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:
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
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 libreriapicamera
per scattare una foto e salvarla nella directoryimages/
. 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 MIMEimage/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
:
-
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()
-
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!