Projekt-Erweiterung - Frage zu Machbarkeit bzgl. Hardware, u.a. I2C

Hallo zusammen :slight_smile:

Als schreibender Nutzer bin ich neu hier, habe aber aus div. Threads hier schon dutzende nützliche Informationen ziehen können - an der Stelle schonmal ein Danke an die Community hier :smiley: :slight_smile:

Alsooo wie folgt:

Ich habe eine Anzuchtbox gebaut mit Hilfe eines Arduinos. Gestartet mit einem Arduino Rev3, aufgrund Mangels an RAM aber dann - nach circa 4 Tagen Recherchen & Codeoptimierung, welche aber nicht zum abschließenden Erfolg führte - zum Rev4 Minima gewechselt.
An diesem angeschlossen ist folgende Hardware:

  • Datalogging-Shield (https://www.arrow.com/en/products/1141/adafruit-industries)
  • 2x 4fach-Relais-Modul (HLRELM-4 von Sertronics; darf als neuer Nutzer nicht so viele Links teilen)
  • CCS811-Sensor (von Joy-It; darf als neuer Nutzer nicht so viele Links teilen)
  • DHT11-Sensor (von Joy-It; darf als neuer Nutzer nicht so viele Links teilen)
  • Boden-Feuchtigkeitssensor (Iduino ME110, keine Herstellerseite gerade auffindbar)
  • über die Relais dann 1x Lüfterausgang für Anzuchtbox, 1x Lüfter für Kühlung Elektronik-Box, 3x verschiedene LED-Bänder, 1x Wasserpumpe & 1x 230VAC auf 24VDC-Netzteil
  • der Arduino wird über ein 12V-Steckernetzteil (1,5A) versorgt, diese 12V werden auch über die Relais an die beiden Lüfter-Ausgänge geschickt

Der Code hat inzwischen so einige Zeilen, aber ein Versuch der Zusammenfassung:

  • Libraries: SD.h, RTClib.h, DFRobot_CCS811.h, EEPROM.h & DHT.h
  • Ausgabe der IDE: 83968 Bytes (32%) für Sketch , 7184 Bytes (21%) des RAMs (mindestens..^^) belegt
  1. Setup: U.a. Initialisierung von allem, SD-Karte wird mit zwei Logdateien beschrieben, einmal für Sensorwerte & einmal für Log der geschalteten Relais.

  2. Loop:

  • Unterscheidung 'Tag-Modus' & 'Nacht-Modus'; Überprüfung aktuelle Uhrzeit, dementsprechend Überprüfung ob alles so geschalten, wie es soll, wenn nicht, wird geschalten inkl. Logging auf SD-Karte
  • Einholen aktueller Sensorwerte & Uhrzeit; Logging auf SD-Karte (& Output auf Serial für Wartungszwecke)
  • div. If's & While's, so dass 'tagsüber' Loop bei Sekunde Null der nächsten Minute neu startet & 'nachts' Loop bei Sekunde Null der nächsten Viertel Stunde neu startet; sprich 'intelligente' Wiederholung div. Delays - auch wenn die scheinbar weng verschrien sind :smiley:
  1. Extra Funktionen für Serial-Ausgabe bei SD-Error, und Aktualisierung verschiedener chars[] für Timestamps.

Nun zu meinen 'Challenges' & Ideen:

Ich muss jeweils aktuell den Sketch anpassen, Arduino neu programmieren (was Neustart & erneuter Durchlauf Setup bedeutet..), wenn ich die Zeiten für 'tagsüber' & 'nachts' neu definieren mag.
Ebenso muss ich dies tun, wenn ich die Einschaltdauer für die Wasserpumpe anpassen mag.
Und, ich muss jedes mal die SD-Karte ziehen ('Hot-Swappable' ist im Code) um aktuelle Sensorwerte oder aber meinen Laptop an Arduino hängen um die Serial-Outputs zu sehen.

Ich habe daher die Idee über I2C (per Ethernet-Patchkabel) eine zweite kleine Box anzuschließen, die zum einen einen 'Port Expander' beinhaltet, paar Taster, Schalter & LEDs und zum anderen ein LCD-Display.
Die Produkte wären:
MCP23017: MCP23017 Serielles Interface Modul kompatibel mit Arduino
LCD-Display: HD44780 1602 LCD Modul Display Bundle mit I2C Schnittstelle 2x16 Zeich

An dem MCP23017 würde ich gerne verschiedene Buttons anschließen, 6x für 'Wert +/-1; +/- 10; +/-100', für 'Hoch', 'Runter' und 'Enter'. Zusätzlich zwei Schalter & zwei LEDs.
Der eine Schalter [1] soll - zwecks Stromsparen - das Display erst aktivieren oder deaktivieren. Der andere Schalter [2] soll - auch zwecks der Delays in meinem Code - ermöglichen eine extra while-Schleife am Anfang meines Loops zu 'betreten', so dass ich Einstellungen bzw. Werte anpassen kann, und sobald dieser Schalter wieder umgelegt wird, läuft der Loop einfach ganz normal durch, ohne irgendwas besonderes.
Auf dem Display will ich - solange Schalter [1] umgelegt - aktuelle Werte anzeigen lassen. Zusätzlich - solange Schalter [1] & [2] umgelegt - will ich die Möglichkeit haben mit Hilfe der Buttons verschiedene Werte, wie z.B. Einschaltdauer Wasserpumpe oder Defintionen für wann 'Tag' & 'Nacht' ändern können.
Die LEDs sollen mir nur anzeigen, wann ich die SD-Karte ziehen kann (sprich, wo ich mich im Loop befinde), so dass ich nicht mehr gespannt & konzentriert warten muss (ggf. halt eine Minute oder falls kurz geblinzelt auch paar mehr^^) muss, bis kurz die LEDs auf dem Datalogging-Shield aufgeblinkt haben und ich die knapp 58 Sekunden Zeit ('tagsüber') habe.

Hier die erste Frage:

  • Ist es möglich die beiden Teilnehmer zusätzlich auf den I2C-Bus hängen? Bisher sind da der CCS811 und das RTC-Modul drauf. I2C-Adressen habe ich schon recherchiert und wäre zumindest von der Seite möglich. Mit dem Ethernet-Kabel habe ich auch keine Bedenken, der CCS811 kriegt über 3,5mm-Buchsen und eigens gelötetem 3x0,75² Kabel über Distanz von knapp 2-3m (scheinbar :smiley:) ausreichend stabile Verbindung hin.

Das Display, die Buttons & LEDs würde ich gerne mit auf die 5V vom Datalogging-Shield (/ Arduino) hängen. Die Inputs für die Taster würde ich per Software mit Pull-Widerständen versehen.

Nächste Frage:

  • Wird das da schon langsam problematisch mit der Stromversorgung über die 5V vom Arduino? Sprich, muss ich sonst die 12V mitnehmen und mit Widerständen o.ä. dann auf die Inputs/Outputs des MCP23017?

Und abschließend die Fragen:

  • Ist das Codetechnisch so möglich, dass ich z.B. eine While (Schalter[2] auf high)-Schleife an den Anfang des Loops setze und dann da drin mit Hilfe des Displays meine Werte anpasse?
  • Ist es Hardware- & Softwaretechnisch möglich, das Display ein- & auszuschalten, ohne dass z.B. der I2C-Bus Faxen macht, weil der Teilnehmer nicht mehr da, oder kann ich da die 5V an dem Display z.B. nur wegnehmen?

Ist möglicherweise alles bisschen viel & ggf. zu detailliert, aber denk mir, lieber gleich alles wovon ich denke, dass es wichtig ist, hinschreiben ;-D Und habe zwar lehrreiche & interessante Erfahrungen durch Try&Error beim bisherigen Aufbau sammeln können, habe aber das Gefühl, dass das gerne ein wenig weniger werden darf - zusätzlich dazu würde ich bei gefühlter Reife des Projekts (bin bei meinem Changelog für mich inzwischen bei Version 2.5 :smiley:) dieses dann hier auch gerne teilen, so dass andere ggf. etwas mitnehmen können (oder ggf. natürlich auch ich zusätzlichen Input kriege).

Ich danke vielmals im Voraus,

rnddude

I2C ist kurz strecken Bus 2 m sind schon heftig. Dazu kommt das Patchkabel hat ziemlich große Kapazität, was macht die Sache noch schlimmer.

Immer schön eines nach dem anderen. Wenn du jetzt eh schon 2 Arduinos rumliegen hast, kannst du die "Fenleitung" auch über UART mit niedriger Baudrate realisieren. Dein Arduino soll nichts anderes als sich selbst mit Strom versorgen. Brauchst du 5V mit unbekannter Leistung nimm einen Spannungsregler.

Was du da mit deiner loop() vor hast, geht def. in die Hose.
Eine Loop ist eine Schleife, die in diesem Fall immer durchlaufen muss.
Wenn es richtig funktionieren soll, dann ohne delay().
Du brauchst einen Coder der sich nicht blockiert, z.B ein "endlicher Automat".

Und noch als Hinweis:
Module die per I2C gesteuert werden, darfst du nicht einfach abschalten. Da musst du im Bus einige Vorkehrungen treffen.
Wozu auch das Abschalten ?

Mein Vorschlag:
umsteigen auf einen ESP32

  • genug RAM
  • Daten gleich per UDP oder TCP an einen Rechner senden oder bei Bedarf vom ESP32 per WiFi an den PC senden lassen.
  • eigenes Webinterface per ESPUI-library wo du deine ganzen Einstellwerte nach Lust und Laune ändern kannst. Mit jedem browserfähigen Gerät = Handy, Tablet, PC

Nö, besser, weil für größere Entfernungen und mit eingebauter Überprüfung (CRC), wäre Arduino UNO R4 Minima CAN Bus geeignet.

Da bin ich bei Stefan, das könnte ein ESP32 sein, der hat CAN Bus und Funk eingebaut. Ein MCP23017 paßt da auch dran, wenn denn gewünscht.

Bislang habe ich auf dem ESP32 HTML-Dateien abgelegt wie beispielsweise diese:

Damit kann ich dann die Animation wählen und die Parameter einstellen. Dies basiert auf den Tabs von Fips.

Nur so als Anregung, Knöpfe und LEDs gehen aber auch :slightly_smiling_face:

Also danke zunächst für die Antworten =)

