Одна из главных задач умного дома — заботиться о своей сохранности, не допускать взломов, пожаров, затоплений, и прочих повреждений. Вот о защите от протечек и затопления мы сегодня и поговорим. Точнее сказать, пока только об обнаружении протечек.
Для обнаружения протечек будем использовать датчик воды. Датчики воды предназначены для определения уровня воды в различных емкостях, где недоступен визуальный контроль, с целью предупреждения перенаполнения емкости водой через критическую отметку. Данный датчик воды (рис. 4.12) – погружной. Чем больше погружение датчика в воду, тем меньше сопротивление между двумя соседними проводами.
Рис. 4.19. Датчик уровня воды.
Датчик имеет три контакта для подключения к контроллеру.
• + – питание датчика;
• - – земля;
• S - аналоговое значение.
На вывод S подается аналоговое значение, которое можно передавать в контроллер для дальнейшей обработки, анализа и принятия решений. Датчик имеет красный светодиод, сигнализирующих о наличие поступающего на датчик питания.
Рассмотрим подключение датчика уровня воды к плате Arduino Mega и модулю NodeMcu ESP8266.
4.4.1. Подключение датчика уровня воды к плате Arduino Mega
Подключение датчика уровня воды к плате Arduino Mega мы будем производить по аналоговому входу. Питание для датчика берем также с платы Arduino. Схема соединений представлена на рис. 4.20.
Рис. 4.20. Схема подключений датчика уровня воды к плате Arduino Mega
Загрузим на плату Arduino Mega скетч получения данных с датчика уровня воды, перевода аналогового значения в см (0 – 4) и вывода в последовательный порт Arduino. Получение данных влажности оформим в виде отдельной процедуры get_data_levelwater(). Содержимое скетча представлено в листинге 4.8.
Листинг 4.8
#define INTERVAL_GET_DATA 2000 // интервал измерений, мс
#define LEVELWATERPIN A9 // пин подключения контакта S
// пороговое значение протечки
#define LEVELWATER 100
// переменная для интервала измерений
unsigned long millis_int1=0;
void setup(void) {
// запуск последовательного порта
Serial.begin(9600);
}
void loop(void) {
if(millis()-millis_int1 >= INTERVAL_GET_DATA) {
// получение данных c датчика уровня воды
float levelwater= get_data_levelwater();
// вывод в монитор последовательного порта
Serial.print("levelwater =");Serial.println(levelwater);
if(levelwater>LEVELWATER)
Serial.println(" flood !!!");
// старт интервала отсчета
millis_int1=millis();
}
}
// получение данных с датчика уровня воды
float get_data_levelwater() {
// получение значения с аналогового вывода датчика
int avalue=analogRead(LEVELWATERPIN);
return (float) avalue;
}
Загрузим скетч на плату Arduino Mega, откроем монитор последовательного порта и видим вывод данных, получаемых с датчика уровня воды (рис. 4.21). При попадание воды на датчик выводим пообщение о протекании. Подберите практическим путем аналоговое значения для константы LEVELWATER (пороговое значение погружения).
Рис. 4.21. Вывод данных уровня затопления в монитор последовательного порта
Скачать данный скетч можно на сайте www.arduino-kit.ru по ссылке .
4.4.2. Подключение датчика уровня воды к модулю NodeMcu ESP8266
Теперь рассмотрим подключение датчика уровня воды к модулю NodeMcu ESP8266.
Схема соединений представлена на рис. 4.22.
Рис. 4.22. Схема подключений датчика Soil Moisture к NodeMcu ESP8266
Загрузим на модуль Node Mcu скетч получения данных с датчика уровня воды и вывода в последовательный порт Arduino. Получение данных влажности оформим в виде отдельной процедуры get_data_soilmoisture(). Для выбора аналогового входа мультиплексора y1 подаем на контакты D7, D8 сигнал низкого уровня LOW, а на контакт D5 – высокого уровня HIGH. Содержимое скетча представлено в листинге 4.9.
Листинг 4.9
#define INTERVAL_GET_DATA 2000 // интервал измерений, мс
#define LEVELWATERPIN A0 // аналоговый пин
// пороговое значение протечки
#define LEVELWATER 100
// переменная для интервала измерений
unsigned long millis_int1=0;
void setup(void) {
// входы подключения к мультиплексору D5, D7, D8 (GPIO 14, 13, 15)
// как OUTPUT
pinMode(14,OUTPUT);
pinMode(13,OUTPUT);
pinMode(15,OUTPUT);
// запуск последовательного порта
Serial.begin(9600);
}
void loop(void) {
if(millis()-millis_int1 >= INTERVAL_GET_DATA) {
// получение данных c датчика уровня воды
float levelwater= get_data_levelwater();
// вывод в монитор последовательного порта
Serial.print("levelwater =");Serial.println(levelwater);
if(levelwater>LEVELWATER)
Serial.println(" flood !!!");
// старт интервала отсчета
millis_int1=millis();
}
}
// получение данных с датчика уровня воды
float get_data_levelwater() {
// выбор входа мультиплексора CD4051 – y1 (001)
digitalWrite(14,HIGH);
digitalWrite(13,LOW);
digitalWrite(15,LOW);
// получение значения с аналогового вывода датчика
int avalue=analogRead(LEVELWATERPIN);
return (float) avalue;
}
Загрузим скетч на модуль Node Mcu, откроем монитор последовательного порта и видим вывод данных, получаемых с датчика уровня воды (рис. 4.23). При попадание воды на датчик выводим пообщение о протекании. Подберите практическим путем аналоговое значения для константы LEVELWATER (пороговое значение погружения).
Рис. 4.23. Вывод данных уровня затопления в монитор последовательного порта
Скачать данный скетч можно на сайте www.arduino-kit.ru по ссылке .