Programmteil per Taster Einschalten

Guten Tag,

so nachdem ich wieder aus dem Krankenhaus raus bin und mich erholt habe (hatte Corona) möchte ich gerne mit meinem Projekt weitermachen.

Leider musste ich feststellen das ich etwas übersehen hatte in meiner Planung da die Steuerung für ein Terrarium sein soll in dem 4 Kornnattern leben und die nicht permanent eine hohe Luftfeuchtigkeit benötigen habe ich bei dem übernommenen Code von jurs (vielen Dank dafür nochmal das du sowas online stellst) den Teil mit dem kurzzeittimer entfernt und wollte es mit der Abfrage ganz am Ende machen.

Doch dabei wird ja immer gesprüht auch wenn es nicht nötig ist daher war ich am Überlegen ob es möglich ist diesen programmteil nur zu aktiveren über einen Taster, wenn man es braucht habe aber bisher nichts darüber gefunden vielleicht könnt ihr ja den richtigen tipp oder Lösung geben.

Ich habe jetzt nur den loop angehängt da der gesamte Code zu groß ist da hier nur 9000 Zeichen erlaubt sind ich hätte etwas über 10.000 Zeichen sind wohl etwas zu viele Erklärungen drin gelandet und der Teil von jurs ist auch recht groß aber egal ich hoffe das reicht.

Vielen dank

void loop()
{
  
  char buffer[30];
  static unsigned long lastMillis;
  static int lastMinute;
  int stunden, minuten, sekunden, dummy;
  if (millis()-lastMillis>1000) // nur einmal pro Sekunde
  {
    lastMillis=millis();
    rtcReadTime(dummy, dummy, dummy, wochentag, stunden, minuten, sekunden);
    updateDisplay(wochentag, stunden, minuten, sekunden); // Funktion zur Anzeige auf LCD
    if (minuten!=lastMinute) // die aktuelle Minute hat gewechselt
    {
      lastMinute=minuten;
      snprintf(buffer,sizeof(buffer),"%02d:%02d Uhr",stunden,minuten);
      Serial.println(buffer);
      relaisSchaltenNachZeit(stunden,minuten);
     
    }
  }
  behandleSerielleBefehle();
  // *INDENT-OFF*

 sensors.requestTemperatures(); 
  
  float t = dht22.readTemperature();       // Die Temperatur wird vom DHT22 ausgelesen, Wert in "t" schreiben
  float h = dht22.readHumidity();          // Die Luftfeuchte wird vom DHT22 ausgelesen, Wert in "h" schreiben

lcd.setCursor(0, 2);                       // Anfang auf Stelle 0, Zeile 3 setzen
  lcd.print(t);                            // Wert aus "t" ausgeben (Temperatur)
  lcd.setCursor(6, 2);                     // Anfang auf Stelle 6, Zeile 3 setzen
  lcd.print("\337C");                      // °C (mit"\337" wird das Gradzeichen dargestellt)auf LCD ausgeben
lcd.setCursor(10, 2);                      // Anfang auf Stelle 9, Zeile 3 setzen
  lcd.print(h);                            // Wert aus "h" ausgeben (Luftfeuchtigkeit)
  lcd.setCursor(16, 2);                    // Anfang auf Stelllcd.setCursore 9, Zeile 1 setzen
  lcd.print("%");                          // % auf LCD ausgeben
lcd.setCursor(0, 3);                       // Anfang auf Stelle 0, Zeile 4 setzen
  lcd.print(sensors.getTempCByIndex(0));   // Temperatur ausgeben
  lcd.setCursor(6, 3);                     // Anfang auf Stelle 9, Zeile 4 setzen
  lcd.print("\337C");                      // °C (mit"\337" wird das Gradzeichen dargestellt)auf LCD ausgeben
lcd.setCursor(10, 3);                      // Anfang auf Stelle 10, Zeile 4 setzen
  lcd.print(sensors.getTempCByIndex(1));   // Temperatur ausgeben
  lcd.setCursor(16, 3);                    // Anfang auf Stelle 16, Zeile 4 setzen
  lcd.print("\337C");                      // °C (mit"\337" wird das Gradzeichen dargestellt)auf LCD ausgeben

// *INDENT-ON*

if(dht22.readHumidity() <= 50)             //ist RLF kleiner oder gleich als
{
  digitalWrite(RelayPin, LOW);             //HIGH = Relais An
}
if(dht22.readHumidity() >= 65)             //ist RLF grösser oder gleich als
{
  digitalWrite(RelayPin, HIGH);            //LOW = Relais Aus
}

tasterstatus=digitalRead(taster);
if (tasterstatus == HIGH)                  //Wenn Wasserstand niedrig(Schwimmerschalter) kontakt
{
digitalWrite(LEDrot, HIGH);                //LED an
}
else                                       //sonst
{
digitalWrite(LEDrot, LOW);                 //LED aus
}}

Entsprechenden Codeteil in eine Funktion auslagern und diese per Tastenabfrage aufrufen.
Funktioniert dann so lange die Taste gedrückt wird.

