Meteostanice

Projekt ne zcela tradiční meteostanice sice nebyl řešen v našem koužku programování elektroniky a robotiky, ale meteostanici jsem tam ukazoval. Chci se tak o ní podělit i na těchto stránkách.

Netradičnost meteostanice spočívá v tom, že místo měření atmosférického tlaku měří koncentraci oxidu uhličitého. Dále již tradičně měří teplotu a relativní vlhkost. Naměřené hodnoty jsou vypisovány na dvouřádkový displej. Mozkem celé stanice je mikrokontrolér.

Použité komponenty:

  • Mikrokontrolér Arduino Nano
  • CO2 senzor MH-Z19B
  • Senzor teploty a vlhkosti DHT11
  • Displej 1602A
  • Odporový trimr 10K
  • PCB deska, vodiče, rezistor

Kód:

#include <SimpleDHT.h>
#include <LiquidCrystal.h>
#include <SoftwareSerial.h>

#define data 12
#define rs 13
#define en 10
#define d4 8
#define d5 6
#define d6 4
#define d7 3
#define voltage A0
#define pwmPin A1
#define correctionT 6

long adc, th, tl, ppm = 0.0;
byte cmd[9] = {0xFF,0x01,0x86,0x00,0x00,0x00,0x00,0x00,0x79};
byte ABCon[9] = {0xFF,0x01,0x79,0xA0,0x00,0x00,0x00,0x00,0xE6};
char response[9];

SoftwareSerial mySerial(5,9); // RX, TX
SimpleDHT11 dht11(data);
LiquidCrystal lcd(rs, en, d4, d5, d6, d7);

void setup() {
mySerial.begin(9600);
mySerial.write(ABCon,9);
mySerial.write(cmd,9);
for (byte i=2; i<=13;i++) {
pinMode(i,OUTPUT);
}
pinMode(data,INPUT); // DHT11
for(byte i=2; i<=7;i++){
pinMode('A'+i,OUTPUT);
}
pinMode(pwmPin, INPUT); // PWM
pinMode(voltage, INPUT); // analog

lcd.begin(16, 2);
lcd.setCursor(0,0);
lcd.print("T: -- ");
lcd.print((char)223);
lcd.print("C H: -- %");
lcd.setCursor(0,1);
lcd.print("CO2: ---- ppm");
}

void loop() { // DHT11
byte temperature = 0;
byte humidity = 0;
int err = SimpleDHTErrSuccess;
if ((err = dht11.read(&temperature, &humidity, NULL)) != SimpleDHTErrSuccess) {
delay(1000);
return;
}
lcd.setCursor(3,0);
if ((int)temperature-correctionT >= 0 && (int)temperature-correctionT < 10) lcd.print('0');
lcd.print((int)temperature-correctionT);
lcd.setCursor(12,0);
lcd.print((int)humidity);

//MH-Z19B
do {
adc=analogRead(voltage);
ppm=5.4095*adc-493.12;
} while (ppm < 100);

lcd.setCursor(5,1);
if (ppm<1000) lcd.print('0');
lcd.print(ppm);
delay(5000);
}

Poučení pro ostatní: CO2 senzor generuje značné množství tepla. Mé umístění teplotního čidla v jeho těsné blízkosti tedy není vhodné. Z tohoto důvodu jsem musel v kódu provádět korekci teploty a to o 6 stupňů! Doporučuji tedy lépe rozvrhnout komponenty, teplotní a CO2 čidla dát od sebe co možná nejdále a teplotní korekci se tak zcela vyhnout.