Как собрать метеостанцию на dht11
Перейти к содержимому

Как собрать метеостанцию на dht11

  • автор:

Урок 21.1 Метеостанция с сохранением данных на flash карту

В этом уроке мы научимся не только получать и выводить данные с датчиков и модулей на дисплей, но и сохранять эти данные на MicroSD карте.

Нам понадобится:
  • Arduino Uno х 1шт.
  • SPI адаптер карт MicroSD v1.0 х 1шт.
  • LCD дисплей LCD1602 IIC/I2C(синий) или LCD1602 IIC/I2C(зелёный) х 1шт.
  • Trema-модуль RTC (часы реального времени) на базе чипа DS1307 х 1шт.
  • Trema-модуль DHT22 (датчик температуры и влажности) х 1шт.
  • Trema-модуль Датчик освещённости х 1шт.
  • Trema-модуль I2C Hub х 1шт.
  • Trema Shield х 1шт.
  • 6 проводной шлейф ПАПА-МАМА для подключения х 1шт.
  • 4 проводной шлейф МАМА-МАМА для подключения х 2шт.
    Остальные провода входят в комплект Trema-модулей
    Trema-модуль DHT22 можно заменить на Trema-модуль DHT11

Для реализации проекта нам необходимо установить библиотеки:

  • Библиотека iarduino_RTC (для подключения RTC часов реального времени DS1302, DS1307, DS3231)
  • Библиотека iarduino_DHT (для работы с датчиками температуры и влажности DHT11, DHT22)
  • Библиотека LiquidCrystal_I2C_V112 (для подключения дисплеев LCD1602 по шине I2C)
    (Библиотека SD, для работы с адаптером MisroSD-карт, входит в стандартный набор Arduino IDE > Скетч> Подключить библиотеку > SD.)

О том как устанавливать библиотеки, Вы можете ознакомиться на странице Wiki — Установка библиотек в Arduino IDE .

Видео:
Схема подключения:

Подключение модулей RTC и LCD, осуществляется к аппаратным выводам шины I2C.
Подключение адаптера,осуществляется к аппаратным выводам шины SPI.
Trema-модуль датчик света подключается к аналоговому входу A0 (можно менять в скетче).
Trema-модуль DHT22 (датчик температуры и влажности) подключается к цифровому выводу 2 (можно менять в скетче).

Метеостанция на Arduino Uno

RTC модуль Trema на базе чипа DS1307 / LCD дисплей на базе чипа LCD1602 Arduino Uno
GND GND
Vcc +5V
SDA (Serial DAta) A4
SCL (Serial CLock) A5
Адаптер карт MicroSD Arduino Uno
CS (Chip Select) 10
SCK (Serial ClocK) 13
MOSI (Master Out Slave In) 11
MISO (Master In Slave Out) 12
Vcc 5V
GND GND
Датчики Arduino Uno
Trema-модуль датчик света A0
Trema-модуль DHT22 (датчик температуры и влажности) 2
Алгоритм работы метеостанции:
  • При старте, в течении 2 секунд, метеостанция выводит информацию о том, подключена ли SD-карта («ON»/»ERR»).
  • Каждую секунду, метеостанция опрашивает подключённые датчики и выводит информацию на LCD дисплей.
  • Каждые 5 минут информация сохраняется на SD-карту, добавляя новую строку в файл «iarduino.txt» в корне SD-карты.
