Индикация показаний при проектировании Умной теплицы на Ардуино
В прошлой статье «Умная теплица на Arduino делаем первые шаги» мы реализовали функции мониторинга данных для нашей Умной теплицы – проект «Домашний цветок».
Все данные с датчиков (давления, температуры, освещенности) мы отправляли в монитор последовательного порта. Смотреть показания датчиков через последовательный порт не совсем удобно, сегодня мы рассмотрим более удобную индикацию показаний. Во-первых, мы реализуем вывод данных с датчиков на дисплей, во-вторых, мы подключим светодиоды, которые будут сигнализировать о наступлении неблагоприятных климатических условий, требующих нашего вмешательства (например, пониженная увлажненность почвы, слишком высокая температура, недостаточная освещенность).
Дополнительно к деталям, использовавшимся в первой части нам понадобятся следующие детали:
- Светодиод красный – 3шт;
- Резистор 220 Ом – 3 шт;
- ЖК-экран (Nokia 5110);
Светодиоды и резисторы имеются в каждом из наборов «Дерзай» («Базовый», «Изучаем Arduino» и «Умный дом»). Выбор двухцветного графического ЖК-дисплея Nokia 5110 (рисунок 1) обусловлен его дешевизной и пониженным энергопотреблением, позволяющим подключать его к плате Arduino без дополнительного питания. Вы можете выбрать другой – например WH1602 с интерфейсом I2C, позволяющим максимально экономить контакты Arduino (всего 2, к которым можно подключать и другие устройства I2C).

Рисунок 1: ЖК дисплей Nokia 5110
Теперь соберем на макетной плате схему, представленную на рисунке 2 (схема из первой части с добавлением светодиодов и дисплея Nokia 5110).

