Progetti IoT per Principianti con Arduino e Raspberry Pi

IoT

Il mondo dell'Internet of Things (IoT) può sembrare complesso, ma grazie a piattaforme come Arduino e Raspberry Pi, è possibile avvicinarsi a questo settore con progetti semplici e alla portata di tutti. In questo articolo, esploreremo alcune idee di base che ti permetteranno di entrare nel mondo IoT utilizzando questi potenti strumenti.

Internet of Things (IoT): partiamo dal principio

Prima di immergerci nei progetti, facciamo un breve ripasso di cosa sia l'IoT. L'Internet of Things si riferisce alla rete di dispositivi connessi che possono scambiare dati tra loro e con il mondo esterno. Questi dispositivi possono includere sensori, attuatori, telecamere, e persino elettrodomestici, tutti connessi ad Internet per eseguire compiti specifici o fornire informazioni in tempo reale. A livello di progetti IoT per principianti da realizzare con il potere di Arduino abbiamo diverse soluzioni e, come dicevo ad inizio articolo, vorrei darti due possibili spunti da cui iniziare.

Un progetto IoT per principianti con Arduino: raccolta dati da sensori

L'integrazione tra hardware e software è il cuore dell'innovazione nel campo dell'IoT. In questo progetto, ti mostrerò come realizzare un sistema di monitoraggio della temperatura e dell'umidità utilizzando Arduino e il sensore DHT11, con l'aggiunta di un modulo Wi-Fi ESP8266. Andremo oltre le basi, esponendo i dati raccolti tramite API REST che possono essere facilmente integrate con un backend web. Questo progetto non solo ti permette di monitorare l'ambiente, ma ti dà anche un assaggio di come combinare elettronica e sviluppo web per creare soluzioni IoT flessibili e potenti.

L'architettura

Immagine schema

L'architettura di questo progetto si basa su una struttura modulare che separa chiaramente i componenti hardware e software, permettendo una facile scalabilità e manutenzione. Al livello più basso, troviamo Arduino UNO, cuore del sistema, raccogliendo i dati dal sensore DHT11. Questi dati vengono processati e inviati al modulo Wi-Fi ESP8266, il quale si occupa di gestire la connessione alla rete e di esporre le API REST tramite un server HTTP parte del codice stesso.

L'ESP8266 permette la comunicazione tra Arduino e un backend web. Le API esposte da ESP8266 seguono uno schema RESTful, il che facilita l'integrazione con qualsiasi piattaforma software: sia un'applicazione web, sia mobile, sia un sistema cloud. Il backend, sviluppato in Python con Flask, si connette a queste API, raccoglie i dati e li rende disponibili per ulteriori elaborazioni o visualizzazioni. Questa architettura distribuita non solo rende il sistema robusto e flessibile, ma apre anche la porta a future espansioni, come l'integrazione con servizi IoT basati su cloud o l'aggiunta di ulteriori sensori per un monitoraggio più completo dell'ambiente.

Componenti Necessari

Prima di immergerci nel codice e nelle connessioni, assicurati di avere tutti i componenti necessari:

  • Arduino UNO: il microcontrollore centrale del progetto.
  • Modulo Wi-Fi ESP8266: permette ad Arduino di connettersi ad una rete Wi-Fi e comunicare con il mondo esterno.
  • Sensore DHT11: per misurare la temperatura e l'umidità dell'ambiente.
  • Breadboard: per realizzare i collegamenti senza saldature.
  • Resistenze: per la protezione dei circuiti, in particolare se colleghi il modulo ESP8266 direttamente ad Arduino.
  • Cavi di collegamento: per realizzare tutte le connessioni tra i componenti.

Una piccola precisazione: Arduino UNO non è l'unica scheda che puoi usare, per esempio abbiamo anche ESPertino che può essere un'ottima alternativa!

Il circuito

Il circuito del nostro primo progetto IoT con Arduino si struttura come segue:

Arduino progetti

Cerchiamo di fare chiarezza anche sulle connessioni fra componenti:

  • DHT11:
    • VCC → 5V su Arduino
    • GND → GND su Arduino
    • DATA → Pin digitale 12 su Arduino
  • ESP8266:
    • VCC → 3.3V su Arduino (oppure alimentazione esterna a 3.3V)
    • GND → GND su Arduino
    • RX → TX su Arduino (con un partitore di tensione per abbassare il livello logico da 5V a 3.3V)
    • TX → RX su Arduino

Il codice per Arduino

Ora, passiamo alla parte pratica. Il codice che segue è progettato per leggere i valori di temperatura e umidità dal sensore DHT11 ed esporli tramite API REST utilizzando l'ESP8266:

#include <ESP8266WiFi.h>
#include <ESP8266WebServer.h>
#include <DHT.h>

