Unterschiede
Hier werden die Unterschiede zwischen zwei Versionen angezeigt.
Beide Seiten der vorigen RevisionVorhergehende ÜberarbeitungNächste Überarbeitung | Vorhergehende ÜberarbeitungNächste ÜberarbeitungBeide Seiten der Revision | ||
uc-welt:gscheiduino:11-hysterese [2016/01/06 18:23] – Hannes Jochriem | uc-welt:gscheiduino:11-hysterese [2016/01/08 17:12] – Hannes Jochriem | ||
---|---|---|---|
Zeile 1: | Zeile 1: | ||
- | [[uc-welt: | + | [[uc-welt: |
- | ====== Hysterese ====== | + | ====== |
===== Was ist eine Hysterese ===== | ===== Was ist eine Hysterese ===== | ||
Zeile 64: | Zeile 64: | ||
</ | </ | ||
- | Ja, das funktioniert, | + | Ja, das funktioniert, |
Für uns sind vorerst folgende zwei wichtig: | Für uns sind vorerst folgende zwei wichtig: | ||
Zeile 92: | Zeile 92: | ||
} | } | ||
</ | </ | ||
+ | |||
+ | Diese Verknüpfung dürfen wir gleich für unser Hysteresbeispiel verwenden: | ||
+ | |||
+ | ===== Hysterese in Software ===== | ||
+ | |||
+ | Wie oben beschrieben benötigen wir zwei zusätzliche Werte: | ||
+ | |||
+ | <code c> | ||
+ | int wert_steigt = 1; | ||
+ | #define HYSTERESE 20 | ||
+ | #define SCHWELLWERT 613 | ||
+ | </ | ||
+ | |||
+ | // | ||
+ | |||
+ | // | ||
+ | |||
+ | Grafisch dargestellt sieht das so aus: | ||
+ | |||
+ | {{: | ||
+ | |||
+ | Zusätzlich definieren wir noch unseren Schwellwert, | ||
+ | |||
+ | <note tip>Wie wir auf diese Werte kommen wird [[uc-welt: | ||
+ | |||
+ | Wer sich traut, darf jetzt gerne selber versuchen, den Code zu schreiben. Für alle anderen folgt hier die Lösung: | ||
+ | |||
+ | <code c kapitel11_schwellwert_hysterse.ino> | ||
+ | #define LED_ROT 13 | ||
+ | #define LED_GRUEN 11 | ||
+ | #define ANALOGPIN A0 | ||
+ | #define HYSTERESE 20 | ||
+ | #define SCHWELLWERT 613 | ||
+ | |||
+ | int wert_steigt = 1; | ||
+ | int messwert = 0; | ||
+ | |||
+ | void setup() | ||
+ | { | ||
+ | pinMode(LED_ROT, | ||
+ | pinMode(LED_GRUEN, | ||
+ | pinMode(ANALOGPIN, | ||
+ | if(analogRead(ANALOGPIN)< | ||
+ | { // Der Wert ist im grünen Bereich, kann also steigen | ||
+ | wert_steigt = 1; | ||
+ | digitalWrite(LED_ROT, | ||
+ | digitalWrite(LED_GRUEN, | ||
+ | } | ||
+ | else | ||
+ | { // Der Wert ist im roten Bereich, kann also fallen | ||
+ | wert_steigt = 0; | ||
+ | digitalWrite(LED_ROT, | ||
+ | digitalWrite(LED_GRUEN, | ||
+ | } | ||
+ | } | ||
+ | |||
+ | void loop() | ||
+ | { | ||
+ | messwert = analogRead(ANALOGPIN); | ||
+ | // Lieber mehr Klammern setzen als zu wenig, so ist die Reihenfolge sicher definiert: | ||
+ | if((wert_steigt == 1) && (messwert > (SCHWELLWERT + HYSTERESE))) | ||
+ | { // Wenn der Wert >613 ist, wird folgender Code ausgeführt: | ||
+ | digitalWrite(LED_ROT, | ||
+ | digitalWrite(LED_GRUEN, | ||
+ | wert_steigt = 0; | ||
+ | } | ||
+ | else if((wert_steigt == 0) && (messwert < (SCHWELLWERT - HYSTERESE))) | ||
+ | { // Ansonsten wird dieser Code hier ausgeführt: | ||
+ | digitalWrite(LED_ROT, | ||
+ | digitalWrite(LED_GRUEN, | ||
+ | wert_steigt = 1; | ||
+ | } | ||
+ | else | ||
+ | { // nichts tun | ||
+ | } | ||
+ | } | ||
+ | </ | ||
+ | |||
+ | Wir fassen noch einmal zusammen was das Programm macht: | ||
+ | |||
+ | * In der setup()-Routine wird der Eingang ausgelesen um zu entscheiden, | ||
+ | * 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 " | ||
+ | * 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: |