#10 Эксперимент “Автоматическая поилка”
Сегодня мы проведём своеобразную творческую практическую работу. Вам предстоит собрать простой прототип автоматической “поилки” для домашних животных. Основная задача прошивки для поилки – поворачивать сервопривод, который будет открывать или закрывать кран подачи воды в поилку в зависимости от показаний датчика. Устройство должно уметь:
- Открывать кран, в случае когда показания датчика опустятся до минимальных значений. Эти значения мы определим экспериментально;
- Закрывать кран подачи воды, когда поилка наполниться полностью (определяется по неким максимальным значениям датчика, которые мы также определим экспериментально).
Перед выполнением эксперимента прочтите:
СБОРКА УСТРОЙСТВА НА МАКЕТНОЙ ПЛАТЕ
Нам понадобятся следующие компоненты:
- Arduino Uno;
- USB-кабель для подключения к компьютеру;
- датчик уровня жидкости
- сервопривод;
- 6 соединительных проводов папа-мама различных цветов.
Соберите устройство по следующей схеме:
Схема устройства на макетной плате |
Принципиальная схема устройства |
Обратите внимание:
- При подключении сервопривода обращайте внимание на цветовую маркировку его проводов: провод тёмного цвета (коричневый) подключается к “земле”, красного цвета – к пину 5V, жёлтого или оранжевого цветов – к сигнальному пину (в нашем случае это 8-й пин);
ПРОГРАММИРОВАНИЕ
Для начала, напишем простой скетч, который будет выводить в монитор порта значение сигнала с нашего датчика. При выполнение эксперимента можно пользоваться как стандартным монитором порта, так и утилитой Serial Projector:
void setup() { Serial.begin(9600); // инициализируем последовательный порт } void loop() { int level=analogRead(A0); // объявляем переменную level и сохраняем в ней значение с датчика Serial.println(level); // посылаем в последовательный порт значение сигнала с датчика delay(1000); // задержка для того, чтобы замедлить вывод значений в монитор (для удобства чтения значений) }
Загрузите скетч в Arduino и откройте монитор порта. Для того, чтобы получить значение датчика, следует опустить его в стакан с водой. Будьте внимательны! не погружайте датчик целиком, а только лишь его “сенсорную” часть! Выполните следующие действия:
- Опустите датчик в стакан с водой и достаньте его оттуда. Посмотрите на значение сигнала, который приходит с датчика. Это будет наш “минимальный” сигнал:
- Повторно опустите датчик в воду таким образом, чтобы вода перекрыла всю “сенсорную” область датчика. Посмотрите на значение сигнала, который приходит с датчика. Это будет наш “максимальный” сигнал:
- Внесите эти значение в программу, как константы. Это можно сделать следующим образом:
const int level_min=237; // минимальный уровень воды const int level_max=370; // максимальный уровень воды void setup() { Serial.begin(9600); // инициализируем последовательный порт } void loop() { int level=analogRead(A0); // объявляем переменную level и сохраняем в ней значение с датчика Serial.println(level); // посылаем в последовательный порт значение сигнала с датчика delay(1000); // зададержка для того, чтобы замедлить вывод значений в монитор (для удобства чтения значений) }
Обратите внимание: значение константы для минимального и максимального уровня можно чуть занизить. Попробуйте самостоятельно объяснить – зачем?
Теперь заставим сервопривод поворачиваться в положение 180º, в случае, если с датчика поступают минимальные значения (открываем кран), и в положение 0º, когда с датчика поступают максимальные значения (закрываем кран):
#include <Servo.h>; // подключаем библиотеку для управления сервоприводом Servo my_servo; // Объявляем переменную типа Servo const int level_min=237; const int level_max=370; void setup() { Serial.begin(9600); // инициализируем последовательный порт my_servo.attach(8); // инициализируем сервопривод на 8-м пине } void loop() { int level=analogRead(A0); // объявляем переменную level и сохраняем в ней значение с датчика if (level<=level_min) { // если приходят минимальные значения my_servo.write(180); // поворачиваем вал в положение 180 градусов } if (level>=level_max) { // если приходят минимальные значения my_servo.write(0); // поворачиваем вал в положение 0 градусов } Serial.println(level); // посылаем в последовательный порт значение сигнала с датчика }
Загрузите скетч в Arduino и проверьте его работоспособность погружая датчик в стакан с водой.
Помните! Не копируйте программу бездумно! В каждом, отдельно взятом случае, минимальные и максимальные значения сигналов будут различаться и их нужно определить самостоятельно (провести калибровку).
Обратите внимание, в скетче остался код для вывода значений сигнала датчика в последовательный порт. Эту часть кода мы можем использовать для того, чтобы видеть на мониторе количество жидкости в нашей “поилке”. Правда, в таком виде эти значения использовать очень неудобно, поэтому…
ЗАДАНИЯ ДЛЯ САМОСТОЯТЕЛЬНОГО ВЫПОЛНЕНИЯ
Задание 1:
Дополните программу таким образом, чтобы в монитор порта приходил сигнал о количестве воды в поилке в виде (для вывода данных рекомендуется использовать утилиту Serial Projector):
Задание 2:
Добавьте к устройству LCD-дисплей и измените скетч таким образом, чтобы данные о количестве воды отображались на нём.
Задание 3:
Добавьте в схему пьезодинамик и дополните программу таким образом, чтобы при критически низком уровне воды (ниже 10%), пьезодинамик начинал подавать прерывистый сигнал.
Задание 4*:
Измените скетч таким образом, чтобы в программе появилась возможность управления нашей поилкой. После того, как в порт будет послана команда “наполнить поилку”, кран должен включаться (поворот сервопривода на 180º). Отключение крана происходит автоматически по сигналу с датчика. Добавьте в программу “защиту от дурака”, т.е. в случае, если количество воды в поилке будет больше 90%, сервопривод не должен реагировать на команду “наполнить поилку”, пришедшую из порта.