Сигнализация на влажность.


03.05.2018


Всем привет. Открываем раздел «ARDUINO»! И в этой статье мы рассмотрим с чего же начать, где что купить, и наметим себе конкретную цель и реализуем её. Но сразу скажу про цель – появилась у меня необходимость сделать что-то вроде сигнализации на то что моя дочь ночью описалась в своей кроватке, это нужно потому что нужно сразу же ребёнку менять колготки! Для реализации такого плана нам понадобится самая маленькая ардуинка – Arduino Nano, 2 датчика влажности, 2 потому что надо на обе стороны кроватки ставить датчики, а также зуммер. А теперь по детальнее про нужное железо:




Arduino Nano

покупал тут

Nano Mini USB With the bootloader compatible for arduino Nano 3.0 controller CH340 USB driver 16Mhz Nano v3.0 ATMEGA328P

Датчик влажности

покупал тут

Smart Electronics Soil Moisture Hygrometer Detection Humidity Sensor Module Development Board DIY Robot Smart Car

Зуммер для Arduino

покупал тут

High quality 3.3-5V Passive Buzzer Alarm Module PCB Dimension 3.3cmx1.3cm For Arduino 9012 Drive w/ 3x Du Pont Line Length 21cm

А также нам понадобится кабель «USB 2.0 Am-miniBm» и блок питания на 5V в который можно вставить Am usb штекер. Так как наша Arduino Nano питается и соединяется с компьютером именно через mini Bm USB разъём.

Я ещё воспользуюсь прозрачным акриловым корпусом от raspberry pi 3 и все компоненты распаяю на небольшой печатной плате.

И так, мы всё заказали и дождались что нам всё это приехало. Что теперь? А, пожалуй, пора взять и попаять немного. Что с чем соединять будем:
Первый датчик влажности:
Наши датчики влажности имеют 4 контакта:
VCC – будем использовать как вход +5v от Arduino, но не с контакта +5V а с цифрового D2 на Arduino, потому что цифровые пины ардуино можно назначить как выход 5V.
GND – это заземление или минус, тут всё просто – ведём на GND пин Arduino
D0 – это цифровой выход у датчика влажности, его мы не будем задействовать
A0 – это аналоговый выход сигнала датчика и его мы коммутируем с A0 пином Arduino

Второй датчик влажности:
VCC – уходит на цифровой D3 пин на Arduino
GND – это минус, можно увсети на тот же GND пин Arduino что и первый датчик.
D0 – это цифровой выход у датчика влажности, его мы не будем задействовать
A0 – это аналогвый выход сигнала датчика и его мы коммутируем с A1 пином Arduino

Зуммер:
Наш зуммер имеет 3 пина (контакта):
VCC – этот пин мы соединим с пином +5V на ардуино, то есть не с цифровым пином а именно с +5V.
GND – это минус, соединяем с GND пином на Arduino который в том же ряду где пин +5V
I/0 – это сигнальный разъём – его соединяем с цифровым пином D4 ардуино.

Попробую теперь изобразить схематично:

Соединяем всё на печатной плате. У меня получился вот такой монстрик:

Далее идём на официальный сайт ардуино чтобы скачать программу «Arduino IDE». www.arduino.cc

Устанавливаем программу, запускаем и после запуска сразу определим, что мы работаем именно с «Arduino Nano» для этого идём в «инструменты» - раздел «Плата» - и выбираем «Arduino Nano»

После того как я подсоединил ардуино к компьютеру - в разделе порт появился COM3, значит его и выбираем:

Хорошо, всё готово к загрузке программы в ардуино. Программы для ардуино называются «Скетч». Скетч имеет 2 обязательных раздела, содержание которых граничат фигурными скобками:
Раздел «void setup()» выполняется один раз в начале выполнения программы:
Пример:
void setup()
{
}

Раздел «void loop()» содержит основной исполняемый код:
Пример:
void loop()
{
}

