Van Zero naar Pico

Wanneer je iets specifieks wilt bereiken met het gepruts wat ik zoal doe, ben ik vaak lang onderweg. Veel zoeken op internet. Uitproberen en weer zoeken. Maar … inmiddels ben ik aardig handig geworden in het gebruik van AI. Over waar ik het op dit moment voor gebruik (mijn gepruts met Python en Raspberry Pi’s) ben ik er erg enthousiast over. Onderstaande is dan ook voornamelijk met behulp van Gemini tot stand gekomen.

Raspberry Pi Zero W
Raspberry Pi Pico 2 W

Ik wilde na mijn gerommel van de vorige keer, LEDs aangesloten op een Raspberry Pi Pico (PicoW) via UDP bedienen vanaf een website op een Raspberry Pi Zero (RaspiZero1). Globaal ziet dat er zo uit. Aan de PicoW hangt op dit moment een OLED, een tweetal LEDs (en nog geen motor). Aan de RaspiZero1 nog de LED-array (6 LEDs), waar ik nu even niets mee doe.

Op de Zero (192.168.2.65) draait weer de Flask-webserver met onderstaande Python-script.

from flask import Flask, render_template, request
import socket

app = Flask(__name__)

UDP_IP = "192.168.2.68" # Vervang door het IP-adres van je Pico
UDP_PORT = 8006 # Kies een poortnummer

@app.route("/", methods=["GET", "POST"])
def index():
    if request.method == "POST":
        led_status = request.form.get("led")
        print("led_status:", led_status) # Controleer de waarde van led_status
        if led_status:
            sock = socket.socket(socket.AF_INET, socket.SOCK_DGRAM)
            sock.sendto(led_status.encode(), (UDP_IP, UDP_PORT))
            print("UDP-pakket verzonden") #voeg deze regel toe
    return render_template("index.html")

if __name__ == "__main__":
    app.run(host="0.0.0.0", port=80) # Zorg ervoor dat de server toegankelijk is op je netwerk.

Met onderstaande index.html pagina.

<!DOCTYPE html>
<html>
<head>
    <title>LED Control</title>
</head>
<body>
    <h1>LED Control</h1>
    <form method="post">
        <button type="submit" name="led" value="led1_on">LED 1 Aan</button>
        <button type="submit" name="led" value="led1_off">LED 1 Uit</button>
        <br><br>
        <button type="submit" name="led" value="led2_on">LED 2 Aan</button>
        <button type="submit" name="led" value="led2_off">LED 2 Uit</button>
    </form>
</body>
</html>
De web-pagina vanaf de Zero.

Op de Pico draait het onderstaande Python script.

import network
import socket
import machine

from machine import Pin, SoftI2C
import ssd1306

#You can choose any other combination of I2C pins
i2c = SoftI2C(scl=Pin(5), sda=Pin(4))

oled_width = 128
oled_height = 64
oled = ssd1306.SSD1306_I2C(oled_width, oled_height, i2c, addr = 0x3c)

LED1_PIN = 16 # Vervang door de GPIO-pin van LED 1
LED2_PIN = 17 # Vervang door de GPIO-pin van LED 2

led1 = machine.Pin(LED1_PIN, machine.Pin.OUT)
led2 = machine.Pin(LED2_PIN, machine.Pin.OUT)

wlan = network.WLAN(network.STA_IF)
wlan.active(True)
wlan.connect("IthurtswhenIP", "XXXXXX") # Vervang door je wifi-gegevens

while not wlan.isconnected():
    machine.idle()

print("Verbonden met WiFi, IP-adres:", wlan.ifconfig()[0])

UDP_PORT = 8006 # Zorg ervoor dat dit overeenkomt met de poort in je Flask-app

sock = socket.socket(socket.AF_INET, socket.SOCK_DGRAM)
sock.bind(("0.0.0.0", UDP_PORT))

while True:
    data, addr = sock.recvfrom(1024)
    print("UDP-pakket ontvangen:", data, addr)
    message = data.decode()
    if message == "led1_on":
        led1.value(1)
        oled.fill(0)
        oled.text('LED 1 aan!', 0, 0)
    elif message == "led1_off":
        led1.value(0)
        oled.fill(0)
        oled.text('LED 1 uit!', 0, 0)
    elif message == "led2_on":
        led2.value(1)
        oled.fill(0)
        oled.text('LED 2 aan!', 0, 10)        
    elif message == "led2_off":
        led2.value(0)
        oled.fill(0)
        oled.text('LED 2 uit!', 0, 10)
    oled.show() 

In eerste instantie wilde e.e.a. niet werken. Eerst stond er achter sock.bind de standaard:

sock.bind(("", UDP_PORT))

De regel aanpassen naar (wat mij logisch leek):

sock.bind(("192.168.2.65", UDP_PORT))

werkte dus ook niet. Maar met:

sock.bind(("0.0.0.0", UDP_PORT))

werkte het uiteindelijk wel.
Op de webpagina een LED-button aanklikken zorgt ervoor dat de betreffende LED op de Pico aan, dan wel uit gaat. Tevens verschijnt er in het OLED-scherm een melding dat een LED aan, dan wel uit is. De opdracht:

oled.fill(0)

wist het OLED-scherm. En

oled.show() 

toont de inhoud op het scherm.

Geef een reactie

Je e-mailadres wordt niet gepubliceerd. Vereiste velden zijn gemarkeerd met *

Deze site gebruikt Akismet om spam te verminderen. Bekijk hoe je reactie gegevens worden verwerkt.