STACJA POGODOWA
1. DFROBOT LCD KEYPAD SHIELD dla Arduino...
Przeglądałem internet i znalazłem w sumie trzy rozwiązania.
a) sam wyświetlacz LCD... w sumie najtańszy ale niełatwy do podłączenia
b) przystawka do arduino z przyciskami, trochę droższa
c) i ta zamieszczona obok... zaciekawiła mnie gdyż ma dodatkowo kilka wyjść gdzie można conieco podłączyć... przy czujnikach analogowych tej samej firmy to łatwizna, po prostu się wpina kabelek, wpisuje kod i tyle... urzączenie pozatym ma własne oprogramowanie lub może korzystać ze standardowego oferowanego przez ARDUINO. Po wpięciu do arduino wprowadziłem podstawowy kod "testowy" dość prosty, i od razu zadziałał.
Sprawę trzeba było skomplikować. Dodałem czujnik temperatury tej samej firmy. Jeden kabelek, poniższy kod i pojawiła się na wyświetlaczu temperatura. wydało się proste... zobaczymy jak pójdzie dalej :)
2. LM35 DFROBOT - ANALOGOWY CZUJNIK TEMPERATURY DFROBOT
Bardzo fajny i prosty czujnik temperatury, prosty kod, wynik widać od razu na ekranie. Dokładność, u mnie pokazuje temperaturę z dokładnością +/-1C. Poniżej kod umożliwiający wyświetlanie temperatury na wyświetlaczu podłączonym do naszego Arduino. Dodatkowo wyświetla czas w sekundach od momentu włączenia urządzenia.
#include <LiquidCrystal.h>
LiquidCrystal lcd(8, 9, 4, 5, 6, 7);
void setup()
{
lcd.begin(16, 2);
lcd.setCursor(0,0);
}
void loop()
{
lcd.setCursor(12,1);
lcd.print(millis()/1000);
lcd.setCursor(0,1);
float val;
float dat;
val=analogRead(5);//Connect LM35 on Analog 0
dat=(500*val)/1024;
lcd.print("Tep:"); //Display the temperature on Serial monitor
lcd.print(dat,1);
lcd.print("C");
delay(2000);
}
LiquidCrystal lcd(8, 9, 4, 5, 6, 7);
void setup()
{
lcd.begin(16, 2);
lcd.setCursor(0,0);
}
void loop()
{
lcd.setCursor(12,1);
lcd.print(millis()/1000);
lcd.setCursor(0,1);
float val;
float dat;
val=analogRead(5);//Connect LM35 on Analog 0
dat=(500*val)/1024;
lcd.print("Tep:"); //Display the temperature on Serial monitor
lcd.print(dat,1);
lcd.print("C");
delay(2000);
}
...
3. DHT11 CZUJNIK WILGOTNOŚCI I TEMPERATURY
W sklepach z częściami do ARDUINO pojawił się czujnik wilgotności i temperatury, od jakiegoś czasu szukałem takiego urzączenia na rynku, tzn takiego z wyświetlaczem działającym i ciągle nie mogłam znaleźć. I tu nagle czujnik... Złożyłem wszystko w całość no i zaczęła się zabawa z programowaniem. Nie było tak prosto jak myślałem. Na stronach ARDUINO.CC biblioteki .h i .ccp. oraz przykład... dla laika :) banał... akurat... po dziesiątkach prób... doczytałem się że najlepiej skorzystać z NOTEPAD++ ... rzeczywiście w końcu zadziałało... program pozwolił na zapisanie interesujących mnie plików w odpowiednim formacie. Przykład skompilowałem w oprogramowaniu ARDUINO. O dziwo w końcu wszystko zadziałało... prawie... nie wiem dlaczego mimo użycia funkcji (float) i zaznaczeniu 2 dziesiętnych urządzenie wyświetla wilgotność i temperaturę bez dziesiętnych :( a punkt rosy z dziesiętnymi. poza tym wydaje mi się że czujnik temperatury pokazuje delikatnie zawyżony odczyt ok +2C. Wilgotność wydaje mi się niezbyt dokładne, pokazuje dość niską dokładność. Poniżej trochę przerobiony skrypt z ARDUINO.CC.
#include <LiquidCrystal.h>
#include <dht11.h>
dht11 DHT11;
#define DHT11PIN A5
LiquidCrystal lcd(8, 9, 4, 5, 6, 7);
// dewPoint function NOAA
// reference: http://wahiduddin.net/calc/density_algorithms.htm
double dewPoint(double celsius, double humidity)
{
double A0= 373.15/(273.15 + celsius);
double SUM = -7.90298 * (A0-1);
SUM += 5.02808 * log10(A0);
SUM += -1.3816e-7 * (pow(10, (11.344*(1-1/A0)))-1) ;
SUM += 8.1328e-3 * (pow(10,(-3.49149*(A0-1)))-1) ;
SUM += log10(1013.246);
double VP = pow(10, SUM-3) * humidity;
double T = log(VP/0.61078); // temp var
return (241.88 * T) / (17.558-T);
}
// delta max = 0.6544 wrt dewPoint()
// 5x faster than dewPoint()
// reference: http://en.wikipedia.org/wiki/Dew_point
double dewPointFast(double celsius, double humidity)
{
double a = 17.271;
double b = 237.7;
double temp = (a * celsius) / (b + celsius) + log(humidity/100);
double Td = (b * temp) / (a - temp);
return Td;
}
void setup()
{
lcd.begin(16, 2);
lcd.setCursor(0,0);
lcd.print("DHT11 TEST"); delay(2000);
lcd.setCursor(0,0);
lcd.print("VERSION: ");
lcd.print(DHT11LIB_VERSION); delay(2000);
}
void loop()
{
int chk = DHT11.read(DHT11PIN);
lcd.clear(); lcd.setCursor(0,0);
lcd.print("H:");
lcd.print((float)DHT11.humidity, 2);
lcd.setCursor(8,0);
lcd.print("T:");
lcd.print((float)DHT11.temperature, 2);
lcd.setCursor(0,1);
lcd.print("D:");
lcd.print(dewPoint(DHT11.temperature, DHT11.humidity));
lcd.setCursor(8,1);
lcd.print("F:");
lcd.print(dewPointFast(DHT11.temperature, DHT11.humidity));
delay(2000);
}
#include <dht11.h>
dht11 DHT11;
#define DHT11PIN A5
LiquidCrystal lcd(8, 9, 4, 5, 6, 7);
// dewPoint function NOAA
// reference: http://wahiduddin.net/calc/density_algorithms.htm
double dewPoint(double celsius, double humidity)
{
double A0= 373.15/(273.15 + celsius);
double SUM = -7.90298 * (A0-1);
SUM += 5.02808 * log10(A0);
SUM += -1.3816e-7 * (pow(10, (11.344*(1-1/A0)))-1) ;
SUM += 8.1328e-3 * (pow(10,(-3.49149*(A0-1)))-1) ;
SUM += log10(1013.246);
double VP = pow(10, SUM-3) * humidity;
double T = log(VP/0.61078); // temp var
return (241.88 * T) / (17.558-T);
}
// delta max = 0.6544 wrt dewPoint()
// 5x faster than dewPoint()
// reference: http://en.wikipedia.org/wiki/Dew_point
double dewPointFast(double celsius, double humidity)
{
double a = 17.271;
double b = 237.7;
double temp = (a * celsius) / (b + celsius) + log(humidity/100);
double Td = (b * temp) / (a - temp);
return Td;
}
void setup()
{
lcd.begin(16, 2);
lcd.setCursor(0,0);
lcd.print("DHT11 TEST"); delay(2000);
lcd.setCursor(0,0);
lcd.print("VERSION: ");
lcd.print(DHT11LIB_VERSION); delay(2000);
}
void loop()
{
int chk = DHT11.read(DHT11PIN);
lcd.clear(); lcd.setCursor(0,0);
lcd.print("H:");
lcd.print((float)DHT11.humidity, 2);
lcd.setCursor(8,0);
lcd.print("T:");
lcd.print((float)DHT11.temperature, 2);
lcd.setCursor(0,1);
lcd.print("D:");
lcd.print(dewPoint(DHT11.temperature, DHT11.humidity));
lcd.setCursor(8,1);
lcd.print("F:");
lcd.print(dewPointFast(DHT11.temperature, DHT11.humidity));
delay(2000);
}
4. ROZBIEŻNOŚĆ ODCZYTU TEMPERATURY MIĘDZY LM35 ORAZ DHT11
Różnica odczytu między jednymczujnikiem a drugim może sięgać do 2*C.
#include <LiquidCrystal.h>
#include <dht11.h>
dht11 DHT11;
#define DHT11PIN A5
LiquidCrystal lcd(8, 9, 4, 5, 6, 7);
void setup()
{
lcd.begin(16, 2);
lcd.setCursor(0,0);
}
void loop()
{
float val;
float dat;
val=analogRead(4);
dat=(500*val)/1024;
int chk = DHT11.read(DHT11PIN);
lcd.clear(); lcd.setCursor(0,0);
lcd.print("T1:");
lcd.print((float)DHT11.temperature,2);
lcd.setCursor(0,1);
lcd.print("T2:");
lcd.print((float)dat,2);
delay(2000);
}
5. (LM35+DHT11)/2
Skoro jest duża rozbieżność wpomiarze temperatury między czujnikami to może mając dwa niezależne wyciągnąć średnią. tą średnią możemy również wykorzystać do wyliczenia Punku Rosy.
#include <LiquidCrystal.h>
#include <dht11.h>
dht11 DHT11;
#define DHT11PIN A5
LiquidCrystal lcd(8, 9, 4, 5, 6, 7);
double dewPoint(double celsius, double humidity)
{
double A0= 373.15/(273.15 + celsius);
double SUM = -7.90298 * (A0-1);
SUM += 5.02808 * log10(A0);
SUM += -1.3816e-7 * (pow(10, (11.344*(1-1/A0)))-1) ;
SUM += 8.1328e-3 * (pow(10,(-3.49149*(A0-1)))-1) ;
SUM += log10(1013.246);
double VP = pow(10, SUM-3) * humidity;
double T = log(VP/0.61078); // temp var
return (241.88 * T) / (17.558-T);
}
double dewPointFast(double celsius, double humidity)
{
double a = 17.271;
double b = 237.7;
double temp = (a * celsius) / (b + celsius) + log(humidity/100);
double Td = (b * temp) / (a - temp);
return Td;
}
void setup()
{
lcd.begin(16, 2);
lcd.setCursor(0,0);
lcd.print("DHT11 TEST"); delay(2000);
lcd.setCursor(0,0);
lcd.print("VERSION: ");
lcd.print(DHT11LIB_VERSION); delay(2000);
}
void loop()
{
float val;
float dat;
float temp;
val=analogRead(4);//Connect LM35 on Analog 0
dat=(500*val)/1024;
temp = (DHT11.temperature + dat)/2;
int chk = DHT11.read(DHT11PIN);
lcd.clear(); lcd.setCursor(0,0);
lcd.print("H:");
lcd.print((float)DHT11.humidity, 2);
lcd.setCursor(8,0);
lcd.print("T:");
lcd.print((float)temp, 2);
lcd.setCursor(0,1);
lcd.print("D:");
lcd.print(dewPoint(temp, DHT11.humidity));
lcd.setCursor(8,1);
lcd.print("F:");
lcd.print(dewPointFast(temp, DHT11.humidity));
delay(2000);
}
#include <dht11.h>
dht11 DHT11;
#define DHT11PIN A5
LiquidCrystal lcd(8, 9, 4, 5, 6, 7);
double dewPoint(double celsius, double humidity)
{
double A0= 373.15/(273.15 + celsius);
double SUM = -7.90298 * (A0-1);
SUM += 5.02808 * log10(A0);
SUM += -1.3816e-7 * (pow(10, (11.344*(1-1/A0)))-1) ;
SUM += 8.1328e-3 * (pow(10,(-3.49149*(A0-1)))-1) ;
SUM += log10(1013.246);
double VP = pow(10, SUM-3) * humidity;
double T = log(VP/0.61078); // temp var
return (241.88 * T) / (17.558-T);
}
double dewPointFast(double celsius, double humidity)
{
double a = 17.271;
double b = 237.7;
double temp = (a * celsius) / (b + celsius) + log(humidity/100);
double Td = (b * temp) / (a - temp);
return Td;
}
void setup()
{
lcd.begin(16, 2);
lcd.setCursor(0,0);
lcd.print("DHT11 TEST"); delay(2000);
lcd.setCursor(0,0);
lcd.print("VERSION: ");
lcd.print(DHT11LIB_VERSION); delay(2000);
}
void loop()
{
float val;
float dat;
float temp;
val=analogRead(4);//Connect LM35 on Analog 0
dat=(500*val)/1024;
temp = (DHT11.temperature + dat)/2;
int chk = DHT11.read(DHT11PIN);
lcd.clear(); lcd.setCursor(0,0);
lcd.print("H:");
lcd.print((float)DHT11.humidity, 2);
lcd.setCursor(8,0);
lcd.print("T:");
lcd.print((float)temp, 2);
lcd.setCursor(0,1);
lcd.print("D:");
lcd.print(dewPoint(temp, DHT11.humidity));
lcd.setCursor(8,1);
lcd.print("F:");
lcd.print(dewPointFast(temp, DHT11.humidity));
delay(2000);
}
6. WILGOTNOŚĆ, TEMPERATURA, CISNIENIE, WYSOKOŚĆ
A teraz wszystko razem... podłączamy trzy czujniki DHT11, LM35 i BMP085 poniżej kod i gotowe... :( nie do końca :( trzeba było się pogłowić nad wysokością wyglądało na początku niezbyt skomplikowanie... należało tylko wpisać odpowiednią komendę i gotowe :) bmp.readAltitude() oczywiście zaczął mierzyć wysokość ale ... jako wartość 0 ma ciśnienie 1013,25 i nie zawsze jest to ciśnienie odpowiadające ciśnieniu na poziomie 0mnpm :) więc należało by to skorygować ... znaleźć tą wartość :) np tutaj i wstawiamy go w nawias bez przecinka pamiętając żeby było 6 liczb, brakujące uzupełniamy zerami np. bmp.readAltitude(102500)... No i mamy na wyświetlaczu pojawi się aktualna wysokość... u mnie w Warszawie po skalibowaniu pojawiła się wartość 109m np filtry warszawskie leżą na wysokości 114m... :) jestem w pełni usatysfakcjonowany :) Temperaturę mierzą wszystkie trzy urządzenia w takim razie dodałem wartości i podzieliłem na 3. Średnia jest dość zbliżona do termometru w budziku :) problrmrm jest nadal wilgotność... prezentowany odczyt wynosi ciągle ok 30% :( gdy w kuchni i w pokoju córki mam ok 50% może w tym pokoju jest bardziej sucho :) porobię trochę prób, może czujnik jest zwalony :(
#include <Wire.h>
#include <Adafruit_BMP085.h>
Adafruit_BMP085 bmp;
#include <LiquidCrystal.h>
#include <dht11.h>
dht11 DHT11;
#define DHT11PIN A3
LiquidCrystal lcd(8, 9, 4, 5, 6, 7);
void setup()
{
lcd.begin(16, 2);
bmp.begin();
}
void loop()
{
float val;
float dat;
float temp;
int hPa;
hPa=bmp.readPressure()/100;
val=analogRead(2);
dat=(500*val)/1024;
temp = (DHT11.temperature + bmp.readTemperature() + dat)/3;
int chk = DHT11.read(DHT11PIN);
lcd.clear(); lcd.setCursor(0,0);
lcd.print("H:");
lcd.print((float)DHT11.humidity, 2);
lcd.setCursor(8,0);
lcd.print("T:");
lcd.print((float)temp, 2);
lcd.setCursor(0,1);
lcd.print("C:");
lcd.print(hPa);
lcd.setCursor(8,1);
lcd.print("W:");
lcd.print(bmp.readAltitude(102610));
delay(3000);
}
...
zamiast hth11 wez thh22, jest lepiej wykonany.
OdpowiedzUsuń