Измеритель температуры и влажности на контроллере Arduino c отображением значений на LCD дисплее

Недавно я начал изучать программирование микроконтроллера Arduino. После того, как я выполнил несколько базовых упражнений (мигание светодиодом, работа с дискретными и аналоговыми входами, вывод информации на ЖК дисплей и т.д.) мне захотелось сделать какое нибудь полезное устройство для дома.

Я решил сделать измеритель температуры и влажности в комнате, с индикацией параметров на ЖК дисплее. Также я сделал адаптивную подсветку дисплея, которая меняет яркость в зависимости от уровня освещенности в комнате. Это позволяет уменьшить энергопотребление устройства, и тем самым увеличить срок службы батарейки.

В проекте я использовал следующие комплектующие:

1. Плата Arduino Uno

image

2. Дисплей LCD1602 c модулем поддержки протокола I2C. Для того чтобы уменьшить число проводов и упростить подключение дисплея, я решил подключать его через протокол I2C, для этого я к LCD дисплею припаял специальный модуль преобразователь.

"

3. Датчик температуры и влажности DHT11. Он позволяет определять влажность от 20-80% и температуру от 0-50˚С. Датчик имеет 4 вывода, но используется только 3. Между выводом питания и выводом данных должен быть установлен резистор 10кОм. Я использовал уже готовый датчик, смонтированный на плате, с подключенным резистором, поэтому можно смело подключать его к плате Arduino.

"

4. Фоторезистор. Подключается к плате Arduino с подтяжкой к GND, через резистор 10кОм.



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



Фоторезистор подключается к аналоговому входу А0 платы Arduino. Линия данных датчика DHT11 подключается к дискретному выводу 2, вывод питания подключается к +5В Arduino, соответственно вывод GND подключаем в земле платы Arduino. LCD дисплей подключается к питанию платы, вывод SDA подключается к А4, вывод SCL к А5. Линия управления яркостью подсветки подключается к выводу 9, на котором формируется ШИМ сигнал.

Ниже представлен исходный код:

#include "DHT.h"                  //Подключаем библиотеку для работы с датчиком DHT11
#include "Wire.h"               
#include "LiquidCrystal_I2C.h"    //Подключаем библиотеки для работы с LCD дисплеем

int LD;                           //Объявляем вспомогательную переменную

#define DHTPIN 2                  //Задаем PIN для подключения датчика DHT11
#define LED 9                     //Задаем PIN который выдает ШИМ-сигнал
#define FOTO 0                    //Задаем PIN для подключения фоторезистора

DHT dht(DHTPIN, DHT11);           //Инициализируем датчик DHT11
LiquidCrystal_I2C lcd(0x27,16,2); //Инициализируем дисплей


void setup() {
 pinMode(LED, OUTPUT);            //Настраиваем PIN LED как выход
 
 dht.begin();                     //Включаем датчик температуры и влажности
 
 lcd.init();                      //Включаем LCD дисплей
 lcd.backlight();
}


int light(int svet)               //Функция преобразования 
{                                 //значения с датчика освещенности 
  if (svet<25)                    //в значение ШИМ-сигнала
  {
    return 255;
  }

  if(svet>1020)
  {
    return 2;
  }
  else
  {
    int L=(int)(-0.2*svet+261.262);
    return L;
  }
}


void loop() {
   int f = analogRead(FOTO);              //Считываем значение с датчика освещенности
   LD=light(f);
   delay(2000);
   analogWrite(LED, LD);                  //Устанавливаем значение ШИМ 
   
   float h=dht.readHumidity();            //Считываем значение влажности
   float t=dht.readTemperature();         //Считываем значение температуры

    lcd.setCursor(0,0);                   //Устанавливаем курсор в нулевую позицию верхней строки
    lcd.print("Temp ");                   //Отображаем значение температуры
    lcd.print(t);
    
    lcd.setCursor(0,1);                   //Помещаем курсор в нулевую позицию нижней строки
    lcd.print("Hum ");                    //Отображаем значение влажности
    lcd.print(h);

}


Скомпилировав данный код, получаем вот такое работающее устройство:



В дальнейшем планирую сделать еще какие-нибудь интересные и более сложные устройства на Arduino.

Также я сделал видеоролик, где показал как работает устройство:

Комментарии 13

    +2
    Arduino это не микроконтроллер, а экосистема. А контроллеры в Ардуино разные могут быть. Что вы хотели рассказать своей статьей? Подобных здесь куча. Да и датчики взяли самые ширпотреб. Уж хотя бы BME280 взяли…
      +3
      Ширпотребный DHT11 или нет, но датчиком он всё равно остаётся.
      Автор просто рассказывает о том, что начать играться с Arduino легко. Сам факт того, что используется «батарейка» для питания уже намекает на то, что «устройство» больше сделано для понимания процесса, а не для постоянного использования. Но очень вероятно, что автор этого ещё пока не знает.
      0
      автор молодец, но для таких поделок лучше рекламировать себя на arduino.ru
        +4

        Т.е. время когда хэйтели ардуину на Хабре и сливали карму даже за приличные туториалы прошло? И пора бежать копипастить уроки для школьников?

          –2
          Пускай хоть такие статьи появляются.
          С того времени подросло новое поколение посетителей сайта.
          А откуда им узнать о существовании ардуино вообще, как не из новостей?
          –2

          Не хватает коментов в коде, а так автору зачет и дальнейших успехов!

            +1

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

              0

              Лучше использовать более дешёвую плату esp8266. Ещё совет, пишите ещё данные в облако типа thingspeak.

                0
                С ESP8266 я тоже работаю, уже есть некоторые проекты. Как будет время, я тоже опубликую статью.
                +1
                А почему у вас хаб C++? У вас код вполне сишный, что тут от крестов?

                К слову, дисплеев таких, с уже напаянным I2C модулем, на том же Али — завались. Непонятно зачем было самому паять.

                Ждал, конечно, хотя бы законченного устройства или, может сравнения датчиков, не знаю, хоть чего-нибудь информативного. Да тут даже не слова нет про то, что у модуля этого I2C'шного, своя система команд, про то, что у этих модулей бывает два разных адреса на шине, в зависимости от модели… Про то, что дисплей тоже свою систему команд имеет, про разницу в инициализации для разных моделей этих дисплеев (ох, помню я намучился, когда свою реализацию для PIC для него делал без либ всяких), про их алфавит, про то что можно свой даже запилить в него.

                Да, я вижу, что тут используется LiquidCrystal_I2C… Но, позвольте, о чём тогда статья?

                «Смарите, парни, я научился шить дуину и даже датчики к ней цеплять, ололо!!!1111»
                  0
                  А почему у вас хаб C++? У вас код вполне сишный, что тут от крестов?

                  Ну, формально ардуина вполне себе C++ (к остальной критике присоединяюсь)
                  class DHT {
                    public:
                     DHT(uint8_t pin, uint8_t type, uint8_t count=6);
                  
                    0
                    Ну это конкретно этот DHT так написан. В коде примера нет классов.

                    Да и либу для DHT можно на функциях легко реализовать, там никакого полиморфизма или чего-то подобного не требуется.
                    +2
                    Недавно я начал изучать программирование микроконтроллера Arduino. После того, как я выполнил несколько базовых упражнений (мигание светодиодом, работа с дискретными и аналоговыми входами, вывод информации на ЖК дисплей и т.д.) мне захотелось...

                    … написать об этом на Хабр.

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

                    Самое читаемое