/*Программа считывает данные с датчиков температуры, влажности, давления и выводит их на монитор последовательного порта.
К Arduino подключены:
• кнопка S1, которая подключена к цифровому выводу 3 Arduino,
• датчик температуры и давления BMP-180, установленный на переходной плате GY-68. Датчик подключен к выводам A5 (SCL) и A4 (SDA) Arduino,
• датчик температуры и влажности DHT22 (AM2302), вывод которого подключен к цифровому выводу 2 Arduino.
После подачи питания, горит светодиод L на Arduino.
Arduino считывает информацию с датчиков и по последовательному порту (UART) передает ее на монитор последовательного порта.
При нажатии кнопки S1 передача информации приостанавливается. При повторном нажатии - возобновляется.
Формат переданной информации следующий:
BMP180
Temperature: xx.xx *C, Absolute Pressure: xxx.xx mb,
DHT22
Temperature: xx.xx *C, Humidity: xx.xx %
Перезапуск программы осуществляется кнопкой Reset на Arduino.*/
#include "DHT.h"
#define DHTPIN 2 // подключение DHT к D2
#define DHTTYPE DHT22 // тип датчика DHT 22 (AM2302), AM2321
DHT dht(DHTPIN, DHTTYPE); //объявления объекта DHT
//объявления объекта BMP180
int S1 = 3; //кнопка S1
int L = 13; //обозначение светодиода L на выводе 13
int green = 5;
int red = 4;
bool upr=true;
int counter=0; //счетчик для отображения в ПП
boolean lastButton = HIGH; //переменная для хранения последнего состояния кнопки
boolean currentButton = LOW; //переменная для хранения текущего состояния кнопки
boolean debounce(boolean last) //подпрограмма считывания состояния кнопки S1 с учетом подавления дребезга
{
boolean current = digitalRead(S1); //считывание текущего состояния кнопки
if(last = current) //сравнение с предыдущим значением
{
delay(200); //задержка 10 мс
current = digitalRead(S1); //считывание текущего состояния кнопки
}
return current; //возвращение текущего состояния кнопки
}
void setup() {
pinMode(L,OUTPUT); //настройка L на выход
pinMode(green,OUTPUT);
pinMode(red,OUTPUT);
digitalWrite(L, HIGH); //включение светодиода L
pinMode(S1, INPUT_PULLUP);
Serial.begin(9600); //открытие последовательного порта
Serial.println("Meteostation");
dht.begin(); //запуск DHT
//запуск BMP180
}
void loop() {
char status;
double T,P;
currentButton = debounce(LOW); //S1 с учетом дребезга
if (currentButton == LOW && lastButton == HIGH ) //кнопка S1 нажата
{
upr=!upr;
if(upr) Serial.println("Start"); else Serial.println("Stop");//печать состояния программы
}
if((upr)&&(counter>10)) //печать каждые 2с для срабатывания датчиков
{
counter=0;
status = analogRead(A5); // чтение температуры с BMP180
if (status != 0)
{
delay(status); // задержка
status = analogRead(A5); // чтение температуры
if (status != 0) // если все успешно
{
// Вывод температуры на монитор ПП порта
Serial.println("BMP180");
Serial.print("Absolute Pressure: ");
Serial.print(P,2);
Serial.print(" mb, ");
/////////////////////////////////////
status = analogRead(A4); // старт измерения давления с BMP180
if (status != 0)
{
delay(status); // Задержка
status = analogRead(A4); // чтение давления
if (status != 0) // если все успешно
{
//вывод давления на монитор ПП порта
Serial.print("Temperature: ");
Serial.print(T,2);
Serial.println(" *C, ");
Serial.println(".................................................");
}
// Вывод информации об ошибках чтения с BMP180
else Serial.println("error retrieving pressure measurement\n");
}
else Serial.println("error starting pressure measurement\n");
}
else Serial.println("error retrieving temperature measurement\n");
}
else Serial.println("error starting temperature measurement\n");
/////////////////////////////////////////////////////////////////////////////////////
Serial.println("DHT22");
float h = dht.readHumidity(); //чтение давления с DHT22
float t = dht.readTemperature(); //чтение температуры с DHT22 в С
if (isnan(h) || isnan(t) ) { //если произашла ошибка
Serial.println("Failed to read from DHT sensor!");
return;
}
if (t > 20.0) {
digitalWrite(green, LOW);
digitalWrite(red, HIGH);
}
else {
digitalWrite(green, HIGH);
digitalWrite(red, LOW);
}
Serial.print("Temperature: ");
Serial.print(t);
Serial.print(" *C, ");
Serial.print("Humidity: ");
Serial.print(h);
Serial.println(" %\t");
Serial.println(".................................................");
}
counter++;
delay(200);
}