Sommario:
2025 Autore: John Day | [email protected]. Ultima modifica: 2025-01-13 06:57
Puoi costruire abbastanza facilmente un dispositivo Internet delle cose fai-da-te che monitora l'inquinamento da polvere nella tua casa per meno di $ 50 e ricevere una notifica quando il livello di polvere diventa troppo alto in modo da poter aerare la stanza, oppure puoi impostarlo all'esterno e ricevere una notifica se è sicuro uscire se vivi in una zona altamente inquinata.
L'ho realizzato come progetto scolastico, quindi non ho avuto abbastanza tempo per trovare un servizio che prenda i messaggi MQTT e te li invii come notifiche o e-mail.
Si noti inoltre che mantenere il sensore sempre alimentato ridurrà la durata della ventola.
Passaggio 1: parti necessarie
Di cosa avrai bisogno
- Arduino Uno
- Scudo Ethernet Arduino
- Sensore laser per particolato (di solito va da $ 10 a $ 30 su eBay / aliexpress)
- Sensore di temperatura e umidità DHT11 (opzionale)
- tagliere
- Cavi jumper
Passaggio 2: assemblare le parti
Per prima cosa, devi collegare lo shield ethernet ad Arduino
Il sensore PM ha più fili, ma quelli di cui abbiamo bisogno sono VCC, GND, TX, RX.
Collega VCC e GND rispettivamente a + e - sulla breadboard.
L'Arduino ha pin hardware RX e TX, ma utilizzeremo l'emulazione software dei pin RX e TX rispettivamente sui pin 2 e 3. Collega l'RX del sensore al TX dell'Arduino e il TX del sensore all'RX dell'Arduino.
Se intendi utilizzare il sensore di temperatura, collega le linee VCC e GND a + e - sulla breadboard e la linea dati al pin 7.
Passaggio 3: il codice
Puoi installare il broker MQTT su un raspberry pi o su un computer che hai sempre a casa, oppure utilizzare un servizio MQTT cloud, come Cloud MQTT. Quindi puoi scrivere uno script che invii i dati come HTTP a un webhook IFTT, poiché non supportano ancora i webhook MQTT e impostare notifiche per quando i livelli di polvere in casa diventano troppo alti.
Stazione aerea Arduino
#includere |
#includere |
#includere |
#includere |
#includere |
#includere |
#includere |
#includere |
#defineDHT11_PIN7 |
#defineRX_PIN2 |
#defineTX_PIN3 |
IPAddress ip(169, 169, 100, 98); |
byte mac = { |
0x00, 0xAA, 0xBB, 0xCC, 0xDE, 0x02 |
}; |
constchar *mqtt_server = "m23.cloudmqtt.com"; |
constint mqtt_port = 11895; |
constchar *mqtt_user = "jhetjewk"; |
constchar *mqtt_pass = "QB2p9PiMV6pn"; |
constchar *mqtt_client_name = "arduinoClient1"; // Le connessioni client non possono avere lo stesso nome di connessione |
Client Ethernet ethClient; |
PubSubClient client(ethClient); |
SoftwareSerial pmSerial(RX_PIN, TX_PIN); |
dht DHT; |
int pm1; |
int pm2_5; |
int pm10; |
ID unsignedlong; |
//File mioFile; |
Stringhe; |
StaticJsonBuffer<200> jsonBuffer; |
JsonObject& root = jsonBuffer.createObject(); |
voidsetup() { |
Serial.begin(57600); |
pmSerial.begin(9600); |
ID = 0; |
pm1 = 0; |
pm2_5 = 0; |
pm10 = 0; |
if (Ethernet.begin(mac) == 0) |
{ |
Serial.println("Impossibile configurare Ethernet utilizzando DHCP"); |
// tentativo con indirizzo IP fisso |
Ethernet.begin(mac, ip); |
} |
client.setServer(mqtt_server, mqtt_port); |
client.setCallback(richiamata); |
ritardo (2000); |
Serial.println(Ethernet.localIP()); |
client.connect("arduinoClient", mqtt_user, mqtt_pass); |
Serial.print("rc="); |
Serial.print(client.state()); |
Serial.print("\n"); |
} |
voidloop() { |
indice = 0; |
valore del carattere; |
char valore precedente; |
if (!client.connected()) |
{ |
if (client.connect("arduinoClient", mqtt_user, mqtt_pass)) { |
Serial.println("connesso"); |
} |
} |
while (pmSerial.available()) { |
valore = pmSerial.read(); |
if ((indice == 0 && valore != 0x42) || (indice == 1 && valore != 0x4d)) { |
Serial.println("Impossibile trovare l'intestazione dei dati."); |
Restituzione; |
} |
if (indice == 4 || indice == 6 || indice == 8 || indice == 10 || indice == 12 || indice == 14) { |
precedenteValore = valore; |
} |
elseif (indice == 5) { |
pm1 = 256 * valore precedente + valore; |
root["pm1"] = abs(pm1); |
} |
elseif (indice == 7) { |
pm2_5 = 256 * valore precedente + valore; |
root["pm2_5"] = abs(pm2_5); |
} |
elseif (indice == 9) { |
pm10 = 256 * valore precedente + valore; |
radice["pm10"] = abs(pm10); |
} |
elseif (indice >15) { |
rottura; |
} |
indice++; |
} |
while (pmSerial.available()) pmSerial.read(); |
int chk = DHT.read11(DHT11_PIN); |
if (DHT.temperatura == -999 || DHT.umidità == -999) { |
root["temperatura"] = "N/A"; |
root["umidità"] = "N/A"; |
} altro { |
root["temperatura"] = DHT.temperatura; |
root["umidità"] = DHT.umidità; |
} |
sendResults(); |
id++; |
ritardo (5000); |
} |
voidsendResults() { |
// pubblica su MQTT |
char jsonChar[100]; |
root.printTo(jsonChar); |
Serial.println(client.publish("arduino", jsonChar)); |
// debug su seriale |
root.printTo(Seriale); |
Serial.print('\n'); |
} |
// Gestisce i messaggi arrivati su argomenti sottoscritti |
voidcallback(char* argomento, byte* payload, lunghezza unsignedint) { |
} |
visualizza rawair_quality.ino ospitato con ❤ da GitHub
Passaggio 4: assemblare la scatola
Ho appena usato una scatola che avevo in giro e ho praticato un foro per il sensore da cui prendere l'aria e ho ritagliato un foro per far uscire i cavi (anche se era un po' troppo grande).
Ho usato dei cuscinetti di colla per attaccare il sensore alla scatola, allineando il foro di ingresso del sensore con il foro praticato sulla scatola.
Infine, ho collegato i cavi ethernet e di alimentazione.