Как подключить датчик движения к ардуино
Перейти к содержимому

Как подключить датчик движения к ардуино

  • автор:

Умный светильник на Ардуино с Блютуз

Скачайте готовый скетч светильника с Bluethooh управлением или скопируйте код ниже. Для включения и переключения режимов работы умного светильника необходимо установить приложение на смартфон или планшет. На нашем сайте вы сможете узнать, как программировать приложения самому. Файл с приложением для Android lampe_bluetooth.apk вы можете скачать на нашем сайте здесь.

Скетч для Блютуз светильника на Arduino

unsigned long count = 180000; // 180 секунд #define LED 8 // пин для подключения реле с лампой #define PIR 2 // пин для подключения датчика движения int val; byte n = 0; unsigned long counttime; void setup() < mySerial.begin(9600); pinMode(LED, OUTPUT); pinMode(PIR, INPUT); > void loop() < // ручной режим if (mySerial.available()) < val = mySerial.read(); if (val == 'H') < digitalWrite(LED, HIGH); > if (val == 'L') < digitalWrite(LED, LOW); > if (val == 'A') < n = 1; >> // автоматический режим while (n == 1) < if (mySerial.available()) < val = mySerial.read(); if (val == 'M') < n = 0; break; > > if (digitalRead(PIR) == HIGH) < digitalWrite(LED, HIGH); n = 1; > if (digitalRead(PIR) == LOW) < counttime = millis(); n = 2; > // функция для отложенного выключения светильника while (n == 2) < if (mySerial.available()) < val = mySerial.read(); if (val == 'M') < n = 0; break; > > if (millis() - counttime > count) < digitalWrite(LED, LOW); n = 1; > if (digitalRead(PIR) == HIGH) < digitalWrite(LED, HIGH); n = 1; > > > >
Пояснения к коду:
  1. в цикле while (n==1) происходит автоматическое включение / выключение лампы, с возможностью выхода в ручной режим с помощью приложения;
  2. в цикле while (n==2) происходит выключение лампы, при отсутствии движения в помещении в течении 180 секунд (интервал можно поменять в программе).

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

(6 оценок, среднее: 5,00 из 5)

Подключение датчика движения к Arduino

Распиновка датчиков движения Ардуино у разных производителей может отличаться, но рядом с контактами есть надписи (см. фото выше). Поэтому, перед подключением внимательно изучите модуль. Один выход идет к GND, второй к питанию 5 Вольт (VCC), а третий выход (OUT) выдает цифровой сигнал с PIR сенсора. Соберите схему, как на фото выше, подключите светодиод к пину 12 на Ардуино и загрузите следующий скетч.

Скетч для датчика движения Ардуино

#define PIR 2 #define LED 12 void setup() < pinMode(PIR, INPUT); pinMode(LED,OUTPUT); > void loop() < int pirVal = digitalRead(PIR); if (pirVal == HIGH) < digitalWrite(LED, HIGH); delay(2000); > else < digitalWrite(LED,LOW); delay(2000); > >
Пояснения к коду:
  1. с помощью директивы #define для портов 2 и 12 мы назначили соответствующие имена PIR и LED. Это сделано лишь для нашего удобства;
  2. в условном операторе if использовано двойное равенство: if (pirVal == HIGH) . Согласно языку программирования Ардуино, двойное равенство является оператором сравнения.

Скетч для светильника с PIR датчиком движения

#define LED 3 // назначаем порт для светодиода #define PIR 2 // назначаем порт для PIR sensor unsigned long counttime; // выделение памяти для счетчика void setup() < pinMode(LED, OUTPUT); pinMode(PIR, INPUT); > void loop() < // если есть движение включаем светодиод if (digitalRead(PIR) == HIGH) < digitalWrite(LED, HIGH); > // включаем счетчик на 1 минуту counttime = millis(); // если нет движения и прошла 1 минута if (digitalRead(PIR) == LOW && millis() - counttime > 60000) < // если нет движения в течении 1 минуты выключаем светодиод digitalWrite(LED, LOW); > >
Пояснения к коду:
  1. с помощью функции counttime = millis(); мы начинаем отсчет времени. И в отличие от функции delay Arduino, которая полностью прерывает программу, микроконтроллер может продолжать остальные вычисления в скетче.
  2. мы изменили время выключения светильника. Если в первом скетче светодиод выключался сразу после сигнала LOW с датчика. То сейчас мы даем 1 минуту до выключения светильника, на случай если человек не вышел из комнаты.

