Для того, чтобы узнать температуру и влажность воздуха на улице, а также атмосферное давление, можно посмотреть прогноз в телевизоре или на погодных сайтах в сети Интернет. Но, как известно, гидрометеоцентр частенько ошибается. Получить фактические точные данные  можно с помощью домашней метеостанции. Домашнюю метеостанцию можно купить, а можно сделать самостоятельно. Рассмотрим создание домашней метеостанции на контроллере Arduino.

Проект метеостанции на Arduino

Наша домашняя метеостанция будет измерять температуру и влажность воздуха, атмосферное давление и выводить параметры на ЖК-дисплей. Список комплектующих, которые понадобятся для данного проекта:

  • контроллер Arduino;
  • плата прототипирования (без пайки)
  • модуль датчика BMP085 или BMP180
  • модуль с датчиком влажности DHT11
  • датчик температуры DS18B20
  • резистор 4,7 кОм;
  • дисплей Nokia 5110
  • провода и корпус

 В качестве платы Arduino в принципе можно использовать любую из модельного ряда Arduino, но я рекомендую Arduino Uno или Arduino Duemilanove, так как в будущем собираюсь установить на нее Ethernet shield, чтобы сделать домашнюю метеостанцию устройством IoT ("Интернета вещей"). Я буду использовать плату Arduino Duemilanove (рисунок 1).

Плата Arduino Duemilanove
Рис. 1. Плата Arduino Duemilanove


Теперь рассмотрим датчики, которые будем использовать в проекте.
Датчик давления BMP085 (рисунок 2) – высокоточный датчик атмосферного давления с низким энергопотреблением. используется для измерения атмосферного давления. Точность достигает минимального значения измерения давления 0.03hPa. Также выводит и данные о температуре. Напряжение питания 1.62V - 3.6V. Интерфейс подключения I2C. В продаже встречаются готовые платы  как с стабилизатором, так и без него. Датчик давления BMP085 мы будем использовать только для измерения атмосферного давления, для измерения температуры будем использовать более точный датчик DS18B20.

Модуль датчика BMP085
Рис.2. Модуль датчика BMP085


Датчик температуры DS18B20 (рисунок 3) –  это цифровой измеритель температуры  с  разрешением преобразования 9 - 12 разрядов и функцией тревожного сигнала контроля за температурой. Обменивается данными с микроконтроллером по однопроводной линии связи, используя протокол интерфейса 1-Wire. Диапазон измерения температуры составляет от -55 до +125 °C. Для диапазона от -10 до +85 °C погрешность не превышает 0,5 °C. У каждой микросхемы DS18B20 есть уникальный серийный код длиной 64 разряда, который позволяет нескольким датчикам подключаться на одну общую линию связи.

Датчик температуры DS18B20
Рис. 3. Датчик температуры DS18B20


Датчик DHT11 (рисунок 4) не обладают высоким быстродействием и точностью, но зато имеет низкую стоимость. Датчик состоит из емкостного датчика влажности и термистора. Содержит аналого-цифровой преобразователь для преобразования аналоговых значений влажности и температуры в цифровые. Диапазон измерения влажности – 20-80%, частота опроса 1 раз в секунду. Мы будем использовать в проекте датчик DHT11 в виде готового модуля.

Модуль DHT11
Рис.4. Модуль DHT11


Для отображения информации с датчиков будем использовать ЖК-дисплей Nokia 5110 (рисунок 5). Это графический монохромный дисплей с разрешением 84×48 точек. Дисплей Nokia 5110 поставляется на плате в паре с контроллером PCD8544 и штыревым разъемом. Электропотребление дисплея позволяет питать его от выхода +3.3 В платы Arduino.

Дисплей Nokia 5110
Рис. 5. Дисплей Nokia 5110


Собираем схему согласно рисунка 6.

Схема подключения к Arduino
Рис. 6. Схема подключения к Arduino


Для удобства я спаял датчики на плате прототипирования, сделал контакты для подключения проводов от дисплея и оформил это в виде шилда – припаял штырьки для подключения к контактам платы Arduino (рисунок 7).

Проект метеостанции на Arduino
Рис. 7. Как получилось у меня. Проект метеостанции на Arduino


Теперь приступим к написанию скетча. При написании скетча нам понадоьятся следующие Arduino-библиотеки:
•    OneWire – для работы с устройствами 1-Wire (датчик DS18B20);
•    BMP085 и Wire – для работы с датчиком BMP085 (или BMP180);
•    DHT – для работы с датчиком DHT11;
•    Adafruit_GFX и Adafruit_PCD8544 – для работы с дисплеем Nokia 5110.

С периодичностью 5 секунд получаем данные с датчиков DS18B20, DHT11, BMP085 и выводим в монитор последовательного порта и на дисплей Nokia 5110. Процедура получения данных с датчика DS18B20 – get_temp()  выполняет поиск устройств 1-Wire, подключенных к выводу Adruino  D7 (у нас один датчик), и выдает его данные.
Запустим Arduino IDE. Создадим новый скетч и внесем в него содержимое листинга 1.

// подключение библиотек
#include <OneWire.h>
#include <Wire.h>
#include <BMP085.h>
#include "DHT.h"
#include <Adafruit_GFX.h>
#include <Adafruit_PCD8544.h>
// тип DHT сенсора
#define DHTTYPE DHT11   // DHT 11 
// создание экземпляров объектов
BMP085 dps = BMP085();
DHT dht(8, DHTTYPE);  // dht11 на pin 8
OneWire  ds(9);       // ds18b20 на pin 9
// Nokia 5110
// pin 3 - Serial clock out (SCLK)
// pin 4 - Serial data out (DIN)
// pin 5 - Data/Command select (D/C)
// pin 6 - LCD chip select (CS)
// pin 7 - LCD reset (RST)
Adafruit_PCD8544 display = Adafruit_PCD8544(3, 4, 5, 6, 7);
// переменные
int Temp1;
long Temperature085 = 0, Pressure085 = 0, Altitude085 = 0;