#define DHTPIN 12 // Pin digitale a cui è collegato il DHT11
#define DHTTYPE DHT11 // Tipo di sensore DHT

DHT dht(DHTPIN, DHTTYPE);
ESP8266WebServer server(80); // Crea un server sulla porta 80

const char* ssid = "Your_SSID";
const char* password = "Your_PASSWORD";

void setup() {
  Serial.begin(115200);
  dht.begin();

  // Connessione Wi-Fi
  WiFi.begin(ssid, password);
  while (WiFi.status() != WL_CONNECTED) {
    delay(1000);
    Serial.println("Connessione WiFi in corso...");
  }
  Serial.println("Connesso a WiFi");

  // Definisce le API
  server.on("/api/temperature", HTTP_GET, handleTemperature);
  server.on("/api/humidity", HTTP_GET, handleHumidity);
  server.on("/api/reading", HTTP_GET, handleReading);

  server.begin();
  Serial.println("Server HTTP avviato");
}

void loop() {
  server.handleClient();
}

void handleTemperature() {
  float temp = dht.readTemperature();
  if (isnan(temp)) {
    server.send(500, "text/plain", "Errore nella lettura della temperatura");
    return;
  }
  server.send(200, "application/json", "{\"temperature\": " + String(temp) + "}");
}

void handleHumidity() {
  float humidity = dht.readHumidity();
  if (isnan(humidity)) {
    server.send(500, "text/plain", "Errore nella lettura dell'umidità");
    return;
  }
  server.send(200, "application/json", "{\"humidity\": " + String(humidity) + "}");
}

void handleReading() {
  float temp = dht.readTemperature();
  float humidity = dht.readHumidity();
  if (isnan(temp) || isnan(humidity)) {
    server.send(500, "text/plain", "Errore nella lettura dei dati");
    return;
  }
  server.send(200, "application/json", "{\"temperature\": " + String(temp) + ", \"humidity\": " + String(humidity) + "}");
}

Spiegazione del codice: questo codice configura l'ESP8266 per collegarsi ad una rete Wi-Fi e avvia un server web. Il server espone tre API REST che restituiscono i dati di temperatura e umidità letti dal sensore DHT11. Puoi accedere ai dati attraverso un browser web o tramite richieste HTTP GET alle URL definite.

Un Progetto IoT per principianti con Raspberry Pi: Monitoraggio Ambientale

Passiamo ora ad un progetto che utilizza un Raspberry Pi, per creare un sistema di monitoraggio ambientale. Questo progetto ti permette di raccogliere dati sull'ambiente circostante e visualizzarli tramite un'interfaccia web.

L'Architettura del Sistema

Raspberry Pi progetti

Il sistema è composto da un Raspberry Pi che raccoglie i dati tramite un sensore di temperatura e umidità. I dati vengono poi inviati ad un server web ospitato sul Raspberry Pi stesso, dove possono essere visualizzati tramite un'applicazione web.

Il progetto prevede i seguenti componenti:

  • Raspberry Pi: la scheda principale per l'elaborazione dei dati e l'hosting del server web
  • Sensore di Temperatura e Umidità DHT22: per raccogliere i dati ambientali
  • Modulo di Alimentazione: per fornire l'energia al Raspberry Pi ed ai sensori
  • Cavi di Collegamento: per connettere il sensore al Raspberry Pi

Il Circuito e le Connessioni

Collega il sensore DHT22 al Raspberry Pi come segue:

  • VCC → Pin 1 (3.3V) del Raspberry Pi
  • GND → Pin 6 (GND) del Raspberry Pi
  • DATA → Pin 7 (GPIO4) del Raspberry Pi

Il Codice per Raspberry Pi

Per leggere i dati dal sensore e servirli su una pagina web, utilizzeremo un'applicazione Python con Flask. Ecco il codice di base:

from flask import Flask, jsonify
import Adafruit_DHT

app = Flask(__name__)

# Configura il sensore
sensor = Adafruit_DHT.DHT22
pin = 4

@app.route('/api/temperature', methods=['GET'])
def temperature():
    humidity, temperature = Adafruit_DHT.read_retry(sensor, pin)
    if temperature is None:
        return jsonify({"error": "Unable to retrieve temperature data"}), 500
    return jsonify({"temperature": temperature})

@app.route('/api/humidity', methods=['GET'])
def humidity():
    humidity, temperature = Adafruit_DHT.read_retry(sensor, pin)
    if humidity is None:
        return jsonify({"error": "Unable to retrieve humidity data"}), 500
    return jsonify({"humidity": humidity})

