Wideo: Stacja monitorowania cząstek kurzu zasilana Arduino: 4 kroki (ze zdjęciami)
2025 Autor: John Day | [email protected]. Ostatnio zmodyfikowany: 2025-01-13 06:58
Możesz dość łatwo zbudować własne urządzenie internetowe, które monitoruje zanieczyszczenie kurzem w domu za mniej niż 50 USD i otrzymuje powiadomienie, gdy poziom kurzu jest zbyt wysoki, aby można było napowietrzyć pomieszczenie lub ustawić je na zewnątrz i otrzymać powiadomienie, jeśli jest bezpiecznie wyjść na zewnątrz, jeśli mieszkasz w bardzo zanieczyszczonym obszarze.
Zrobiłem to jako projekt szkolny, więc nie miałem wystarczająco dużo czasu, aby znaleźć usługę, która będzie pobierać wiadomości MQTT i wysyłać je do Ciebie, takie jak powiadomienia lub e-maile.
Należy również pamiętać, że ciągłe zasilanie czujnika skróci żywotność wentylatora.
Krok 1: Potrzebne części
Co będziesz potrzebował
- Arduino Uno
- Osłona Arduino Ethernet
- Czujnik laserowy cząstek stałych (zwykle kosztuje 10-30 USD w serwisie eBay/aliexpress)
- Czujnik temperatury i wilgotności DHT11 (opcja)
- Deska do krojenia chleba
- Kable rozruchowe
Krok 2: Złóż części
Najpierw musisz podłączyć osłonę Ethernet do Arduino
Czujnik PM ma wiele przewodów, ale te, których potrzebujemy, to VCC, GND, TX, RX.
Podłącz VCC i GND odpowiednio do + i - na płytce stykowej.
Arduino ma sprzętowe piny RX i TX, ale użyjemy programowej emulacji pinów RX i TX odpowiednio na pinach 2 i 3. Podłącz RX czujnika do TX Arduino i TX czujnika do RX Arduino.
Jeśli zamierzasz używać czujnika temperatury, podłącz linie VCC i GND do + i - na płytce do krojenia chleba, a linię danych do pinu 7.
Krok 3: Kodeks
Możesz zainstalować brokera MQTT na raspberry pi lub komputerze, który zawsze masz w domu, lub skorzystać z usługi MQTT w chmurze, takiej jak Cloud MQTT. Następnie możesz napisać skrypt, który wysyła dane jako HTTP do webhooka IFTT, ponieważ nie obsługują one jeszcze webhooków MQTT i skonfigurować powiadomienia, gdy poziom kurzu w domu stanie się zbyt wysoki.
Stacja lotnicza Arduino
#włączać |
#włączać |
#włączać |
#włączać |
#włączać |
#włączać |
#włączać |
#włączać |
#defineDHT11_PIN7 |
#defineRX_PIN2 |
#defineTX_PIN3 |
Adres IP ip(169, 169, 100, 98); |
bajt mac = { |
0x00, 0xAA, 0xBB, 0xCC, 0xDE, 0x02 |
}; |
constchar *mqtt_server = "m23.cloudmqtt.com"; |
consint mqtt_port = 11895; |
constchar *mqtt_user = "jhetjewk"; |
constchar *mqtt_pass = "QB2p9PiMV6pn"; |
constchar *mqtt_nazwa_klienta = "arduinoClient1"; // Połączenia klienta nie mogą mieć tej samej nazwy połączenia |
EthernetClient ethClient; |
Klient PubSubClient (ethClient); |
SoftwareSerial pmSerial(RX_PIN, TX_PIN); |
dht DHT; |
int pm1; |
wewn pm2_5; |
wewn pm10; |
identyfikator unsignedlong; |
//Plik mójPlik; |
Ciąg s; |
StaticJsonBuffer<200> jsonBuffer; |
JsonObject& root = jsonBuffer.createObject(); |
voidsetup() { |
Serial.początek (57600); |
pmSerial.początek(9600); |
identyfikator = 0; |
pm1 = 0; |
pm2_5 = 0; |
pm10 = 0; |
jeśli (Ethernet.begin(mac) == 0) |
{ |
Serial.println("Nie udało się skonfigurować Ethernetu przy użyciu DHCP"); |
// próba ze stałym adresem ip |
Ethernet.begin(mac, ip); |
} |
klient.setServer(mqtt_server, mqtt_port); |
klient.setCallback(oddzwanianie); |
opóźnienie (2000); |
Serial.println(Ethernet.localIP()); |
client.connect("arduinoClient", mqtt_user, mqtt_pass); |
Serial.print("rc="); |
Serial.print(klient.stan()); |
Serial.print("\n"); |
} |
voidloop() { |
indeks = 0; |
wartość znaku; |
char poprzednia wartość; |
jeśli (!klient.podłączony()) |
{ |
if (client.connect("arduinoClient", mqtt_user, mqtt_pass)) { |
Serial.println("podłączony"); |
} |
} |
while (pmSerial.available()) { |
wartość = pmSerial.read(); |
if ((indeks == 0 && wartość != 0x42) || (indeks == 1 && wartość != 0x4d)) { |
Serial.println("Nie można znaleźć nagłówka danych."); |
powrót; |
} |
jeśli (indeks == 4 || indeks == 6 || indeks == 8 || indeks == 10 || indeks == 12 || indeks == 14) { |
poprzednia wartość = wartość; |
} |
elseif (indeks == 5) { |
pm1 = 256 * poprzednia wartość + wartość; |
korzeń["pm1"] = abs(pm1); |
} |
elseif (indeks == 7) { |
pm2_5 = 256 * poprzednia wartość + wartość; |
korzeń["pm2_5"] = abs(pm2_5); |
} |
elseif (indeks == 9) { |
pm10 = 256 * poprzednia wartość + wartość; |
root["pm10"] = abs(pm10); |
} |
elseif (indeks >15) { |
przerwa; |
} |
indeks++; |
} |
while (pmSerial.available()) pmSerial.read(); |
int chk = DHT.odczyt11(DHT11_PIN); |
jeśli (DHT.temperatura == -999 || DHT.wilgotność == -999) { |
root["temperatura"] = "nie dotyczy"; |
root["wilgotność"] = "nie dotyczy"; |
} w przeciwnym razie { |
root["temperatura"] = DHT.temperatura; |
root["wilgotność"] = DHT.wilgotność; |
} |
sendResults(); |
id++; |
opóźnienie(5000); |
} |
voidsendResults() { |
// opublikuj w MQTT |
char jsonChar[100]; |
root.printTo(jsonChar); |
Serial.println(client.publish("arduino", jsonChar)); |
// debuguj do serialu |
root.printTo(Serial); |
Serial.print('\n'); |
} |
// Obsługuje wiadomości otrzymane w subskrybowanych tematach |
voidcallback(char* temat, bajt* ładunku, długość unsignedint) { |
} |
zobacz rawair_quality.ino hostowane z ❤ przez GitHub
Krok 4: Złóż pudełko
Po prostu użyłem pudełka, które leżałem i wywierciłem otwór na czujnik, z którego wydostało się powietrze, i wyciąłem otwór na kable (choć był trochę za duży).
Użyłem podkładek klejących do przymocowania czujnika do pudełka, wyrównując otwór wejściowy czujnika z wywierconym otworem w pudełku.
W końcu podłączyłem kable ethernetowe i zasilające.