Mit einer zusätzlichen Statusvariable kannst du auch eine Togglefunktion erhalten.

Also die Aktion soll solange aktiviert bleiben bis man den Taster erneut betätigt.
Erklärungsversuch:
Morgens um 7uhr soll das Licht angehen bis 19uhr wenn ich dann aber um 9uhr feststelle, dass sich eine Schlange in der Häutung befindet möchte betätige ich einen Taster betätigen und die Funktion Luft Befeuchtung soll solange bis ich den Taster erneut betätige aktiviert bleiben das sind teilweise bis zu 6 Tage wo dann aber der normale Programm Ablauf nicht unterbrochen oder verzögert werden soll.
Ich weiß ist blöd erklärt aber anders fällt es mir derzeit nicht ein.

johann81:
..........solange bis ich den Taster erneut betätige aktiviert bleiben das sind teilweise bis zu 6 Tage wo dann aber der normale Programm Ablauf nicht unterbrochen oder verzögert werden soll.

Ich würde den Taster wohl gegen einen Schalter tauschen. Das hat den Vorteil, dass auch wenn der Arduino mal einen Neustart macht, diese Info für die CPU nicht verloren ist. Immer dann, wenn die CPU prüft ob der Sprühnebel los gehen soll oder nicht, wird einfach der Schalter abgefragt, somit hat man auch gleich einen Marker der eindeutig festhält, was der Bediener wünscht.

Franz

Taster als Wechselschalter:
zB: Arduino Tutorial 28: Using a Pushbutton as a Toggle Switch | Technology Tutorials
Ein Schalter könnte hier aber die bessere Lösung sein.
Grüße Uwe

johann81:
Also die Aktion soll solange aktiviert bleiben bis man den Taster erneut betätigt.
.....

Und genau so hatte ich es auch beschrieben bzw. vorgeschlagen.
Wenn tatsächlich der Schaltstatus nach einem Neustart benötigt wird, kann der Status auch im EEProm gespeichert werden.

HotSystems:
Wenn tatsächlich der Schaltstatus nach einem Neustart benötigt wird, kann der Status auch im EEProm gespeichert werden.

Du bist dir also vollkommen sicher, dass ein Neustart nur gewollt sein muss. Dass ein Neustart in der CPU einfach durch eussere Einflüsse PASSIEREN kann, ist also unvorstellbar. Naja, ich finde das kann vorkommen. Und wenn man dann wichtige Funktionen trotzdem beibehalten will/muss, finde ich logisch. Dass man es auch umständlich über das EEProm einlesen / auslesen kann ist klar. Ich weiß noch was schöneres. Man könnte auch eine Speicherkarte einbauen, und die Info dort ablegen, ist noch ein bischen aufwändiger, aber klar, wers kopliziert will, der kann auch einen Servo einbauen, der ein Zeichen auf ein Papier macht, und das immer wenn man die Info braucht mit na Kamera mit Erkennungssoftware auslesen. Alles ist mööööööglich :slight_smile: . Ich würde den Schalter anstelle der Taste empfehlen, ist eben einfacher als der ganze Käse :slight_smile: Ich kann im Programm dauernd den Taster abfragen und dann nen Merker setzen, den ich dann überall Abfrage wo ich die Info brauche. Ist eben auch recht umständlich und wie ich ja schon geschrieben habe, unsicher, wenn es eine wichtige Einstellung ist. Oder ich frage einfach nur da den Schalter ab, wo ich die Info brauche und alles ist gut. Den Pin brauche ich für den Taster genauso wie für den Schalter.

Franz

Franz54:
Du bist dir also vollkommen sicher, dass ein Neustart nur gewollt sein muss......

Und wo habe ich das geschrieben ?
Alles weitere......ohne Kommentar.

Bitte nicht streiten.
Grüße Uwe

Keine Angst. :slight_smile:
Ich wollte nur noch ein paar "hochtechnische Möglichkeiten" anbieten, anstelle eines einfachen Schalters, der genau das selbe erfüllt. :slight_smile: :slight_smile: Und den man an jeder Stelle locker abfragen kann. Ohne Merker, ohne EEprom und sonstigen schnick schnack.

Franz54:
Keine Angst. :slight_smile:
Ich wollte nur noch ein paar "hochtechnische Möglichkeiten" anbieten,.....

Ok.....dann sollte der TO sich dazu äußern, welchen Weg er gehen möchte, dann brauchen wir nicht weiter rumraten.

(deleted)

Peter-CAD-HST:

buttonState=buttonState++%2;

Das ist keine gute Idee!

warning: operation on 'buttonState' may be undefined [-Wsequence-point]

Topic: Warnung bei ++index % maxwert

Gruß Fips

(deleted)

müßte
buttonState=(++buttonState)%2;
nicht auch funktonieren?
aber
buttonState=++buttonState%2;
nicht weil % vor ++ kommt.
Grüße Uwe