Освой Arduino играючи
/* Моя кошка замечательно разбирается в программировании. Стоит мне объяснить проблему ей - и все становится ясно. */
John Robbins, Debugging Applications, Microsoft Press, 2000
Хотя в переводе "rain sensor" переводится как датчик дождя, его можно также называть датчиком протечки, влаги, капель. Датчик выполнен в виде модуля.
Датчик дождя позволяет определить появление капель влаги и вовремя предупредить пользователя, например, включив оповещение. Подобные системы активно используются в аграрной отрасли, в автомобилестроении, в ванной, в теплицах.
Модуль датчика состоит из двух частей:
Первая часть - сама плата обнаружения капель. Она отслеживает количество попавшей на неё влаги. По сути, сенсор представляет собой простой переменный резистор, замыкаемый водой в разных местах, что вызывает изменение сопротивления.
Вторая часть датчика – сдвоенный компаратор (как правило, LM393, но возможны варианты LM293 и LM193). Его главная задача – преобразование значения с сенсора в аналоговый сигнал от 0 до 5 вольт.
Как правило, у модуля датчика доступно два выхода:
Аналоговый. Значение, получаемое контроллером, будет варьироваться от 0 до 1023. Где 0 – все затопило или идёт ливень, сенсор очень влажный, 1023 – сухая погода, сенсор сухой (в некоторых датчиках встречаются противоположные значения, 1023 – максимальная влажность, 0 – максимальная сухость).
Цифровой. Выдаёт высокое (5В) или низкое напряжение в случае превышения некоторого порога. Уровень порога срабатывания регулируется с помощью подстроечного резистора.
Для проверки интенсивности осадков рекомендуется располагать датчик не горизонтально, а под некоторым углом, чтобы капли стекали вниз.
Схема подключения:
Rain | Arduino
--------------
AO | A
DO | D
GND | GND
VCC | 5V
На модуле датчика также есть два светодиода (питание и превышение порога) и подстроечный резистор.
Скетч для датчика дождя.
int analogRainPin = A0; // Аналоговый вход
int digitalRainPin = 8; // Цифровой вход
void setup() {
Serial.begin(9600);
pinMode(digitalRainPin, INPUT);
}
void loop() {
int sensorValue = analogRead(analogRainPin); // Считываем данные с аналогового порта
Serial.print("Analog value: ");
Serial.println(sensorValue); // Выводим аналоговое значение
sensorValue = digitalRead(digitalRainPin); // Считываем данные с цифрового порта
Serial.print("Digital value: ");
Serial.println(sensorValue); // Выводим цифровое значение
delay(1000);
}
Для проверки можете капать или проводить мокрой тряпкой. Намочили датчик – значит пошёл дождь или появилась протечка, вытерли сухой тряпкой – дождь закончился.
Изучив полученные данные, можете добавить дополнительные условия, которые зададут некоторые пороговые значения для включения сигнализации. Например, при достижении некоторого значения будем включать светодиод.
#define PIN_RAIN_SENSOR A1 // Аналоговый вход для сигнала датчика протечки и дождя
#define PIN_ALERT 6 // Цифровой выход для сигнализации
#define MAX_COUNTER 30 // Пороговое значение для счётчика
#define ALERT_LEVEL 300 // Пороговое значение для счётчика
// Счётчик для сбора статистики, который увеличивается на 1 каждую секунду после срабатывания датчика
int curCounter = 0;
void setup(){
Serial.begin(9600);
pinMode(PIN_ALERT, OUTPUT);
pinMode(PIN_RAIN_SENSOR, INPUT); // Можно не указывать, т.к. это значение по умолчанию
}
void loop(){
int sensorValue = analogRead(PIN_RAIN_SENSOR);
Serial.println(sensorValue); // Выводим значение
delay(300);
// Если накопили достаточно оснований для включения сигнализации
if (curCounter >= MAX_COUNTER){
digitalWrite(PIN_ALERT, HIGH); // Срабатывание сигнализации
curCounter = MAX_COUNTER; // Защита от переполнения переменной
}
// Определяем уровень влажности
if (sensorValue < ALERT_LEVEL){
// В очередной раз убедились, что все влажно и увеличиваем счетчик
curCounter++;
}else {
// Интенсивность дождя не превышает порога
digitalWrite(PIN_ALERT, LOW); // Выключаем сигнализацию
curCounter = 0; // Обнуляем счетчик
}
delay(1000); // Задержка между измерениями
}
Купить датчик дождя на AliExpress