Go Down

Topic: Programmteil per Taster Einschalten (Read 309 times) previous topic - next topic

johann81

Aug 02, 2020, 01:57 pm Last Edit: Aug 02, 2020, 01:59 pm by johann81
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

Code: [Select]
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
}}

HotSystems

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.
Gruß Dieter

I2C = weniger ist mehr: weniger Kabel, mehr Probleme. 8)

johann81

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.

Franz54

..........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

uwefed

#4
Aug 02, 2020, 06:39 pm Last Edit: Aug 02, 2020, 06:40 pm by uwefed
Taster als Wechselschalter:
zB: https://toptechboy.com/arduino-tutorial-28-using-a-pushbutton-as-a-toggle-switch/
Ein Schalter könnte hier aber die bessere Lösung sein.
Grüße Uwe

HotSystems

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.

Gruß Dieter

I2C = weniger ist mehr: weniger Kabel, mehr Probleme. 8)

Franz54

#6
Aug 02, 2020, 07:45 pm Last Edit: Aug 02, 2020, 10:17 pm by Franz54
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  :) . Ich würde den Schalter anstelle der Taste empfehlen, ist eben einfacher als der ganze Käse  :) 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

HotSystems

Du bist dir also vollkommen sicher, dass ein Neustart nur gewollt sein muss......
Und wo habe ich das geschrieben ?
Alles weitere......ohne Kommentar.
Gruß Dieter

I2C = weniger ist mehr: weniger Kabel, mehr Probleme. 8)

uwefed


Franz54

#9
Aug 02, 2020, 10:19 pm Last Edit: Aug 02, 2020, 10:24 pm by Franz54
Keine Angst. :)
Ich wollte nur noch ein paar "hochtechnische Möglichkeiten" anbieten, anstelle eines einfachen Schalters, der genau das selbe erfüllt.  :)  :)  Und den man an jeder Stelle locker abfragen kann. Ohne Merker, ohne EEprom und sonstigen schnick schnack.

HotSystems

Keine Angst. :)
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.
Gruß Dieter

I2C = weniger ist mehr: weniger Kabel, mehr Probleme. 8)

Peter-CAD-HST

Moin johann81

deine Funktionsbeschreibung:

Quote
.... betätige ich einen Taster betätigen und die Funktion Luft Befeuchtung soll solange bis ich den Taster erneut betätige aktiviert bleiben
Mein Vorschlag:

nimm aus dem IDE das Beispiel für Debounce und baue es bei dir ein.

Die Zeile

Code: [Select]
ledState = !ledState;

löschen

und durch eine globale Variable

Code: [Select]
buttonState=buttonState++%2;

ersetzen und auch noch die Zeile

Code: [Select]
digitalWrite(ledPin, ledState);

löschen, diese wird nicht mehr benötigt.

Die Variable buttonState kannst du in deinem Programm auswerten

Code: [Select]
if (buttonState) LuftBefeuchtungAn(); else LuftBefeuchtungAus();

Viel Erfolg
Gruss Peter
und gesund bleiben



KISS Q&D - keep calm and carry on - mind the gap - beware of sharks! -

Derfips

Code: [Select]
buttonState=buttonState++%2;


Das ist keine gute Idee!

Quote
warning: operation on 'buttonState' may be undefined [-Wsequence-point]
Topic: Warnung bei ++index % maxwert


Gruß Fips
Meine Esp8266 & ESP32 Projekte => https://fipsok.de

Peter-CAD-HST

#13
Aug 03, 2020, 11:31 am Last Edit: Aug 03, 2020, 11:36 am by Peter-CAD-HST
Moin Fips

Super, danke für deinen Hinweis.

Dann muss die Zeile geändert werden in:

Code: [Select]
buttonState=(buttonState+1)%2;

Die Idee ist gut, nur die Umsetzung war mangelhaft, im wahrsten Sinne des Wortes :)

Gruss Peter
und gesund bleiben
KISS Q&D - keep calm and carry on - mind the gap - beware of sharks! -

uwefed

#14
Aug 03, 2020, 01:00 pm Last Edit: Aug 03, 2020, 01:00 pm by uwefed
müßte
buttonState=(++buttonState)%2;
nicht auch funktonieren?
aber
buttonState=++buttonState%2;
nicht weil % vor ++ kommt.
Grüße Uwe

Go Up