Integrieren eines TM1637 Modul

#include <EEPROM.h>
#include <LiquidCrystal_I2C.h>

LiquidCrystal_I2C lcd(0x27, 16, 2); // Standardadresse für ein 16x2 LCD

const int button1Pin = 5;
const int button2Pin = 6;
const int button3Pin = 7;
const int button4Pin = 4;
const int button5Pin = 3;  // Neuer Button-Pin hinzugefügt
const int relay1Pin = 12;
const int relay2Pin = 8;
const int counterAddress = 0;

unsigned int storedState;
unsigned long lastDisplayTime = 0;
const unsigned long displayInterval = 3000; // 30 Sekunden in Millisekunden (30000)

void setup()
{
  Serial.begin(9600);
  Serial.println(F("Start..."));
  pinMode(button1Pin, INPUT_PULLUP);
  pinMode(button2Pin, INPUT_PULLUP);
  pinMode(button3Pin, INPUT_PULLUP);
  pinMode(button4Pin, INPUT_PULLUP);
  pinMode(button5Pin, INPUT_PULLUP);  // Neuer Button-Pin initialisieren
  pinMode(relay1Pin, OUTPUT);
  pinMode(relay2Pin, OUTPUT);

  digitalWrite(relay1Pin, HIGH); // Deaktiviere Relais 1 zu Beginn
  digitalWrite(relay2Pin, HIGH); // Deaktiviere Relais 2 zu Beginn

  // Lesen Sie den gespeicherten Zustand von EEPROM
  EEPROM.get(counterAddress, storedState);
  lcd.init();
  lcd.backlight();
}

void loop()
{
  // Überprüfe, ob Button 1 gedrückt wurde
  if (digitalRead(button1Pin) == LOW)  
  {
    digitalWrite(relay1Pin, LOW);
    delay(500);
    digitalWrite(relay1Pin, HIGH);
    digitalWrite(relay2Pin, LOW);
    delay(500);
    digitalWrite(relay2Pin, HIGH);
    storedState++;
    EEPROM.put(counterAddress, storedState);
  }
  // Überprüfe, ob Button 2 gedrückt wurde
  else if (digitalRead(button2Pin) == LOW)
  {
    // Button 2 wurde gedrückt, aktiviere Relais 1 zweimal mit Pause
    for (int i = 0; i < 2; i++)
    {
      digitalWrite(relay1Pin, LOW);
      delay(500);
      digitalWrite(relay1Pin, HIGH);
      delay(500);
    }
    // Aktiviere Relais 2 für 10 Minuten
    digitalWrite(relay2Pin, LOW);
    delay(6000);
    digitalWrite(relay2Pin, HIGH);
    storedState += 2; // Erhöhe um 2, da der Button 2 zweimal gedrückt wurde
    EEPROM.put(counterAddress, storedState);
  }
  // Überprüfe, ob Button 3 gedrückt wurde
  else if (digitalRead(button3Pin) == LOW)
  {
    // Button 3 wurde gedrückt, aktiviere Relais 1 viermal mit Pause
    for (int i = 0; i < 4; i++)
    {
      digitalWrite(relay1Pin, LOW);
      delay(500);
      digitalWrite(relay1Pin, HIGH);
      delay(500);
    }
    // Aktiviere Relais 2 für 20 Minuten
    digitalWrite(relay2Pin, LOW);
    delay(2000);
    digitalWrite(relay2Pin, HIGH);
    storedState += 4; // Erhöhe um 4, da der Button 3 viermal gedrückt wurde
    EEPROM.put(counterAddress, storedState); 
    // Button 2 Ende
  }
  // Start Button 4 Überprüft ob Button 4 gedrückt wurde (für das Zurücksetzen des Zählerstands)
  else if (digitalRead(button4Pin) == LOW)
  {
    // Setzen Sie den Zählerstand auf 0 und speichern Sie ihn im EEPROM
    storedState = 0;
    EEPROM.put(counterAddress, storedState);
    // Warten Sie kurz, um mehrere Tastendrücke zu verhindern
    delay(1000);
  }
  // Button 5 Anfang Überprüft ob Button 5 gedrückt wurde
  else if (digitalRead(button5Pin) == LOW)
  {
        digitalWrite(relay2Pin, LOW);
    delay(3000);
    digitalWrite(relay2Pin, HIGH);    
    // Butten 5 Ende
  }

  // Überprüfen Sie, ob die Zeit für die Anzeige des Zählerstands abgelaufen ist
  unsigned long currentTime = millis();
  if (currentTime - lastDisplayTime >= displayInterval)
  {
    // Aktualisieren Sie die Zeitmarke für die Anzeige
    lastDisplayTime = currentTime;
    // Ausgabe des Speicherzustands auf dem Serial Monitor
    Serial.print("Zählerstand: ");
    Serial.println(storedState);

    // Anzeige des Betrags in Euro auf dem LCD
    lcd.clear();
    lcd.setCursor(0, 0);
    lcd.print(storedState * 0.5, 1); // Jeder Impuls entspricht 0,5 Euro
    lcd.print(F(" Euro"));            // Euro-Zeichen am Ende der ersten Zeile

    // Leere die zweite Zeile
    lcd.setCursor(0, 1);
    lcd.print(F("                "));
  }
}

