Moin, ich möchte eine 868Mhz zu Wifi Bridge (MQTT) mit einem ESP8266 aufbauen. Aus Gründen der geringeren Stromaufnahme habe ich einen Attiny zusammen mit einem 868Mhz FM Sender und 3 AA Zellen mit in ein Feuchtraumschalter-Gehäuse gequetscht. Der Taster schaltet den Tiny ein, der sendet 3 mal hintereinander einen String mit einer ID und schaltet sich wieder ab. Ich hoffe mit dem Batteriesatz mehrere Jahre hin zu kommen. Dafür brauche ich nun ein Gateway zum MQTT Broker das ich mit einem ESP8266 bauen möchte. Der Sender sendet mit nur 4800 Baud, aber am Datenausgang des Empfängers liegt zu Zeiten bei denen kein Sender aktiv ist, digitales Rauschen an, d.h. eine gewöhnliche UART liest dort ständig Mist. Irgendwann kommen dann 8 mal Synchronzeichen STX, die Message, ETX, ne CRC und EOT, das 3 Mal hintereinander. Nun gibts in den Arduino Libraries die Funktion Serial.find() mit der ich nach einer Zeichenfolge SYN,SYN,STX suchen lassen könnte, man kann da auch ein Timeout angeben so das die Funktion auch zurück kommt wenn nichts zu Lesendes da ist, oder gar keine Daten kommen. Meine Frage ist: Ist die Funktion für das "Betriebssystem" des ESP blockierend, also Hängt sich das Ding WLAN-mäßig weg wenn es auf Eingabe serieller Zeichen wartet? Wenn ja, muß ich einen anderen Weg suchen... Gruß, Pille
Beitrag #6823355 wurde vom Autor gelöscht.
Handmade Beispiel:
1 | int readycount = 0; |
2 | String inputString = ""; |
3 | |
4 | void serialEvent() { |
5 | while (Serial.available()) { |
6 | // get the new byte:
|
7 | String suche = "SYN"; |
8 | char inChar = (char) Serial.read(); |
9 | if (inchar == suche.charAt(readycount)) |
10 | readycount++; |
11 | else
|
12 | readycount = 0; |
13 | |
14 | if (readycount > 0) |
15 | inputString += inChar; |
16 | if (readycount > suche.length() - 1) { |
17 | match = true |
18 | }
|
19 | }
|
Oder sowas, habe ich Mal bei etwas ähnlichem gebaut. https://hackaday.io/project/38134-attiny-rc-switch-to-serial-bridge
:
Bearbeitet durch User
Pille schrieb: > also Hängt sich das Ding > WLAN-mäßig weg nein. Dennoch, wenn du im Arduino Umfeld unterwegs bist, dann halte dich beim Einlesen von der seriellen Daten an dieses Tutorial: https://forum.arduino.cc/t/serial-input-basics-updated/382007
Pille schrieb: > Nun gibts in den Arduino Libraries die Funktion Serial.find() mit der > ich nach einer Zeichenfolge SYN,SYN,STX suchen lassen könnte Das setzt voraus, dass die Synchronisation des Empfängers auf die Bytegrenzen bereits gelungen ist, i.e. die Erkennung vom Startbit muss bereits funktioniert haben. Ein Empfänger kann aber genauso gut irgendetwas vom Rauschen kurz vorher als Startbit genommen haben und interpretiert dann das erste vom Sender kommende Startbit als Datenbit. So einfach geht es also nicht. Der Sender muss ein Synchronisationssignal senden, so dass die AGC vom Empfänger sich einpegeln kann und dann muss ausreichend lange ein Stop-Pegel folgen, so dass auf das nächste Start-Bit des Senders sicher synchronisiert werden kann. Erst dann geht es mit der eigentlichen Übertragung los.
Pille schrieb: > Ich hoffe mit dem Batteriesatz mehrere Jahre hin zu > kommen. Mit der Ruhestromaufnahme des ESP Chips und AA Zellen kommt man typischerweise auf 2 Monate. Hast du besondere Vorkehrungen getroffen, um die Ruhestromaufnahme der Schaltung erheblich weiter zu reduzieren? > 3 AA Zellen Haben frisch geladen zu viel Spannung. Ich nehme an, du hast einen geeigneten Spannungsregler dazwischen. Welchen? Pille schrieb: > Ist die Funktion Serial.find() ... blockierend? Schau in den Quelltext, das geht am einfachsten mit einer "richtgen" IDE. Oder in Github: https://github.com/esp8266/Arduino/blob/60fe7b4ca8cdca25366af8a7c0a7b70d32c797f8/cores/esp8266/Stream.cpp Wenn das die richtige Stelle ist, dann ruft Stream::find() die Methode Stream::timeRead() auf welche in ihrer Warteschleife wiederholt yield() aufruft. Das ist also OK, die Warteschleife wird deinen ESP nicht zum abstürzen bringen.
Stefan ⛄ F. schrieb: > Mit der Ruhestromaufnahme des ESP Chips und AA Zellen kommt man > typischerweise auf 2 Monate. Hast du besondere Vorkehrungen getroffen, > um die Ruhestromaufnahme der Schaltung erheblich weiter zu reduzieren? Der ESP8266 soll den Gateway für den batteriebetriebenen Sender geben - also keine Sorge wegen Ruhestrom ...
Stefan ⛄ F. schrieb: > Pille schrieb: >> Ich hoffe mit dem Batteriesatz mehrere Jahre hin zu >> kommen. > > Mit der Ruhestromaufnahme des ESP Chips und AA Zellen kommt man > typischerweise auf 2 Monate. Hast du besondere Vorkehrungen getroffen, > um die Ruhestromaufnahme der Schaltung erheblich weiter zu reduzieren? Moin Stefan, gerade erst aufgestanden? > >> 3 AA Zellen > > Haben frisch geladen zu viel Spannung. Ich nehme an, du hast einen > geeigneten Spannungsregler dazwischen. Welchen? > Lies doch bitte ganz einfach meinen Post noch einmal. Weder sitzt im Sender ein ESP noch sind die 4,5V zu viel. > Pille schrieb: >> Ist die Funktion Serial.find() ... blockierend? > > Schau in den Quelltext, das geht am einfachsten mit einer "richtgen" > IDE. Oder in Github: > > https://github.com/esp8266/Arduino/blob/60fe7b4ca8cdca25366af8a7c0a7b70d32c797f8/cores/esp8266/Stream.cpp > > Wenn das die richtige Stelle ist, dann ruft Stream::find() die Methode > Stream::timeRead() auf welche in ihrer Warteschleife wiederholt yield() > aufruft. Das ist also OK, die Warteschleife wird deinen ESP nicht zum > abstürzen bringen. Danke, das ist was ich wissen wollte..habs aber indessen anders gelöst (Schleife mit Serial.available) Gruß, Pille
noiasca schrieb: > Pille schrieb: >> also Hängt sich das Ding >> WLAN-mäßig weg > > nein. > Dennoch, wenn du im Arduino Umfeld unterwegs bist, dann halte dich beim > Einlesen von der seriellen Daten an dieses Tutorial: > https://forum.arduino.cc/t/serial-input-basics-updated/382007 Ok, danke werde ich lesen...bin aber schon fertig. Ich bin nur "notgedrungen" im Arduino Umfeld unterwegs. Gruß Pille
Wolfgang schrieb: > Pille schrieb: >> Nun gibts in den Arduino Libraries die Funktion Serial.find() mit der >> ich nach einer Zeichenfolge SYN,SYN,STX suchen lassen könnte > > Das setzt voraus, dass die Synchronisation des Empfängers auf die > Bytegrenzen bereits gelungen ist, i.e. die Erkennung vom Startbit muss > bereits funktioniert haben. Ein Empfänger kann aber genauso gut > irgendetwas vom Rauschen kurz vorher als Startbit genommen haben und > interpretiert dann das erste vom Sender kommende Startbit als Datenbit. > So einfach geht es also nicht. > Der Sender muss ein Synchronisationssignal senden, so dass die AGC vom > Empfänger sich einpegeln kann und dann muss ausreichend lange ein > Stop-Pegel folgen, so dass auf das nächste Start-Bit des Senders sicher > synchronisiert werden kann. Erst dann geht es mit der eigentlichen > Übertragung los. Es ist offensichtlich ausreichend "oft genug" ein asymmetrisches Zeichen zu senden auf das der UART sich dann irgendwann einklinkt. Ich sende wirklich nur 10x SYN (0x16, 0xe5 hatte ich auch, geht auch) und werte nur den Wechsel von SYN auf SOH aus... egal wieviele SYN da vorher gelesen wurden. Das funktioniert in der Praxis zu 100%. Ein Taster zum Einschalten der Hofbeleuchtung für ein paar Minuten ist aber auch nicht so mission critical das es sich lohnen würde da mehr Gehirnschmalz zu investieren. Im Zweifelsfalle drückt man halt nochmal.. Gruß Pille
Es kommt ja darauf an welches Modul man für 433Mhz nutzt. Welches ist es denn? Zum Beispiel die rcswitch Library feuert die ESP hauptinterrupts bei rauschen auf dem normalen Empfängern.. Das stört den ganzen Ablauf. Achja in meine Code sind noch Fehler, das habe ich einfach so im Texteditor zusammengeschrieben.. suche.charAt() sollte es heißen. Das ist aber nur ein Pseudo Beispiel.
:
Bearbeitet durch User
Philipp K. schrieb: > Es kommt ja darauf an welches Modul man für 433Mhz nutzt. Welches > ist es > denn? Ein unintelligentes Ding von Hope RF.. HM-R868S und den dazu passenden Sender HM-T868S. Davon waren noch einige in der Kiste. 433Mhz hat aber davon auch Keines. > Zum Beispiel die rcswitch Library feuert die ESP hauptinterrupts bei > rauschen auf dem normalen Empfängern.. Das stört den ganzen Ablauf. > Das wird auch bei dem von mir mittlerweile selbst geschriebenen Code so sein, aber Gott...die Uart empfängt mit 4800Baud, die CPU läuft mit 40Mhz... > Achja in meine Code sind noch Fehler, das habe ich einfach so im > Texteditor zusammengeschrieben.. suche.charAt() sollte es heißen. > > Das ist aber nur ein Pseudo Beispiel. Der Ampfnag läuft bei mir indessen zuverlässig, nebenbei schickt das Ding momentan Daten eines HDC1080 auf den MQTT broker und die kommen auch an. Der Tasterstatus wird noch nicht gesendet, weils den Code dafür noch gar nicht gibt, aber des ESP weiß "Bescheid", muß da noch weiter machen. Alledings bekomme ich am Broker nach dem periodischen Empfang der HDC1080 Werte jeweils einen Socket Error, da muß ich wohl nochmal forschen ob mir irgendwo eine Masche runtergefallen ist. Der Arduino-Editor der IDE ist eine Zumutung wenn man VI bzw. VIM gewöhnt ist... Gruß, Pille
Philipp K. schrieb: > Pille schrieb: >> VI bzw. VIM gewöhn > > in den heutigen Zeiten sollte man sich schon Nano gönnen. Ich gönne Dir ja Nano von Herzen, zumal wenn Du nicht seit den 80ern wie ich VI benutzt, aber auch nur vergleichbar zu diesem ist er bei Weitem nicht. Mit VI/VIM kann man zaubern, mit Nano nicht und das in der Arduino IDE ist ne Zumutung. Gruß, Pille
Pille schrieb: > Es ist offensichtlich ausreichend "oft genug" ein asymmetrisches Zeichen > zu senden auf das der UART sich dann irgendwann einklinkt. Wenn der UART vorher mit Rauschen gefüttert wurde, braucht er eine ausreichende Lücke, um richtig auf das gesendete Startbit zu synchronisieren. Was meinst du in dem Zusammenhang mit "asymmetrisches Zeichen"? Wenn man es richtig macht, funktioniert das Einklinken nicht irgendwann, sondern beim ersten Zeichen nach der Einpegelphase.
Wolfgang schrieb: > Pille schrieb: >> Es ist offensichtlich ausreichend "oft genug" ein asymmetrisches Zeichen >> zu senden auf das der UART sich dann irgendwann einklinkt. > > Wenn der UART vorher mit Rauschen gefüttert wurde, braucht er eine > ausreichende Lücke, um richtig auf das gesendete Startbit zu > synchronisieren. Was meinst du in dem Zusammenhang mit "asymmetrisches > Zeichen"? > Wenn man es richtig macht, funktioniert das Einklinken nicht irgendwann, > sondern beim ersten Zeichen nach der Einpegelphase. Ja. Mir ist die Funktionsweise des Empfängers mit AVR und der UART schon bekannt. Es funktioniert aber so wie ichs jetzt gemacht habe in der Praxis bei jedem Tastendruck auf die benötigte Entfernung problemlos. Warum soll ich da jetzt noch Arbeit reinstecken? VW baut auch keine besseren Autos nur weil prinzipiell besser ginge.. Gruß, Pille
Bitte melde dich an um einen Beitrag zu schreiben. Anmeldung ist kostenlos und dauert nur eine Minute.
Bestehender Account
Schon ein Account bei Google/GoogleMail? Keine Anmeldung erforderlich!
Mit Google-Account einloggen
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.