Raspberry Pi Pico W (MicroPython)

Tutorial per connettere Raspberry Pi Pico W a My Microeden.

Goal

Il tutorial accompagna l'utente nel controllare un led a distanza tramite la board di sviluppo Raspberry Pi Pico W.

Risorse necessarie

  1. Raspberry Pi Pico W : https://www.kubii.com/it/microcontrollori/3205-1641-raspberry-pi-pico-w-h-wh-3272496311589.html#/versione_pico-pico_w
  2. Thonny software per programmare in Micropython. https://thonny.org/
  3. Cavo MicroUSB per programmare la board.
  4. Account gratuito Eden Keeper Home su My Microeden.

Configurazione di Thonny

Prima di caricare il software sulla scheda di sviluppo assicurati che tutte le impostazioni dell'interprete siano corrette.

  1. Fare click sul menu Esegui->Configura l'interprete...
  1. Nel menu per determinale il tipo di interprete selezionare la voce MicroPython (Raspberry Pi Pico).
  1. Nel menu Porta o WebREPL posto leggermente più in basso selezionare la voce < Prova a determinare la porta automaticamente >.
  1. Fare click sul pulsante OK lasciando invariate le altre impostazioni.
  2. Premere il pulsante Stop (Consigliato ma non necessario) nella barra delle impostazioni e controllare se la console mostra il messaggio di benvenuto di MicroPython installato sul Raspberry.
  1. Fare click sul menu Strumenti->Gestisci pacchetti...
  1. Cerca la libreria umqtt.simple dalla funzione di ricerca e fare click sulla voce corrispondente dalla lista dei risultati.
  1. Fare click sul pulsante Installa e attendere l'installazione.
  1. Al termine fare click sul pulsante Chiudi per tornare all'editor.

Aggiunta del dispositivo su My Microeden

Accedere con il proprio account alla piattaforma My Microeden e aprire la sezione I tuoi dispositivi IoT.

  1. Fare click sul pulsante + posto in basso a destra e selezionare l'opzione Nuovo dispositivo.
  1. Nella finestra che compare subito dopo, se non selezionato fare click sul protocollo MQTT e successivamente dare un nome al proprio dispositivo, lasciare il campo ID vuoto.
  1. Verranno create tutte le credenziali necessarie per collegare la scheda di sviluppo alla piattaforma, ricordarsi di compiare tutte le informazioni generate perchè andranno inserite nel codice in MicroPython per collegare il Raspberry.

NOTA BENE : Copiare tutti i campi, per ragioni di sicurezza non verranno più mostrati.

  1. Fare click sul pulsante Ho salvato le credenziali e attendere qualche istante, il dispositivo appena creato apparirà sulla dashboard, in caso contrario ricaricare la pagina.
  1. Fare click sul pulsante e selezionare l'opzione Personalizza.
  1. Fare click sul pulsante Switch per aggiungere un nuovo interruttore al dispositivo.
  1. Riempire i campi richiesti : per quanto riguarda l'etichetta può essere personalizzata a piacimento, mentre per quanto riguarda la parola chiave e i comandi devono coincidere con quelli del codice che vedremo successivamente, per questo tutorial usare i seguenti valori :
  • Parola Chiave : led
  • Comando on : ledon
  • Comando off : ledoff
  1. Fare click sul pulsante Salva Widget per aggiungerlo al dispositivo.
  1. Fare click sul pulsante Salva Modifiche per completare le modifiche.

Codice per il Raspberry

Il codice di esempio indicato di seguito deve essere personalizzato in base ai dati generati dalla piattaforma per il corretto funzionamento, ricordati quindi di cambiare i valori delle variabili, attualmente il codice è scritto in funzione del tutorial.

import network
import time
import json
from machine import Pin
from umqtt.simple import MQTTClient

# --- Configurazione Wi-Fi ---
WIFI_SSID = "il_nome_della_tua_wifi"
WIFI_PASS = "la_password_della_tua_wifi"

# --- Configurazione Broker MQTT ---
MQTT_BROKER = "Z8O-91K-8D3.mqtt.microeden.io" 
MQTT_PORT = 8243  
MQTT_USER = b"Z8O-91K-8D3"
MQTT_PASS = b"77c7829ba89a6e1b2ccfbbb25dc5f7a65977201e9e6874b6f683b27bdeb31b46" 
CLIENT_ID = b"MICROEDEN-MYDEVICE-Z8O-91K-8D3"

TOPIC_OUT = b"microeden/dot/Z8O-91K-8D3/outbox" 
TOPIC_IN = b"microeden/dot/Z8O-91K-8D3/inbox"   

INTERVALLO_PING = 40000   
INTERVALLO_STATUS = 5000  

# Pin del LED integrato
led = Pin("LED", Pin.OUT)

client = None

# --- Funzione che invia lo stato del LED ---
def invia_aggiornamento():
    global client
    try:
        # Invia solo lo stato del led: {"led": true/false}
        risposta = {"led": bool(led.value())}
        payload = json.dumps(risposta)
        client.publish(TOPIC_OUT, payload.encode())
        print(f"Stato inviato: {payload}")
    except Exception as e:
        print("Errore invio aggiornamento:", e)

