Probleme bei „OneButton.h“

Moin Zusammen!

Ich komme hier einfach nicht weiter und finde den Fehler nicht :frowning: - kann mir jemand weiterhelfen?

Vorgeschichte:
Ich habe die Hardware aufgebaut und programmiert die im Gewächshaus die Temperatur max. / Temperatur min. / Temperatur und Feuchte aktuell anzeigt.

Kommentar von meinen Kumpels:
So was gibt es fix fertig für ein paar Euros! Da musst Du nicht ewig dran rum fummeln!

Ich: Der Weg ist das Ziel und die Anzeige von Datum & Uhrzeit noch dazugefügt.
So was gibt es nicht so viel ich weiß.

Funktioniert alles prima!
Ich habe das ganze „klassisch“ gelöst mit 2 Tastern.
Taster 1 schaltet die Anzeige weiter – Taster 2 löst z.B. ein Reset der Temperatur min. aus.

Stand heute:

Jetzt habe ich den Befehl / die libray „one button“ entdeckt und möchte mit nur einem Taster auskommen. Und zusätzlich auch noch den Füllstand der Regenwasser Zisterne anzeigen.

Dazu habe ich mir folgendes Test Programm geschrieben. (Mit einem Taster testen - erst einmal nur Festwert anzeigen / keine Daten und Sensoren einlesen.)

Mein Problem:

Das Programm läuft soweit mit „void click()“

Sobald ich die mit „//“ ausgeblendeten Schritte „button1.attachLongPressStop(longPressStop);“ und // void longPressStop() ff. aktiviere geht nix mehr.

Dto. wenn ich es über aktivieren der Funktion „(doubleclick);“ versuche.

Da bekomme ich jedes Mal die komische Meldung „Schritt 1 was not declared in this scope“

Weiß jemand Rat?

Gruß Martin

P.S.: ´bin hier zwar schon eine ganze Zeit im Forum aber das ist mein erstes Programm / scetch den ich hier einstelle. Ich hoffe da klappt zu Eurer Zufriedenheit :slight_smile: .

//  Schritte 1-4 mit Taster am Analogeingangang A0 setzen -> am Display anzeigen
//  Rev.: 1   Schritte mit "One Button" Befehl auslösen 
//  Rev.: 2   Funktionen bei langem Drücken in den Schritten auslösen (z.B. reset Temp. / Sommer Winterzeit)
//  Jb / läuft? -> nein! / 13.11.2021

int Schritt = 1;                      // Variable "Schritt" definieren und auf 1 setzen

 #include <LiquidCrystal.h>;                   // include the library code
 LiquidCrystal lcd(12, 11, 10, 9, 8, 7);       // initialize the library with the numbers of the interface pins
                                             // Syntax: LiquidCrystal lcd(rs, enable, d4, d5, d6, d7)
#include "OneButton.h"         // Lib einbinden
OneButton button1(A0, false);  // Taster an Pin A0 anschließen, Pegel definieren ("false" = Sprung L->H an A0)
                                             
void setup() 
{
    button1.attachClick(click);
//  button1.attachDoubleClick(doubleclick);
//  button1.attachDuringLongPress(longPress);
//  button1.attachLongPressStop(longPressStop);
  
  lcd.begin(16, 2);   //Display mit 16 Zeichen und 2 Zeilen definieren
  lcd.clear();
    pinMode(0, OUTPUT); digitalWrite(0, LOW); pinMode(1, OUTPUT); digitalWrite(1, LOW); // LED´s an D0 und D1 abschalten
}
void loop() {

  if (Schritt == 1) { Schritt_1(); }
  if (Schritt == 2) { Schritt_2(); }
  if (Schritt == 3) { Schritt_3(); }
  if (Schritt == 4) { Schritt_4(); } 
 
  button1.tick(); // Abfrage Taster
  
}   // Ende void loop   

// --- Funtionen definieren  ---

void click()       // Mit Taster bei kurzem Drücken Schritte hoch zählen 
    {
    Schritt = Schritt+1;
    if (Schritt > 4) { Schritt = 1; }  // nach Schritt 4 wieder auf Schritt 1 setzen
    lcd.clear();              
    }

//   void longPressStop()       // Funktionen bei langem Taster drücken und nach loslassen in den Schritten auslösen 
//   {
//   if (Schritt = 2) {lcd.setCursor(0,0); lcd.print("Temp. max. Reset"); delay(2000); // warten (1000 = one second)}  
//  lcd.clear();              
//   }

void Schritt_1()           // Funktionen bei Schritt 1 definieren
{
  lcd.setCursor(0,0); lcd.print("Schritt = "); lcd.print(Schritt);
  lcd.setCursor(0,1); lcd.print("Anzeige: Liter");
}