void setup() {
  // запуск последовательного порта
  Serial.begin(9600);
  Serial.println("start");
  // запуск I2C
  Wire.begin();
  // запуск bmp
  dps.init();   
  // инициализация дисплея
  display.begin();
  // установить контраст фона экрана
  display.setContrast(60);
  display.clearDisplay();       // очистить экран
  display.setTextSize(1);    // размер шрифта
  display.setTextColor(BLACK);   // цвет
  // заставка
  display.setCursor(15,15);   
  display.print("Home Meteo"); 
  display.display();
  delay(2000);
}


void loop () {
   display.clearDisplay();     
   display.setCursor(15,5);   
   display.print("Home Meteo"); 
   // ds18b20
   int Temp=get_temp();
   if(Temp==999) {
     display.setCursor(15,15);   
     display.print("t="); 
     display.print(Temp1/16); 
     display.print(".");
     display.print(((Temp1%16)*100)/16);
     display.print(" C");
    }
   else if(Temp==998) {
     Serial.println("Temp=ERROR");
     display.setCursor(15,15);   
     display.print("t=ERROR"); 
   }
   else {
     Serial.print("Temp=");
     Serial.print(Temp/16);
     Serial.print(".");
     Serial.print(((Temp%16)*100)/16);
     Serial.println(" *C");
     display.setCursor(15,15);   
     display.print("t="); 
     display.print(Temp/16); 
     display.print(".");
     display.print(((Temp%16)*100)/16);
     display.print(" C");
     Temp1=Temp;
   }
   // dht11
   float h = dht.readHumidity();
   float t = dht.readTemperature();
   Serial.print("humidity="); 
   Serial.print(h);
   Serial.println(" %");
   Serial.print("temperatura="); 
   Serial.print(t);
   Serial.println(" *C");
   display.setCursor(15,25);   
   display.print("h="); 
   display.print(h); 
   display.print(" %");
   // bmp085
   dps.getTemperature(&Temperature085); 
   dps.getPressure(&Pressure085);
   dps.getAltitude(&Altitude085);
   Serial.print("pressure5="); 
   Serial.print(Pressure085/133.3);
   Serial.println(" mm Hg");
   Serial.print("temp5="); 
   Serial.print(Temperature085*0.1);
   Serial.println(" *C");
   Serial.println();
   display.setCursor(5,35);   
   display.print("p="); 
   display.print(Pressure085/133.3); 
   display.print("mmHg");
   // обновить
   display.display();
   // пауза
   delay(5000);
}
// получение температуры датчика ds18b20
int get_temp() {
 byte i;
 byte present = 0;
 byte data[12];
 byte addr[8];
 int Temp;
  
  if ( !ds.search(addr)) {
        Serial.print("No more addresses.\n");
        ds.reset_search();
        return 999;
  }
  Serial.print("R=");  // печать уникального 1-wire идентификатора
  for( i = 0; i < 8; i++) {
    Serial.print(addr[i], HEX);
    Serial.print(" ");
  }
  Serial.println();
  if ( OneWire::crc8( addr, 7) != addr[7]) {
        Serial.print("CRC is not valid!\n");
        return 999;
  }
  if ( addr[0] != 0x28) {
        Serial.print("Device is not a DS18S20 family device.\n");
        return 999;
  }
  
  ds.reset();
  ds.select(addr);
  // начинаем преобразование, используя ds.write(0x44,1)
  ds.write(0x44,1);
  // пауза с запасом (750 мс)  
  delay(1000);     
  ds.reset();

  ds.select(addr);
  ds.write(0xBE);          
  for ( i = 0; i < 9; i++) {        
    data[i] = ds.read();
  }
  Temp=(data[1]<<8)+data[0];
  Temp=Temp;
  Serial.print("intT=");
  Serial.println(Temp);
    
  return Temp;
}

После загрузки скетча видим вывод получаемых данных в мониторе последовательного порта (рисунок 8) и на экран дисплея Nokia 5110 (рисунок 9).

Вывод данных в монитор последовательного порта
Рис.8. Вывод данных в монитор последовательного порта


Устанавливаем это все в корпус (рисунок 10).

Вывод данных с Arduino на дисплей Nokia 5110
Рис. 9. Вывод данных с Arduino на дисплей Nokia 5110


Устанавливаем это все в корпус (рисунок 10).

Собранная на Ардуино метеостанция в корпусе
Рис. 10. Собранная на Ардуино метеостанция в корпусе


Остается накрыть блок крышкой и перенести на улицу, при этом дисплей и блок питания оставить в комнате. Метеостанция будет готова к работе.

Метеостанцию можно усложнить, добавив датчик дождя и часть кода из предыдущего проекта "Датчик дождя на Arduino".

В прикрепленных архивах рабочий скетч и необходимые библиотеки. Скачать архив проекта "Метеостанция на Ардуионо".

Вы можете собрать данный проект, используя товары из магазина Радиодеда:

Образовательный конструктор на Arduino

1542Образовательный конструктор "33 ПРОЕКТА ARDUINO" для обучения основам электроники и программирования на основе книги "Практическая энциклопедия Arduino"

Описание

3900,00 руб


 

Добавить комментарий


Защитный код
Обновить