Заключение. HC-SR501 датчик движения Ардуино позволяет сделать автоматическое включение освещения в комнате или создать «умную» подсветку лестницу в доме с помощью адресной ленты ws2812b. В комментариях к этой записи вы можете оставлять вопросы или свои замечания по представленной теме, на все комментарии наших постоянных пользователей мы стараемся ответить максимально быстро.

(15 оценок, среднее: 4,80 из 5)

Как проверить конденсатор мультиметром

Как проверить конденсатор мультиметром

LCD 1602 Arduino бегущая строка

LCD 1602 бегущая строка на Ардуино

Участие в конкурсе Ученые будущего 2017

Участие в конкурсе Ученые будущего 2017

Российский юниорский водный конкурс

Участие в российском водном конкурсе

Комментарии к записи

Светильник не будет выключаться
Поправил скетч, проверьте.
Виталий :

Пока поправлял ваш скетч считай новый написал, да и сам вспоминал минут 40 что к чему, но мне полезно, как раз проэктик родился)
#define LED 13 // порт для светодиода
#define PIR 2 // порт для PIR sensor
int state = 0; // нужен для запоминания состояния
unsigned long counttime; // выделение памяти для счетчика
void setup() pinMode(LED, OUTPUT);
pinMode(PIR, INPUT);
Serial.begin(9600);
>
void loop() // если есть движение включаем светодиод
if (digitalRead(PIR) == HIGH) digitalWrite(LED, HIGH);
Serial.println(«Есть человек»);
state = 1; // разовое изменение состояния за цикл
Serial.println(state);
>
// запускаем таймер
if (digitalRead(PIR) == LOW && state == 1) counttime = millis();
Serial.println(«Движения нет, догорает свет»);
Serial.println(counttime);
state = 0; // сбрасываем состояние, если ничего не изменится,
delay(200);// счетчик будет доделывать свое задание
>
// если нет движения и прошло 15 секунд
if (millis() — counttime >= 15000) Serial.println(«ТЕМНОТА»);
digitalWrite(LED, LOW);
>
> code>

Спасибо. Кому-то обязательно пригодится

Перелопачивал Ваш пример часа 2, то ошибки, то не правильная работа, почему не проверили код перед тем как его публиковать? State = 0 должно быть рядом с выключением лампочки, иначе условие с таймером не будет выполнено никогда. Про &amp, &gt вообще не понял что это и откуда. P.s. Надеялся взять рабочий код и подправить под себя, в итоге пришлось вникать в работу всех команд и процессов. За это конечно спасибо, теперь я в этом немного шарю, но всё таки выкладывать не проверенные коды не хорошо.

Тимофей :

Написал вот такую программу для 2 лампочек 12в. Не срабатывает вкл разных этажей(2). В чем причина подскажите пожалуйста?

Разберитесь с фигурными скобками в void loop

Возможно ли как то проверить датчик на работоспособность к примеру, не залило ли водой, или отрезали провода, есть ли возможность как то проверять работает ли датчик?

Добавить комментарий Отменить ответ

Этот сайт использует Akismet для борьбы со спамом. Узнайте, как обрабатываются ваши данные комментариев.

Импортозамещение услуг в ИТ области

  • Импортозамещение услуг в ИТ области 21 декабря, 2023

Ипотека для программиста в Москве

Ипотека для программиста в Москве 19 декабря, 2023

Тетрис на Arduino с OLED SSD1306 i2c дисплеем

Тетрис на Arduino с OLED SSD1306 i2c дисплеем 23 ноября, 2023

Как подключить 1.8 TFT дисплей к Ардуино

Как подключить 1.8 TFT SPI 128×160 к Ардуино 27 октября, 2023

DF Player mini подключение к Ардуино

  • Как подключить DF Player mini mp3 к Ардуино 20 июля, 2017

Часы на адресной ленте ws2812b Arduino

