Wegen der Inkompatibilität der FastLED und WIFININA libraries möchte ich zwei Metro Mini via I2C verbinden, der eine übernimmt nur die WLAN-Kommunikation, der Andere alles Weitere.
Spielt es eine Rolle, ob man zuerst zum TX oder RX Teil hochlädt, bzw. nach dem asynchronen Hochladen die reset Knöpfe drückt, wenn man keinen Laptop anschließen kann, und keine Eingabe/Ausgabe über den seriellen Monitor hat?
Es kann beides gültig sein. Das hängt ganz davon ab, wie defensiv die Teile programmiert sind und was sie wann von der Gegenseite erwarten.
Im Übrigen senden und empfangen auch beim I2C-Bus beide Seiten Daten (mindestens das ACK-Bit).
Ok, ich folge diesem Beispiel. Vom master kommt in meinem Fall ein Mal pro Sekunde ein byte (CO2 Sensor) und alle drei Sekunden ein anderes byte (PM 2.5 Sensor), die der slave empfangen und dann via WLAN im gleichen Zeitabstand an ThingSpeak senden soll.
mit FastLED code auf dem Master verbinde, kommen die Werte beim Slave nur noch stotternd an. Die WLAN Übertragung habe ich gar nicht erst ausprobiert. Ist I2C also auch keine Möglichkeit der FastLED/WIFININA Inkompatibilität zu entrinnen?
Die Inkompatibilität kommt bei FastLED oft durch die Verwendung von Interrupts. Diese werden bei gesperrt um die engen Timings einzuhalten. I2C braucht genauso Interrupts
Dann will ich mal meinen Senf dazu geben.
Erstens:
Kein Serial.print begin(9600)!
Und schon gar nicht ein Serial.print() ohne das sich der Wert geändert hat! Du flutest Dir den Port.
Also mal ganz umgebaut:
Dein PIN 1 wird PIN A1.
Sowohl SerMon als auch Wire.write() kommt nur noch zum Einsatz, wenn sich der Wert geändert hat.
Und dann das #define weg.
Danke - schade, ich dachte einen zweiten uC zu verwenden (paßt noch in die Gehäuse der Installationen rein) der nur WLAN Übertragung macht, wäre ein Weg, dem FastLED/WIFININA Problem zu entkommen.
An diesem Pin ist testhalber ein Potentiometer angeschlossen. Die beiden Codes oben, genau wie ich sie hier einkopiert habe, funktionieren. Drehe ich am Potentiometer am Master, ändert sich die Blinkgeschwindigkeit am Slave von sehr schnell (100 ms) zu langsam (1000 ms).
Also sind meine beiden uC wohl nicht defekt und der Pin 1 scheint ok zu sein. Wenn ich 1 auf A1 ändere, ändert sich nichts. Es funktioniert (ohne FastLED, ohne WLAN) wie zuvor. Ich habe auch andere Metro Mini ausprobiert, mit dem gleichen Resultat.
Serial.print scheint auch normal zu funktionieren, denn im Serial Monitor sehe ich die Werte des Master bzw. Slave, ob ich am Potentiometer drehe oder nicht.
Das #defiine in eine Variablendeklaration zu ändern macht leider auch keinen Unterschied. Es funktioniert (ohne FastLED, ohne WLAN) wie zuvor.
Der Code, den Sie alternativ vorschlagen, funktioniert ebenso.
Danke, der Slave Code funktioniert auch, wie der alte, aber wenn auf dem Master FastLED benutzt wird, kommen auch mit Ihrem verbesserten Code leider nur Stotterwerte auf dem Slave an.
Es ist völlig egal, ob man analogRead(1) oder analogRead(A1) schreibt.
Man kann darüber streiten, was schöner ist, aber es bleibt dennoch gleichwertig.
also ein ESP ala NodeMCU oder WemosD1 hat meiner Meinung kein Problem mit Wifi und Fastled. Bevor ich da mit mehreren Controllern rummache würde ich einen Testen der alles kann.
Ich bin ganz Deiner Meinung, allerdings wurde dieser Vorschlag bereits im vorangegangenen Thema verworfen.
Leider finde ich hier im Thema nirgendwo Programmteile für FastLED oder habe ich was übersehen? Die Schnipsel hier mit den Verbesserungen von @my_xy_projekt funktionieren mit zwei UNOs prima.
Also denke ich mir selbst was aus, getestet mit zwei UNOs und WS2815:
Ich hatte zunächst je einen Metro Mini plus AirLift FeatherWing ESP32 verwenden wollen, aber FastLED/WIFININA vertragen sich nicht. Dann bekam ich den Hinweis es notfalls mit einem zweiten uC zu probieren, aber FastLED/I2C vertragen sich anscheinend auch nicht.
Ich habe in diversen Installationen (U-Bahn Station) bereits die Metro Mini (mit Dezibel Meßgerät und zwei Potentiometern, also drei Analogeingänge benötigt) plus AirLift FeatherWing ESP32 (für WLAN) Lösung verbaut. Ohne FastLED funktioniert alles, auch nach WLAN Ausfall, usw. Im Gehäuse ist gerade noch Platz für einen zweiten uC.
Ich habe hier ein Schema, wie alle Komponenten momentan verbunden sind.
Das Dezibel-Meßgerät gibt 0,6 - 2,6V aus, die in dB Werte von 30 - 130 umgewandelt werden. Die zwei Potentiometer dienen dazu, je nach U-Bahn Station die untere und obere Lärmschwelle einzustellen, damit stets alle 24 RGB LEDs ausgenutzt werden. Der RGB LED Ring ist hinter einer Fresnel-Linse angebracht und visualisiert die dB Werte. Die dB Werte werden per WLAN und MQTT zu AIO (alternativ ThingSpeak) übertragen.
Das funktionierte im ursprünglichen set-up (ohne Master/Slave, nur ein Metro Mini plus AirLift FeatherWing) auch gut, aber eben entweder ohne WLAN, oder ohne FastLED.
Ich bin bauraumbeschränkt nur in soweit, daß das, was auf dem Schema zu sehen ist, in das 3D-gedruckte Kunststoffgehäuse gerade so eben paßt.
Einen CO2 Sensor gibt es in diesem set-up nicht.
Es gibt je Station am anderen Ende ein zweites set-up mit einem SENSIRION SCD30 CO2 and RH/T Sensor und einem SENSIRION Particulate Matter Sensor SPS30 mit der gleichen Problematik. Mit WLAN die Daten übertragen - kein Problem. Parallel dazu einen NeoPixel Ring mit FastLED zu betreiben geht nicht.
Das Grundproblem ist also, daß die FastLED (und auch Adafruits NeoPixel library) und WIFININA library nicht kompatibel sind, und so kam es, nach einem Forenvorschlag zu der Idee, zwei uC zu verwenden, mit I2C verbunden, wobei der zweite uC nur für WLAN zuständig ist.
Wenn FastLED und WIFININA doch, irgendwie, problemlos zusammenarbeiten könnten, dann bräuchte es auch keinen zweiten uC und kein I2C.