Skocz do zawartości

Arduino i DF PLAYER mini


Pomocna odpowiedź

Napisano

Witam wszystkich.

Mam mały problem z odtwarzaczem a raczej z kodem, ale od początku. Jakiś czas temu wymyśliłem sobie, że zrobię sobie taki mały komunikator, który będzie mnie informował mnie o pewnych zdarzeniach głosowo. Chodzi mniej więcej o to, aby dane komunikaty zostały odtworzone jak czujniki podadzą sygnały na określone piny. Wymyśliłem sobie takie założenia:

Czujnik 1 podaje sygnał na pin 7 i ma się po 16 sekundach odtworzyć komunikat nr.1.

Następnie jeśli czujnik 2 nie poda sygnału na pin 9, komunikat ma zostać powtórzony po 16 sekundach. I tak aż do załączenia czujnika 2.

Następnie jeśli czujnik 2, poda sygnał na pin 9, odtwarzanie komunikatu ma zostać przerwane. Do tego momentu program wykonuje się poprawnie.

Następnie jeśli czujnik 2 zostanie rozłączony odtwarzanie komunikatu powinno zostać wznowione ale dopiero po 16 sek.- i tutaj jest problem, nie zawsze jest to po 16 sekundach. zależy w którym monecie czujnik 2 wstrzeli się z rozłączeniem. Czasami następuje to prawie natychmiast, czasami czeka tylko parę sekund. Owszem nieraz trafi w to 16 sekund.

Z kolei jeśli czujnik 1 przestanie podawać sygnał na pin 7, a czujnik 2 będzie nadal podawał sygnał na pin 9, to po 3 sekundach odtworzyć ma się komunikat nr.2. i tak aż do rozłączenia czujnika 2. I tutaj też nie zawsze po rozłączeniu czujnika 1, komunikat jest po trzech sekundach zależy kiedy wstrzeli się rozłączenie, czasami natychmiast a czasami po trzech sekundach.

Jestem bardzo, bardzo początkujący. Jeśli któryś z kolegów chciałby pomóc w rozwiązaniu mojego problemu będę wdzięczny.

Janusz.

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

int czujnik_1 = 7;
int czujnik_2 = 9;
int play_state = 3;
SoftwareSerial mySerial(10, 11); // RX, TX

void setup() {
 mySerial.begin (9600);
 Serial.begin (9600);
 mp3_set_serial (mySerial);
 delay(1);
 mp3_set_volume (15);
 pinMode(czujnik_1, INPUT);
 pinMode(czujnik_2, INPUT);
 pinMode(play_state, INPUT);
}

void zapal() {
 delay(16000);                                                         // czekaj 16 sekund
 boolean play_state = digitalRead(3);
 if (play_state == HIGH) {
   if ( digitalRead(czujnik_1) == HIGH && digitalRead(czujnik_2) == LOW)// sprawdź czy dalej czujnik 1 jest włączony 
                                                                      // i jeżeli czujnik 2 się nie włączył
     mp3_play(1);                                                    // graj to
 }
}

void zgas() {
 delay( 3000);                                             // czekaj 3 sekundy
 boolean play_state = digitalRead(3);
 if (play_state == HIGH) {
   if (digitalRead(czujnik_2) == HIGH && digitalRead(czujnik_1) == LOW )// sprawdź czy dalej czujnik 2 jest włączony
                                                                       // i jeżeli czujnik 1 jest  się wyłączył                 
     mp3_play(2);                                                     // graj to 
 }
}

void loop() {
 if ( digitalRead(czujnik_1) == HIGH) {//jeśli czujnik 1 dał sygnał wysoki
    zapal();//wykonaj to
 }

 if ( digitalRead(czujnik_2) == HIGH){// jeśli czujnik 2 dał sygnał wysoki
    zgas();// wykonaj to
 }
}

" alt="" />

Dziękuję za pomoc. Na tę chwilę poradziłem sobie w ten sposób, że w miejsce delay wstawiłem pętlę i kazałem płytce migać diodą co sekundę. Ale z maszyną stanów muszę spróbować. Czuję, że jeszcze da się to jakoś ładniej napisać.

Pozdrawiam Janusz.

Bądź aktywny - zaloguj się lub utwórz konto!

Tylko zarejestrowani użytkownicy mogą komentować zawartość tej strony

Utwórz konto w ~20 sekund!

Zarejestruj nowe konto, to proste!

Zarejestruj się »

Zaloguj się

Posiadasz własne konto? Użyj go!

Zaloguj się »
×
×
  • Utwórz nowe...