Главная » 2015 » Апрель » 13 » Домашняя погодная станция на Arduino
12:11
Домашняя погодная станция на Arduino

 

Доброго времени суток! 

Хотелось бы поделиться своим проектом домашней метеостанции на основе Ардуины. 

Обвес: 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: продолжение следует!!!

 

 

Категория: Electronics | Просмотров: 17018 | Добавил: RocketJump | Теги: 2004 lcd, dht22, bmp180, метеостанция, Arduino, подключение к Ардуино, ds3231 | Рейтинг: 4.3/3
Всего комментариев: 61 2 3 4 5 6 »
avatar
1 zero___ • 21:26, 07.02.2016
А можешь кинуть библиотеки которые использовал?
Заранее спасибо)
1-1 2-2 3-3 4-4 5-5 6-6
avatar