Рисунок 2. Схема соединения для мониторинга параметров для проекта на Arduino «Домашний цветок».
Приступим к написанию скетча. Составим условия, когда необходимо сигнализировать светодиодами о наступлении неблагоприятных климатических условий. Это следующие:
- температура воздуха > TEMP_DETECT;
- увлажненность почвы < MOISTURE_DETECT;
- освещенность < LIGHT_DETECT.
Значения для констант TEMP_DETECT, MOISTURE_DETECT, LIGHT_DETECT необходимо определить самостоятельно. При наступлении неблагоприятного параметра будет загораться соответствующий светодиод, он будет сигнализировать нам, что необходимо предпринять какие-то действия:
- включить полив почвы;
- включить лампу освещения;
- включить вентилятор.
Пины Arduino для подключения светодиодов определены константами LED_TEMP, LED_MOISTURE, LED_LIGHT.
Текущие значения температуры и влажности воздуха, увлажненности почвы и освещенности будем выводить на дисплей Nokia 5110. Для работы с дисплеем будем использовать Arduino библиотеки Adafruit_GFX и Adafruit_PCD8544.
Создадим в Arduino IDE новый скетч, занесем в него код из листинга 1 и загрузим скетч на на плату Arduino. Напоминаем, что в настройках Arduino IDE необходимо выбрать тип платы (Arduino UNO) и порт подключения платы.
Листинг 1.
// подключение библиотек для nokia 5110
#include
#include
// подключение библиотеки DHT
#include "DHT.h"
// тип датчика DHT
#define DHTTYPE DHT11
// контакт подключения входа данных модуля DHT11
int pinDHT11=9;
// контакт подключения аналогового выхода модуля влажности почвы
int pinSoilMoisture=A0;
// контакт подключения аналогового выхода датчика температуры TMP36
int pinTMP36=A1;
// контакт подключения аналогового выхода фоторезистора
int pinPhotoresistor=A2;
// пины светодиодов индикации
#define LED_TEMP 5
#define LED_MOISTURE 6
#define LED_LIGHT 7
// значения для условий
#define TEMP_DETECT 30
#define MOISTURE_DETECT 500
#define LIGHT_DETECT 250
// создание экземпляра объекта DHT
DHT dht(pinDHT11, DHTTYPE);
// Nokia 5110
// pin 13 - Serial clock out (SCLK)
// pin 12 - Serial data out (DIN)
// pin 11 - Data/Command select (D/C)
// pin 10 - LCD chip select (CS)
// pin 8 - LCD reset (RST)
Adafruit_PCD8544 display = Adafruit_PCD8544(13, 12, 11, 10, 8);
void setup() {
// запуск последовательного порта
Serial.begin(9600);
//
pinMode(LED_TEMP,OUTPUT);digitalWrite(LED_TEMP,LOW);
pinMode(LED_MOISTURE,OUTPUT);digitalWrite(LED_MOISTURE,LOW);
pinMode(LED_LIGHT,OUTPUT);digitalWrite(LED_LIGHT,LOW);
//
dht.begin();
// инициализация дисплея
display.begin();
// установить контраст фона экрана
display.setContrast(60);
display.clearDisplay(); // очистить экран
display.setTextSize(1); // размер шрифта
display.setTextColor(BLACK); // цвет
// заставка
display.setCursor(15,15);
display.print("Home Flower");
display.display();
delay(2000);
}
void loop()
{
display.clearDisplay();
display.setCursor(5,0);
display.print("Home Flower");
// получение данных с DHT11
float h = dht.readHumidity();
display.setCursor(5,10);
if (isnan(h))
{
Serial.println("Failed to read from DHT");
display.print("airH= error");
}
else
{
Serial.print("HumidityDHT11= "); Serial.print(h);Serial.println(" %");
display.print("airH=");display.print(h);display.print("%");
}
// получение значения с аналогового вывода модуля влажности почвы
display.setCursor(5,20);
int val0=analogRead(pinSoilMoisture);
Serial.print("SoilMoisture= "); Serial.println(val0);
display.print("soilM=");display.print(val0);
// получение значения с аналогового вывода датчика температуры TMP36
display.setCursor(5,30);
int val1=analogRead(pinTMP36);
// перевод в мВ
int mV= val1*1000/1024;
// перевод в градусы цельсия
int t=(mV-500)/10+75;//t=23;
Serial.print("TempTMP36= "); Serial.print(t);Serial.println(" C");
display.print("airT=");display.print(t);display.print(" C");
// получение значения с аналогового вывода фоторезистора
display.setCursor(5,40);
int val2=analogRead(pinPhotoresistor);
Serial.print("Light= "); Serial.println(val2);
display.print("Light=");display.print(val2);
// обновить
display.display();
//// проверка условий
// увлажненность почвы
if(val0 > MOISTURE_DETECT)
digitalWrite(LED_MOISTURE,HIGH);
else
digitalWrite(LED_MOISTURE,LOW);
// температура воздуха
if(t > TEMP_DETECT)
digitalWrite(LED_TEMP,HIGH);
else
digitalWrite(LED_TEMP,LOW);
// освещенность
if(val2 < LIGHT_DETECT)
digitalWrite(LED_LIGHT,HIGH);
else
digitalWrite(LED_LIGHT,LOW);
// пауза 5 секунд
Serial.println();
delay(5000);
}
После загрузки скетча на плату, открываем монитор последовательного порта и наблюдаем вывод значений с показаниями наших датчиков (рисунок 3).
Рисунок3. Вывод значений с показаниями наших датчиков в монитор последовательного порта Arduino.
А вот и наш выращиваемый цветок (рисунок 4,5). Вывод значений на ЖК-дисплей и светодиоды, сигнализирующие о наступлении неблагоприятных климатических условий.

Рисунок 4,5. Проект «Домашний цветок»
В следующих уроках нам необходимо будет организовать полив цветка, обдув, освещение. Т.е. добавить нашей Умной теплице функции управления.
8 комментариев
Добавить комментарий
Для отправки комментария вам необходимо авторизоваться.

Книга Джереми Блума Изучаем Arduino: инструменты и методы технического волшебства.
25 крутых проектов с Arduino
Мобильные роботы на базе Arduino книга М. Момота
Хотелось бы увидеть дельнейшее написание статей по оборудованию умной теплицы. Когда и где можно будет их прочитать? Скоро начало сезона и хочется оборудовать свою теплицу. Константин.
9 или 10 декабря будет новая статья(3 часть)
Спасибо!
Когда появится продолжение статей про умную теплицу?
Вот 3 часть: http://playarduino.ru/uroki-arduino/organizatsiya-poliva-arduino/
Плохая программа. Датчик влажности почвы работает непрерывно и быстро выходит из строя по причине постоянного электролитического процесса. Замерять влажность достаточно два раза в день, остальное время датчик влажности почвы должен быть обесточен.
Нигде (включая даташит) не нашел подобных рекомендаций по обесточиванию датчика
У меня стоит на улице уже 2 года — и нормально
Конечно измерения для этого датчика можно производить гораздо реже раз в 10 мин — раз в 1 час
это можно изменить
Спасибо!
Очень хорошии у вас статьи!