Код программы:
// Подключаем библиотеки: #include // подключаем библиотеку для работы с шиной I2C (для LCD дисплея) #include // подключаем библиотеку для работы с LCD дисплеем #include // подключаем библиотеку для работы с шиной SPI (для адаптера карт MicroSD) #include // подключаем библиотеку для работы с адаптером карт MicroSD #include // подключаем библиотеку для работы с датчиком DHT #include // подключаем библиотеку для работы с RTC модулем // Объявляем переменные и константы: int8_t DHT_result; // объявляем переменную для хранения состояния опроса датчика DHT uint16_t LUM_result; // объявляем переменную для хранения результата опроса датчика освещённости bool MSD_result; // объявляем переменную для хранения состояния адаптера карт MicroSD uint8_t LCD_symbol[8] = ; // символ градуса const uint8_t PIN_temperature = 2; // номер цифрового вывода к которому подключён датчик DHT const uint8_t PIN_adapterSD_CS = 10; // указываем номер вывода CS шины SPI инициирующего передачу данных с адаптером карт MicroSD const uint8_t PIN_illumination = 0; // номер аналогового вывода к которому подключён освещенности LiquidCrystal_I2C lcd(0x27,16,2); // объявляем переменную для работы с LCD дисплеем, указывая параметры дисплея (адрес I2C = 0x27, количество столбцов = 16, количество строк = 2) iarduino_RTC time(RTC_DS1307); // объявляем переменную для работы с RTC модулем, указывая название модуля (DS1307) iarduino_DHT sensor(PIN_temperature); // объявляем переменную для работы с датчиком DHT, указывая номер цифрового вывода к которому подключён датчик File myFile; // объявляем переменную myFile класса File, которая будет служить "указателем" на открытый файл void setup() < MSD_result = SD.begin(PIN_adapterSD_CS); // инициируем SD карту с указанием номера вывода CS time.begin(); // инициируем RTC модуль lcd.init(); // инициируем LCD дисплей lcd.backlight(); // включаем подсветку LCD дисплея lcd.createChar(1, LCD_symbol); // загружаем символ градус lcd.setCursor(0, 0); // устанавливаем курсор в позицию: столбец 0, строка 0 lcd.print(F("iArduino.ru")); // выводим текст "iArduino.ru" lcd.setCursor(0, 1); // устанавливаем курсор в позицию: столбец 0, строка 1 lcd.print(F("SD-card ")); // выводим текст "SD-card" lcd.print(MSD_result?"OK":"ERR"); // выводим состояние карты MicroSD: "OK" или "ERR" delay(2000); // ждём 2 секунды lcd.clear(); // стираем информацию на дисплее >void loop() < if(time.seconds!=atoi(time.gettime("s")))< // выполняем скрипт один раз в секунду // читаем данные с датчиков: DHT_result = sensor.read(); // опрашиваем датчик DHT (влажность и температура) LUM_result = 1024-analogRead(PIN_illumination); // опрашиваем датчик освещённости // выводим информацию на LCD дисплей: // выводим температуру: lcd.setCursor(0, 0); // устанавливаем курсор в позицию: столбец 0, строка 0 lcd.print(F("t= \1C")); // выводим текст "t= °С" lcd.setCursor(2, 0); // устанавливаем курсор в позицию: столбец 2, строка 0 if(DHT_result==DHT_OK)// выводим значение температуры else // выводим текст ". " // выводим влажность: lcd.setCursor(0, 1); // устанавливаем курсор в позицию: столбец 0, строка 1 lcd.print(F("PH= %")); // выводим текст "PH= %" lcd.setCursor(3, 1); // устанавливаем курсор в позицию: столбец 3, строка 1 if(DHT_result==DHT_OK) // выводим значение влажности else // выводим текст ". " // выводим освещённость: lcd.setCursor(10, 0); // устанавливаем курсор в позицию: столбец 10, строка 0 lcd.print(F("*= ")); // выводим текст "*= " lcd.setCursor(12, 0); // устанавливаем курсор в позицию: столбец 12, строка 0 lcd.print(LUM_result); // выводим значение освещённости // выводим время: lcd.setCursor(10, 1); // устанавливаем курсор в позицию: столбец 10, строка 1 lcd.print(time.gettime("H:i")); // выводим время lcd.setCursor(12, 1); // устанавливаем курсор в позицию: столбец 12, строка 1 if(time.seconds%2) < lcd.print(" ");>// убираем знак ":" каждую нечётную секунду // сохраняем информацию на SD-карту: if(MSD_result) < // если SD-карта подключена if(time.seconds==0)< // если секунды равны 00 if(time.minutes%5==0)< // если минуты кратны 5 (равны: 00,05,10,15,20,25,30,35,40,45,50,55) myFile = SD.open(F("iarduino.txt"),FILE_WRITE); // если файла с именем "iarduino.txt" - нет, то он будет создан. if(myFile)< // если файл доступен (открыт для записи), то . myFile.print(time.gettime("Y-m-d H.i:")); // записываем дату и время myFile.print(F(" температура ")); // записываем температуру myFile.print(sensor.tem); myFile.print(F("°С, влажность ")); // записываем влажность myFile.print(sensor.hum); myFile.print(F("%, освещённость ")); // записываем освещенность myFile.print(LUM_result); myFile.println("."); myFile.close(); // закрываем файл "iarduino.txt" >> > > >else // ждём 0.2 сек, разгружая шину I2C >
Ссылки:
  • Код программы.
  • Библиотека iarduino_RTC.
  • Библиотека iarduino_DHT.
  • Библиотека LiquidCrystal_I2C_V112.
  • Wiki — Установка библиотек в Arduino IDE .
  • WiKi — Работа с символьными ЖК дисплеями.
  • Wiki — Часы реального времени, RTC (Trema-модуль) .
  • Wiki — Датчики температуры и влажности DHT11/DHT22.
  • Wiki — Trema Shield.