Если мы хотим указать комментарий, то ставим «//» и всё что после этого в строке будет считаться комментарием и не будет участвовать в коде. У Arduino Nano есть 8 аналоговых пинов на вход (A0-A7) и 12 цифровых пинов (D2-D13). Цифровые пины могут работать как на вход сигнала, так и на выход. В том числе их можно назначить и как источник +5V, мы так и сделали для наших двух датчиков. При составлении скетча я столкнулся с интересной проблемой – А как указать на конкретный пин в скетче? То есть я знаю, что мне надо привязать переменную «moisture_sensor1» к первому аналоговому пину ардуино, а переменную «moisture_sensor_power1» к первому цифровому пину. А как указать именно на них? Перерыл все схемы и ничего не нашёл, везде этот надоевший пример с миганием на 13 пин. Но на деле оказалось всё просто – аналоговые входы так и обозначаются в скетче A0 – A7, то есть первый аналоговый вход в скетче это A0 а второй A1. А вот цифровые обозначаются просто цифрами – то есть первый цифровой пин D2 в скетче это просто «2» а следующий D3 это «3». И D4 – пин к которому мы присвоили переменную «s» (I/0 пин на зуммере).

Вот наш скетч:


// Начало скетча
// Определяем пин подключения аналогового выхода первого датчика YL-69 (выход датчика АО подключен к пину A0):
#define moisture_sensor1 A0
// Определяем пин подключения аналогового выхода второго датчика YL-69 (выход датчика АО подключен к пину A1):
#define moisture_sensor2 A1
// Определяем пин подачи питания (VCC) на первый датчик YL-69 (используем D2 цифровой пин arduino nano):
#define moisture_sensor_power1 2
// Определяем пин подачи питания (VCC) на второй датчик YL-69 (используем D3 цифровой пин arduino nano):
#define moisture_sensor_power2 3
// Определяем пин обмена информации с I/O вход зуммера (используем D4 цифровой пин arduino nano):
#define s 4

void setup()
{

// для выдачи данных с датчика (от 0 до 1023, где 1023 - сухо) на мониторинг программы
Serial.begin(9600);

// Определяем пин ардуино D2 как питание (выход 5 вольт) для VCC первого датчика:
pinMode(moisture_sensor_power1, OUTPUT);
// Определяем пин ардуино D3 как питание (выход 5 вольт) для VCC второго датчика:
pinMode(moisture_sensor_power2, OUTPUT);
// Определяем пин ардуино D4 как цифровой выход для I/0 зуммера:
pinMode(s, OUTPUT);

}

void loop()
{

// Подаём питание на первый датчик
digitalWrite(moisture_sensor_power1, HIGH);
// Подаём питание на второй датчик
digitalWrite(moisture_sensor_power2, HIGH);

// Время, необходимое датчикам, чтобы включиться и замерить показания
delay(10);

// Считываем показания первого датчика (от 0 до 1023, где 1023 - сухо)
int moisture_value1 = analogRead(moisture_sensor1);
// Считываем показания второго датчика (от 0 до 1023, где 1023 - сухо)
int moisture_value2 = analogRead(moisture_sensor2);

// Отключаем питание на первого датчика
digitalWrite(moisture_sensor_power1, LOW);
// Отключаем питание второго датчика
digitalWrite(moisture_sensor_power2, LOW);

// выдача данных с датчиков (от 0 до 1023, где 1023 - сухо) на мониторинг программы
Serial.println(String(moisture_value1));
Serial.println(String(moisture_value2));

// проверка на влажность обоих датчиков
if (moisture_value1 <= 800 || moisture_value2 <= 800 )
{
// если влага то посылаем разные тоны на I/O вход зуммера

tone(s, 700, 300);
delay(600);
tone(s, 700, 300);
delay(600);
tone(s, 780, 150);
delay(300);
tone(s, 700, 150);
delay(300);
tone(s, 625, 450);
delay(600);
tone(s, 590, 150);
delay(300);
tone(s, 520, 150);
delay(300);
tone(s, 460, 450);
delay(600);
tone(s, 350, 450);
delay(600);
delay(600);
tone(s, 350, 450);
delay(600);
tone(s, 460, 450);
delay(600);
tone(s, 520, 150);
delay(300);
tone(s, 590, 150);
delay(300);
tone(s, 625, 450);
delay(600);
tone(s, 590, 150);
delay(300);
tone(s, 520, 150);
delay(300);
tone(s, 700, 1350);
delay(1800);
tone(s, 700, 300);
delay(600);
tone(s, 700, 300);
delay(600);
tone(s, 780, 150);
delay(300);
tone(s, 700, 150);
delay(300);
tone(s, 625, 450);
delay(600);
tone(s, 590, 150);
delay(300);
tone(s, 520, 150);
delay(300);
tone(s, 460, 450);
delay(600);
tone(s, 350, 450);
delay(600);
delay(600);
tone(s, 350, 450);
delay(600);
tone(s, 625, 450);
delay(600);
tone(s, 590, 150);
delay(300);
tone(s, 520, 150);
delay(300);
tone(s, 700, 450);
delay(600);
tone(s, 590, 150);
delay(300);
tone(s, 520, 150);
delay(300);
tone(s, 460, 1350);
delay(5000);

// Выключаем звук
noTone (s);
}
// Задержка перед считыванием следующего значения (600000 = 10 минут)
delay(600000);
}
// конец скетча


