Zbuduj prostą stacjĘ pogodową



Kod programu:

//początek programu
#include <Adafruit_Sensor.h>
#include <Adafruit_BME280.h>
#include <LiquidCrystal.h>
float temperature;
float humidity;
float pressure;
int counter=0;
float odczyt=0;
String znak="<*>";
byte st[8] = {
B00110,
B00110,
B00000,
B00000,
B00000,
B00000,
B00000,
B00000
};
#define czerwona 10
#define zielona 11
#define niebieska 3

#define ALTITUDE 437.0 // Altitude in Żywiec, Poland
Adafruit_BME280 bme; // I2C
LiquidCrystal lcd(4, 5, 6, 7, 8, 9);

void setup(void) {
pinMode(czerwona, OUTPUT);
pinMode(zielona, OUTPUT);
pinMode(niebieska, OUTPUT);
Serial.begin(9600);
lcd.createChar(0, st);
lcd.begin(16, 2);
lcd.print("Odczyt danych");

bool status;
// default settings
status = bme.begin(0x76); //I2C adres czujnika
if (!status) {
lcd.clear();
lcd.print("Czujnik nie");
lcd.setCursor(0,1);
lcd.print("funkcjonuje");
while (1);
}
}

void loop() {
delay(2000);
getPressure();
getHumidity();
getTemperature();
lcd.clear();
//Printing Temperature
String temperatureString = String(temperature,1);
lcd.print("T: ");
lcd.print(temperatureString);
//lcd.print((char)223);
lcd.print((char)0);
lcd.print("C ");
//Printing Humidity
String humidityString = String(humidity,0);
lcd.print("W: ");
lcd.print(humidityString);
lcd.print("%");
//Printing Pressure
lcd.setCursor(0,1);
lcd.print("C: ");
String pressureString = String(pressure,0);
if (pressure >= 1000.0) lcd.setCursor(3,1); else lcd.setCursor(4,1);
lcd.print(pressureString);
lcd.setCursor(8,1);
lcd.print("hPa");
lcd.setCursor(13,1);
lcd.print(znak);
//NIEBIESKA
if (pressure > 1020) {
digitalWrite(czerwona, LOW);
digitalWrite(zielona, LOW);
analogWrite(niebieska, 22);
}
//CZERWONA
if (pressure < 990) {
analogWrite(czerwona, 22);
digitalWrite(zielona, LOW);
digitalWrite(niebieska, LOW);
}
//ZIELONA
if ((pressure > 1000) && (pressure <= 1010)) {
digitalWrite(czerwona, LOW);
analogWrite(zielona, 22);
digitalWrite(niebieska, LOW);
}
//ZIELONA-NIEBIESKA
if ((pressure > 1010) && (pressure <= 1020)) {
digitalWrite(czerwona, LOW);
analogWrite(zielona, 22);
analogWrite(niebieska, 22);
}
//ZIELONA-CZERWONA
if ((pressure >= 990) && (pressure <= 1000)) {
analogWrite(czerwona, 22);
analogWrite(zielona, 22);
digitalWrite(niebieska, LOW);
}
//wyznaczanie trendu
counter++;
if (counter == 1) {odczyt = pressure;}
if (counter == 5400) { // interwał czasowy odczytu: 30 -> 1 minuta, 1800 - 1 godzina, 5400 - 3 godziny itd
odczyt = round(odczyt * 100.0) / 100.0;
pressure = round(pressure * 100.0) / 100.0;
odczyt = pressure - odczyt;
Serial.print(" pressure=");Serial.print(pressure);
Serial.print(" odczyt=");Serial.print(odczyt);
if (odczyt >= -1.0 && odczyt <=1.0) {znak="<->";}
if (odczyt < -1.0) {znak="<--";}
if (odczyt > 1.0) {znak="-->";}
Serial.print(" znak ");Serial.println(znak);
counter=0; //zerowanie licznika
}
}

float getTemperature()
{
temperature = bme.readTemperature();
}

float getHumidity()
{
humidity = bme.readHumidity();
}

float getPressure()
{
pressure = bme.readPressure();
pressure = bme.seaLevelForAltitude(ALTITUDE,pressure);
pressure = pressure/100.0F;

//koniec programu

Uwagi do programu:

dołączamy biblioteki Adafruit_Sensor, Adafruit_BME280 (czujnik BME280) oraz LiquidCrystal (wyświetlacz 16x2);
tablica st[8] definiuje znak stopnia Celsjusza;
stała ALTITUDE definiuje wysokość nad poziomem morza w naszej miejscowości;
zmienna logiczna status bada stan połączenia z czujnikiem, po wystąpieniu błędu zapętla program;

zmienna znak przyjmuje w zależności od stanu zmiennej odczyt następujące wartości:
<*> pierwszy odczyt trendu ciśnienia - pierwsze trzy godziny od włączenia układu
<-> małe wahania ciśnienia (2 hpa)
<-- spadek ciśnienia
--> wzrost ciśnienia

Diody LED:
zmiana stanu poszczególnych sekwencji jest uzależniona od aktualnej wartości zmiennej pressure;
kolejność sekwencji (od najniższego po bardzo wysokie ciśnienie):
CZERWONA
CZERWONA + ZIELONA
ZIELONA
ZIELONA + NIEBIESKA
NIEBIESKA

Kod źródłowy do pobrania TUTAJ