Доброго времени суток!
Хотелось бы поделиться своим проектом домашней метеостанции на основе Ардуины.
Обвес: DS3231 (часы реального времени), DHT22 (датчик температуры и влажности), BMP180 (датчик давления и температуры) и LCD-экран 2004 c интерфейсом I2C.
Схема подключения приведена ниже:
Скачать схему
Листинг программы :
// Домашняя погодная станция AlphaT @ Даниил Шевченко,2014
// dashevda@yandex.ru
#include "DHT.h"
#include <DS1307.h>
#include <Wire.h>
#include <LiquidCrystal_I2C.h>
#include <SFE_BMP180.h>
SFE_BMP180 pressure;
#define ALTITUDE 170.0 // Высота над уровнем моря (метры)
LiquidCrystal_I2C lcd(0x27, 2, 1, 0, 4, 5, 6, 7, 3, POSITIVE);//установка IIC-адреса дисплея
DS1307 rtc(A2, A3); // ds3231 на аналоговых пинах 2,3
DHT dht;
char* x = "1"; // объявляем символьную x=1
void setup()
{
Serial.begin(9600);
Wire.begin();
pressure.begin();
rtc.halt(false); // Set the clock to run-mode
lcd.begin(20, 4);
dht.setup(2); // data pin 2
/*
// УСТАНОВКА ВРЕМЕНИ
rtc.setDOW(MONDAY); // день недели
rtc.setTime(10,47,30); // время (часы,минуты,секунды)
rtc.setDate(13, 04, 2015); // дата (число,месяц,год)
*/
// заставка при включении
lcd.setCursor(0, 0);
lcd.print(" AlphaT v0.99");
delay(800);
lcd.setCursor(0, 1);
lcd.print(" Weather Station");
delay(800);
lcd.setCursor(0, 2);
lcd.print(" @Daniil Shevchenko");
lcd.setCursor(0, 3);
delay(800);
lcd.print(" 2014 Fuck Eah!===>");
delay(2000);
lcd.clear();
uint8_t temp_cel[8] = {B00111, B00101, B00111, B00000, B00000, B00000, B00000};//значок градуса
lcd.createChar(1, temp_cel);
char temp[] = {'\1', 67, '\0'}; //Отрисовка градусов Цельсия
lcd.setCursor(7, 3); // установка курсора на позицию 18:3
lcd.print(temp); // вывод на экран значка градуса Цельсия
lcd.setCursor(18, 3); // установка курсора на позицию 18:3
lcd.print(temp); // вывод на экран значка градуса Цельсия
}
void loop()
{
char status;
double T, P;
status = pressure.startTemperature();
delay(status);
status = pressure.getTemperature(T);
status = pressure.startPressure(3);
delay(status);
status = pressure.getPressure(P, T);
lcd.setCursor(0, 1);
lcd.print("-----");
lcd.setCursor(9, 2);
lcd.setCursor(14, 1);
lcd.print(" -----");
lcd.setCursor(9, 2);
lcd.print(" ");
lcd.setCursor(9, 3);
lcd.print(" ");
lcd.setCursor(18, 2);
lcd.print("mm");
lcd.setCursor(8, 2); // установка курсора на позицию
lcd.print("%"); // вывод на экран "%"
lcd.setCursor(0, 0); // установка курсора на позицию 0:0
lcd.print(rtc.getDOWStr(3)); // вывод на экран дня недели из ds3231
lcd.setCursor(10, 0); // установка курсора на позицию 10:0
lcd.print(rtc.getDateStr()); // вывод на экран даты из ds3231
lcd.setCursor(6, 1); // установка курсора на позицию 6:1
lcd.print(rtc.getTimeStr()); // вывод на экран времени из ds3231
Serial.print(rtc.getTimeStr());
Serial.println();
float humidity = dht.getHumidity(); // запись в переменную humidity значения влажности с dht22
float temperature = dht.getTemperature();//запись в temperature значение температуры с dht22
lcd.setCursor(0, 2); // установка курсора на позицию 0:2
lcd.print("H:"); // вывод на экран "Humi :"
lcd.setCursor(3, 2); // установка курсора на позицию 14:2
lcd.print(humidity, 1); // вывод на экран значения влажности
lcd.setCursor(0, 3); // установка курсора на позицию 0:3
lcd.print("T:"); // вывод на экран "Temp :"
lcd.setCursor(3, 3); // установка курсора на позицию 14:3
lcd.print(temperature, 1); // вывод на экран значения температуры
lcd.setCursor(11, 2);
lcd.print("P:");
lcd.setCursor(14, 2);
lcd.print(P * 0.75014766658, 0);
lcd.setCursor(11, 3);
lcd.print("T:");
Serial.print(humidity);
Serial.println();
Serial.print(temperature);
Serial.println();
Serial.print(P);
Serial.println();
if (T >= 0 && T < 10) {
lcd.setCursor(13, 3);
lcd.print(" ");
lcd.setCursor(17, 3);
lcd.print(" ");
lcd.setCursor(14, 3);
lcd.print(T, 1);
}
else if (T < 0 && T > -10) {
lcd.setCursor(17, 3);
lcd.print(" ");
lcd.setCursor(13, 3);
lcd.print(T, 1);
}
else if (T <= -10) {
lcd.setCursor(13, 3);
lcd.print(T, 1);
}
else if (T >= 10) {
lcd.setCursor(14, 3);
lcd.print(T, 1);
}
// уборка лишних символов от названия предыдущего дня
if (x != rtc.getDOWStr())
{ lcd.setCursor(0, 0);
lcd.print(" ");
}
x = rtc.getDOWStr();
delay(1000);
}
Скачать скетч
Сначала всё собрал на макетке:
Экран крупным планом:
Затем всё запаял на плату (с Arduino Mini Pro 5V 16Mhz):
К сожалению, на Ардуине мини про не обнаружил линию +3.3В, от которого питается датчик BMP180, пришлось воспользоваться вот таким конвертером уровней с 5В на 3.3В:
Дата и время устанавливаются один раз в программе.
Навесной монтаж с обратной стороны выглядит так (извиняюсь за такой кустарный колхоз):
В дальнейшем планирую следующие улучшения/переделки :
- корпус;
- BMP180 выведу на улицу;
- кнопки установки даты и времени + будильник (добавлю бипер или mp3-шилд для мелодий) ;
- датчик углекислого газа с сигнализированием о необходимости проветривания;
- логгирование показаний на флешку (давление, уличная температура с привязкой к дате/времени,).
Для второй, более продвинутой версии, вытравлю нормальную плату:)
Спасибо за внимание!
PS: продолжение следует!!!
|