Как сделать простую систему сигнализации Arduino

Обнаружьте движение, затем напугайте до чертика злоумышленника высокими звуками тревоги и мигающими огнями. Звучит весело? Конечно, это так. Это цель сегодняшнего проекта Arduino, подходящего для начинающих. Мы будем писать с нуля и тестировать по мере продвижения, чтобы вы могли надеяться получить некоторое представление о том, как все это делается, а не просто установить что-то, что я уже сделал.

Отказ от ответственности: это не собирается на самом деле защитить ваш дом. Это может вызвать у вашей сестры неприятный шок, когда она пробирается в вашу комнату.

Тебе понадобиться:

  • Ардуино
  • Ультразвуковой датчик «ping», я использую HC-SR04. Лучше бы PIR, но это дорого. Датчик ping может быть тайно помещен в дверной проем и все еще выполнять ту же самую основную работу, и стоит всего 5 $
  • Пьезо зуммер
  • Светодиодная лента, с той же проводкой, которую мы использовали в этом проекте

    ,

Поскольку вы подключаете этот проект, не удаляйте все каждый раз — просто продолжайте работу над последним блоком. К тому времени, когда вы доберетесь до раздела «Coding The Alarm System», у вас должны быть все части и кусочки, которые выглядят примерно так:

готовая проводка

Мигающие огни

Используйте схему подключения из этого проекта

подключить вашу светодиодную ленту; не меняйте контакты, так как нам нужен выход ШИМ. использование этот код, чтобы быстро проверить вашу проводку. Если все идет хорошо, вы должны иметь это:

LED-RGB-тест

Датчик расстояния

На модуле SR04 вы найдете 4 контакта. VCC а также GND перейти к + 5В рельсу и земле соответственно; TRIG является ли контакт, используемый для отправки сигнала гидролокатора, поместите его на контакт 6; ECHO используется для считывания сигнала обратно (и, следовательно, для расчета расстояния) — установите это значение на 7.

SR04

Чтобы сделать все невероятно простым, есть библиотека, которую мы можем использовать под названием NewPing. Загрузите и разместите в своем Arduino’s Библиотека папку и перезапустите IDE, прежде чем продолжить. Проверьте, используя этот код; откройте последовательный монитор и убедитесь, что скорость установлена ​​на 115200 бод. Если вам повезет, вы должны увидеть, как некоторые измерения расстояния отправляются вам на довольно высокой скорости. Вы можете найти отклонение в 1 или 2 сантиметра, но это нормально. Попробуйте провести рукой перед датчиком, перемещая его вверх и вниз, чтобы увидеть изменяющиеся показания.

пинг-вывода

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

В цикле этого тестового приложения мы используем пинг() функция для отправки эхолота, возвращая значение в миллисекундах того, сколько времени потребовалось для возврата значения. Чтобы понять это, мы используем библиотеки NewPing, встроенные в константу US_ROUNDTRIP_CM, который определяет, сколько микросекунд требуется, чтобы пройти один сантиметр. Между пингами также имеется задержка 50 мс, чтобы избежать перегрузки датчика.

Пьезо будильник

Пьезокристаллический сенсор — это простой и дешевый зуммер, и мы можем использовать ШИМ-вывод 3 для создания разных тонов. Подключите один провод к контакту 3, другой — к заземляющей шине — не имеет значения, какой именно.

Используйте этот код для тестирования.

Единственный способ убить довольно неприятную и громкую тревогу — это выдернуть вилки. Код немного сложен для объяснения, но он использует синусоидальные волны для генерации отличительного звука. Настройте цифры, чтобы играть с разными тонами.

Кодирование системы сигнализации

Теперь, когда у нас есть все части этой головоломки, давайте объединим их вместе.

Сделайте новый набросок, который называется Тревога. Начните с объединения всех переменных и определений выводов, которые мы использовали в тестовых примерах до сих пор.

#include
// Select which PWM-capable pins are to be used.
#define RED_PIN    10
#define GREEN_PIN   11
#define BLUE_PIN  9
#define TRIGGER_PIN  6  // Arduino pin tied to trigger pin on the ultrasonic sensor.
#define ECHO_PIN     7  // Arduino pin tied to echo pin on the ultrasonic sensor.
#define MAX_DISTANCE 100 // Maximum distance we want to ping for (in centimeters).
#define ALARM 3
float sinVal;
int toneVal;

Начните с написания основного настроить() функция — мы пока будем иметь дело только с огнями. Я добавил 5-секундную задержку перед запуском основного цикла, чтобы дать нам время убраться с дороги, если это необходимо.

