Нужен скетч включения реле

Тема в разделе "Закажу проект", создана пользователем Predtech, 12 дек 2017.

  1. Predtech

    Predtech Нуб

    Вот пример скетча
    Код (C++):

    #include <SoftwareSerial.h>
    #include <DFPlayer_Mini_Mp3.h>
    const int relPin = 3; //реле в пин 2 цифровой
    const int photoPin = A0; //датчик в пин A0 аналоговый

    SoftwareSerial mySerial(10, 11); // RX, TX
    unsigned long timing;


    //
    void setup () {
      Serial.begin (9600);
      pinMode(relPin, OUTPUT);
      pinMode(photoPin, INPUT);
      mySerial.begin (9600);
      mp3_set_serial (mySerial);  //set softwareSerial for DFPlayer-mini mp3 module
      mp3_set_volume (1);
    }


    //
    void loop () {
      if( analogRead(photoPin) > 650 )
            digitalWrite(relPin, HIGH);
            if( analogRead(photoPin) > 650 )
            mp3_play ();
           
             if (millis() - timing > 60000){ // Вместо 60000 подставьте нужное значение паузы
      timing = millis();
      Serial.println ("Готово");
      digitalWrite(relPin, LOW);
      mp3_stop ();      
    }}
     


    /*
       mp3_play ();   //start play
       mp3_play (5);  //play "mp3/0005.mp3"
       mp3_next ();   //play next
       mp3_prev ();   //play previous
       mp3_set_volume (uint16_t volume);  //0~30
       mp3_set_EQ (); //0~5
       mp3_pause ();
       mp3_stop ();
       void mp3_get_state ();   //send get state command
       void mp3_get_volume ();
       void mp3_get_u_sum ();
       void mp3_get_tf_sum ();
       void mp3_get_flash_sum ();
       void mp3_get_tf_current ();
       void mp3_get_u_current ();
       void mp3_get_flash_current ();
       void mp3_single_loop (boolean state);  //set single loop
       void mp3_DAC (boolean state);
       void mp3_random_play ();
    */

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

    А нужно что бы поднес магнит датчик и музыка включилась на 60 секунд, далее выключилась и все заново.
     
  2. akl

    akl Гуру

    вот так вроде должно работать
    Код (C++):
    void loop () {
      if( analogRead(photoPin) > 650 ){ //сработал датчик
            digitalWrite(relPin, HIGH); //включаем реле
            mp3_play ();           //включаем музычку
           timing = millis();    //засекаем момент включения
       }
       if (millis() - timing > 60000){ // если с момента включения прошло 60 сек.
          Serial.println ("Готово");
          digitalWrite(relPin, LOW);  //выключаем всё
          mp3_stop ();    
       }
    }
     
    Predtech нравится это.
  3. Predtech

    Predtech Нуб

    Огромное спасибоооо уже все перепробовал ))))
     
  4. vvr

    vvr Инженерище

    Код (C++):

    #include <SoftwareSerial.h>
    #include <DFPlayer_Mini_Mp3.h>

    const int relPin = 3;               //реле в пин 2 цифровой
    const int photoPin = A0;            //датчик в пин A0 аналоговый

    SoftwareSerial mySerial(10, 11);    // RX, TX

    int count = 0;
    byte state = 0;



    void setup ()
    {
      pinMode(relPin, OUTPUT);
      pinMode(photoPin, INPUT);
     
      Serial.begin (9600);
      mySerial.begin (9600);
     
      mp3_set_serial (mySerial);
      mp3_set_volume (1);
    }


    void loop ()
    {
      if(state == 0 && analogRead(photoPin) > 650)
      {
        state = 1;
      }

      if(state == 1)
      {
        digitalWrite(relPin, HIGH);
        mp3_play ();

        static unsigned long timing = 0;

        if (millis() - timing > 1000)
        {
          count ++;
          timing = millis();
        }

        if(count >= 60)
        {
          Serial.println ("Готово");
          digitalWrite(relPin, LOW);
          mp3_stop ();
          count = 0;
          state = 0;  
        }
      }
    }


     
     
  5. akl

    akl Гуру

    этот вариант (у vvr) отличается тем, что в нем музычка не будет продляться если датчик срабатывает во время ее проигрывания - 60 секунд проиграет и только после этого ее можно перезапустить. я бы вообще сделал чтобы при повторном срабатывании датчика можно было отключать музычку (естественно надо будет ограничить "дребезг"). Но думаю ТС и сам это легко сделает, если как следует сначала продумает алгоритм, нарисует его на бумажке и только после этого воплотит его в си

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