METEO


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);
 }
...

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);
}

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);
}

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);
}
...

1 komentarz:

  1. zamiast hth11 wez thh22, jest lepiej wykonany.

    OdpowiedzUsuń