Unterschiede

Hier werden die Unterschiede zwischen zwei Versionen angezeigt.

Link zu dieser Vergleichsansicht

Beide Seiten der vorigen RevisionVorhergehende Überarbeitung
Nächste Überarbeitung
Vorhergehende Überarbeitung
uc-welt:gscheiduino:11-hysterese [2016/01/06 18:39] Hannes Jochriemuc-welt:gscheiduino:11-hysterese [2024/02/06 09:43] (aktuell) – Externe Bearbeitung 127.0.0.1
Zeile 1: Zeile 1:
-[[uc-welt:gscheiduino:10-batterie|← Kapitel 10: Übungsaufgabe Batterietester]] | [[uc-welt:gscheiduino:00-uebersicht|↑ Übersicht]]  | [[uc-welt:gscheiduino:12| →]]+[[uc-welt:gscheiduino:10-batterie|← Kapitel 10: Übungsaufgabe Batterietester]] | [[uc-welt:gscheiduino:00-uebersicht|↑ Übersicht]]  | [[uc-welt:gscheiduino:12-daemmerungsschalter|Kapitel 12: Dämmerungsschalter →]]
  
-====== Hysterese ======+====== Kapitel 11: Hysterese ======
  
 ===== Was ist eine Hysterese ===== ===== Was ist eine Hysterese =====
Zeile 105: Zeile 105:
 </code> </code>
  
-//wert_steigt// ist die Variable, die sich den Zustand des Systems merkt. Wir definieren sie hier mit 1, gehen also davon aus, dass der Spannungswert unter dem Schwellwert istWenn der Schwellwert überschritten wirdändern wir die Variable auf den Wert 0. Ob wir die Variable zu Beginn mit 0 oder 1 definieren ist eigentlich egal.+//wert_steigt// ist die Variable, die sich den Zustand des Systems merkt. Wir definieren sie hier mit 1, damit sie irgend eine Grundinitialisierung hatIst aber eigentlich egal, wir werden den Wert in der setup()-Routine definieren, indem wir abfragen, ob der Wandlerwert unter oder über der Schwelle liegt.
  
 //HYSTERESE// ist in diesem Fall ein Wert, den wir vom gewünschten Schwellwert abziehen oder addieren. Wir wollen eine Gesamthysterese von 0,2V erreichen, das heißt, der untere Schwellwert beträgt 2,9V, der obere 3,1V. //HYSTERESE// ist in diesem Fall ein Wert, den wir vom gewünschten Schwellwert abziehen oder addieren. Wir wollen eine Gesamthysterese von 0,2V erreichen, das heißt, der untere Schwellwert beträgt 2,9V, der obere 3,1V.
Zeile 114: Zeile 114:
  
 Zusätzlich definieren wir noch unseren Schwellwert, einfach weil es den Code schöner macht. Zusätzlich definieren wir noch unseren Schwellwert, einfach weil es den Code schöner macht.
 +
 +<note tip>Wie wir auf diese Werte kommen wird [[uc-welt:gscheiduino:08-analoginputs#theorie|hier]] beschrieben.</note>
  
 Wer sich traut, darf jetzt gerne selber versuchen, den Code zu schreiben. Für alle anderen folgt hier die Lösung: Wer sich traut, darf jetzt gerne selber versuchen, den Code zu schreiben. Für alle anderen folgt hier die Lösung:
Zeile 123: Zeile 125:
 #define HYSTERESE 20 #define HYSTERESE 20
 #define SCHWELLWERT 613 #define SCHWELLWERT 613
 + 
 int wert_steigt = 1; int wert_steigt = 1;
 int messwert = 0; int messwert = 0;
Zeile 132: Zeile 134:
   pinMode(LED_GRUEN, OUTPUT); // Pin auf Ausgang   pinMode(LED_GRUEN, OUTPUT); // Pin auf Ausgang
   pinMode(ANALOGPIN, INPUT);  // Pin auf Eingang   pinMode(ANALOGPIN, INPUT);  // Pin auf Eingang
 +  if(analogRead(ANALOGPIN)<SCHWELLWERT)
 +  {  // Der Wert ist im grünen Bereich, kann also steigen
 +    wert_steigt = 1;
 +    digitalWrite(LED_ROT, LOW);    // rote LED aus
 +    digitalWrite(LED_GRUEN, HIGH); // gruene LED an
 +  }
 +  else
 +  {  // Der Wert ist im roten Bereich, kann also fallen
 +    wert_steigt = 0;
 +    digitalWrite(LED_ROT, HIGH);  // rote LED an
 +    digitalWrite(LED_GRUEN, LOW); // gruene LED aus
 +  }
 } }
    