Das Programm ist fehlerfrei. Ich möchte das TM1637 integrieren. Das Modul soll erst anzeigen wenn das Relais 2 an ist . Wenn der Butten 1 gedrückt wird bleibt das Relais für ein festgelegte Zeit (Button 1 = 5 Minuten) an. In dieser Zeit soll das TM1637 die Sekunden rückwärts zählen und nach der abgelaufenen Zeit aus gehen. Beim Button 2 Relais 2 = 10 Minuten und beim Button 3 =20 Minuten. In meine Programmierung sind die Zeiten anders festgelegt, damit der Test schneller geht. Ich habe es mit KI versucht aber nach 4 Stunden habe ich aufgegeben. Kann mir jemand helfen?

Was gibt es da dann noch zu tun, wenn es schon fehlerfrei ist? :wink:

Gruß Tommy

Schau mall hier :

Das geht nicht.
Nicht, weil es nicht geht, sondern weil Dein Code das nicht hergibt.
Mindestens hier:

tztztz

Ich denke dir kann keiner helfen hier, wenn er nicht GENAU weiß was du für ein TM1637 Modul hast.

Bevor du fragst. Das gibt es nackt, und mit Treiberchip. Wenn mit Treiberchip dann hast du nur noch 4 Pins (GND,VCC + 2 zu quatschen). Wenn den so ist, dann init man eine Libs und gut ist.

Also poste ein Foto o. Link zu dem Teil.

Gruß

Pucki

...solange der bsherige Code das nicht hergibt, wird das eh nix.

JEPP.

Aber es ist ein Unterschied ob ich mich um viele Pins o. nur um 2 kümmern muss.

ganz viele Pins (Nackt) (Würde ich persönlich mit einen PCF8574 ansteuern. Spart Pins am Board)

2 Pins + Power (fertig für Libs)

Und bevor ich DAS nicht weiß hilf mir der Code auch nicht weiter.
Weil eine Anaylse könnte mir max. ein Hinweis geben. Und um eine Analyse zu machen bin ich zu faul. Da soll der TO halt die richtigen Info liefern.

@to
Bei beiden Links sind Anleitungen dabei wie man das Ansteuert

Gruß

Pucki

Ich möchte das Tm1637 4-Bit-Digital-LED-Anzeigemodul für Arduino 7-Segment wie ich es beschrieben habe integrieren.

Mit Treiberchip

Bekommst du Provision vom dem Saftladen das du den so liebst?
Das ist der Schlimmster Laden was es gibt, versuchen alles als Marke eintragen, weist was passiert danach?
Und auch im dem Fall überteuert.

