Проект 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);
}