# --- Funzione che gestisce i messaggi in entrata ---
def gestisci_messaggi(topic, msg):
    try:
        dati = json.loads(msg.decode())
        # Utilizzo della chiave "content" come nel tuo codice originale
        if "content" in dati:
            comando = dati["content"]
            if comando == "ledon":
                led.value(1)
                print(">>> LED ACCESO")
            elif comando == "ledoff":
                led.value(0)
                print(">>> LED SPENTO")

            # Invia subito il nuovo stato dopo il comando
            invia_aggiornamento()
    except Exception as e:
        print("Errore nel processare il messaggio:", e)

def connetti_wifi():
    wlan = network.WLAN(network.STA_IF)
    wlan.active(True)
    if not wlan.isconnected():
        print("Connessione Wi-Fi...")
        wlan.connect(WIFI_SSID, WIFI_PASS)
        while not wlan.isconnected():
            time.sleep(1)
    print("Wi-Fi Connesso!")

# --- Loop Principale ---
while True:
    try:
        connetti_wifi()

        client = MQTTClient(
            client_id=CLIENT_ID, 
            server=MQTT_BROKER, 
            port=MQTT_PORT, 
            user=MQTT_USER, 
            password=MQTT_PASS, 
            keepalive=60,
            ssl=True, 
            ssl_params={'server_hostname': MQTT_BROKER} 
        )

        client.set_callback(gestisci_messaggi)
        client.connect()
        client.subscribe(TOPIC_IN)

        print("In ascolto di 'ledon' o 'ledoff' tramite chiave 'content'...")
        invia_aggiornamento()

        ultimo_ping = time.ticks_ms()
        ultimo_status = time.ticks_ms()

        while True:
            client.check_msg() 

            tempo_attuale = time.ticks_ms()

            if time.ticks_diff(tempo_attuale, ultimo_ping) > INTERVALLO_PING:
                client.ping()
                ultimo_ping = tempo_attuale

            if time.ticks_diff(tempo_attuale, ultimo_status) > INTERVALLO_STATUS:
                invia_aggiornamento()
                ultimo_status = tempo_attuale
                ultimo_ping = tempo_attuale 

            time.sleep(0.1)

    except Exception as e:
        print(f"Errore: {e}. Riconnessione...")
        time.sleep(5)
  1. A inizio codice si trovano le variabili necessarie per la connessione, riempirle come mostrato nel codice precedente.
# --- Configurazione Wi-Fi ---
WIFI_SSID = "il_nome_della_tua_wifi"
WIFI_PASS = "la_password_della_tua_wifi"

# --- Configurazione Broker MQTT ---
MQTT_BROKER = "microeden_broker"
MQTT_PORT = 8243  
MQTT_USER = b"id_utente"
MQTT_PASS = b"password_token_utente" 
CLIENT_ID = b"client_id"

TOPIC_OUT = b"topic_outbox" 
TOPIC_IN = b"topic_inbox"
  1. Come indicato in precedenza abbiamo settato una parola chiave e dei comandi predefiniti e che sono specificati in questa parte del programma.
# --- Funzione che gestisce i messaggi in entrata ---
def gestisci_messaggi(topic, msg):
    try:
        dati = json.loads(msg.decode())
        # Utilizzo della chiave "content" come nel tuo codice originale
        if "content" in dati:
            comando = dati["content"]
            if comando == "ledon":
                led.value(1)
                print(">>> LED ACCESO")
            elif comando == "ledoff":
                led.value(0)
                print(">>> LED SPENTO")

            # Invia subito il nuovo stato dopo il comando
            invia_aggiornamento()
    except Exception as e:
        print("Errore nel processare il messaggio:", e)

E lo stato del led viene inviato tramite questa parte di codice :

def invia_aggiornamento():
    global client
    try:
        # Invia solo lo stato del led: {"led": true/false}
        risposta = {"led": bool(led.value())}
        payload = json.dumps(risposta)
        client.publish(TOPIC_OUT, payload.encode())
        print(f"Stato inviato: {payload}")
    except Exception as e:
        print("Errore invio aggiornamento:", e)

Scrivendo sempre sulla stessa parola chiave led.

  1. Copiare il codice in Thonny, ricontrollando che tutte le credenziali comprese quelle del Wi-Fi siano correttamente impostate.
  1. Premere il pulsante Play "Esegui lo script corrente..." dalla barra degli strumenti di Thonny.
  1. Il programma si collegherà dapprima al Wi-Fi e successivamente inizierà a inviare lo stato del led alla piattaforma cloud.
  2. Non appena il Raspberry inizia a informare la piattaforma del suo stato, il badge della connessione diventerà verde per indicare che il dispositivo è online.
  3. Attivando e disattivando lo switch sulla dashboard, il led sulla scheda si accenderà e si spegnerà di conseguenza.

Conclusioni

Con questo tutorial l'utente ha acquisito le nozioni base per controllare un'uscita del Raspberry, la guida è incentrata per qualcosa di semplice come quella di accendere e spegnere un led ma con lo stesso principio è possibile sviluppare applicazioni più complesse, ad esempio per il controllo dell'irrigazione del giardino.

Per qualsiasi dubbio è possibile contattarci all'indirizzo info@microeden.io oppure se si possiede un account PRO è possibile aprire un ticket di assistenza aziendale tramite la funzione apposita.