@app.route('/api/reading', methods=['GET'])
def reading():
    humidity, temperature = Adafruit_DHT.read_retry(sensor, pin)
    if humidity is None or temperature is None:
        return jsonify({"error": "Unable to retrieve data"}), 500
    return jsonify({"temperature": temperature, "humidity": humidity})

if __name__ == '__main__':
    app.run(host='0.0.0.0', port=5000)

Questo script Python utilizza Flask per creare un server web che espone tre endpoint API per la temperatura, l'umidità e le letture complete. I dati vengono letti tramite la libreria Adafruit_DHT, che gestisce il sensore DHT22.

Il codice è strutturato come segue:

  • Lettura dei Dati Ambientali: il codice rimane invariato per la lettura della temperatura e dell'umidità dal sensore DHT11.
  • Scattare Immagini: la funzione capture_image utilizza la libreria picamera per scattare una foto e salvarla nella directory images/. Il nome del file è basato sul timestamp corrente.
  • API per Immagini: l'endpoint /image restituisce l'immagine più recente scattata dalla fotocamera. L'immagine viene servita con il tipo MIME image/jpeg.

Come impostare gli scatti

Per scattare immagini periodicamente, puoi utilizzare il cron di Linux per eseguire uno script Python a intervalli regolari. Ecco un esempio di come configurare un job cron:

  1. Crea uno script per scattare immagini e salvarle:

    Script di Scatto Periodico (capture_periodic.py)

    import picamera
    import time
    import os
    
    image_dir = '/home/pi/images/'
    if not os.path.exists(image_dir):
        os.makedirs(image_dir)
    
    def capture_image():
        try:
            camera = picamera.PiCamera()
            filename = 'image_{}.jpg'.format(int(time.time()))
            filepath = os.path.join(image_dir, filename)
            camera.capture(filepath)
        except Exception as e:
            print(f"Error capturing image: {e}")
    
    if __name__ == "__main__":
        capture_image()
    
  2. Aggiungi un job cron per eseguire lo script ogni ora:

    crontab -e
    

    Aggiungi la seguente riga per eseguire lo script ogni ora:

    0 * * * * /usr/bin/python3 /home/pi/capture_periodic.py
    

Questo è un esempio di progetto IoT adatto a tutti i principianti, che monitora i dati ambientali e cattura anche immagini periodiche, rendendole disponibili tramite API RESTful. Con l'aggiunta della fotocamera e della pianificazione per scattare immagini, il tuo Raspberry Pi diventa un potente strumento per la raccolta e la visualizzazione dei dati.

Evoluzioni dei nostri progetti IoT per principianti

Se ti stai chiedendo come potresti portare questi progetti al livello successivo, ti invitiamo a scoprire i progetti IoT basati su Telegram. Grazie ai chatbot di Telegram, è possibile integrare il tuo sistema con la piattaforma di messaggistica, permettendo il controllo remoto e la visualizzazione dei dati direttamente tramite chat. Questo rende il tuo progetto più interattivo e ti permette anche di ricevere notifiche istantanee e comandi a distanza:

Stando sempre in tema a questi progetti, ti invito a scoprire anche altri progetti da cui prendere spunto, per esempio con Raspberry Pi:


Altrimenti, potresti sfruttare il nostro progetto Telegram per Arduino basato su un chatbot totalmente gratuito che puoi trovare qui!

E se ti dicessi che abbiamo due percorsi per te?

Per approfondire ulteriormente il mondo dell'IoT e dell'embedded, ti invito ad esplorare:

  • Making IoT: Una risorsa eccellente per imparare a costruire e gestire progetti IoT. Il sito offre tutorial, guide dettagliate e ispirazione per nuovi progetti, che possono aiutarti a espandere le tue competenze e applicare le tue conoscenze a scenari più complessi.

  • Telegram per il Mondo Embedded e IoT: Scopri come Telegram può essere utilizzato per controllare e monitorare dispositivi embedded. Utilizza bot di Telegram per ricevere aggiornamenti, controllare dispositivi e integrare la tua soluzione IoT con la piattaforma di messaggistica che milioni di persone utilizzano ogni giorno.

Con questi strumenti e risorse, sei pronto per affrontare nuove sfide e ampliare le tue capacità nel mondo dell'Internet of Things. Che tu sia un principiante entusiasta o un esperto in cerca di nuove idee, c'è sempre qualcosa di nuovo da scoprire e da costruire!

Sei interessato a scoprire di più su Arduino e Raspberry Pi? Sei indeciso su quale scheda scegliere? Iscriviti al nostro webinar esclusivo e gratuito, che si terrà mercoledi 9 ottobre alle ore 18:30, seguendo questo link: Iscrizione Webinar Arduino & Raspberry Pi.

Scarica subito una copia gratis

Scrivi un commento

Seguici anche sul tuo Social Network preferito!

Send this to a friend