arduino void loop() { DFminiplayer

Ik ben een bingomachine aan het bouwen met een Arduino nano. De bedoeling is spraakuitgifte met een DFminiplayer, 90 lampjes en twee LED displays op de console en een supergroot LED display voor in de zaal. Alles werkt maar de spraak krijg ik niet aan de praat. In het gedeelte void setup() { laat ik de DFplayer zeggen "bingomachine ingesteld op 90" Dat werkt gewoon. Maak ik een kopie van de spraakuitgifte met andere tekst en zet dat in het gedeelte void loop() { dan blijkt de loop niet meer te werken en blijft het hele geval steeds resetten en blijft oneindig de openingszin uitspreken. Zelfs een stukje tekst aan het begin van de loop wordt niet op de PC getoond in seriële monitor. Zet ik de spraak met // uit in de loop dan werkt de loop wel en gaan de lampjes en de cijferdisplay's weer aan
Ik laat het programma zelf zijn rondjes draaien dus ipv een drukknop voor de bingocaller heb ik even 1 sec. delay gezet.
Wie weet raad en hulp???

hier heb ik een stuk voorbeeldcode gevonden:
https://wiki.dfrobot.com/DFPlayer_Mini_SKU_DFR0299

hoe ziet jouw code eruit?

GMT+1

Dat programma werkt. Ook in mijn telejukebox zit een miniplayer in de loop die het gewoon doet. Is een apparaat met speakers en een druktoets telefoon kan je uit 800 liedjes kiezen, werkt probleemloos. Dus ik weet wel hoe het moet.
Kan de code eventueel mailen.

Sorry het ziet eruit als een levenswerk, maar je hebt ook een PC?

Had je dit niet beter met software op de PC op een groot lcdscherm kunnen doen?

De code zou wel helpen om je p probleem op te lossen.

Klopt dit was ook wel een levenswerk maar ik ben gepensioneerd en wil mooie dingen maken. Het grote soort schoolbord had ik al eerder gemaakt en werkte op een 6802 processor. Nu heb ik kennis genomen van de aduino's en ik wil spraak en controlelampjes.
Hieronder de code. Als je die assembleert krijg je geen foutmeldingen. Drivers voor DFminiplayer uiteraard nodig. Alle bingogetallen correct genummerd en ingesproken op de DF kaart
----------------------------
/*

msb
PGFEDCBA
0b00111111 - 0
0b00000110 - 1
0b01011011 - 2
0b01001111 - 3
0b01100110 - 4
0b01101101 - 5
0b01111101 - 6
0b00000111 - 7
0b01111111 - 8
0b01100111 - 9
*/
#include "Arduino.h"
#include "DFRobotDFPlayerMini.h"
#define mp3_player_busy 7
#define CLK 8 // to alle MM5451 pin 21
#define dataBit 12 // to MM5451 pin 22
#define dataBitA 9 // to MM5451 pin 22
#define dataBitB 10 // to MM5451 pin 22
#define dataBitC 11 // to MM5451 pin 22
DFRobotDFPlayerMini myDFPlayer;

// 7-segment display code array
byte segCode[] = {
0b00111111, 0b00000110, 0b01011011,
0b01001111, 0b01100110, 0b01101101,
0b01111101, 0b00000111, 0b01111111,
0b01100111
};
byte tienen = 0; //tientallen
byte myCount = 1; //bingogetal
int MIN = 1; int MAX = 91; // Range of Bingo numbers.
bool getal [91]; //de array van de bingonummers heet getal
int mapnaam = 1 ; // taalkeuze
int teller;
int bits;
void setup() {
pinMode(mp3_player_busy, INPUT_PULLUP);
pinMode(CLK, OUTPUT);
pinMode(dataBit, OUTPUT); // Decoder grote displa
pinMode(dataBitA, OUTPUT); //Decoder 1ste 35 LEDs
pinMode(dataBitB, OUTPUT); //Decoder 2de 35 LEDs
pinMode(dataBitC, OUTPUT); //Decoder laatste 20 LEDS +14 voor cijferlampjes op paneel 1 over
digitalWrite(CLK, 0);
digitalWrite(dataBit, 0);
digitalWrite(dataBitA, 0);
digitalWrite(dataBitB, 0);
digitalWrite(dataBitC, 0);
Serial.begin(9600);

DFRobotDFPlayerMini myDFPlayer;
// Zero out array that will hold Bingo numbers.
for (teller = 0; teller < 91; teller++) {
getal[teller] = false;
}
delay (3000);
Serial.println ("bingo getallen clear");
teller = 0;
if (!myDFPlayer.begin(Serial)) { //Use softwareSerial to communicate with mp3.
Serial.println("Unable to begin:");
}

// myDFPlayer.EQ(DFPLAYER_EQ_BASS); /*----Set different EQ----*/
// delay(250);
myDFPlayer.outputDevice(DFPLAYER_DEVICE_SD); /*----Set device we use SD as default----*/
delay(250);
myDFPlayer.volume(40); //Volume 40
delay(250);

Serial.println("Initializing DFPlayer ... (May take 3~5 seconds)");

myDFPlayer.playFolder(1, 91); //"bingo computer ingesteld op 90"//
delay (1000);
while ((digitalRead(mp3_player_busy) == 0))
delay (300);

}

// the loop routine runs over and over again forever:
void loop() {
//Getalen generator
do
{ myCount = random( MIN, MAX );
}
while (getal[myCount] == true) ;
(getal[myCount] = true) ;

/////////////////
delay (1000);
///////ALS IN DE LOOP DE SPAAK AAN STAAT WORDT DIT NIET EENS ZICHTBAAR OP DE MONITOR
Serial.println(myCount);
///////HIER ZIT HET PROBLEEM
myDFPlayer.playFolder(1, myCount); //"bingo getal wordt uitgesproken 90"//
delay (1000);
while ((digitalRead(mp3_player_busy) == 0))
delay (300);
//////////////////

//tientallen en eenheden splitsen//
tienen = myCount / 10 ;

///////////////////////////////////////////
/////////////lampjes 1 tot 35//////////////
//////////////////////////////////////////
//Part A 1-35//
digitalWrite(dataBitA, 1);
digitalWrite(dataBitB, 0);
digitalWrite(dataBitC, 0);
pulseCLK(); //startbit
for (bits = 1; bits < 36; bits++) {
if (getal[bits] == true) {
digitalWrite(dataBitA, 1);
}
if (getal[bits] == false) {
digitalWrite(dataBitA, 0);
}
pulseCLK();
}
////////part B 36 - 70 ///////////////
digitalWrite(dataBitA, 0);
digitalWrite(dataBitB, 1 );
digitalWrite(dataBitC, 0 );
pulseCLK(); //startbit
for (bits = 36; bits < 71; bits++) {
if (getal[bits] == true) {
digitalWrite(dataBitB, 1);
}
if (getal[bits] == false) {
digitalWrite(dataBitB, 0);
}
pulseCLK();
}
//////////Part C 71-90 en cijferlampjes /////////////
digitalWrite(dataBitA, 0);
digitalWrite(dataBitB, 0 );
digitalWrite(dataBitC, 1);
pulseCLK(); //startbit
for (bits = 71; bits < 91; bits++) {
if (getal[bits] == true) {
digitalWrite(dataBitC, 1);
}
if (getal[bits] == false) {
digitalWrite(dataBitC, 0);
}
pulseCLK();
}
//Nog 15 pulsen over. 14 pulsen voor LED display

////////// output LED display////////////

ssrWriteLSBLED(segCode[myCount % 10]); // MOD myCount = 0-9
ssrWriteMSBLED(segCode[tienen % 10]); // MOD myCount = 0-9
//1 puls over
digitalWrite(dataBitC, 0);
pulseCLK();
pulseCLK();

////////// output grote display////////////
// start bit
digitalWrite(dataBit, 1);
pulseCLK();
ssrWriteLSB(segCode[myCount % 10]); // MOD myCount = 0-9
ssrWriteMSB(segCode[tienen % 10]); // MOD myCount = 0-9
zeroWrite(22);

randomSeed(micros()); // Reseed number generator.

} // end loop

///////////Clockpuls maken ////////////
void pulseCLK() {
digitalWrite(CLK, 1);
delay (2);
digitalWrite(CLK, 0);
}

//Voor output grote display //////
// LSB out first!
void ssrWriteLSB(byte value) {
for (int x = 0; x < 7; x++) {
byte temp = value & 0x01;
if (temp == 0x01) digitalWrite(dataBit, 1); // data bit HIGH
else digitalWrite(dataBit, 0); // data bit LOW
pulseCLK();
value = value >> 0x01; // shift left
}
}

// LSB out first!
void ssrWriteMSB(byte value) {
for (int x = 0; x < 7; x++) {
byte temp = value & 0x01;
if (temp == 0x01) digitalWrite(dataBit, 1); // data bit HIGH
else digitalWrite(dataBit, 0); // data bit LOW
pulseCLK();
value = value >> 0x01; // shift left
}
}

//voor output kleine display
void ssrWriteLSBLED(byte value) {
for (int x = 0; x < 7; x++) {
byte temp = value & 0x01;
if (temp == 0x01) digitalWrite(dataBitC, 1); // data bit HIGH
else digitalWrite(dataBitC, 0); // data bit LOW
pulseCLK();
value = value >> 0x01; // shift left
}
}

// LSB out first!
void ssrWriteMSBLED(byte value) {
for (int x = 0; x < 7; x++) {
byte temp = value & 0x01;
if (temp == 0x01) digitalWrite(dataBitC, 1); // data bit HIGH
else digitalWrite(dataBitC, 0); // data bit LOW
pulseCLK();
value = value >> 0x01; // shift left
}
}

void zeroWrite(byte num1) {
digitalWrite(dataBit, 0); // data bit LOW
for (int x = 0; x < num1; x++) pulseCLK();
}

Haal de onderste van deze twee maal voorkomende definitie weg:

DFRobotDFPlayerMini myDFPlayer;

Het myDFPlayer object bestaat waarschijnlijk niet meer in de loop omdat je een andere in de setup definieert.

Goed gezien van K7Jz

De setup() heeft een eigen myDFPlayer en die is gekoppeld aan Serial.
Maar die bestaat niet meer zodra setup() is afgelopen.

loop() gebruikt vervolgens de andere myDFPlayer maar die is niet geinitialiseerd dus die doet het niet.

PS,
Het helpt ook als je de code binnen code tags plaatst:

[code]
Hier de code plaatsen
[/code]

Dat wordt dan zo getoond, en dan blijft de indenting intact.

code:


   Hier de code plaatsen

Het commentaar geeft aan dat je softwareSerial gebruikt, maar je gebruikt de gewone serial.

Die gebruik je ook voor debug doeleinden, zoals hier:

c code:

Serial.println(myCount)

Verwijder alle printLn eens?

GMT+1

Ik heb nu alles wat niets met de bingo en lampjes te maken heeft er uit gegooid.
Nu speelt die wel af in de loop
Nu ben ik deel voor deel aan het terugzetten van het bingospel en wat blijkt zodra ik de pinmode van D10 en D11 (databitB en databitC) aanzet dan doet die het niet meer. Gaat dus de draadjes overzetten naar een andere i/o poort.

Serial.println kan je gewoon gebruiken als je maar tussen de DFplayer TX en arduino RX een SN7407 zet. Die heeft open collector als de miniplayer niet in gebruik is bijt die de RX lijn niet. Eventueel tijdens upload de geheugenkaart even er uit halen.

Hier de code waarmee ik het heb uitgevonden

#include "Arduino.h"
#include "DFRobotDFPlayerMini.h"

DFRobotDFPlayerMini myDFPlayer;
//poorten definiëren
#define CLK 8 // to alle MM5451 pin 21
#define dataBit 12 // to MM5451 pin 22
#define dataBitA 9 // to MM5451 pin 22
#define dataBitB 10 // to MM5451 pin 22
#define dataBitC 11 // to MM5451 pin 22
#define mp3_player_busy 7

// 7-segment display code array
byte segCode[] = {
0b00111111, 0b00000110, 0b01011011,
0b01001111, 0b01100110, 0b01101101,
0b01111101, 0b00000111, 0b01111111,
0b01100111
};
//variabelen en onthouden
byte tienen ; //tientallen
byte myCount; //bingogetal
int MAX = 91; // Range of Bingo numbers.
bool getal [91]; //de array van de bingonummers heet getal
int mapnaam = 1 ; // taalkeuze
int teller;
int bits;

void setup() {
Serial.begin(9600); /*open a serial connection to communicate with the MP3-player (this is the hardware serial)*/
if (!myDFPlayer.begin(Serial)) { //Use softwareSerial to communicate with mp3.
Serial.println("Unable to begin:");}

//alle pinmodes
pinMode(mp3_player_busy, INPUT);
pinMode(CLK, OUTPUT);
pinMode(dataBit, OUTPUT); // Decoder grote displa
pinMode(dataBitA, OUTPUT); //Decoder 1ste 35 LEDs
// pinMode(dataBitB, OUTPUT); //Decoder 2de 35 LEDs
// pinMode(dataBitC, OUTPUT); //Decoder laatste 20 LEDS +14 voor cijferlampjes op paneel 1 over

delay(2000); //tijd voor stabilisatie player
myDFPlayer.playFolder(1, 91);
delay(5000);
}
void loop() {
Serial.println("loop");
myDFPlayer.playFolder(1, 92);
delay (5000);
}

Nog wat verfijningen gevonden: Alleen pootje D10 is de boosdoener. D11 heeft geen invloed.

Het hele spel werkt ondertussen perfect. Hier en daar zijn wat onnodige commands zijn meegekomen uit voorbeelden. O.a. om cijferdisplay's correct aan te sturen en van de DFplayer. Ook het knopje voor de bingocaller staat nu in de software en werkt. Verder wat onnodige delay's er uit gehaald waardoor het spel sneller reageert. Ik vond het prettiger dat eerst het cijfer display en de lampjes te laten werken en dan de spraak. Zo gaat het bij een mechanische bingo ook. Weet je ook niet welke bal de volgende is. Het duurt heel eventjes voordat alle clock en data pulsen naar 4 verschillende LED dravers zijn gegaan maar nauwelijks merkbaar. Omschakeling van 90 naar 75 systeem werkt ook door de callerknop ingedrukt te houden tijdens reset.

Zit nog één rotte of oscillerende LED driver in Als na reset alles uit is zie je toch in één sectie de lichtjes iets gloeien. Zal een andere proberen.

Ik zoek nog iets om op een mooie manier cijfertjes bij de lampjes te maken. Verschillende opties: stickertjes zoals vroeger bij dia's werden gebruikt, graveren, of een doorzichtige sheet printen maar dat moet in spiegelbeeld anders zit de toner aan de verkeerde kant.

Zo nu maar een stel huisvrouwen uitnodigen, het buurthuis afhuren, kunnen ze elke week gokken. Haha. Frans PA0FMY uit Vlijmen.

benleentje

Golden Member

ik zoek nog iets om op een mooie manier cijfertjes bij de lampjes te maken.

Zoiets misschien?

https://www.bol.com/nl/l/labelprinters/N/25376/

Geen inkt nodig enkel een tape erin en makkelijk printen. Tape heb je in diverse kleuren ook in transparant.

[Bericht gewijzigd door benleentje op vrijdag 25 september 2020 15:50:12 (26%)

Mensen zijn soms net als een gelijkrichter, ze willen graag hun gelijk hebben.

Sheet printen op papier en afdekken met boeklon oid?

Ik heb in Win-Word een tabel gemaakt met hokjes precies even breed en hoog als de afstand van de lampjes en die op een overhead sheet afgedrukt. De toner zit wel aan de verkeerde kant maar ik zou er een blanco overheen kunnen doen. Ik had de cijfers zo groot mogelijk gedaan maar dat leest achteraf niet prettig. Het lampje moet niet onder het cijfer komen maar er iets boven. Dus kleinere cijfers maken en onderin de hokjes plaatsen ipv gecentreerd-midden. Kan allemaal makkelijk met Win-Word. Eerst maar op gewoon papier voordat ik er weer eem sheet aan waag. Het plakken van een sheet is nog probleematies. Zit te denken aan kleine messing nageltjes, dat is ook niet lelijk.