Tm1637 4-Bit-Digital-LED-Anzeigemodul für Arduino 7-Segment

#include <TM1637Display.h>

#define CLK 9  // Anschluss für Clock
#define DIO 10  // Anschluss für Daten

TM1637Display display(CLK, DIO);

void setup() {
  Serial.begin(9600);
  display.setBrightness(7);  // Helligkeit einstellen (1-7)
}

void loop() {
  // Testanzeige "1234"
  display.showNumberDec(1234);
  delay(2000);

  // Anzeige löschen
  display.clear();
  delay(1000);

  // Testanzeige "abcd"
  display.showNumberDecEx(0x61626364);
  delay(2000);

  // Anzeige löschen
  display.clear();
  delay(1000);
}

Das ist ein Testprogramm für die TM1637 Anzeige.

NEIN LEIDER nicht, aber er gehört zu den ca. 6 Lieferanten von mir + Amazone. Er hat auf seine HP auch Links zu Libs und alles. Sowas nenne ich Service wenn alles auf einer Seite ist.

Und es sagt ja keiner das er da kaufen soll.

Davon abgesehen, ich habe einige Male bei den Bestellt, direkt o. über Amazone. Und die Produkte waren O.K. Das reicht mir.

Gruß

Pucki

Ich verwende das zweite Bild TM1637.

@ralf-funke

Dann hast du doch alles was du brauchst.

Wenn das Testprogramm läuft ,brauchst du nur den Kopf in dein Haupt-Prg. intregieren, und die Aufrufe für Text (das sind HEX-Codes) + Zahlen , mit den Daten die du willst füttern.

Wenn du ein Counter willst, muss du einfach ein Wert nehmen, und den alle paar Millis() um ein Faktor abziehen und das Ergebnis anzeigen.

Gruß

Pucki

Wie würdest du das schreiben?

Ich programmiere erst set 2 Tagen und verstehe noch nicht alles was du schreibst.
Meine Pinbelegung für das TM1637 5V+ und GND und CLK auf Pin 9 und DIO aif Pin 10.

#include <EEPROM.h>
#include <LiquidCrystal_I2C.h>
#include <TM1637Display.h>

LiquidCrystal_I2C lcd(0x27, 16, 2); // Standardadresse für ein 16x2 LCD

const int button1Pin = 5;
const int button2Pin = 6;
const int button3Pin = 7;
const int button4Pin = 4;
const int button5Pin = 3;  // Neuer Button-Pin hinzugefügt
const int relay1Pin = 12;
const int relay2Pin = 8;
const int counterAddress = 0;

unsigned int storedState;
unsigned long lastDisplayTime = 0;
const unsigned long displayInterval = 3000; // 30 Sekunden in Millisekunden (30000)

// TM1634 Display
#define CLK 9  // Anschluss für Clock
#define DIO 10  // Anschluss für Daten
TM1637Display display(CLK, DIO);

// Deklaration der Funktion berechneRestzeit
int berechneRestzeit();

void setup()
{
  Serial.begin(9600);
  Serial.println(F("Start..."));
  pinMode(button1Pin, INPUT_PULLUP);
  pinMode(button2Pin, INPUT_PULLUP);
  pinMode(button3Pin, INPUT_PULLUP);
  pinMode(button4Pin, INPUT_PULLUP);
  pinMode(button5Pin, INPUT_PULLUP);  // Neuer Button-Pin initialisieren
  pinMode(relay1Pin, OUTPUT);
  pinMode(relay2Pin, OUTPUT);

  digitalWrite(relay1Pin, HIGH); // Deaktiviere Relais 1 zu Beginn
  digitalWrite(relay2Pin, HIGH); // Deaktiviere Relais 2 zu Beginn

  // Lesen Sie den gespeicherten Zustand von EEPROM
  EEPROM.get(counterAddress, storedState);
  lcd.init();
  lcd.backlight();

  // Initialisierung des TM1634-Displays
  display.setBrightness(7);  // Helligkeit einstellen (1-7)
}

