Skocz do zawartości

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


Mikolajkie

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

- 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

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...

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.