А как загрузить наш скетч в ардуино? Очень просто!

Подключаем по USB к компьютеру, запускаем программу, пишем скетч и жмём на галочку для проверки скетча и затем на стрелку для загрузки в ардуино.

Но давайте немного схему оптимизируем! Дело в том, что в процессе эксплуатации выяснился один недостаток – а именно постоянный неприятный звук из зуммера. Это происходит потому что мы постоянно на него подаём +5V напряжения (а именно на контакт VCC). А давайте сделаем так что питание на зуммер подаётся только в случае, когда нужно включать саму сигнализацию. Для этого нам нужно просто контакт VCC зуммера отпаять от пина +5V и припаять его на D5 цифровой пин нашей Arduino Nano. Таким образом мы сможем регулировать подачу питания на зуммер!


Новый оптимизированный скетч:


#define moisture_sensor1 A0
#define moisture_sensor2 A1
#define moisture_sensor_power1 2
#define moisture_sensor_power2 3
#define s 4
// Определяем пин подачи питания (VCC) на зуммер (используем D5 цифровой пин arduino nano):
#define zumpower 5
void setup()
{
pinMode(moisture_sensor_power1, OUTPUT);
pinMode(moisture_sensor_power2, OUTPUT);
pinMode(s, OUTPUT);
// Определяем пин ардуино D5 как питание (выход 5 вольт) для VCC зуммера:
pinMode(zumpower, OUTPUT);

}

void loop()

{
digitalWrite(moisture_sensor_power1, HIGH);
digitalWrite(moisture_sensor_power2, HIGH);
// Сначала отключаем питание на пине, к которому подключен VCC зуммера
digitalWrite(zumpower, LOW);

delay(10);

int moisture_value1 = analogRead(moisture_sensor1);
int moisture_value2 = analogRead(moisture_sensor2);
digitalWrite(moisture_sensor_power1, LOW);
digitalWrite(moisture_sensor_power2, LOW);

if (moisture_value1 <= 800 || moisture_value2 <= 800 )
{
// если влага то подаём питание на зуммер и посылаем разные тоны на I/O вход

// Подаём питание на зуммер
digitalWrite(zumpower, HIGH);
delay(1000);

// играет мелодия
tone(s, 700, 300);
delay(600);
tone(s, 700, 300);
delay(600);
tone(s, 780, 150);
delay(300);
tone(s, 700, 150);
delay(300);
tone(s, 625, 450);
delay(600);
tone(s, 590, 150);
delay(300);
tone(s, 520, 150);
delay(300);
tone(s, 460, 450);
delay(600);
tone(s, 350, 450);
delay(600);
delay(600);
tone(s, 350, 450);
delay(600);
tone(s, 460, 450);
delay(600);
tone(s, 520, 150);
delay(300);
tone(s, 590, 150);
delay(300);
tone(s, 625, 450);
delay(600);
tone(s, 590, 150);
delay(300);
tone(s, 520, 150);
delay(300);
tone(s, 700, 1350);
delay(1800);
tone(s, 700, 300);
delay(600);
tone(s, 700, 300);
delay(600);
tone(s, 780, 150);
delay(300);
tone(s, 700, 150);
delay(300);
tone(s, 625, 450);
delay(600);
tone(s, 590, 150);
delay(300);
tone(s, 520, 150);
delay(300);
tone(s, 460, 450);
delay(600);
tone(s, 350, 450);
delay(600);
delay(600);
tone(s, 350, 450);
delay(600);
tone(s, 625, 450);
delay(600);
tone(s, 590, 150);
delay(300);
tone(s, 520, 150);
delay(300);
tone(s, 700, 450);
delay(600);
tone(s, 590, 150);
delay(300);
tone(s, 520, 150);
delay(300);
tone(s, 460, 1350);
delay(5000);
// Выключаем звук
noTone (s);

delay(1000);

// отключаем питание зуммера
digitalWrite(zumpower, LOW);
}

// Задержка перед повторением всего цикла (120000 = 2 минуты)
delay(120000);
}


Вот и всё, наш Arduino готов к работе!