Хочу сделать пугачку-говорилку

popkop
Offline
Зарегистрирован: 02.04.2020

Добрый день, друзья. Хочу сделать пугачку-говорилку. Есть плата D1 mini обычный датчик движения mp3 player.

Не могу понять как написать код таким образом. что бы если в течении 40 секунд есть движение в поле видимости датчика то воспроизводим музыку.

p.s. просто на движение музыку воспроизводить научился. 

Так же желательно не на delay(); это делать. Т.К. в дальнейшем планирую перепрошивать d1 mini через wifi удаленно. а на делей говорят это сделать не получится

ЕвгенийП
ЕвгенийП аватар
Offline
Зарегистрирован: 25.05.2015

popkop пишет:
обычный датчик движения

Обычным бывает стиральный порошок, а датчики движения бывают инфракрасные; ультразвуковые; микроволновые; гибридные, может ещё какие, но "обычных" точно не бывает.

popkop пишет:
Не могу понять как написать код таким образом ...

А что Вы можете понять? Хоть какой-то код у Вас есть? Хоть какие-то попытки делались? Выкладывайте.

popkop
Offline
Зарегистрирован: 02.04.2020
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);
  } else {
    Serial.println(val);
    Serial.println("da");
    mp3_play ();
    delay(10000);
    mp3_stop();
  }
  delay(3000);
}
 Датчик присутствия HC-SR501
Я уже думал может попробовать: если с датчика приходит единица или HIGH то запустить цикл и через 40 секунд проверить есть ли единица  на датчике. Тогда воспроизводить мелодию
ЕвгенийП
ЕвгенийП аватар
Offline
Зарегистрирован: 25.05.2015

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

popkop
Offline
Зарегистрирован: 02.04.2020
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);
}

 

sadman41
Offline
Зарегистрирован: 19.10.2016

millis() знаете? Вот, оперируя им, определяйте сколько времени прошло с момента первого движения. Если > N sec, то включайте плеер.

popkop
Offline
Зарегистрирован: 02.04.2020
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);
}

Ребят, что написал не так? все равно играет при первом же движении

b707
Offline
Зарегистрирован: 26.05.2017

popkop пишет:
Ребят, что написал не так? все равно играет при первом же движении

все

во-первых. ты по срабатыванию датчика сначала должен запомнить время - где это в твоем коде? - нигде

во-вторых, нужен флаг, показывающий. что таймер уже запущен - этого тоже нет

И только если все три условия - 1) флаг поднят, 2) прошло 5 сек и 3)сигнал все еще не пропал - истиннны, только тогда играем

popkop
Offline
Зарегистрирован: 02.04.2020
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);
}

Ребята, я вообще не понимаю с этим флагом. Понимаю, что чего-то не хватает, а чего не пойму (

andriano
andriano аватар
Offline
Зарегистрирован: 20.06.2015

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

popkop
Offline
Зарегистрирован: 02.04.2020

Ребята, переписал уже код по другому. Все равно работает не правильно. Где логику нарушил?

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);
               }
   }

 

ЕвгенийП
ЕвгенийП аватар
Offline
Зарегистрирован: 25.05.2015

Хоть комментарии напишите

popkop
Offline
Зарегистрирован: 02.04.2020

Посидел пар дней и справился с этой задачей, просто подправил логику.

Ребята, другой вопрос: необходимо как-то общаться с моей платой d1 mini через wi-fi или другие средства. К примеру: хочу отключать датчик, что бы он не срабатывал (снимать с сигнализации). Может есть какие-то библиотеки или другие средства?

Я вижу только вариант: это подымать web сервер. И через него проводить общение

MaksVV
Offline
Зарегистрирован: 06.08.2015

по простому Тактовой кнопкой можно управлять. Если более сложный функционал. То несколько кнопок, экран с меню. Или взаимодействие девайса со смартфоном по блютуз или вайфай. Опять же самое простое через простые терминалы типа serial bluetooth terminal или serial WiFi terminal. А лучше по gsm - Думаю для охранки это хорошо иметь еще и оповещение на телефон . если будет gsm , то можно прикрутить управление по mqtt. еще есть вариант управления через инфракрасный канал пультом от телека.