Хочу сделать пугачку-говорилку
- Войдите на сайт для отправки комментариев
Чт, 02/04/2020 - 16:15
Добрый день, друзья. Хочу сделать пугачку-говорилку. Есть плата D1 mini обычный датчик движения mp3 player.
Не могу понять как написать код таким образом. что бы если в течении 40 секунд есть движение в поле видимости датчика то воспроизводим музыку.
p.s. просто на движение музыку воспроизводить научился.
Так же желательно не на delay(); это делать. Т.К. в дальнейшем планирую перепрошивать d1 mini через wifi удаленно. а на делей говорят это сделать не получится
Обычным бывает стиральный порошок, а датчики движения бывают инфракрасные; ультразвуковые; микроволновые; гибридные, может ещё какие, но "обычных" точно не бывает.
А что Вы можете понять? Хоть какой-то код у Вас есть? Хоть какие-то попытки делались? Выкладывайте.
Нет, так не пойдёт, прочитайте сначала обязательную для всех новичков тему, а потом выложите код как положено. Как Вы прикажете мне его комментировать, если в нём даже номеров строк нет?
int pirPin = D4; int val; #include <SoftwareSerial.h> #include <DFPlayer_Mini_Mp3.h> void setup() { Serial.begin(9600); mp3_set_serial (Serial); mp3_set_volume (13); } void loop() { // Читаем состояние PIR val = digitalRead(pirPin); if (val == LOW) { // чисто вывод в ком порт Serial.println(val); Serial.println("net"); } else { // чисто вывод в ком порт Serial.println(val); Serial.println("da"); mp3_play (); delay(10000); mp3_stop(); } delay(3000); }millis() знаете? Вот, оперируя им, определяйте сколько времени прошло с момента первого движения. Если > N sec, то включайте плеер.
int pirPin = D4; int val; unsigned long timing; unsigned long timing2; #include <SoftwareSerial.h> #include <DFPlayer_Mini_Mp3.h> void setup() { Serial.begin(9600); mp3_set_serial (Serial); mp3_set_volume (13); } void loop() { // Читаем состояние PIR val = digitalRead(pirPin); if (val == LOW) { // чисто вывод в ком порт Serial.println(val); Serial.println("net"); } else { Serial.println("da"); if (millis() - timing > 5000){ timing = millis(); Serial.println("da2"); if (val == HIGH){ Serial.println("ugraem"); mp3_play (); delay(10000); mp3_stop(); } } } delay(3000); }Ребят, что написал не так? все равно играет при первом же движении
все
во-первых. ты по срабатыванию датчика сначала должен запомнить время - где это в твоем коде? - нигде
во-вторых, нужен флаг, показывающий. что таймер уже запущен - этого тоже нет
И только если все три условия - 1) флаг поднят, 2) прошло 5 сек и 3)сигнал все еще не пропал - истиннны, только тогда играем
int pirPin = D4; int val; int flag; unsigned long timing; unsigned long timing2; #include <SoftwareSerial.h> #include <DFPlayer_Mini_Mp3.h> void setup() { Serial.begin(9600); mp3_set_serial (Serial); mp3_set_volume (13); } void loop() { // Читаем состояние PIR val = digitalRead(pirPin); if (val == LOW) { // чисто вывод в ком порт Serial.println(val); Serial.println("net"); } else { timing = millis(); Serial.println("da"); flag = 1; if (millis() - timing > 5000){ Serial.println("da2"); if (val == HIGH){ Serial.println("ugraem"); mp3_play (); delay(10000); mp3_stop(); flag = 0; } } } delay(3000); }Ребята, я вообще не понимаю с этим флагом. Понимаю, что чего-то не хватает, а чего не пойму (
popkop, логика работы контроллера в большинстве случаев полостью совпадает с логикой человека: постарайтесь представить себя на месте контроллера - как бы Вы лично решали поставленную задачу, и сформулируйте это на бумаге. Для начала - по-русски.
Ребята, переписал уже код по другому. Все равно работает не правильно. Где логику нарушил?
int pirPin = D4; int val; int r; unsigned long interval=3000; unsigned long previousMillis=0; unsigned long interval1=5000; unsigned long previousMillis1=0; #include <SoftwareSerial.h> #include <DFPlayer_Mini_Mp3.h> void setup() { Serial.begin(9600); mp3_set_serial (Serial); mp3_set_volume (13); } void loop() { if ((unsigned long)(millis() - previousMillis) >= interval) { previousMillis = millis(); val = digitalRead(pirPin); if (val == LOW) { Serial.println("net"); } else { if ((unsigned long)(millis() - previousMillis1) >= interval1) { previousMillis1 = millis(); int r = 1; Serial.println(r); Serial.println("da"); } } } if ( val == HIGH && r == 1){ Serial.println("ugraem"); mp3_play (); delay(10000); mp3_stop(); r = 0; Serial.println(r); } if ( val == LOW && r == 1){ Serial.println("sbros"); r = 0; Serial.println(r); } }Хоть комментарии напишите
Посидел пар дней и справился с этой задачей, просто подправил логику.
Ребята, другой вопрос: необходимо как-то общаться с моей платой d1 mini через wi-fi или другие средства. К примеру: хочу отключать датчик, что бы он не срабатывал (снимать с сигнализации). Может есть какие-то библиотеки или другие средства?
Я вижу только вариант: это подымать web сервер. И через него проводить общение
по простому Тактовой кнопкой можно управлять. Если более сложный функционал. То несколько кнопок, экран с меню. Или взаимодействие девайса со смартфоном по блютуз или вайфай. Опять же самое простое через простые терминалы типа serial bluetooth terminal или serial WiFi terminal. А лучше по gsm - Думаю для охранки это хорошо иметь еще и оповещение на телефон . если будет gsm , то можно прикрутить управление по mqtt. еще есть вариант управления через инфракрасный канал пультом от телека.