Da auch für mich gerade 'eins nach dem anderen' anzuwenden ist.. :smiley:

An fony: Das ist mir selber auch bekannt, auch dass das ganz und gar nicht der eigentliche Sinn & Zweck von I2C ist. Ich kann nur sagen, dass es mit dem Bestand und dem CCS811 funktioniert.
Bzgl. des Patchkabels, Kapazitäten etc - auf die Idee kam ich über ein anderes Forum:
https://forums.raspberrypi.com/viewtopic.php?t=82049
Da wurde fröhlich diskutiert & sich ausgetauscht und hab mir gedacht, dass ich zumindest - wenn schon nicht beim CCS811 [beim Aufbau etc war mir auch gar noch nicht bewusst, dass der mit I2C funktioniert.. nur so.. Aufgelötet nach Tutorial und beim Coden etc dann irgendwann die Information mitbekommen :smiley:] - dass dann dort 'besser' machen könnte. Zumindest halt insofern besser, dass bisschen nach Methode Legacy und funktionierenden Bestand nutzen. Darüber hinaus will ich es nicht wie z.B. in dem Thread es Leute über Cat5E-Kabel und Switches "on Steroids by P82B96 :smiley:) xx Meter durchs Haus umeinander schicken; ich will da 0,3m bis 1m Patchkabel benutzen. Hat auch den netten Vorteil, dass ich nicht noch zusätzlich ein weiteres 'Spezialkabel' mit extra Steckern löten muss (soll alles auf- & abbaubar bleiben) uuund ich ggf. 12V mitschicken kann. RJ45-Buchse mit Lötpins in die beiden Gehäuse und 'jut ist' (hoffentlich, aber daher ja hier mit diesmal weng Rückfragen etc :smiley:).

