Освой Arduino играючи

Сайт Александра Климова

Шкодим

/* Моя кошка замечательно разбирается в программировании. Стоит мне объяснить проблему ей - и все становится ясно. */
John Robbins, Debugging Applications, Microsoft Press, 2000

Датчик дождя

Хотя в переводе "rain sensor" переводится как датчик дождя, его можно также называть датчиком протечки, влаги, капель. Датчик выполнен в виде модуля.

Rain sensor

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

Модуль датчика состоит из двух частей:

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

Вторая часть датчика – сдвоенный компаратор (как правило, LM393, но возможны варианты LM293 и LM193). Его главная задача – преобразование значения с сенсора в аналоговый сигнал от 0 до 5 вольт.

Как правило, у модуля датчика доступно два выхода:

Аналоговый. Значение, получаемое контроллером, будет варьироваться от 0 до 1023. Где 0 – все затопило или идёт ливень, сенсор очень влажный, 1023 – сухая погода, сенсор сухой (в некоторых датчиках встречаются противоположные значения, 1023 – максимальная влажность, 0 – максимальная сухость).

Цифровой. Выдаёт высокое (5В) или низкое напряжение в случае превышения некоторого порога. Уровень порога срабатывания регулируется с помощью подстроечного резистора.

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

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

  • VCC – питание 5В
  • GND – заземление
  • АO – аналоговый выход, например, A1
  • DO – цифровой выход

Rain | Arduino 
--------------
  AO | A
  DO | D
 GND | GND
 VCC | 5V 		 

На модуле датчика также есть два светодиода (питание и превышение порога) и подстроечный резистор.

Rain sensor

Скетч для датчика дождя.


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);
}

Для проверки можете капать или проводить мокрой тряпкой. Намочили датчик – значит пошёл дождь или появилась протечка, вытерли сухой тряпкой – дождь закончился.

Rain sensor Serial Monitor

Изучив полученные данные, можете добавить дополнительные условия, которые зададут некоторые пороговые значения для включения сигнализации. Например, при достижении некоторого значения будем включать светодиод.


#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

Дополнительные материалы

Реклама