Проект 10. Сигнализация
В этом проекте будет разработана сигнализация, работающая на датчике расстояния. При включении сохраняется уровень расстояния на датчике, и если в активном состоянии сигнализации кто-то пройдёт мимо, например, войдёт через дверь, то сигнализация сработает и зазвучит сигнал тревоги!
Программирование:
Цикл while
break
Практика
Запрограммируйте сигнализацию следующим образом:
При включении контроллера загорается жёлтый светодиод, далее - ожидание нажатия на button1. При нажатии на кнопку измеряется текущее расстояние модулем Ultrasonic и записывается в переменную. Загорается зелёный светодиод – индикатор рабочего режима сигнализации, жёлтый выключается.
Сигнализация будет реагировать на изменение расстояния, например, её можно разместить вдоль дверного проёма, тогда при проходе человека через дверь, расстояние на датчике изменится и сработает сигнализация. При срабатывании сигнализации начинает мигать красный светодиод (зелёный выключается), включается пьезодинамик. Отключение сигнализации производится button2.
Дополнительное задание
Реализовать отключение сигнализации после поворота регулятора в крайнее левое положение (eryoma.read() == 1023) и нажатия кнопок button0 и button2. Вынести проигрывание звука в отдельную процедуру
Решение
Мы рекомендуем сначала освоить материал и попробовать сделать программу самостоятельно! А потом проверить себя, посмотрев наш вариант решения:
Основная программа
#include <Eryoma.h>
Eryoma eryoma;
int distance;
boolean active = false;
void setup() {
pinMode(A14, OUTPUT);
eryoma.setupConnector(ePort4, Keypad);
eryoma.setupConnector(ePort2, Ultrasonic);
eryoma.setupConnector(ePort1, TrafficLight);
Serial.begin(9600);
}
void loop() {
eryoma.write(ePort1, 0, 255, 0);
if (eryoma.read(ePort4, D1) == 0) {
distance = eryoma.read(ePort2);
eryoma.write(ePort1, 255, 0, 0);
active = true;
while (eryoma.read(ePort2) >= distance - 3) {
Serial.print(distance);
Serial.print(" || ");
Serial.println(eryoma.read(ePort2));
// delay(10);
if (eryoma.read(ePort4, D2) == 0) {
active = false;
break;
}
}
if (active) {
eryoma.write(ePort1, 0, 0, 255);
while (eryoma.read(ePort4, D2) == 1) {
tone(A14, 600);
delay(1000);
tone(A14, 300);
delay(1000);
}
noTone(A14);
}
}
}
Дополнительное задание
#include <Eryoma.h>
Eryoma eryoma;
int distance;
boolean flag = true;
boolean active = false;
void setup() {
pinMode(A14, OUTPUT);
eryoma.setupConnector(ePort4, Keypad);
eryoma.setupConnector(ePort2, Ultrasonic);
eryoma.setupConnector(ePort1, TrafficLight);
Serial.begin(9600);
}
void loop() {
eryoma.write(ePort1, 0, 255, 0);
if (eryoma.read(ePort4, D1) == 0) {
distance = eryoma.read(ePort2);
eryoma.write(ePort1, 255, 0, 0);
active = true;
while (eryoma.read(ePort2) >= distance - 3) {
if (eryoma.read(ePort4, D0) == 0 && eryoma.read(ePort4, D1) == 1 && eryoma.read(ePort4, D2) == 0 && eryoma.read(ePort4, An) >= 1000) {
active = false;
break;
}
}
if (active) {
eryoma.write(ePort1, 0, 0, 255);
while (eryoma.read(ePort4, D0) == 1 || eryoma.read(ePort4, D1) == 0 || eryoma.read(ePort4, D2) == 1 || eryoma.read(ePort4, An) <= 1000) {
playSignal();
}
noTone(A14);
active = false;
}
}
}
void playSignal() {
tone(A14, 600);
delay(1000);
tone(A14, 300);
delay(1000);
}