An zwieblum & agmue: UART & CAN fallen leider flach, auf dem Arduino habe ich keine Pins mehr frei außer glaube A0.

An zwieblum: Verstehe die Aussage mit den 5V nicht ganz. In jedem Tutorial etc kriegen doch z.B. Taster & LEDs ihre 5V-Spannung vom Arduino? Und deine Aussage mit 'Arduino soll nichts anderes als sich selbst versorgen' versteh ich dem gegenüber als Widerspruch. Meine Frage war ob ich zusätzlich zu den Sensoren & den 2 Relais-Modulen auf der 5V (& 3,3V vom Shield)-Linie vom Arduino noch die 2 Geräte mit den Tastern & 2 LEDs anhängen kann. Da mag ich ja keine Lasten in dem Sinne dran hängen.

An HotSystems: Ich weiß nicht, ob ich mich da unklar ausgedrückt habe, aber der Code mit dem loop() und im Speziellen der Aufbau mit den verschachtelten Delays ist so im Bestand und funktioniert auch seit knapp 8-9 Tagen problemlos, seit 5-6 Tagen 24/7..
Die diesbzgl. Frage war, ob ich da dann quasi am Anfang des (sich wiederholenden) Loops eine (ja, dann endlose, wenn Schalter[2] nie zurück umgelegt wird) While-Schleife einbauen kann, in der der Arduino so lange bleiben wird und ich Werte von Variablen ändern kann. Solange halt, bis ich den Schalter[2] wieder umlege, und die Bedingung der While-Schleife nicht mehr wahr ist und somit der Loop einfach weiter läuft.
Edit Nachtrag: Dass der ggf. im Delay von einer Minute 'tagsüber' oder 15 Minuten 'nachts' hängt und dann beim neuen Loop erst checkt, dass ich was machen will, ist mir bewusst.