void loop()
{
  // Überprüfe, ob Button 1 gedrückt wurde
  if (digitalRead(button1Pin) == LOW)  
  {
    digitalWrite(relay1Pin, LOW);
    delay(500);
    digitalWrite(relay1Pin, HIGH);
    digitalWrite(relay2Pin, LOW);
    delay(500);
    digitalWrite(relay2Pin, HIGH);
    storedState++;
    EEPROM.put(counterAddress, storedState);
  }
  // Überprüfe, ob Button 2 gedrückt wurde
  else if (digitalRead(button2Pin) == LOW)
  {
    // Button 2 wurde gedrückt, aktiviere Relais 1 zweimal mit Pause
    for (int i = 0; i < 2; i++)
    {
      digitalWrite(relay1Pin, LOW);
      delay(500);
      digitalWrite(relay1Pin, HIGH);
      delay(500);
    }
    // Aktiviere Relais 2 für 10 Minuten
    digitalWrite(relay2Pin, LOW);
    delay(6000);
    digitalWrite(relay2Pin, HIGH);
    storedState += 2; // Erhöhe um 2, da der Button 2 zweimal gedrückt wurde
    EEPROM.put(counterAddress, storedState);
  }
  // Überprüfe, ob Button 3 gedrückt wurde
  else if (digitalRead(button3Pin) == LOW)
  {
    // Button 3 wurde gedrückt, aktiviere Relais 1 viermal mit Pause
    for (int i = 0; i < 4; i++)
    {
      digitalWrite(relay1Pin, LOW);
      delay(500);
      digitalWrite(relay1Pin, HIGH);
      delay(500);
    }
    // Aktiviere Relais 2 für 20 Minuten
    digitalWrite(relay2Pin, LOW);
    delay(2000);
    digitalWrite(relay2Pin, HIGH);
    storedState += 4; // Erhöhe um 4, da der Button 3 viermal gedrückt wurde
    EEPROM.put(counterAddress, storedState); 
    // Button 2 Ende
  }
  // Start Button 4 Überprüft ob Button 4 gedrückt wurde (für das Zurücksetzen des Zählerstands)
  else if (digitalRead(button4Pin) == LOW)
  {
    // Setzen Sie den Zählerstand auf 0 und speichern Sie ihn im EEPROM
    storedState = 0;
    EEPROM.put(counterAddress, storedState);
    // Warten Sie kurz, um mehrere Tastendrücke zu verhindern
    delay(1000);
  }
  // Button 5 Anfang Überprüft ob Button 5 gedrückt wurde
  else if (digitalRead(button5Pin) == LOW)
  {
    digitalWrite(relay2Pin, LOW);
    delay(3000);
    digitalWrite(relay2Pin, HIGH);    
    // Butten 5 Ende
  }

  // Überprüfen Sie, ob die Zeit für die Anzeige des Zählerstands abgelaufen ist
  unsigned long currentTime = millis();
  if (currentTime - lastDisplayTime >= displayInterval)
  {
    // Aktualisieren Sie die Zeitmarke für die Anzeige
    lastDisplayTime = currentTime;
    // Ausgabe des Speicherzustands auf dem Serial Monitor
    Serial.print("Zählerstand: ");
    Serial.println(storedState);

    // Anzeige des Betrags in Euro auf dem LCD
    lcd.clear();
    lcd.setCursor(0, 0);
    lcd.print(storedState * 0.5, 1); // Jeder Impuls entspricht 0,5 Euro
    lcd.print(F(" Euro"));            
    // Leere die zweite Zeile
    lcd.setCursor(0, 1);
    lcd.print(F("                "));
  }
}

In der Lib sind Beispiel fang damit an, nur die Pins musst anpassen.