void setup(){
//set pinModes for RGB strip
pinMode(RED_PIN,OUTPUT);
pinMode(BLUE_PIN,OUTPUT);
pinMode(GREEN_PIN,OUTPUT);
//reset lights
analogWrite(RED_PIN,0);
analogWrite(BLUE_PIN,0);
analogWrite(RED_PIN,0);
delay(5000);
}

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

//helper function enabling us to send a colour in one command
void color (unsigned char red, unsigned char green, unsigned char blue)     // the color generating function
{
analogWrite(RED_PIN, red);
analogWrite(BLUE_PIN, blue);
analogWrite(GREEN_PIN, green);
}

Наконец, наш цикл на данный момент будет состоять из простой цветовой вспышки между красным и желтым (или, что бы вы ни хотели, чтобы ваш будильник был — просто измените значения RGB).

void loop(){
color(255,0,0); //red
delay(100);
color(255,255,0); //yellow
delay(100);
}

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

Теперь давайте интегрируем датчик расстояния, чтобы включить эти огни, только когда что-то находится, скажем, в 50 см (чуть меньше ширины дверной рамы). Мы уже определили правильные выводы и импортировали библиотеку, поэтому перед настроить() Функция добавляет следующую строку, чтобы создать его экземпляр:

NewPing sonar(TRIGGER_PIN, ECHO_PIN, MAX_DISTANCE); // NewPing setup of pins and maximum distance.

Под этим, добавьте переменную для хранения состояния срабатывания тревоги или нет, конечно, по умолчанию false.

boolean triggered = false;

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

Serial.begin(115200); // Open serial monitor at 115200 baud to see ping results.

Далее, давайте переименуем текущий цикл в тревога() — это то, что будет вызвано, если сработала сигнализация.

void alarm(){
color(255,0,0); //red
delay(100);
color(255,255,0); //yelow
delay(100);
}

Теперь создайте новый петля () функция, в которой мы получаем новый пинг, читаем результаты и запускаем сигнализацию, если что-то обнаружено в пределах диапазона метра.

void loop(){
if(triggered == true){
alarm();
}
else{
delay(50);// Wait 50ms between pings (about 20 pings/sec). 29ms should be the shortest delay between pings.
unsigned int uS = sonar.ping(); // Send ping, get ping time in microseconds (uS).
unsigned int distance = uS / US_ROUNDTRIP_CM;
Serial.println(distance);
if(distance < 100){
triggered = true;
}
}
}

Позвольте мне кратко объяснить код:

  • Начните с проверки, сработала ли сигнализация, и, если это так, отключите функцию будильника (просто мигая в данный момент).
  • Если это еще не сработало, получите текущее показание от датчика.
  • Если датчик читает <100 cm, something has padded the beam (adjust this value if it’s triggering too early for you, obviously).

Дайте ему пробную версию сейчас, прежде чем мы добавим надоедливый пьезо-зуммер.

За работой? Отлично. Теперь давайте добавим этот зуммер обратно. добавлять pinMode к настроить() рутина.

pinMode(ALARM, OUTPUT);

Затем добавьте пьезо-зуммер в функцию alarm ():

for (int x=0; x<180; x++) {
// convert degrees to radians then obtain sin value
sinVal = (sin(x*(3.1412/180)));
// generate a frequency from the sin value
toneVal = 2000+(int(sinVal*1000));
tone(ALARM, toneVal);
}

Если вы попытаетесь скомпилировать на этом этапе, вы столкнетесь с ошибкой - я оставил это намеренно, чтобы вы могли увидеть некоторые распространенные проблемы. В этом случае и библиотека NewPing, и библиотека стандартных тонов используют одни и те же прерывания - они в основном конфликтуют, и вы не можете многое сделать, чтобы это исправить. О, Боже.

Не беспокойтесь, хотя. Это обычная проблема, и у кого-то уже есть решение - скачайте и добавьте этот NewTone в папку Arduino Libraries. Настройте начало вашей программы, чтобы включить это:

#include

И настроить строку:


tone(ALARM, toneVal);

в


NewTone(ALARM, toneVal);

вместо.

Это оно. Установите будильник в дверях своей спальни для следующего несчастного потенциального грабителя.

Или сумасшедшая собака, которая казалась совершенно равнодушной к тревоге.

Возникли проблемы с кодом? Вот полное приложение. Если вы получаете случайные ошибки, попробуйте вставить их ниже, и я посмотрю, смогу ли я помочь.

Кредит изображения: Пожарная тревога через Flickr

Ссылка на основную публикацию
Adblock
detector