Und das Abschalten des Display - wie in nur einem der ca. 827 Sätze in meinem Beitrag nur nebenbei geschrieben, sorry :smiley: - nur gedacht zwecks Stromsparen; zusätzlich wegen ggf. Nerven eines leuchtenden & sich ständig aktualisierenden Displays. Der ganze Aufbau läuft 24/7, und hab auch alles hinter extra Stromzähler eingesteckt.

An StefanL38, agmue & zwieblum: Potenzial für Optimierung sehe ich an anderen Stellen auch so einige, aber ich mag das Ganze bisschen minimal und so auch funktional aufrecht erhalten - auch da Pflänzchen bereits gedeihen. Für die Zukunft hab ich schon was gelernt auf jeden Fall. Habe mir nach dem Kauf des Rev4 Minima auch gedacht, dass ich doch gleich die Rev4 Wifi hätte nehmen können, aaaaaber nun gut.
Ich mag es zumindest jetzt erstmal vermeiden, dass ich 2 Geräte laufen hab, oder auf anderes Board wechseln. Auch wenn das mit Wifi & Html etc auch bestimmt schick wäre, mag ich so ein Gerät darüber hinaus nicht direkt in mein Heimnetzwerk lassen, wenn es nicht sein muss.

--

Die Frage ob mit I2C so machbar ist, rührt z.B. daher, da eigentlich ja Daisy-Chain nach Standard vorgesehen ist. Irgendwie auch parallel möglich (so wie ja eigentlich in meinem Bestand mit dem RTC-Modul auf dem Shield und meinem CCS811), und irgendwie auch nach Standard, aber da ist für mich zu viel Spanisch in meinem Kopf. Ist halt dann wirklich ne Sternverkabelung..
Auch; der CCS811 hat fürs I2C z.B. angeblich Pull-up-Widerstände für den Standard verbaut, kein Plan ob auch das LCD & der Expander die haben, oder ob ich ggf. einfach einen mit einlöten kann ohne dass es schaden kann.
Hab da mal kleine Skizze angehängt:

Nachtrag nach Edit - kann 'als neuer Nutzer nicht mehrere Beträge erwähnen', also leider ohne Klickbare-Erwähnungen :smiley:

Ok, da ich deinen Sketch nicht kenne, kann ich auch nicht weiter darüber urteilen. Ich würde es def. ohne delay() und ohne While-Schleifen aufbauen. Und in deinem Display kannst du ja die Beleuchtung abschalten und evtl. einen Leerstring übergeben.

Bei der Nutzung von 2 Controllern musst du drauf achten, ob diese im I2C-BUS auch Master oder Slave sein können / müssen.