Часы на адресной светодиодной ленте Ардуино 17 декабря, 2021

Подключение lcd 1602 к Arduino i2c

Подключение LCD дисплея к Ардуино 30 декабря, 2016

Подключение IR приемника и пульта к Ардуино 12 июня, 2016

Arduino и ИК датчик движения

ИК датчик движения выдаёт цифровой сигнал, если замечает перемещение источника тепла в поле своего зрения. Вариантов исполнения модулей с этими датчиками существует много, в наборе GyverKIT идёт миниатюрный модуль на базе AM312. На плате нет ничего лишнего, поэтому модуль потребляет 8.5 мкА и отлично подходит для автономных проектов:

  • Питание: 2.7.. 12V
  • Ток потребления: 8.5 мкА
  • Угол обзора: 100 градусов
  • Дальность срабатывания: 3-5 метров
  • Таймаут: 2 секунды
  • Сигнал: 2 секунды

Подключение

Подключается к питанию и любому цифровому пину:

Обратите внимание на распиновку датчика: не на всех она подписана на плате, но можно определить сторону платы по компонентам:

Примеры

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

void setup() < Serial.begin(9600); >void loop()

Откроем плоттер и помашем над датчиком рукой:

Домашнее задание

  • Датчику по сути не нужен микроконтроллер! Сделайте сигнализацию, подав сигнал с датчика движения на светодиод, реле, активный зуммер, модуль мосфет-транзистора

Сигнализация на Ардуино своими руками

Arduino, простая сигнализация для дома или гаража

Скетч для сигнализации, все необходимые библиотеки и приложение для смартфона можно скачать одним архивом здесь. Отметим, что нельзя будет дистанционно управлять Arduino, так как проект максимально простой. Вы сможете лишь в сообщениях на смартфоне узнавать о показаниях датчиков, установленных в доме, через заданный промежуток времени или при срабатывании какого-либо датчика.

Скетч охранной сигнализации на Arduino Uno / Nano