Начало работы с Ардуино. На примере проекта простейшей метеостанции на ардуино.

Соединяем все компоненты по нижеприведенной схеме с помощью макетной платы и перемычек или любым другим способом.

Схема для ардуино УНО:

Схема для ардуино НАНО:

Скачиваем с официального сайта и устанавливаем IDE.

И распаковываем их в папку C:\Program Files (x86)\Arduino\libraries

Подключаем ардуино к компьютеру с помощью USB кабеля.

Открываем среду разработки Arduino IDE. По умолчанию она окрашена в светлые тона, у меня просто стоит тёмная тема, не пугайтесь если у Вас не так.

Выбираем нашу плату и порт, к которому подключена плата:

Код:

Копируем этот код и вставляем в IDE
#include // подключаем библиотеку для датчика
LCD_1602_RUS lcd ( 0x27 , 20 , 4 ) ; // определяем адрес дисплея и его размер
#include // подключаем библиотеку для датчика
DHT dht ( 2 , DHT11 ) ; // сообщаем на каком порту будет датчик
void setup ( )
lcd . init ( ) ; // Инициализация дисплея
lcd . backlight ( ) ; // Подключение подсветки
lcd . clear ( ) ; // Чистим дисплей
dht . begin ( ) ; // запускаем датчик DHT11
float h = dht . readHumidity ( ) ; // считываем температуру (t)
float t = dht . readTemperature ( ) ; // и влажность (h)
lcd . setCursor ( 0 , 0 ) ; // Устанавливаем курср на нулевую символ и нулевой строки
lcd . print ( «Влажн. :» ) ; // выводим надпись «Влажн.:»
lcd . print ( h , 1 ) ; // выводим значение влажности с одним символом после запятой
lcd . print ( » %» ) ; // выволим знак процента
lcd . setCursor ( 0 , 1 ) ; // Устанавливаем курср на нулевой символ первой строки
lcd . print ( «Темпер.:» ) ; // выводим надпись «Темпер.:»
lcd . print ( t , 1 ) ; // выводим значение влажности с одним символом после запятой
lcd . print ( «\337C» ) ; // выволим знак градуса (337 символ в талице) и «С»
delay ( 2000 ) ; // ждём 2000 микросикенд (2 секунды)

Копируем его в поле для кода IDE:

и жмём загрузить:

Ждём несколько секунд и наша метеостанция работает:

Если что-то пошло не так:

  • Не загружается код — проверьте подключение к компьютеру и выбор порта. Если всё верно попробуйте выбрать другой загрузчик:
  • Ошибка компиляции — проверьте весь ли код вы скопировали, возможно упущена какая-нибудь строка или скобка. Проверьте путь установки библиотек.
  • Всё загрузилось, но не работает — проверяйте подключение, если всё верно, то покрутите крутилку контрастности на задней стороне дисплея.
  • Всё равно не работает — попробуйте заменить адрес «0х27» во второй строке кода на «0x3F», китайцы делают дисплеи с разными контроллерами и у них разные адреса.

Часы-метеостанция на Arduino своими руками

28.01.19 meteoClock_v1.3: исправлено предсказание погоды (работало “наоборот”)
19.04.19 meteoClock_v1.5: добавлено управление яркостью подсветки и светодиода по датчику света. Смотрите последнюю схему!

Рекомендую ознакомиться с модифицированной прошивкой от Norovl, в ней полностью переработан интерфейс, русифицированы дни недели и добавлено меню на русском языке. Почитать и скачать можно на GitHub автора.

Внимание! Исправлена ошибка в схеме с мини-версией RTC. Будьте внимательны! × Закрыть это предупреждение.

Внимание! При неподключенном BME280 прошивка не работает, т.к. библиотеку писали индусы. × Закрыть это предупреждение.

ОПИСАНИЕ