Ja, wie gesagt, ich habe auch paar Diskussionen über Delays (passiv) mitbekommen. Mein Gedanke war nur nach experimentieren mit z.B. millis(), warum ich das überhaupt versuche umzumodeln, da ich es für schlicht nicht notwendig halte, dass der CPU alle paar ms überprüft, ob schon die nächste Minute angefangen hat, wenn es auch reicht, dass z.B. alle Sekunde oder noch länger zu machen.
Ist halt jetzt nur neue 'Challenge' mit der Idee mit Display etc.

Ok, dann schau dir diesen Beitrag an und du wirst die meisten delays rausschmeißen.

Wenn du Relais auf +5V vom Arduino hängen hast mag das funktionieren, ist später dann ein Quell ewiger Freude. Taster sind egal. LEDs ... na ja, kommt halt drauf an welche LEDs - mancher verbraten auch schon mal 10W.

Also nehme ich auf jeden Fall schonmal mit, dass Display ausschalten keine Option ist - über Software (und dem Schalter) lässt sich die Beleuchtung abschalten und ggf. nur leere Anzeige.. Merci :slight_smile:

Mit I2C Controller, Master, Slave - mag heißen, oder wie werde ich da schlauer? Ich nehme auf jeden Fall an, der Arduino ist an sich erstmal der 'Controller' & 'Master'? Und ich sollte nun überprüfen, ob nicht nur der der CCS811 ein Slave ist, sondern auch LCD & Expander?

Und @zwieblum : 20mA, ca. 0,06W ;D Und 'später Quell ewiger Freude' heißt, dass das nicht lange gut gehen wird, weil der Arduino das eigentlich gar nicht mag und diese Relais-Module sozusagen weng Müll sind?

Da kommt es drauf an, welches Display und welche Library du da verwendest.
Bei einigen kannst du die Beleuchtung auch per Software schalten.

In deiner Schaltung hast du am LCD noch einen Microcontroller gezeichnet. Der sollte dann auch Slave sein, wie alle anderen Module auch.

Also die Library hab ich kurz schonmal durchforstet, und die bereitgestellte von AZDelivery kann das backlight seperat schalten - auch für den Hinweis danke ;D
Und auf meine Skizze ist das dieser MCP23017 für die zusätzlichen I/Os mit primär Tastern in der zweiten Box.

Und ich kann da auf den beiden Seiten und in den Datenblättern keine Hinweise über Slave o.ä. finden - kann man davon ausgehen, wenn die das so verkaufen und an sich mit nur Arduino und dem jeweiligen Gerät einzeln funktioniert? Oder bin ich da blind und such nur nach Stichwort 'Master' & 'Slave'?

Die MCP23017 sind generell Slave, deswegen steht das nicht extra dabei. (Die Schreiber gehen davon aus, dass das der Leser schon weiß)

Gruß Tommy

20mA ist kein problem, aber wenn die Spulen der Relais auch von den 5V vom Arduino gespeist werden sinf 20mA wohl nur im ausgeschalteten Zustand zu erreichen.

Alles klar, den MCP hatte ich als Controller gesehen.

Dann suche mal unter "i2c range extender" nach Verlängerungsmöglichkeiten für I²C.

Bei Sensoren kannst Du von I²C-Slaves ausgehen. Wenn Du aber zwei µCs miteinander verbinden willst, so muß der eine als Master und der andere als Slave agieren. Die mir bekannten µCs sind gerne Master. Da ich Rev4 Minima nicht kenne, mußt Du herausfinden, ob der auch I²C-Slave sein kann. Das kann an der Hardware oder mangelnder Softwareunterstützung durch Bibliotheken liegen.

Ja, aber in echten Projekten eher nicht. Der UNO R4 Minima weicht aber in der technischen Spezifikation stark von R3 ab, weshalb alle allgemeinen Aussagen von Dir zu hinterfragen sind. Beispielsweise lese ich "DC Current per I/O Pin 8 mA", viel weniger als beim R3!