void Schritt_2()           // Funktionen bei Schritt 2 definieren
{
  lcd.setCursor(0,0); lcd.print("Schritt = "); lcd.print(Schritt);
  lcd.setCursor(0,1); lcd.print("Temp. max.");
}

void Schritt_3()           // Funktionen bei Schritt 3 definieren
{
  lcd.setCursor(0,0); lcd.print("Schritt = "); lcd.print(Schritt);
  lcd.setCursor(0,1); lcd.print("Temp. min.");
}

void Schritt_4()           // Funktionen bei Schritt 4 definieren
{
  lcd.setCursor(0,0); lcd.print("Schritt = "); lcd.print(Schritt);
  lcd.setCursor(0,1); lcd.print("Datum / Uhrzeit");
}

Das wird nichts.
Da fehlt mindestens ein =
Dann schaun wa weiter.
Und wenn Du das auskommentierte wieder einkommentierst und einmal STRG-T drückst, dann ....

da fehlt eine schließende Klammer

STRG-T hilft solche Sachen zu finden.

Außerdem sollst du dir die Warnings aufdrehen, da gibts ein paar Sachen die der Compiler anmeckert.

//  Schritte 1-4 mit Taster am Analogeingangang A0 setzen -> am Display anzeigen
//  Rev.: 1   Schritte mit "One Button" Befehl auslösen
//  Rev.: 2   Funktionen bei langem Drücken in den Schritten auslösen (z.B. reset Temp. / Sommer Winterzeit)
//  Jb / läuft? -> nein! / 13.11.2021

int Schritt = 1;                      // Variable "Schritt" definieren und auf 1 setzen

#include <LiquidCrystal.h>                  // fixed
LiquidCrystal lcd(12, 11, 10, 9, 8, 7);       // initialize the library with the numbers of the interface pins
// Syntax: LiquidCrystal lcd(rs, enable, d4, d5, d6, d7)
#include "OneButton.h"         // Lib einbinden
OneButton button1(A0, false);  // Taster an Pin A0 anschließen, Pegel definieren ("false" = Sprung L->H an A0)

void setup()
{
  button1.attachClick(click);
  //  button1.attachDoubleClick(doubleclick);
  //  button1.attachDuringLongPress(longPress);
  //  button1.attachLongPressStop(longPressStop);

  lcd.begin(16, 2);   //Display mit 16 Zeichen und 2 Zeilen definieren
  lcd.clear();
  pinMode(0, OUTPUT); digitalWrite(0, LOW); pinMode(1, OUTPUT); digitalWrite(1, LOW); // LED´s an D0 und D1 abschalten
}
void loop() {

  if (Schritt == 1) {
    Schritt_1();
  }
  if (Schritt == 2) {
    Schritt_2();
  }
  if (Schritt == 3) {
    Schritt_3();
  }
  if (Schritt == 4) {
    Schritt_4();
  }

  button1.tick(); // Abfrage Taster

}   // Ende void loop

// --- Funtionen definieren  ---

void click()       // Mit Taster bei kurzem Drücken Schritte hoch zählen
{
  Schritt = Schritt + 1;
  if (Schritt > 4) {
    Schritt = 1;  // nach Schritt 4 wieder auf Schritt 1 setzen
  }
  lcd.clear();
}

void longPressStop()       // Funktionen bei langem Taster drücken und nach loslassen in den Schritten auslösen
{
  if (Schritt == 2) {         //fixed
    lcd.setCursor(0, 0); lcd.print("Temp. max. Reset"); delay(2000); // warten (1000 = one second)}
    lcd.clear();
  }
}


void Schritt_1()           // Funktionen bei Schritt 1 definieren
{
  lcd.setCursor(0, 0); lcd.print("Schritt = "); lcd.print(Schritt);
  lcd.setCursor(0, 1); lcd.print("Anzeige: Liter");
}

void Schritt_2()           // Funktionen bei Schritt 2 definieren
{
  lcd.setCursor(0, 0); lcd.print("Schritt = "); lcd.print(Schritt);
  lcd.setCursor(0, 1); lcd.print("Temp. max.");
}

void Schritt_3()           // Funktionen bei Schritt 3 definieren
{
  lcd.setCursor(0, 0); lcd.print("Schritt = "); lcd.print(Schritt);
  lcd.setCursor(0, 1); lcd.print("Temp. min.");
}

void Schritt_4()           // Funktionen bei Schritt 4 definieren
{
  lcd.setCursor(0, 0); lcd.print("Schritt = "); lcd.print(Schritt);
  lcd.setCursor(0, 1); lcd.print("Datum / Uhrzeit");
}