Zeile 137: Zeile 151:
 { {
   messwert = analogRead(ANALOGPIN);   messwert = analogRead(ANALOGPIN);
-  if(wert_steigt == 1 && messwert > (SCHWELLWERT + HYSTERESE)) +  // Lieber mehr Klammern setzen als zu wenig, so ist die Reihenfolge sicher definiert: 
-  { // Wenn der Wert >613 ist, wird folgender Code ausgeführt:+  if((wert_steigt == 1&& (messwert > (SCHWELLWERT + HYSTERESE))) 
 +  { // Wenn der Wert >SCHWELLWERT+HYSTERESE ist, wird folgender Code ausgeführt:
     digitalWrite(LED_ROT, HIGH);  // rote LED an     digitalWrite(LED_ROT, HIGH);  // rote LED an
     digitalWrite(LED_GRUEN, LOW); // gruene LED aus     digitalWrite(LED_GRUEN, LOW); // gruene LED aus
     wert_steigt = 0;     wert_steigt = 0;
   }   }
-  else if(wert_steigt == 0 && messwert < (SCHWELLWERT - HYSTERESE))+  else if((wert_steigt == 0&& (messwert < (SCHWELLWERT - HYSTERESE))) 
   { // Ansonsten wird dieser Code hier ausgeführt:   { // Ansonsten wird dieser Code hier ausgeführt:
     digitalWrite(LED_ROT, LOW);    // rote LED aus     digitalWrite(LED_ROT, LOW);    // rote LED aus
     digitalWrite(LED_GRUEN, HIGH); // gruene LED an     digitalWrite(LED_GRUEN, HIGH); // gruene LED an
 +    wert_steigt = 1;
   }   }
   else   else
Zeile 153: Zeile 169:
 } }
 </code> </code>
 +
 +Wir fassen noch einmal zusammen was das Programm macht:
 +
 +  * In der setup()-Routine wird der Eingang ausgelesen um zu entscheiden, ob man unter oder ober der Schwelle ist
 +  * Entsprechend werden auch schon die LEDs ein- bzw. ausgeschaltet
 +  * In der loop()-Routine wird der Eingang ausgelesen und in eine Variable gespeichert
 +  * Abhängig von "unter" oder "über Schwelle" werden verschiedene Vergleichswerte verwendet
 +  * Dadurch entsteht eine Hysterese und es kann nicht zu zu schnell wechselnden Zuständen kommen
 +
 +Nach erfolgreichen Upload des Programms kann es sofort getestet werden:
 +
 +Wenn man nun das Poti langsam zum Schwellwert dreht, schaltet die LED um. Nun muss das Poti weiter als zuvor zurück gedreht werden, damit die LEDs wieder zurückschalten. Wie viel unterschied zwischen den zwei Umschaltpunkten ist, kann man mit #define HYSTERESE einstellen.
 +
 +Da wir uns jetzt schon sehr gut mit Analogeingängen und Hysteresen auskennen, kommt ein ganz klassisches Beispiel für beide Anwendungen:
 +
 +[[uc-welt:gscheiduino:12-daemmerungsschalter|Kapitel 12: Dämmerungsschalter]]