Решил таки сделать свою версию метеостанции-часов-календаря на Arduino с кучей датчиков и различными крутыми штуками! Проект уместился в корпусе G909G из магазина Чип и Дип, питается от micro-USB и выглядит весьма неколхозно! =)

  • Большой дешёвый LCD дисплей
  • Вывод на дисплей:
    • Большие часы
    • Дата
    • Температура воздуха
    • Влажность воздуха
    • Атмосферное давление (в мм.рт.ст.)
    • Углекислый газ (в ppm)
    • Прогноз осадков на основе изменения давления

    Версия 1.5
    – Добавлено управление яркостью
    – Яркость дисплея и светодиода СО2 меняется на максимальную и минимальную в зависимости от сигнала с фоторезистора
    Подключите датчик (фоторезистор) по схеме. Теперь на экране отладки справа на второй строчке появится величина сигнала
    с фоторезистора. Пределы яркости устанавливаются в настройках прошивки.

    ВИДЕО

    КОМПОНЕНТЫ

    Каталоги ссылок на Алиэкспресс на этом сайте:

    • Всё для пайки: паяльники, приспособления
    • Платы Ардуино, модули и датчики
    • Модули и датчики для умного дома
    • Дешёвые инструменты
    • Аккумуляторы, платы защиты, зарядники
    • Мультиметры
    • Блоки питания, преобразователи

    Стараюсь оставлять ссылки только на проверенные крупные магазины, из которых заказываю сам. Также по первые ссылки ведут по возможности на минимальное количество магазинов, чтобы минимально платить за доставку. Если какие-то ссылки не работают, можно поискать аналогичную железку в каталоге Ардуино модулей . Также проект можно попробовать собрать из компонентов моего набора GyverKIT .

    • Arduino Nano купить в РФ, aliexpress, aliexpress, искать
    • Сенсорная кнопка aliexpress, aliexpress, искать
    • Датчик BME280 aliexpress, искать
    • MH-Z19 – искать
      • https://ali.ski/l-K7a
      • Обычные aliexpress, aliexpress, искать
      • Мини aliexpress, aliexpress, искать
      • Светодиод RGB (пачка) искать, https://ali.ski/5RjZp
      • RGB модуль (ему резистор НЕ НУЖЕН)
        • https://ali.ski/TF9rG
        • https://ali.ski/g9ruEe
        • https://ali.ski/FAuwUT
        • https://ali.ski/gqnQZk
        • https://ali.ski/zatZcn

        СХЕМЫ

        КОРПУС

        Несколько вариантов 3D-печатных корпусов для этого проекта с инструкциями по сборке есть в ветке обсуждения часов-метеостанции на форуме сообщества

        ПРОШИВКА

        ВНИМАНИЕ! Максимально подробный гайд по началу работы с платой и загрузке прошивки для проекта находится ЗДЕСЬ . Изучи его внимательно, прежде чем писать на форум или в группу ВК!

        ОШИБКИ И FAQ

        • Как показал эксперимент, снаружи корпуса датчик температуры показывает на 0.5 градуса меньше, чем внутри! Нужно более удачно компоновать электронику, отводить и экранировать тепло от греющихся элементов…
        • Если дисплей показывает слишком тускло/на белом фоне
          На плате драйвера дисплея (к которой подключаются провода) есть крутилка контрастности, с её помощью можно подстроить контраст на нужный. Также контрастность зависит от угла взгляда на дисплей (это же LCD) и можно настроить дисплей на чёткое отображение даже под углом “дисплей на уровне пупка, смотрим сверху”. А ещё контрастность сильно зависит от питания: от 5V дисплей показывает максимально чётко и ярко, тогда как при питании от USB через Arduino напряжение будет около 4.5V (часть падает на защитном диоде по линии USB), и дисплей показывает уже не так ярко. Вывод настраивайте крутилкой при внешнем питании от 5V!
        • Если датчик CO2 работает некорректно (инфа от Евгения Иванова)
          Ну там в папке библиотеки сенсора в examples есть скетчи для калибровки. также ее можно запустить втупую замкнув на землю разъем “HD” на 7+ секунд.
          Само собой вот прямо на улице на морозе этим заниматься не обязательно… можно просто в бутылку набрать свежего воздуха с датчиком внутри и запечатать. калибровка проводится минимум 20 минут..
          По-умолчанию датчик поставляется с включенной автокалибровкой, которая происходит каждый день, и если датчик используется в невентелируемом помещении, то эта калибровка быстро уводит значения от нормы за горизонт, потому ее нужно обязательно отключать.
          Документация.
        • Автокалибровка датчика CO2 отключена в скетче!
        • Если у вас не работает датчик BME280, скорее всего у него отличается адрес. В проекте используется библиотека Adafruit_BME280, у которой нет отдельной функции смены адреса, поэтому адрес задаётся вручную в файле библиотеки Adafruit_BME280.h почти в самом начале файла (лежит в папке Adafruit_BME280 в вашей папке библиотек, вы должны были её туда установить), у моего модуля был адрес 0x76. Как узнать адрес своего модуля BME280? Есть специальный скетч, называется i2c scanner. Его можно нагуглить, можно скачать с моего FTP. Прошиваете данный скетч, открываете порт и получаете список адресов подключенных к шине i2c устройств. Чтобы остальные модули вам не мешали – можно их отключить и оставить только BME280. Полученный адрес указываем в библиотеке, сохраняем файл и загружаем прошивку метео-часов. Всё!
        • Если отстают часы, проблема скорее всего в питании схемы. Если при смене блока питания на более качественный проблема не уходит, повесьте конденсатор по питанию RTC модуля (прям на плату на VCC и GND паять): обязательно керамический, 0.1-1 мкФ (маркировка 103 или 104, смотрите таблицу маркировок). Также можно поставить электролит (6.3V, 47-100 мкФ)

        ПОДДЕРЖАТЬ

        Вы можете поддержать меня за создание доступных проектов с открытым исходным кодом, полный список реквизитов есть вот здесь .

        Как собрать метеостанцию на dht11

        Приложение № 2

        Фрагмент методической разработки

        Урок № 1

        Тема занятия: Получение практических навыков работы микроконтроллера «Arduino Uno» с цифровым датчиком «DHT11».

        1. Изучить особенности прилагаемых к данному пособию устройств(Arduino Uno, DHT11).

        2. Собрать принципиальную схему проекта.

        3. Написать рабочую программу согласно заданию.

        4. Загрузить программу в Arduino и получить необходимые данные с датчика.

        Собрать рабочую схему проекта, произвести измерения влажности и температуры воздуха в помещении.

        На данном занятии ученикам предоставляется следующий набор комплектующих, из которых необходимо собрать рабочую схему.

        · Цифровой датчик измерения температуры и влажности воздуха — DHT11;

        · Набор соединительных проводов – «мама-папа»;

        Ниже, на Рис.1, приведена рабочая схема проекта измерения температуры и влажности в помещении на основе цифрового датчика DHT11.

        После того как схема собрана, переходим к написанию программы, которая позволит организовать взаимодействие микроконтроллера Arduino Uno и цифрового датчика DHT11.

        Для работы с цифровым датчиком измерения температуры и влажности в программе необходимо подключить библиотеку “DHT.h”. Это выполняется следующим образом:

        #include «DHT.h«

        После этого будут доступны функции для работы с данным датчиком.

        Далее для корректной работы необходимо в программе настроить параметры используемого датчика.

        #define DHTPIN 2 //Пин, к которому подключен датчик температуры и влажности

        #define DHTTYPE DHT11 //Тип используемого датчика

        Объявляем объект, который является посредником в работе датчика и программы.

        DHT dht(DHTPIN, DHTTYPE); //Объявляем объект для работы с датчиком dht11

        Теперь необходимо настроить скорость передачи данных между компьютером с программной средой разработки(Arduino IDE 1.6.х) и микроконтроллера Arduino Uno, а также инициализируем подключенный датчик. Для этого прописываем следующие строчки в функции предварительной настройки работы устройств и интерфейсов – «void setup()».

        Serial.begin(9600); //Настройка скорости передачи в последовательном порту (9600 бод/с)

        dht.begin(); //Инициализация датчика измерения температуры и влажности DHT11

        Далее необходимо объявить две переменные, в которых будут храниться результаты измерений с цифрового датчика DHT11, получать измерения будем с помощью функций, хранящихся в подключенной библиотеке «DHT11.h», для этого в основной части программы(«void loop()») прописываем следующие строки:

        float dht11_Temperature; //Переменная для хранения влажности воздуха с датчика DHT11

        float dht11_Humidity; //Переменная для хранения влажности воздуха с датчика DHT11

        dht11_Temperature = dht.readTemperature(); //Снимаем показания температуры с датчика DHT11

        dht11_Humidity = dht.readHumidity(); //Снимаем показания влажности с датчика DHT11

        Теперь необходимо вывести на экран результаты полученных с датчиков измерений, для этого воспользуемся следующими функциями, которые также записываются в теле основной программы («void loop()»):

        Serial.print(“Temperature: “);

        Serial.print(dht11_Temperature);

        Serial.println(“ *C”);

        Serial.print(“Humidity: ”);

        Serial.println(dht11_Humidity);

        Serial.println(“ %”);

        Для удобства восприятия выводимых данных воспользуемся функцией задержки, для этого прописываем в основной части программы («void loop()») следующую строку:

        delay(3000); Ставим паузу в течение 3 секунд перед следующим выводом измерений с датчика

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

Ваш адрес email не будет опубликован. Обязательные поля помечены *