Witam,
stację pogodową zbudowałem dla mojego brata, który ma alergię na kurz. Wyposażyłem ją w czujnik temperatury i wilgotności oraz czujnik kurzu, który występuje w nawilżatorach i oczyszczaczach powietrza. Te trzy czynniki są bardzo ważne dla alergika, dlatego wszystkie występują w mojej stacji pogodowej. Jej odczyty są teraz bardzo pomocne dla nas! Projekt publikuję drugi raz, zrobiłem poprawki do pierwszej wersji.
Do jej zbudowania potrzebowałem:
- Arduino Nano CH340
- czujnik temperatury i powietrza DHT11
- czujnik pyłu / stężenia cząstek – monitor czystości powietrza GP2Y1010AU0F
- wyświetlacz LCD 2×16 znaków wraz z konwerterem I2C LCM1602
- rezystor THT 1/4 W 4,7kΩ
- mały powerbank 5V
- płytka stykowa 170 otworów
- przewody połączeniowe
Podłączenie:
Czujnik kurzu podłączamy następująco: zasilanie do 5V, wejście modułu ILED do pinu cyfrowego D7, wyjście AOUT do pinu analogowego A0. Czujnik DTH11 podłączamy również do 5V, ale dodatkowo umieszczamy rezystor 4,7 kΩ pomiędzy zasilanie i pin sygnałowy, podpięty do pinu cyfrowego D2. Ekran LCD podpinamy także do 5V, linię SDA do A5, a linię SCL do A4.
Program:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 |
#include <DHT.h> #include <LiquidCrystal_I2C.h> #define MIN_VOLTAGE 600 #define VREF 5000 #define PIN_LED 7 #define PIN_ANALOG 0 #define MAX_ITERS 10 #define DHTPIN 2 int ADC_VALUE; int ITER; float VOLTAGE; float DUST; float AVG_DUST; LiquidCrystal_I2C lcd(0x27, 2, 1, 0, 4, 5, 6, 7, 3, POSITIVE); DHT dht; void setup(void){ Serial.begin(9600); pinMode(PIN_LED, OUTPUT); digitalWrite(PIN_LED, LOW); lcd.begin(16,2); lcd.setCursor(0,0); dht.setup(DHTPIN); } float computeDust(){ digitalWrite(PIN_LED, HIGH); delayMicroseconds(280); ADC_VALUE = analogRead(PIN_ANALOG); digitalWrite(PIN_LED, LOW); VOLTAGE = (VREF / 1024.0) * ADC_VALUE * 11; if (VOLTAGE > MIN_VOLTAGE){ return (VOLTAGE - MIN_VOLTAGE) * 0.2; } return 0; } void loop(void){ AVG_DUST = 0; ITER = 0; while (ITER < MAX_ITERS){ DUST = computeDust(); if (DUST > 0){ AVG_DUST += DUST; ITER++; delay(50); } } AVG_DUST /= MAX_ITERS; float t = dht.getTemperature(); float h = dht.getHumidity(); lcd.clear(); lcd.setCursor(0,0); lcd.print("Kurz = "); lcd.print(AVG_DUST); if (dht.getStatus()){ Serial.println("Error..."); } else { lcd.setCursor(0,1); lcd.print("W:"); lcd.print(h); lcd.print(" "); lcd.print("T:"); lcd.print(t); delay(5000); } } |
Efekt mojej pracy można zobaczyć tutaj:
Mój projekt powstał zgodnie z myślą “Potrzeba matką wynalazców”. Jest wykorzystywany w domu codziennie. Program do obsługi czujników oraz LCD powstał w oparciu o stronę oraz kurs na forbot.pl.
Pozdrawiam
Karol
Poprawiłem art, żeby film YT ładował się bezpośrednio w artykule.
Na przyszłość – wystarczy wkleić adres filmu w nowej linii (ale nie robić z niego klikalnego linka) i player sam będzie się ładował w treści :)
Pozdro!
coś masz nie tak z wyświetlaniem – cały ekran Ci miga
pewnie czyścisz go całego – zamiast czyścić całość to po prostu czyść komórki odpowiedzialne za wyświetlanie wartości a resztę zostawiaj bez zmian
No tak, “lcd.begin(16,2);” przecież się daje w “setup()”, a nie w “loop()”. Linijka 51 kodu do wywalenia i powinno działać jak należy. Po co dwa razy to wywoływać?
Nie wiem jak egzemplarz autora, ale mój GP2Y1010AU0F był bardzo niedokładny (praktycznie nic sensownego nie byłem w stanie z niego wyciągnąć). Z Chin można kupić znacznie lepszy PMS7003 za 60-70zł, albo odrobinę taniej większy PMS5003.
Świetna sprawa, można sobie fajne wykresy robić potem.
Jeszcze jedno, ten fragment kodu:
lcd.clear();
lcd.setCursor(0,0);
lcd.print(“Kurz = “);
lcd.print(AVG_DUST);
float t = dht.getTemperature();
float h = dht.getHumidity();
Zła kolejność. Najpierw się pobiera dane z czujników, potem się czyści wyświetlacz i wyświetla dane. Inaczej niepotrzebnie zwiększasz czas, przez który nie danych na wyświetlaczu.
Ponadto pozwolę sobie polecić ten blog na przykładzie artykułu o tym wykrywaczu pyłu (autor opisuje zwiększenie precyzji pomiarów przez zmianę VREF Arduino na wewnętrzne 1.1V): http://www.jarzebski.pl/arduino/czujniki-i-sensory/czujnik-pylu-gp2y1010au0f.html
Kod już poprawiłem, z migającym ekranem nie mogłem sobie sam poradzić. Dziękuję bardzo za pomoc.
To popraw jeszcze raz, bo popsułeś znaki nowej linii :)
Dzięki poprawiłem
Jeszcze jedno. Czunik DHT11 daje odczyty 8 bitowe, to oznacza że zwraca tylko liczby całkowite.
Wystarczy byte t = dht.getTemperature();
można to zrobić na wyświetlaczu LED? wtedy wystarczy wgrać inne biblioteki?