Batteriespannung mit Python3 und MCP3208 überwachen, Last spannungsabhängig über Relais schalten, BME280 für Luftdruck, Temperatur und Luftfeuchte als Webseite anzeigen lassen

L I V E Stammtisch ab 20:30 Uhr im Chat
  • Dieses Tutorial ist veraltet und wandert bald ins Archiv.

    Die neuere Anleitung findet ihr hier:

    Teil 1 und Teil 2.

    Da ich mittlerweile einen Pi Zero W mit BME280 habe und auf den MCP3208 umgestiegen bin, hier ein kleines Tut für mich selbst als Gedankenstütze, ihr dürft natürlich auch gucken und Tips geben:

    Der Pi Zero W hat den Vorteil, dass man die Leitungen direkt anlöten kann, was einem Wackelkontakte erspart.

    Hardware:

    Relaisboard mit Optokoppler

    Das Board bzw. die Relais selbst laufen mit 5 Volt, die Optokoppler werden mit den 3,3 Volt des Raspberry angesteuert.

    BME280 3,3 Volt

    Die BME280 sind im Moment bissl teuer, aber das legt sich hoffentlich bald wieder.

    Ach der BME280 benötigt 3,3 Volt und GND, zudem die BCM GPIOs 2 und 3 für I2C.

    MCP3208

    Der MCP3208 könnte zwar auch mit 5 Volt arbeiten, da die GPIOs jedoch nur 3,3 Volt vertragen, betreiben wir ihn auch nur mit 3,3 Volt.

    Zum Betrieb des MCP3208 benötigen wir zusätzlich zu den 3,3 Volt und GND auch noch die BCM GPIOs 8, 9 ,10 und 11 für SPI.

    Der MCP3208 hat eine 12-Bit-Auflösung, wenn wir also an einen Kanal 3,3 Volt anlegen, bekommen wir den Wert 4095 geliefert. (0 bis 4095)

    Ich setze mal voraus, dass der Pi mit PiOS läuft, up to date ist und läuft, SPI und I2C mit raspi-config aktiviert wurde, deutsche Tastatur eingestellt ist, wir uns in /home/pi befinden und im Terminal als User pi angemeldet sind.

    Ich benutze hier den GPIO BCM 24, um das Relaisboard zu schalten, wie z.B. hier zu sehen ist, oder im Terminal mit gpio readall

    Zuerst erzeuge ich schon beim boot die nötigen Dateien im RAM, damit sie vorhanden sind und dem User pi gehören und die SD-Karte nicht kaputtschreiben.

    sudo crontab -e

    Code
    @reboot /home/pi/strom_aus.py
    @reboot touch /dev/shm/strom_status.txt && chown pi:pi /dev/shm/strom_status.txt
    @reboot touch /dev/shm/volt.txt && chown pi:pi /dev/shm/volt.txt
    @reboot touch /dev/shm/zeit.txt && chown pi:pi /dev/shm/zeit.txt
    @reboot touch /dev/shm/temperatur.txt && chown pi:pi /dev/shm/temperatur.txt
    @reboot touch /dev/shm/luftdruck.txt && chown pi:pi /dev/shm/luftdruck.txt
    @reboot touch /dev/shm/luftfeuchte.txt && chown pi:pi /dev/shm/luftfeuchte.txt
    ##############################################################################

    Mit Strg+x speichern, mit j bestätigen und Enter drücken.

    Das Script strom_aus.py wird ausgeführt, damit bei einem Stromausfall o.ä. die Last beim neu booten erst einmal aus bleibt.

    nano strom_aus.py

    Python
    #!/usr/bin/env python3
    from RPi import GPIO as gpio
    gpio.setwarnings(False)
    gpio.setmode(gpio.BCM)
    gpio.setup(24, gpio.OUT)
    gpio.output(24, gpio.HIGH)

    Mit Strg+x speichern, mit j bestätigen und Enter drücken.

    Ausführbar machen mit chmod +x /home/pi/strom_aus.py

    Da können wir auch gleich das Script zum anschalten noch machen:

    nano strom_an.py

    Python
    #!/usr/bin/env python3
    from RPi import GPIO as gpio
    gpio.setwarnings(False)
    gpio.setmode(gpio.BCM)
    gpio.setup(24, gpio.OUT)
    gpio.output(24, gpio.LOW)

    Mit Strg+x speichern, mit j bestätigen und Enter drücken.

    Ausführbar machen mit chmod +x /home/pi/strom_an.py

    Python-Spidev für den MCP3208 installieren:

    sudo apt install python3-spidev
    Ein Script mit nano MCP3208.py anlegen:

    Strg+x zum speichern, mit j und Enter bestätigen.

    Ausführbar machen mit chmod +x /home/pi/MCP3208.py

    Dann das eigentliche Script zum auslesen des MCP3208 und zum reagieren auf die unterschiedliche Spannung:

    nano mcp3208_auslesen.py

    Auch hier wieder mit Strg+x speichern, j und Enter.

    Ausführbar machen mit chmod +x /home/pi/mcp3208_auslesen.py

    Damit wird das Relaisboard bei unter 12,8 Volt ausgeschaltet und bei über 13.8 Volt eingeschaltet.

    sudo apt install python3-smbus um die Software für den BME280 bzw. smbus zu installieren.

    Das Script für den BME280:

    nano bme280.py

    Speichern mit Strg+x, mit j bestätigen und Enter drücken.

    Ausführbar machen mit chmod +x /home/pi/bme280.py

    In Zeile 26 und 28 ist bei mir der Umrechnungswert durch den Spannungsteiler 290,69 der muss angepasst werden, je nach dem, wie hoch die Spannung ist, die ihr messen wollt, aber keinesfalls dürfen mehr als 3,3 Volt beim GPIO ankommen.

    Mit ein wenig rechnen ganz einfach, beträgt die Ausgabe des MCP3208 z.B. 3718 und die angelegte Spannung vor dem Spannungsteiler ist 12,79 Volt, so ist 3718 / 12.79 = 290,69

    Jetzt noch einen crontab für pi anlegen:

    crontab -e

    Code
    * * * * * /usr/bin/python3 /home/pi/bme280.py
    * * * * * /usr/bin/python3 /home/pi/mcp3208_auslesen.py
    ##########################################

    Speichern mit Strg+x, mit j bestätigen und Enter drücken.

    Jetzt noch ein sudo reboot und wenn ich nichts vergessen habe, sollte es klappen.

    Installation des Apache2:

    sudo apt install libapache2-mod-php7.3, der Rest wird automatisch mitinstalliert, einfach j und Enter drücken.

    sudo nano /var/www/html/index.php

    Strg+x, mit j bestätigen, Enter.

    sudo nano /var/www/html/menu_style.css

    Strg+x, mit j bestätigen, Enter drücken.

    Jetzt könnt ihr noch ein favicon.ico hinzufügen und einen Unterordner /images/ in dem die bg.png (siehe Anhang) liegt.

    sudo mkdir /var/www/html/images

    Die Forensoftware erlaubt keine .ico als Dateiendung, also nach dem runterladen umbenennen oder selbst eines erstellen.

    Die Dateien www-data schenken:

    sudo chown -R www-data:www-data /var/www/html/

    Das ganze sollte dann so ausehen:

    Und weil man es nicht oft genug schreiben kann, niemals dürfen mehr als 3,3 Volt am GPIO ankommen.

    Wollt ihr höhere Spannungen messen, benötigt ihr einen Spannungsteiler.

    Dazu komme ich dann später mit einem Update zur Hardware.

    Hier lässt sich ein Spannungsteiler bequem online berechnen.

    Z.B. bei maximalen 15 Volt, die am Kanal des MCP3208 angelegt werden, könnte das so aussehen:

    Hier noch ein Bild der Verkabelung:

    Sorry für die schlechten Paintskills. ¯\_(ツ)_/¯


  • Batteriespannung mit Python3 und MCP3208 überwachen, Last spannungsabhängig über Relais schalten, BME280 für Luftdruck, Temperatur und Luftfeuchte als Webseite anzeigen lassen? Schau mal ob du hier fündig wirst!

  • Beitrag von SteepBrook64153 (1. Juli 2021 um 00:06)

    Dieser Beitrag wurde gelöscht, Informationen über den Löschvorgang sind nicht verfügbar.
  • Wenn du Fehlermeldungen bekommst, könntest du sie posten, dann könnte man nachvollziehen, warum.

    Zu der Zeile 2 # Woher ?, schrieb ich einen Schritt zuvor:

    Ein Script mit nano MCP3208.py anlegen

    Von daher kann es importiert werden, wenn die Datei nicht vorhanden ist und du bekommst eine Fehlermeldung, wenn das die IMPORT Fehlermeldungen sind, die du nicht zeigst.

    rpi.gpio als veraltet zu bezeichnen, nur weil die letzte Version 2 Jahre alt ist ?

    Das Pre-Release 0.70.1a4 ist vom März 2021, also mach nicht so, als ob es deprecated wäre.

    https://pypi.org/project/RPi.GPIO/#history

    python3-spidev 3.4 ist auch von 2019, auch veraltet ?

    Ansonsten steht es dir natürlich frei, ein besseres Tutorial zu schreiben.

    Für mich als Nichtprogrammierer ist es leider an der Grenze meiner Möglichkeiten.

    Zum Thema Hardware, steht im letzten Satz etwas mit ... später ... Update ... Hardware.

    • Offizieller Beitrag

    Es wäre günstig bei den Skripten strom_aus.py und strom_an.py auch nicht auf Modulebene zu arbeiten, sondern eine main() Funktion zu verwenden. Wegen Tutorial und nachmachen usw. :cool:

    So z.B.

    Das gleiche bei der bme280.py.

    Noch ein Tipp der Dir hilft die Übersicht zu behalten. Ab Python 3.6 gibt es f-Strings. Damit musst Du nicht mehr zählen und nummerieren, sondern kannst Variablen direkt in den Text einfügen. So wird z.B. aus

    Python: mcp3208_auslesen.py
    print("\nDie Batteriespannung ist wieder über {0} Volt, überprüfe ob es auch mehr als {1} Volt sind.\nDas Ergebnis ist eine Batteriespannung von {2:.2f} Volt.".format(MIN_VOLTAGE, MAX_VOLTAGE, voltage))

    das hier

    Python
    print(f"\nDie Batteriespannung ist wieder über {MIN_VOLTAGE} Volt, überprüfe ob es auch mehr als {MAX_VOLTAGE} Volt sind.\nDas Ergebnis ist eine Batteriespannung von {voltage:.2f} Volt.")

    ... als Überlegung für ein späteres Update.

  • Beitrag von SteepBrook64153 (3. Juli 2021 um 21:21)

    Dieser Beitrag wurde gelöscht, Informationen über den Löschvorgang sind nicht verfügbar.
    • Offizieller Beitrag

    Ich weis zwar nicht was du für eine System zu laufen hast, und welche alten Module sich darauf noch sammeln.

    Also mein Raspberry Pi OS ist aktuell und spidev, auf dem das Hilfsskript MCP3208.py oben basiert, war per default installiert.

    Code
    pi@avi:~ $ python3 -V
    Python 3.7.3
    pi@avi:~ $ pip3 freeze | grep spidev
    spidev==3.4

    Das 3.4 in der Ausgabe hat nichts mit der verwendeten Python-Version zu tun.


    Btw. gpiozero ist in der Raspberry Pi OS Lite Version nicht vorhanden, bzw. vorinstalliert.

  • Beitrag von SteepBrook64153 (4. Juli 2021 um 00:07)

    Dieser Beitrag wurde gelöscht, Informationen über den Löschvorgang sind nicht verfügbar.
  • Beitrag von SteepBrook64153 (4. Juli 2021 um 00:11)

    Dieser Beitrag wurde gelöscht, Informationen über den Löschvorgang sind nicht verfügbar.
    • Offizieller Beitrag

    Ich habe nicht von spidev geredet

    Nicht? Wovon hast Du dann geredet oder anders. Was war mit

    Ich weis zwar nicht was du für eine System zu laufen hast, und welche alten Module sich darauf noch sammeln.
    [...]

    bis zur Python Version 3.4. genutzt werden kann oder unterstützt wird

    gemeint? :conf:

    Ich habe nicht von spidev geredet , denn mit der Installation von GPIOZERO ist dieses bereits vorhanden !

    Vielleicht habe ich ja nur nicht gründlich genug gesucht. Zeige es mir mal bitte hier https://gpiozero.readthedocs.io/en/stable/_mod…es.html#MCP3008 oder an anderer Stelle! Das würde mich dann nun doch interessieren wo ich den import übersehen habe.

    //Edit: Vergiss diesen Teil, den habe ich gerade selber gefunden: https://gpiozero.readthedocs.io/en/stable/_mod…ro/pins/pi.html

  • Beitrag von SteepBrook64153 (4. Juli 2021 um 00:36)

    Dieser Beitrag wurde gelöscht, Informationen über den Löschvorgang sind nicht verfügbar.
  • Moin!

    Nur ganz kurz..

    Wie man hier , einem Hersteller des MCP 3208 nachlesen kann, falls man lesen kann, steht eindeutig geschrieben, dass die INPUT Spannung die ausgewertet werden soll, beträgt die maximale Eingangsspannung am Input Eingang 0,6 Volt + der Versorgungsspannung, bzw. wenn keine gesonderte Referenzspannung genutzt wird, über der Versorgungsspannung des Chips !

    Du hast ja, danke dafür, das Datenblatt mit angegeben. Kannst du dann auch die Seite bzw. den Originaltext zitieren?

    Danke!

    73 de Bernd

    Ich habe KEINE Ahnung und davon GANZ VIEL!!
    Bei einer Lösung freue ich mich über ein ":thumbup:"
    Vielleicht trifft man sich in der RPi-Plauderecke.
    Linux ist zum Lernen da, je mehr man lernt um so besser versteht man es.

  • Beitrag von SteepBrook64153 (4. Juli 2021 um 00:57)

    Dieser Beitrag wurde gelöscht, Informationen über den Löschvorgang sind nicht verfügbar.
  • Und meine Hauptkritik an diesem Beitrag geht dahingehend, dass ein MCP3208 ohne Schutzbeschaltung, selbst betreiben an PIN2 = 5 Volt, der möglicher Weise auch noch als Referenzspannung des A/D dient, nicht mehr als max. 7 Volt, bzw oder 0,7 Volt + Versorgungsspannung 5 Volt = 5,7 Volt ohne bleibende Schäden zu erfassen sind !

    Wer lesen kann, ist klar im Vorteil, ich zitiere mich mal selbst:

    Zitat

    Der MCP3208 könnte zwar auch mit 5 Volt arbeiten, da die GPIOs jedoch nur 3,3 Volt vertragen, betreiben wir ihn auch nur mit 3,3 Volt.

    In Zeile 26 und 28 ist bei mir der Umrechnungswert durch den Spannungsteiler 72,63 der muss angepasst werden, je nach dem, wie hoch die Spannung ist, die ihr messen wollt, aber keinesfalls dürfen mehr als 3,3 Volt beim GPIO ankommen.

    Mit ein wenig rechnen ganz einfach, beträgt die Ausgabe des MCP3208 z.B. 355 und die angelegte Spannung vor dem Spannungsteiler ist 4.9, so ist 355 / 4.9 = 72,4489

    Und weil man es nicht oft genug schreiben kann, niemals dürfen mehr als 3,3 Volt am GPIO ankommen.

    Wollt ihr höhere Spannungen messen, benötigt ihr einen Spannungsteiler.

    Hier lässt sich das z.B. bequem online berechnen, wie man einen Spannungsteiler aufbaut.

    Auch oben ergänzt und FETT hervorgehoben.

    BTW: @Kai_in_der_Kiste Wo sind denn jetzt die IMPORT Fehlermeldungen ?

  • Beitrag von SteepBrook64153 (5. Juli 2021 um 19:06)

    Dieser Beitrag wurde gelöscht, Informationen über den Löschvorgang sind nicht verfügbar.
    • Offizieller Beitrag

    Und meine Hauptkritik an diesem Beitrag geht dahingehend, dass ein...

    Das beantwortet nicht meine Frage auf:

    Nicht? Wovon hast Du dann geredet oder anders. Was war mit...


    Wer als Moderator nicht den Arsch in der Klamotte hat, dann auch mal das Wort "Sorry" zu verwenden, sondern lieber seinen eigenen Post manipuliert

    Es gibt an der Stelle keinen Grund für eine Entschuldigung Mod. hin oder her. Meine erneute Suche war halt erfolgreich und da habe ich meinen Beitrag editiert. Die normalste Aktion halt. Mehr ist dazu nicht zu sagen.

    An anderer Stelle habe ich mich geirrt und zwar hier:

    Btw. gpiozero ist in der Raspberry Pi OS Lite Version nicht vorhanden, bzw. vorinstalliert.

    Sorry dafür! Das war früher so und scheint mittlerweile nicht mehr der Fall zu sein.


    Ich gestatte mir jedoch die Frage , warum sie sich auf der einen Seite und in vielen Beiträgen für die Verwendung des neueren Systems "GPIOZERO" aussprechen, und nun , wohl aus persönlichen Ansichten / Gründen, oder Vorurteilen, hier einen Meinungswechsel betreiben ?

    Die Antwort ist leicht: Ich empfehle gpiozero wo es nur geht, weil ich das super finde. Nenn es ruhig missionieren, das trifft es ganz gut. Wenn ich aber merke, dass der entsprechende TO kein Interesse an diesem Modul hat, obwohl es imho besser ist als RPi.GPIO, dann lass ich es und starte keinen Kreuzzug inkl. Verurteilung des TO.


    Übrigens: Achte. auf. Deine. Wortwahl!

  • Moin!

    @Kai_aus_der Kiste

    Denn der A/D Wandler dieses Typs MCP 3xxx wird vom PI über das Busprotokoll SPI angesprochen. Und damit ist erst einmal der BUS-Master das PI. Das heißt aber auch, dass alle Signale die vom A/D Wandler zum PI wandern, oder übertragen werden, und das ist sowohl der Chipspezifikation zu entnehmen, und der Spezifizierung des SPI Standards, Signal und Spannungskonform zu PI sind.

    Mit dieser Aussage hast du recht, wobei "Spannungskonform" schon strittig ist.

    Egal mit welcher Betriebsspannung du, oder jeder andere den A/D Wandler betreibt, die Signale die via SPI zum PI haben immer die korrekten Spannungen.

    Du schreibst also, wenn ich den MCP3XXX mit 5V an Vdd betreibe, dann liegen an Dout tatsächlich 3,3V.

    Woher weiss der Baustein denn das er an einem SBC oder µC angeschlossen ist, der nur 3,3V ab verträgt und nicht an einem Controller der an den IO's mit 5V arbeitet? An der Spannung die an CLK oder Din liegen?

    Nicht nur hier, im Forum, sondern auch in der Arduinowelt wird bei 3,3V Sensoren zu einem Levelshifter gesprochen.

    73 de Bernd

    ps.:

    Ich weis immer noch nicht, was du hier laberst :?:

    Das muss doch auch nicht sein, oder?

    Ich habe KEINE Ahnung und davon GANZ VIEL!!
    Bei einer Lösung freue ich mich über ein ":thumbup:"
    Vielleicht trifft man sich in der RPi-Plauderecke.
    Linux ist zum Lernen da, je mehr man lernt um so besser versteht man es.

  • Ich weis immer noch nicht, was du hier laberst


    Der MCP hat keine getrennte Versorgung von Logik und Daten und auch keine interne Isolation, also jeder Spannungfehler am Chip kann und wird voll auf die SPI Datenleitungen durchschlagen, von daher scheint es erst mal technischer Unsinn zu sein wenn er schreibt:

    Du verstehen :?: SPI hat nichts mit Spannungen zu tun, die am A/D Wandler Eingang ankommen

    https://ww1.microchip.com/downloads/en/DeviceDoc/21298e.pdf

    VDD maximal 7V

    The MCP3204/3208 devices operate over a broad voltage range (2.7V - 5.5V)

    und Vref im Datenblatt immer maximal VDD auf Seite 2 und nie über VDD :!:

    also wenn der PI am SPI 3,3V erwartet dann muss der Chip auch an Vref 3,3V bekommen! ist Fakt

    und höhere Spannungen am AD Eingang werden dann nicht gemessen und/oder schädigen den Chip und ggffs. auch den PI.

    lasst die PIs & ESPs am Leben !
    Energiesparen:
    Das Gehirn kann in Standby gehen. Abschalten spart aber noch mehr Energie, was immer mehr nutzen. Dieter Nuhr
    (ich kann leider nicht schneller fahren, vor mir fährt ein GTi)

  • Beitrag von SteepBrook64153 (5. Juli 2021 um 22:20)

    Dieser Beitrag wurde gelöscht, Informationen über den Löschvorgang sind nicht verfügbar.
  • Beitrag von SteepBrook64153 (5. Juli 2021 um 22:24)

    Dieser Beitrag wurde gelöscht, Informationen über den Löschvorgang sind nicht verfügbar.
  • Moin!

    Da das Thema sowieso schon versaut ist...

    Die SPI-Slavekomponente, die mit 5 Volt betrieben wird, legt auch immer 5Volt an ihre Ausgänge. Woher soll das Bauteil auch wissen das es nur, in diesem Fall, 3,3Volt anlegen darf.

    Das bei dir noch nie was passiert ist, ist nicht massgebend.

    Es ist immer wieder schön zu sehen, wie andere Menschen, die mich nicht kennen, meinen Wissenstand beurteilen.

    73 de Bernd

    Ich habe KEINE Ahnung und davon GANZ VIEL!!
    Bei einer Lösung freue ich mich über ein ":thumbup:"
    Vielleicht trifft man sich in der RPi-Plauderecke.
    Linux ist zum Lernen da, je mehr man lernt um so besser versteht man es.

Jetzt mitmachen!

Du hast noch kein Benutzerkonto auf unserer Seite? Registriere dich kostenlos und nimm an unserer Community teil!