Forum: Mikrocontroller und Digitale Elektronik ESP8266 Serial.find, Serial.read usw..


von Pille (Gast)


Lesenswert?

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.
von Philipp K. (philipp_k59)


Lesenswert?

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
von noiasca (Gast)


Lesenswert?

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

von Wolfgang (Gast)


Lesenswert?

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.

von Stefan F. (Gast)


Lesenswert?

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.

von my2ct (Gast)


Lesenswert?

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

von Pille (Gast)


Lesenswert?

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

von Pille (Gast)


Lesenswert?

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

von Pille (Gast)


Lesenswert?

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

von Philipp K. (philipp_k59)


Lesenswert?

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
von Pille (Gast)


Lesenswert?

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

von Philipp K. (philipp_k59)


Lesenswert?

Pille schrieb:
> VI bzw. VIM gewöhn

in den heutigen Zeiten sollte man sich schon Nano gönnen.

von Pille (Gast)


Lesenswert?

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

von Wolfgang (Gast)


Lesenswert?

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.

von Pille (Gast)


Lesenswert?

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
Noch kein Account? Hier anmelden.