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

  • Hier geht es zum --> Teil 2.

    Hier ist Teil 1:

    Vorwort:

    Das alte Tutorial wandert bald ins Archiv, da ich hier ein neues mit einigen Verbesserungen schreibe.

    Verwendung findet weiterhin ein Zero2W, ein BME280, ein MCP3208 und ein 8-Kanal-Relaisboard. Als OS habe ich hier Bullseye mit PHP 8.

    Ich verwende hier nur die ersten 3 Kanäle des MCP3208 und nur die ersten beiden Relais. Die weiteren Kanäle und Relais kann man nach dieser Anleitung hoffentlich selbst belegen.

    Diese Anleitung ist für eine 12 Voltbatterie an Kanal 0, die 5-Voltspannung des Raspberrys an Kanal 1 und eines 7s-Li-Ion-Akkus an Kanal 2, mit max. 15 Volt Eingangsspannung für die 12 Voltbatterie an Kanal 0, maximal 5,4 Volt für die Spannung des Raspberrys an Kanal 1 und maximal 30 Volt für den 7s-Li-Ion-Akku an Kanal 2. Die Werte hängen letzen Endes aber von der Auswahl der Spannungsteiler an den Eingängen des MCP3208 ab.

    Habt ihr nur ein 2er-Relaisboard, könnt ihr euch die Einträge Relais 3 bis 8 sparen.

    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.

    Achtung:

    Niemals dürfen mehr als 3,3 Volt am MCP3208 ankommen, bei höheren Spannungen immer mit Spannungsteilern arbeiten.

    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.

    Hauptteil:

    Ich benutze hier den GPIO BCM 18, um das Relais1 zu schalten und GPIO BCM 23 für Relais 2, wie z.B. hier zu sehen ist.

    Relais 3-8 sind an BCM GPIO 24,25,12,16,20 und 21.

    Leider gibt es unter Bullseye den Befehl gpio readall nicht mehr. ¯\_(ツ)_/¯

    Aber hier gibt es ein Script, das mit pigiod läuft.

    Zuerst öffne ich mit sudo crontab -e den crontab von root und erzeuge damit schon beim boot die nötigen Dateien im RAM, damit sie vorhanden sind und ändere die Rechte der Dateien, damit sie dem User pi gehören und die SD-Karte nicht kaputtgeschrieben wird.

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

    Hinweis:

    Die vielen Dateien sind nötig, da wir später auch auf der Webseite sehen können, wie der aktuelle Zustand der Relais ist, wann diese zuletzt geschaltet wurden.

    Zudem wird dort die Temperatur, der Luftdruck und die Luftfeuchtigkeit angezeigt und wann diese Werte zum letzten Mal gemessen wurden.

    Desweiteren werden wir eine weitere Webseite erstellen, auf der wir die Einstellungen einsehen können, z.B. in welchen Intervallen die Spannungen an den einzelnen Kanälen des MCP3208 gemessen werden und in welchem Intervall der BME280 ausgelesen wird.

    Nachdem die crontab von root bearbeitet wurde, nehmen wir uns nun die crontab des Users pi vor, indem wir sie mit crontab -e aufrufen.

    Dort sorgen wir dafür, dass alle Relais beim Start des Systems erst einmal ausgeschaltet werden und die Python-Scripte für den BME280 und den MCP3208 gestartet werden:

    Nun müssen wir die Dateien erzeugen, welche beim nächsten Systemstart aufgerufen werden.

    Beginnen wir mit Relais 1, indem wir mit nano /home/pi/relais1_aus.py eine Datei erzeugen:

    Python
    #!/usr/bin/env python3
    from RPi import GPIO as gpio
    gpio.setwarnings(False)
    gpio.setmode(gpio.BCM)
    gpio.setup(18, gpio.OUT)
    gpio.output(18, gpio.HIGH)
    with open('/dev/shm/relais1_status.txt', 'w') as relais1:
        relais1.write('1')

    Dieses Script wird gleich nach dem Start aufgerufen und sorgt dafür, dass Relais 1 an BCM GPIO 18 ausgeschaltet ist, denn auch wenn das Relaisboard erst schaltet, wenn der entsprechende GPIO auf LOW gezogen wird, ist der GPIO-Status vorher nicht definiert, man erkennt das am leichten glimmen der LEDs auf dem Relaisboard.

    Nach Aufruf der Datei erlischt die LED auf dem Board, somit ist der Status definiert und das Relais 1 ist definitiv aus.

    Zusätzlich wird der Status in der sich im RAM befindlichen Statusdatei eingetragen, hier eine "1" für "aus".

    Die Datei muss jetzt nur noch mit chmod +x /home/pi/relais1_aus.py ausführbar gemacht werden.

    Das gleiche machen wir mit nano /home/pi/relais1_an.py zum anschalten des ersten Relais:

    Python
    #!/usr/bin/env python3
    from RPi import GPIO as gpio
    gpio.setwarnings(False)
    gpio.setmode(gpio.BCM)
    gpio.setup(18, gpio.OUT)
    gpio.output(18, gpio.LOW)
    with open('/dev/shm/relais1_status.txt', 'w') as relais1:
        relais1.write('2')

    Hier wird der GPIO 18 auf LOW gezogen, damit schaltet das Relais 1 an, außerdem wird eine "2" für "an" in die Statusdatei eingetragen.

    Auch hier wieder speichern mit Strg + x und anschliessend ausführbar machen mit chmod +x /home/pi/relais1_an.py, dieses Spielchen wiederholen wir jetzt für alle weiteren Relais, je nachdem, wieviele Relais euer Relaisboard hat, bei mir sind es 8 Relais.

    Kommen wir zum MCP3208, zum auslesen des SPI benötigen wir diese Datei, welche wir 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

    Diese Datei wird dann von unseren Kanalauslesescripten benutzt, um das SPI auszulesen.

    Jetzt legen wir das Script an, das liest uns Kanal 0 des MCP3208 aus und schaltet Relais 1 an oder aus, je nachdem, wieviel Spannung anliegt.

    nano /home/pi/ch0.py

    Die ganzen print() kann man alle mit einem # auskommentieren, sobald man sich überzeugt hat, dass das Script seine Arbeit verrichtet, es ist aber auch kein Beinbruch sie drin zu lassen.

    Wichtig ist aber das ausführbar machen mitchmod +x /home/pi/ch0.py.

    Das gleiche machen wir jetzt noch für Kanal 2, an dem der 7s-Li-Ion gemessen wird:

    Wie man sieht, ist das Script weitgehend identisch, bis auf die geänderten Kanäle und dem Umrechnungsfaktor für den MCP3208.

    Speichern mit Strg+x, ausführbar machen mitchmod +x /home/pi/ch2.py.

    Nun benötigen wir noch die Dateien mit den Ein- und Ausschaltspannungen.

    nano ausschaltspannung_ch0.txt

    Hier tragen wir einen realistischen Wert ein, bei dem das Relais 1 die Last ausschalten soll, je nachdem wie leer die Batterie werden darf, z.B. zwischen 13.40 und 11.80 Volt, ich nehme mal 12.80 Volt als Beispiel, speichern mit Strg+x.

    Das gleiche mit Kanal 2 und Relais 2:

    nano ausschaltspannung_ch2.txt

    Da es bei mir ein 7s-Li-Ion-Akku ist, nehme ich als Beispiel 25.00 Volt als Abschaltspannung, um den Akku nicht zu sehr zu entladen.

    Jetzt legen wir fest, ab wann die Relais einschalten sollen.

    nano einschaltspannung_ch0.txt

    Ich nehme mal 14.00 Volt, speichern mit Strg+x.

    nano einschaltspannung_ch2.txt

    Sagen wir mal 29 Volt, da bei 7x4,2 = 29,4 Volt Ladeschlusspannung ist, speichern mit Strg+x.

    Für die Betriebsspannung des Pi an Kanal 1:

    nano /home/pi/ch1_.py

    Speichern und ausführbar machen.

    Auf hier können wir die print() auskommentieren, wenn alles läuft.

    Auch das /usr/bin/clear benötigen wir dann nicht mehr.

    Jetzt lesen wir noch die CPU-Temperatur aus und speicher sie in die RAM-Datei:

    nano /home/pi/cputemp.sh

    Bash
    #!/bin/bash
    /usr/bin/vcgencmd measure_temp | grep -o '[0-9].*[0-9]' > /dev/shm/cputemp.txt

    Speichern und ausführbar machen.

    Kommen wir zum BME280.

    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

    Irgendwo hier im Forum gibt es eine schönere Version des Scripts, mit korrekten Einrückungen, ich finde es auf die schnelle nicht, Hauptsache es läuft. :lol:

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

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

    Zeichenlimit erreicht, Ende Teil 1...

    Wie Frage ich nach Hilfe?

    Der despotische Bierbaron sagt: Kein Support per PN ! :angel::wink:

    Edited 10 times, last by fred0815: Script für CPU-Temperatur überarbeitet, damit es nur Zahlen mit Nachkommastellen ausspuckt. ().