In C / C++ sind "=" und "==" verschieden.
= ist eine Zuweisung und als Ergebnis [EDIT] fast [/DIT] immer richtig.
== ist ein Vergleich. if braucht einen Vergleich.

Ein Trick:
if (Schritt = 2) ist eine syntaktisch korrekte Zuweisung auch wenn sie nicht das macht, was Du willst. Es gibt keine Fehlermelcdung oder Warnung.
wenn Du die Kontrolle umdrehst:
if (2 == Schritt) ist das gleiche wie if (Schritt == 2)
if (2 = Schritt) ergibt aber eine Fehlermeldung weil eine Kostante (die 2) nicht mit einer anderen Zahl zugewiesen werden kann.

Grüße Uwe

Außer, wenn Du 0 / null / nullptr zuweist.

a=0 ist false.

Gruß Tommy

Naja, Du darfst es nicht ganz so eng sehen - Wenn es nicht passt, wird sicher (auch von mir) der Hinweis gegeben, wie es besser ist.
Niemand ist perfekt...

Und irgendwie komm ich nicht in die waagerechte... von daher habe ich Dir das mal versucht fertig zu basteln, was ich versucht habe in #2 zu erläutern.

Deine Probleme:

// lcd.setCursor(0, 0); lcd.print("Temp. max. Reset"); delay(2000); // warten (1000 = one second)}

Wenn Du das einkommentierst, dann erwartest Du, das die geschweifte Klammer am Ende mitgenommen wird und der Funktionsteil beendet is.
Das ist Falsch!
Alles was hinter dem // auf der selben Zeile liegt, wird als Kommentar behandelt - Wurscht, ob , ( oder {, } ,), oder ; Oder ein möglicher Inhalt.

Derzeit kommentierst Du am Anfang der Zeile alles aus.
Wenn Du die Kommentierungen wegnimmst, fällt Dir genau diese Zeile:

    lcd.setCursor(0, 0); lcd.print("Temp. max. Reset"); delay(2000); // warten (1000 = one second)}

auf die Füsse.
Das muss heissen:

lcd.setCursor(0, 0); lcd.print("Temp. max. Reset"); delay(2000);} // warten (1000 = one second)

Und wenn Du dann noch aus

void longPressStop()       // Funktionen bei langem Taster drücken und nach loslassen in den Schritten auslösen
{
  if (Schritt = 2)

ein

void longPressStop()       // Funktionen bei langem Taster drücken und nach loslassen in den Schritten auslösen
{
  if (Schritt == 2)

machst, dann könnte es werden...

Wenn es nach mir ginge - danach gehts ja nu nich - wäre ein switch/case das Idealste.
Eine Bedingung erfüllt - erledigt, fange an von Vorn.
Eine Prüfung - und durch.

Derzeit sind IMMER 4 Prüfungen notwendig....

hallo mx_xy_projekt
Ich stimme Dir bezüglich switch-Case bei.
Was hat das aber mit meinem Beitrag (Zitat) zu tun. Ich erklährte = und ==
Grüße Uwe

Du hast mich zitiert - und das dazu erklärt. Ich halte mich dafür eher als falscher Adressat und hatte dann nur noch meinen Senf dazu gegeben. - Also alles gut...

Ich weiß daß Du das weißt. Vom TO weiß ich das nicht.
Ich befürchte daß Deine zwar richtige aber kurze Fehlerbeschreibung dem To nicht helfen könne um seinen Fehler zu verstehen bzw zu korrigieren. Darum hab ich das ausführlicher erklährt.

Grüße Uwe

Hallo Leute!

Danke für Eure Hilfe!

Mann....,
2 so einfache Fehler hätten mir eigentlich nicht mehr passieren dürfen.
Aber manchmal sieht man halt den Wald vor lauter Bäumen nicht mehr :roll_eyes:

Alles hatte bis dato funktioniert; an die neue Zeile " if Schritt =(=!) 2" dabei nicht mehr gedacht und den Fehler in der für mich neuen Funktion "onebutton" gesucht.
Die Fehlermeldung "Schritt 1 ... not declared.." stiftete natürlich zusätzliche Verwirrung.

Aber jetzt läufts! :smiley:

Danke nochmal!
Martin

P.S.:
An alle Anfänger die hier mitlesen:
Die Funktion "onebutton" ist genial. Unbedingt da einlesen wenn Ihr etwas mit Taster(n) aufbaut / programmiert!

Die lesen immer öfter nur bereits gelöste Probleme... :slight_smile: