Skocz do zawartości

Pomoc w sprawdzeniu kodu: DFPlayer Mini, Arduino UNO, Matryca LED 8x8. Samochód Bluetooth.


Pomocna odpowiedź

@farmaceuta Witam, proszę o pomoc w sprawdzeniu kodu. Czy wszystkie komendy, które obsługują DFPlayer Mini są dobre? Czy if'y, które włączają dźwięki też są dobre?

#include <LedControl.h>
#include <SoftwareSerial.h>
#include <DFRobotDFPlayerMini.h>

SoftwareSerial playerSerial(A4, A5);

char data;

int DIN = A0;
int CS = A1;
int CLK = A2;

LedControl lc=LedControl(DIN, CLK, CS, 0);

byte smile[8] = {0x00,0x26,0x46,0x40,0x40,0x46,0x26,0x00};
byte half[8] = {0x00,0x24,0x44,0x40,0x40,0x44,0x24,0x00};
byte all[8] = {0x00,0x20,0x40,0x40,0x40,0x40,0x20,0x00};
byte open[8] = {0xE7,0xA7,0xA7,0xA0,0xA0,0xA7,0xA7,0xE7};

unsigned long czas;
unsigned long zapamietanyCzas;
unsigned long czas1;
unsigned long zapamietanyCzas1;

int x = 0;
int y = 0;

int lock = 0;

DFRobotDFPlayerMini player;

void setup() {
  // put your setup code here, to run once:
  Serial.begin(9600);
  playerSerial.begin(9600);
  pinMode(9, OUTPUT);
  pinMode(10, OUTPUT);
  pinMode(3, OUTPUT);
  pinMode(4, OUTPUT);
  pinMode(6, OUTPUT);
  pinMode(7, OUTPUT);
  pinMode(12, OUTPUT);
  pinMode(11, INPUT);
  lc.shutdown(0, false);
  lc.setIntensity(0,15);
  lc.clearDisplay(0);
  player.begin(playerSerial);
  player.volume(30);
  analogWrite(9, 175);
  analogWrite(10, 175);
  printByte(smile);
}

void loop() {
  // put your main code here, to run repeatedly:
  if(Serial.available() > 0) {
    data = Serial.read();
    if(data == 'F') {
      digitalWrite(3, HIGH);
      digitalWrite(6, HIGH);
    } else if(data == 'B') {
      digitalWrite(4, HIGH);
      digitalWrite(7, HIGH);
    } else if(data == 'L') {
      digitalWrite(4, HIGH);
      digitalWrite(6, HIGH);
    } else if(data == 'R') {
      digitalWrite(3, HIGH);
      digitalWrite(7, HIGH);
    } else if(data == 'S') {
      digitalWrite(3, LOW);
      digitalWrite(4, LOW);
      digitalWrite(6, LOW);
      digitalWrite(7, LOW);
    } else if(data == 'V') {
      digitalWrite(12, HIGH);
    } else if(data == 'v') {
      digitalWrite(12, LOW);
    }

    if(data == 'F' || data == 'B' || data == 'L' || data == 'R' && digitalRead(11) == HIGH && lock == 0) {
      player.play(1);
      printByte(open);
      x = 0;
      y = 0;
      lock = 1;
    } else if(digitalRead(11) == HIGH && lock == 1 && x == 0 && y == 0) {
      printByte(smile);
      lock = 0;
    }
  }

  czas = millis();

  if(czas - zapamietanyCzas >= 4000UL && digitalRead(11) == HIGH) {
    zapamietanyCzas = czas;
    x = 1;
  }

  czas1 = millis();

  if(x == 1) {
    if(czas1 - zapamietanyCzas1 >= 100) {
      zapamietanyCzas1 = czas1;
      y++;
    }
  }

  if(y == 1) {
    printByte(half);
  } else if(y == 2) {
    printByte(all);
  } else if(y == 3) {
    printByte(half);
  } else if(y == 4) {
    printByte(smile);
  } else if(y == 5) {
    x = 0;
    y = 0;
  }
}

void printByte(byte character[]) {
  int i;
  for(i=0;i<8;i++) {
    lc.setRow(0,i,character[i]);
  }
}

 

Edytowano przez Mikolajkie
Link do komentarza
Share on other sites

Wygląda w porządku, choć z df'a nigdy nie korzystałem 😉 

Tu jest tak jakby błąd. . 

pinMode(11, INPUT);

W takim przypadku pin wejściowy nie ma ustalonego stanu . 

Wpisz tak.. 

pinMode(11, INPUT_PULLUP);

Wtedy guzik będzie reagował na stan niski, czyli jeśli wciśnięty to if musi wyglądać tak (warunek spełniony)

if(digitalRead(11) == LOW)

Guzik podpięty do pinu ardu a drugi koniec do masy

Link do komentarza
Share on other sites

6 minut temu, Mikolajkie napisał:

@farmaceuta Tylko to nie przycisk... To busyPin, czyli pin, który daje stan niski, gdy odtwarzacz gra jakiś dźwięk, a wysoki, gdy nic nie odtwarza.😄

Aha to wporzadku😉 to powinno śmigać, wygraj i się dowiemy 😉

Link do komentarza
Share on other sites

Zarejestruj się lub zaloguj, aby ukryć tę reklamę.
Zarejestruj się lub zaloguj, aby ukryć tę reklamę.

jlcpcb.jpg

jlcpcb.jpg

Produkcja i montaż PCB - wybierz sprawdzone PCBWay!
   • Darmowe płytki dla studentów i projektów non-profit
   • Tylko 5$ za 10 prototypów PCB w 24 godziny
   • Usługa projektowania PCB na zlecenie
   • Montaż PCB od 30$ + bezpłatna dostawa i szablony
   • Darmowe narzędzie do podglądu plików Gerber
Zobacz również » Film z fabryki PCBWay

@farmaceuta Na internecie czytałem, że busyPin musi mieć INPUT ustawione.

 

A jeśli chodzi o INPUT_PULLUP to jest wejście z wykorzystaniem rezystorów podciągających?

Gdy nie ma styku to jest stan wysoki, a gdy przycisk naciśnięty to stan niski?

Link do komentarza
Share on other sites

8 minut temu, Mikolajkie napisał:

@farmaceuta Na internecie czytałem, że busyPin musi mieć INPUT ustawione.

 

A jeśli chodzi o INPUT_PULLUP to jest wejście z wykorzystaniem rezystorów podciągających?

Gdy nie ma styku to jest stan wysoki, a gdy przycisk naciśnięty to stan niski?

Dokladnie tak

Link do komentarza
Share on other sites

@farmaceuta Co zrobić, by działo się to tak, jak na tym filmie? https://www.youtube.com/watch?v=Fq-A9Yn3P1k 

Na filmie wejdź na 8:30. Mam podłączony czujnik drgań do pinu 11 i ustawiony na INPUT_PULLUP. Jak zrobić, żeby pod uderzeniu z większym odstępem czasu na przykład mignęła dioda na 200 milisekund, a po trzech szybkich uderzeniach zaświeciła się na 1000 milisekund?

Link do komentarza
Share on other sites

(edytowany)

- tutaj masz dużo o czytniku mp3.

https://www.jarzebski.pl/arduino/komponenty/modul-mp3-z-ukladem-yx5300.html

- przypomniałem sobie że kiedys robiłem zegarek gadający z DFPlaer mini, tutaj link

- i tam inicjalizacja była inaczej robiona np. 

[1999]         

		// ----------------- DFPlayer mini ----------------------------
			// myPort.begin(9600, SWSERIAL_8N1, MYPORT_RX, MYPORT_TX, false, 95, 11);
	myPort.begin(9600, SWSERIAL_8N1, MYPORT_RX, MYPORT_TX);

 

Edytowano przez 99teki
Link do komentarza
Share on other sites

@farmaceuta Finalnie tam może być cokolwiek oprócz diody (ja składam to z zestawu Arduino KIT). To nie projekt, który zostanie na stałe, ale diodę ja podłączyłem pod pin 10.

Link do komentarza
Share on other sites

uint32_t last = 0;
uint32_t last2 = 0;
uint32_t last3 = 0;
uint32_t interwal = 0;

byte impuls = 0;

bool stan = 0;
bool stan2 = 0;

void setup() {
  pinMode(11, INPUT_PULLUP);
}

void loop() {
  if (digitalRead(11) == LOW) {
    if (millis() - last > 200UL) {
      impuls++;
      last = millis();
      last2 = millis();
      stan = 1;
    }
  }
  if (millis() - last2 > 800UL && stan == 1) {
    if (impuls == 1) {
      //zrob cos
      digitalWrite(10, HIGH);
      last3 = millis();
      interwal = 200;
      stan2 = 1;
    }
    if (impuls == 2) {
      //zrob cos
      digitalWrite(10, HIGH);
      last3 = millis();
      interwal = 500;
      stan2 = 1;
    }
    if (impuls == 3) {
      //zrob cos
      digitalWrite(10, HIGH);
      last3 = millis();
      interwal = 1000;
      stan2 = 1;
    }
    if (impuls == 4) {
      //zrob cos
      digitalWrite(10, HIGH);
      last3 = millis();
      interwal = 2000;
      stan2 = 1;
    }
    impuls = 0;
    stan = 0;
  } 
  if (millis() - last3 > interwal && stan2 == 1) {
    digitalWrite(10, LOW);
    stan2 = 0;
  }
}

powinno dzialac

Link do komentarza
Share on other sites

Dołącz do dyskusji, napisz odpowiedź!

Jeśli masz już konto to zaloguj się teraz, aby opublikować wiadomość jako Ty. Możesz też napisać teraz i zarejestrować się później.
Uwaga: wgrywanie zdjęć i załączników dostępne jest po zalogowaniu!

Anonim
Dołącz do dyskusji! Kliknij i zacznij pisać...

×   Wklejony jako tekst z formatowaniem.   Przywróć formatowanie

  Dozwolonych jest tylko 75 emoji.

×   Twój link będzie automatycznie osadzony.   Wyświetlać jako link

×   Twoja poprzednia zawartość została przywrócona.   Wyczyść edytor

×   Nie możesz wkleić zdjęć bezpośrednio. Prześlij lub wstaw obrazy z adresu URL.

×
×
  • Utwórz nowe...

Ważne informacje

Ta strona używa ciasteczek (cookies), dzięki którym może działać lepiej. Więcej na ten temat znajdziesz w Polityce Prywatności.