Der UNO R4 Minima hat eine andere Stromversorgung (Buck Converter) als der R3, leider konnte ich keine Angabe zum maximalen Strom finden. Eventuell weiß @uwefed was dazu? Daher falle ich auf den Rat zum R3 zurück, verwende einen DC-DC-Wandler zur Stromversorgung der externen Elektronik. Alleine die Beleuchtung eines 20x4 LC-Displays ist für einen UNO-R3 schon grenzwertig. DC-DC-Wandler gibt es für verschiedene Stromstärken. Input- und Output-GND sollte verbunden sein.

Willst Du nur ein paar LEDs blinken lassen und schaffst das mit delay, ist das OK. Hast Du aber eine Kommunikation, wo Du auf Eingaben wartest, muß delay raus! Wenn bei einer Kommunikation zwischen µCs per I²C gerade per delay gewartet wird, während Daten reinkommen, hast Du einen Datenverlust oder der I²C-Bus wird blockiert. Daher nochmal mein Rat, delay muß raus!

Die gute Nachricht: delay ist überflüssig und kann ersetzt werden.

Laut Datenblatt vom UNO R4 Minima nur 8 mA je Pin!

Also zunächst wieder Danke für die Antworten, auch an @Tommy56 für den Hinweis.
Ich habe jetzt mal AZDelivery noch angeschrieben, ob deren I2C-Modul zum LCD als Master oder Slave auftritt.
Falls das gute Teil ein Slave sein sollte, bin ich dann auf dem richtigen Stand, dass z.B. die Sternverkabelung kein Problem darstellt?
Die Fraglichkeit über Funktion aufgrund von Distanz der Signale und möglicherweise notwendigen Extendern würde ich tatsächlich auf die Bank 'Theorie & Praxis können öfter mal auseinander liegen' schieben - auch aufgrund meiner Erfahrung dass meine Verkabelung mit dem CCS811 eigentlich gar nicht funktionieren dürfte.

Dann bezüglich der Maximal-Ströme auf den Pins. Sehr guter Hinweis, ich danke dafür.
Muss schon auch sagen, dass das v.a. beim Uno R4 schon irgendwie seitens Arduino irgendwie deutlicher kommuniziert werden könnte. In englischen Foren (auch hier) kann man da schon paar ernüchternde Storys lesen, aufgrund Angaben wie "Rückwärtskompatibel mit Shields" etc. Aber nun gut, wäre wahrscheinlich auch hier dann größere Diskussion, daher nur als Nebenkommentar gemeint.

Zum einen kann ich auf jeden Fall sagen, dass bei mir nichts außer die Relais-Module nennenswert Strom über die I/O-Pins fließen lassen.
Die Relais-Module ziehen 15-20mA und ich bin auf jeden Fall mehr als froh, dass hier bei mir noch nichts durchgeschmort ist - im Gegensatz zu anderen Nutzern, die vom R3 auf R4 gewechselt sind..

Ich würde der Einfachheit halber da einen zweiten MCP23017 in meine erste Box setzen und die Relais-Module an die I/Os des MCP23017 anschließen - die 'können' 20mA nach Angabe von AZDelivery.
Das Backlight des LCD will 15mA, ist somit auch in der Range.
Die zwei kleinen LEDs für die zweite Box werden sicherheitshalber welche mit 10mA - darf ruhig eh 'nur glimmen' und nicht wie z.B. wie die verbauten StatusLEDs des Arduinos gefühlt 50lm rausknallen :smiley:

Der Gesamtstrom, den der Spannungswandler vom R4 zur Verfügung stellen kann - nebst den 8mA max über I/Os - , soll wohl pi mal Auge "1W/Input-Spannung - 5V" sein. Mit dem Wissen dass bei mir Programmtechnisch nur begrenzt Relais gleichzeitig geschalten sein können, dürfte ich mit meiner Stromversorgung da 'well in range' sein.
Gedanken über seperates Netzteil habe ich auch, finde das nur nervig, dass der Arduino aufgrund des Spannungsfalls des Spannungswandler scheinbar keine 5V direkt annehmen kann (nur 6-24VDC), ich somit eigentlich ja dann zwei Spannungen (zusätzlich zu 12VDC, 24VDC & 230VAC bei mir) führen muss, wenn ich nicht über USB einspeisen mag.. Oder lieg ich da falsch?!

Es wird interessant sein, was sie antworten. Es ist Slave.

Gruß Tommy