#include SoftwareSerial.h> // подключение библиотеки SoftwareSerial.h SoftwareSerial mySerial(2, 3); // указываем пины rx и tx соответственно #include DHT.h> // подключаем библиотеку для датчика DHT dht(16, DHT11); // сообщаем на каком порту будет датчик int tmp; #define PIR 5 // порт для подключения датчика движения int pir; #define KNP 7 // порт для подключения переключателя int knp; #define WTR 19 // порт для подключения датчика воды int wtr; #define LED 11 // порт для подключения светодиодов #define BUZ 9 // порт для подключения пьезодинамика // строки для идентификации информации, получаемой на смартфоне String stringT = String("*"); String stringP = String("^"); String stringW = String("-"); String stringH = String("#"); // переменные для счетчиков, отсчета циклов и т.д. unsigned long motion; unsigned long hour; byte m, s1, s2, s3, c = 10; void setup() < mySerial.begin(9600); Serial.begin(9600); dht.begin(); pinMode(PIR, INPUT); analogWrite(PIR, LOW); pinMode(KNP, INPUT); analogWrite(KNP, LOW); pinMode(WTR, INPUT); analogWrite(WTR, LOW); // проверка светодиодов и пищалки при включении питания pinMode(BUZ, OUTPUT); pinMode(LED, OUTPUT); analogWrite(LED, 255); tone(BUZ, 100); delay(1000); analogWrite(LED, 0); noTone(BUZ); delay(1000); > void loop() < tmp = dht.readTemperature(); pir = digitalRead(PIR); knp = digitalRead(KNP); wtr = analogRead(WTR); // запускаем счетчик hour = millis(); // 3600000 миллисекунд - это 1 час, 10800000 - 3 часа // если прошло 3 часа - отправляем данные на смартфон // при необходимости ставите свои значения вместо 10800000 if (millis() - hour > 10800000) < mySerial.println(tmp + stringT); // отправляем значение температуры mySerial.println(pir + stringP); // отправляем наличие движения в доме mySerial.println(wtr + stringW); // отправляем данные с датчиков воды mySerial.println(stringH); // отправляем сигнал, что 3 часа прошло > // ведем отсчет циклов, каждый десятый цикл отправляем данные на смартфон c--; Serial.print(c); Serial.println(" - цикл"); Serial.println(""); delay(1000); noTone(BUZ); if (c > 10) < c = 10; >if (c < 1) < s1 = 0; s2 = 0; s3 = 0; mySerial.println(tmp + stringT); // отправляем значение температуры mySerial.println(pir + stringP); // отправляем наличие движения в доме mySerial.println(wtr + stringW); // отправляем данные с датчиков воды // выводим на монитор порта номер все данные с датчиков Serial.print("TMP color: #ff6600;">Serial.println(tmp); Serial.print("PIR color: #ff6600;">Serial.println(pir); Serial.print("KNP color: #ff6600;">Serial.println(knp); Serial.print("WTR color: #ff6600;">Serial.println(wtr); Serial.println(""); > // СРАБОТАЛ ДАТЧИК ДВИЖЕНИЯ И КНОПКА ВЫКЛЮЧЕНА - ВКЛЮЧАЕМ СВЕТ if (pir == HIGH && knp == LOW) < analogWrite(LED, 255); > // ДАТЧИК ДВИЖЕНИЯ ОТКЛЮЧИЛСЯ И КНОПКА ВЫКЛЮЧЕНА - ВЫКЛЮЧАЕМ СВЕТ if (pir == LOW && knp == LOW) < motion = millis(); while (pir == LOW) < tmp = dht.readTemperature(); pir = digitalRead(PIR); knp = digitalRead(KNP); wtr = analogRead(WTR); c--; Serial.print(c); Serial.println(" - цикл"); Serial.println(""); delay(1000); noTone(BUZ); if (c > 10) < c = 10; >if (c < 1) < s1 = 0; s2 = 0; s3 = 0; mySerial.println(tmp + stringT); // отправляем значение температуры mySerial.println(pir + stringP); // отправляем наличие движения в доме mySerial.println(wtr + stringW); // отправляем данные с датчиков воды // выводим на монитор порта номер все данные с датчиков Serial.print("TMP color: #ff6600;">Serial.println(tmp); Serial.print("PIR color: #ff6600;">Serial.println(pir); Serial.print("KNP color: #ff6600;">Serial.println(knp); Serial.print("WTR color: #ff6600;">Serial.println(wtr); Serial.println(""); > // ИНТЕРВАЛ ВЫКЛЮЧЕНИЯ СВЕТА В МИЛЛИСЕКУНДАХ if (millis() - motion > 5000) < analogWrite(LED, 0); break; > if (pir == HIGH) < analogWrite(LED, 255); break; > > > // СРАБОТАЛ ДАТЧИК ДВИЖЕНИЯ И КНОПКА ВКЛЮЧЕНА - ЗАПУСКАЕМ ТАЙМЕР if (pir == HIGH && knp == HIGH) < motion = millis(); delay(1000); analogWrite(LED, 255); Serial.println("СРАБОТАЛ ДАТЧИК"); Serial.println(""); delay(1000); while (knp == HIGH) < tmp = dht.readTemperature(); pir = digitalRead(PIR); knp = digitalRead(KNP); wtr = analogRead(WTR); c--; Serial.print(c); Serial.println(" - цикл"); Serial.println(""); delay(1000); noTone(BUZ); if (c > 10) < c = 10; >if (c < 1) < s1 = 0; s2 = 0; s3 = 0; mySerial.println(tmp + stringT); // отправляем значение температуры mySerial.println(pir + stringP); // отправляем наличие движения в доме mySerial.println(wtr + stringW); // отправляем данные с датчиков воды // выводим на монитор порта номер все данные с датчиков Serial.print("TMP color: #ff6600;">Serial.println(tmp); Serial.print("PIR color: #ff6600;">Serial.println(pir); Serial.print("KNP color: #ff6600;">Serial.println(knp); Serial.print("WTR color: #ff6600;">Serial.println(wtr); Serial.println(""); > // ЕСЛИ ДАТЧИК ДВИЖЕНИЯ ОТКЛЮЧИЛИ - ОТПРАВКА СООБЩЕНИЯ НА БЛЮТУЗ if (knp == LOW) < Serial.println("СИГНАЛИЗАЦИЯ ОТКЛЮЧЕНА"); Serial.println(""); delay(1000); > // ЕСЛИ ПРОШЛО БОЛЕЕ 10 СЕКУНД - ОТПРАВКА СООБЩЕНИЯ НА БЛЮТУЗ if (millis() - motion > 10000 && s1 != 1) < m = 1; goto message1; > delay(1000); > > // ЕСЛИ ПРОИЗОШЛА УТЕЧКА ВОДЫ - ОТПРАВКА СООБЩЕНИЯ НА БЛЮТУЗ if (wtr > 500 && s2 != 2) < m = 2; goto message2; > if (wtr > 500) < tone(BUZ, 400); > if (wtr noTone(BUZ); > // ЕСЛИ УПАЛА ТЕМПЕРАТУРА - ОТПРАВКА СООБЩЕНИЯ НА БЛЮТУЗ if (tmp < 20 && s3 != 3) < m = 3; goto message3; > if (tmp < 20) < tone(BUZ, 200); > if (tmp >= 20) < noTone(BUZ); > message1: while (m == 1) < Serial.println("СИГНАЛ ТРЕВОГИ ОТПРАВЛЕН НА БЛЮТУЗ"); Serial.println(""); delay(1000); mySerial.println(tmp + stringT); // отправляем значение температуры mySerial.println(1 + stringP); // отправляем наличие движения в доме mySerial.println(wtr + stringW); // отправляем данные с датчиков воды s1 = 1; m = 0; break; > message2: while (m == 2) < Serial.println("СИГНАЛ УТЕЧКИ ВОДЫ ОТПРАВЛЕН НА БЛЮТУЗ"); Serial.println(""); delay(1000); mySerial.println(tmp + stringT); // отправляем значение температуры mySerial.println(pir + stringP); // отправляем наличие движения в доме mySerial.println(500 + stringW); // отправляем данные с датчиков воды s2 = 2; m = 0; break; > message3: while (m == 3) < Serial.println("СИГНАЛ ТЕМПЕРАТУРЫ ОТПРАВЛЕН НА БЛЮТУЗ"); Serial.println(""); delay(1000); mySerial.println(20 + stringT); // отправляем значение температуры mySerial.println(pir + stringP); // отправляем наличие движения в доме mySerial.println(wtr + stringW); // отправляем данные с датчиков воды s3 = 3; m = 0; break; > >
Пояснения к коду:

На первый взгляд схема может показаться сложной, однако это не так. Сигнализацию можно собрать на любой плате, в том числе и Arduino Uno. Вместо светодиодов можно можно использовать LED ленту, но при этом питание для платы нужно будет уже 12 Вольт, и подключать LED ленту не к 5V, а к пину Vin Arduino. Со светодиодами можно использовать для питания схемы обычную зарядку от телефона на 5 Вольт.

Установка приложения на смартфон для сигнализации

Чтобы установить приложение закачайте файл home_twit.apk на свой телефон через USB шнур, найдите его в памяти телефона и нажмите «Установить». Этот телефон должен быть всегда в зоне Bluethoth сигнала Ардуино. После установки откройте приложение и нажмите кнопку «Настроить». Здесь потребуется указать минимальное и максимальное значение температуры, при которой будет отправляться сообщение.

А сейчас самое сложное — настройка аккаунтов в Twitter. Укажите в настройках логин пользователя в Твиттере, кому вы будете отправлять сообщение. Также требуется указать логин, API key и API secret key от лица которого будут поступать сообщения. Последние нововведения обусловлены борьбой со спамом и сбором информации о пользователях в соцсети. Как получить API key и API secret — читайте в этом обзоре.

На телефоне, который будет всегда при вас и будет получать сообщения потребуется установить официальное приложение Twitter с PlayMarket и войти в него под нужным логином. В итоге приложение signalizaciya.apk с телефона, находящегося в доме, будет собирать данные с датчиков Ардуино и отправлять их личным сообщением через Твиттер пользователю, под чьим логином вы установили приложение Twitter.

Если у вас возникли проблемы с настройками сигнализации на Ардуино — пишите свои вопросы в комментариях к этому обзору.

Добавить комментарий

Ваш адрес email не будет опубликован. Обязательные поля помечены *