Hallo
Ich habe heute mal mein erstes Interrupt Programm geschrieben.
Habe für meinen Briefkasten eine abfrage gemacht. Wenn die Post da war bekomme ich eine Push- Nachricht auf mein Handy bei meiner Zeitungsrohr auch.
Das Programm läuft auch alles 100 pro.
Jetzt war nur das Problem wenn die Zeitung den Sensor dauerhaft drückt bekomme ich eine Push-Nachricht hintereinander.
Deswegen habe ich jetzt das Programm umgeschrieben mit Interrupt.
Der Interrupt springt aber nicht in das Unterprogramm
Hier mal der Sk
[#include <Pushover.h>
#include <ESP8266WiFi.h>
int d1 = 5; //OLED Pin
int d2 = 4; //OLED Pin
#define BUTTON 4
#define BUTTON1 5
volatile int buttonState = 0;
int buttonState1 = 0;
const char* ssid = "Repeater ";
const char* password = "00000000";
Pushover po = Pushover("000000000000","000000000000000000");//Zeitung
Pushover po1 = Pushover("00000000000000000","0000000000000000");// Post
WiFiClient espClient;
void setup() {
Serial.begin(115200);
pinMode(BUTTON, INPUT_PULLUP);
pinMode(BUTTON1, INPUT_PULLUP);
attachInterrupt(buttonState, TasterUnterbricht, CHANGE);
setup_wifi();
}
void setup_wifi() {
delay(10);
Serial.println();
Serial.print("Connecting to ");
Serial.println(ssid);
WiFi.begin(ssid, password);
while (WiFi.status() != WL_CONNECTED) {
delay(500);
Serial.print(".");
}
Serial.println("");
Serial.println("WiFi connected");
Serial.println("IP address: ");
Serial.println(WiFi.localIP());
}
void loop() {
buttonState1 = digitalRead(BUTTON1);
if (buttonState1 == LOW) {
Serial.println("pressed");
po1.setMessage("Button gedrückt!");
Serial.println(po1.send());
delay(300);
}
}
ICACHE_RAM_ATTR void TasterUnterbricht() { // Sobald der Wert am Pin ändert sich
buttonState = digitalRead(BUTTON);
if (buttonState == LOW) {
Serial.println("pressed");
po.setMessage("Button gedrückt!");
Serial.println(po.send());
delay(10);
}
}/code]
Ich weiß nicht warum das TasterUnterbricht nicht ausführt wir.
Könnte mir BITTE erklären was ich falsch gemacht habe?
Aber BITTE Step by Step
Gruß Bodo
vergiss den Interrupt, polle den Taster weiterhin. Nur musst du ihn so programmieren das er nicht retriggerbar ist. Also dein Programm erst auf erneuten Tastendruck hin reagiert. Dazu musste ihn entprellen und die Pegeländerungen auswerten. Stichwort: nicht nachtriggerbares Monoflop.
Andere Frage - gerade bei so zeitkritischen Dingen wie 'die Zeitung wird eingelegt' sollte ein Interrupt nun wirklich nicht nötig sein - wenngleich Dieser dann trotzdem funktionieren muß.
Mein Herangehen wäre gewesen, im alten Sketch (Den ohne Interrupt) die Flanke auszuwerten, und nicht, ob der Taster betätigt ist.
Also MERKEN, wie der Zustand vorhin war und bei Unterschied diese Flanke auswerten.
Dann kommt nämlich auch nur eine Nachricht - vll. nach einer halben Stunde, daß die Zeitung nicht ganz eingeworfen wurde und nass werden könnte - da sind dem Spieltrieb keine Grenzen gesetzt.
Mit Interrupt und ESP bin ich nämlich draußen - Da soll's aber Andere hier geben, Die Da Bescheid wissen.
Ok werde das mal versuchen mit dem Flanke auszuwerten.
Aber mich würde trotzdem interessieren warum das so nicht geht mit dem Interrupt.
Was hab ich das falsch gemacht oder vergessen zu machen.
Ich möchte ja gern dazu lernen.
Gruß Bodo
Bodo-Baller:
Aber mich würde trotzdem interessieren warum das so nicht geht mit dem Interrupt.
Was hab ich das falsch gemacht oder vergessen zu machen.
Ich möchte ja gern dazu lernen.
Habe das Problem nun auch und will das Thema wieder aufleben lassen.
Ich wollte über eine Photodiode mit dem Wemos D1 Wifi schnelle Impulse einlesen.
Lese diese über Interrupts "auf Flanke" ein und habe das Problem des "Prellens" wie der Themenstarter ?
Dachte, dass es an der Photodiode liegt und habe das Gleiche auf dem UNO probiert :
da funktioniert das mit den Interrupts ohne Probleme !
Um die Diode/Pegel etc. auszuschliessen, habe ich auf dem Wemos einen zyklischen DO programmiert und mit dem DI-Interrupteingang verbunden : gleiches Problem !?
Pinmode, andere Pins etc. habe ich durchprobiert.
Problem müsste somit am Wemos und der Interruptverarbeitung liegen...
Über die Ursache warum es bei dir nicht funktioniert kann man ohne code nur spekulieren.
Deshalb bitte den Code posten. "Schnelle Impulse" heißt was für eine Maximalfrequenz in Hz?
Einzelne Impulse von 2 femto-Sekunden Dauer wären einfach zu kurz. Ebenso wäre eine Frequenz von 100 MHz einfach zu hoch.
viele Grüße Stefan
Wenn mir einer sagt, daß er schon mit Interrupts auf dem Wemos D1 Wifi erfolgreich gearbeitet hat,
würde mir das genügen !
Ich habe extra einen zweiten Wemos bersorgt, um einen Defekt des Wemos Boards auszuschliessen.
Am Arduino UNO geht das mit den Interrupts und gleicher Diodenhardware ohne Probleme !
In den Foren wird häufiger von gleichen Problemen berichtet ( = Mehrfachauslösung des Interrupts ).
Aber Lösungen habe ich keine gefunden.
Ein einfaches Pollen des Einganges geht auch auf dem Wemos.
Eine Interruptverarbeitung mit Rücklesen eines eigenen Ausgang geht schon nicht ( was die Diodenhardware auschliesst ).
Meine Dioden-Shield hat am Arduino Uno mit Interrupt ohne Prellen funktioniert !
Danach hatte ich mir einen einzelnen Ausgang vom Wemos auf den Interrupteingang gelegt !
Das ging schon schief...
Entweder geht die Flankenerkennung nicht oder da ist etwas andere faul.
Den Interrupt habe ich übrigens gewählt, da ich mehrere Zähler parallel abfrage und
auch Daten per Wifi übertrage.
Die Impulse haben 5ms ( aus einem Stromzähler optisch abgegriffen ).
Da will ich nichts verlieren.
Aber selbst wenn ich den Code auf die 3 Zeilen minimiere, "prellt" das Ganze...
( Bei einem mechanischen Taster ist natürlich Interruptverarbeitung kontraproduktiv ... )
eriklaux:
Meine Dioden-Shield hat am Arduino Uno mit Interrupt ohne Prellen funktioniert !
Der ESP8266 ist auch um einiges schneller, als der UNO. Evtl. erkennt der eine unsaubere Flanke als 2 Signale, was der UNO nicht schafft. Genau kann da nur ein Oszi helfen.
Wenn ich das "Entprellen" bei WEMOS entferne, habe ich bei Flankenwechsel ca. 300 Zählerinkremente !!
Wenn das Signal nicht wechselt, steht der Zähler und keine Interrupts werden ausgelöst.
Genau so ist es ja auch bei dem digitalen Ausgang des Wemos.
Da müsste ja das digitale Ausgangssignal dann auch schwanken ( was nicht minder schlecht wäre ).
Ich habe auch schon mit Eingangsbeschaltungen( = Widerständen ) rumgespielt.
Das scheint aber auch schon im Shield drin zu sein.
Ich wollte eigentlich keine Doktorarbeit daraus machen ...
Arduino Uno arbeitet mit 5V, Das Wemos D1 Mini mit 3,3V.
Könnte es sein das das Signal genau auf der Grenze zwischen LOW/HIGH rumwackelt?
Ein Oszilloskop wäre echt am besten. Wie sieht denn die Schaltungs aus? Kannst du mal einen Schaltplan posten?
Hast du 0815-Operationsverstärker im Hause? Damit könnte man mal einen Schmitt-Trigger mit Hysterese aufbauen.
Dann könntest du mal probieren wie es mit verschieden langen Impulsen ist.
Also gaaanz langsam mit 100 millisekunden anfangen und dann die Impulszeit immer halbieren um zu sehen ob es denn bei langen Impulsen auch so ist oder nur bei kurzen.
Die Beschaltung wie du das angeschlossen hast wäre schon interessant. Vielleicht fängst du dir EMV ein die auch noch Impulse erzeugt.
Anbei ein Bild von dem Lichtsensor, welcher mit 3.3 und 5V arbeiten soll und
für den Einsatz des LED-Impulszählens geeignet sein soll.
Der scheint am Wemos D1 R1 wirklich zu prellen.
Der Effekt, dass auch der programmierte digitale (Impuls-)Ausgang auf den Interrupt-Eingang ( D2 auf D12 ) innerhalb des Wemos prellt,
konnte ich nämlich plötzlich nicht mehr nachvollziehen !(?)
Kann mir das eigentlich nur mit Kontaktierung der einfachen Brücke(??) o.ä. erklären...
In anderen Foren wurde von Einstreuungen vom Wifi-Modul beim Wemos berichtet.
Aber das bezog sich auf den analogen Eingang.
Ich lasse die Interrupt-Entprellung erst einmal drin und vermesse den Lichtsensor
bei Gelegenheit mit dem Oszi.
Das er am Uno nicht geprellt hat, lässt sich u.U. wirklich mit der Prozessor-Geschwindigkeit erklären.