Sketch opschonen

algemene C code
Berichten: 50
Geregistreerd: 12 Mrt 2016, 23:38

Sketch opschonen

Berichtdoor Pexy » 06 Nov 2018, 11:44

Hallo beste forumleden.

Ik zou graag hulp willen vragen voor mijn sketch. Ik heb een aantal verschillende states, nu bijvoorbeeld 8 stuks.
Maar ik zou graag willen weten of het in een array kan zodat ik een stuk minder tekst en geheugen gebruik in de sketch.
De bedoeling is dat als state2 bijvoorbeeld word aangeroepen, dat state2=1 is en dan een audio bestand afspeelt en de rest van de states, state 1 en 3 t/m 8 =0 wordt.
Op de manier hoe ik het nu gedaan heb werkt maar kost veel tekst en weet zeker dat het anders kan, maar kom er niet aan uit.
Ik hoop dat jullie mij kunnen helpen.
Alvast bedankt.

Hieronder de sketch:
cpp code
// Arduino IDE 1.8.5

/*
Copyright: DFRobot
name: DFPlayer_Mini_Mp3 sample code
Author: lisper <lisper.li@dfrobot.com>
Date: 2014-05-30
Description: connect DFPlayer Mini by SoftwareSerial, this code is test on Uno
Note: the mp3 files must put into mp3 folder in your tf card
*/
#include <SoftwareSerial.h>
#include <DFPlayer_Mini_Mp3.h>

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


// Include the required Wire library for I2C
#include <Wire.h>

int n = 0;

int state1 = 0;
int state2 = 0;
int state3 = 0;
int state4 = 0;
int state5 = 0;
int state6 = 0;
int state7 = 0;
int state8 = 0;


void setup () {
Serial.begin (9600);
mySerial.begin (9600);
mp3_set_serial (mySerial); //set softwareSerial for DFPlayer-mini mp3 module
mp3_set_volume (20);
delay(2000);
mp3_play (0); //Play the first mp3

// Start the I2C Bus as Slave on address 9
Wire.begin(9);
// Attach a function to trigger when something is received.
Wire.onReceive(receiveEvent);
}
void receiveEvent(int bytes) {
n = Wire.read(); // read one character from the I2C
}


//
void loop () {

if (!state1 && n == 1) {
state1 = 1;
state2 = 0;
state3 = 0;
state4 = 0;
state5 = 0;
state6 = 0;
state7 = 0;
state8 = 0;
mp3_play (n);
}
if (!state2 && n == 2) {
state1 = 0;
state2 = 1;
state3 = 0;
state4 = 0;
state5 = 0;
state6 = 0;
state7 = 0;
state8 = 0;
mp3_play (n);
}
if (!state3 && n == 3) {
state1 = 0;
state2 = 0;
state3 = 1;
state4 = 0;
state5 = 0;
state6 = 0;
state7 = 0;
state8 = 0;
mp3_play (n);
}
if (!state4 && n == 4) {
state1 = 0;
state2 = 0;
state3 = 0;
state4 = 1;
state5 = 0;
state6 = 0;
state7 = 0;
state8 = 0;
mp3_play (n);
}
if (!state5 && n == 5) {
state1 = 0;
state2 = 0;
state3 = 0;
state4 = 0;
state5 = 1;
state6 = 0;
state7 = 0;
state8 = 0;
mp3_play (n);
}
if (!state6 && n == 6) {
state1 = 0;
state2 = 0;
state3 = 0;
state4 = 0;
state5 = 0;
state6 = 1;
state7 = 0;
state8 = 0;
mp3_play (n);
}
if (!state7 && n == 7) {
state1 = 0;
state2 = 0;
state3 = 0;
state4 = 0;
state5 = 0;
state6 = 0;
state7 = 1;
state8 = 0;
mp3_play (n);
}
if (!state8 && n == 8) {
state1 = 0;
state2 = 0;
state3 = 0;
state4 = 0;
state5 = 0;
state6 = 0;
state7 = 0;
state8 = 1;
mp3_play (n);
}
}

Advertisement

Gebruikers-avatar
Berichten: 2655
Geregistreerd: 06 Aug 2016, 01:03

Re: Sketch opschonen

Berichtdoor Koepel » 06 Nov 2018, 11:59

Wat is de bedoeling ? Wil je een bestand eenmalig afspelen ? Het belangrijk om dat te benoemen. Je probeert nu een verkeerde oplossing te vinden voor een verkeerd probleem, zie ook: http://xyproblem.info/.

Kun je van 'n' een byte maken en een "volatile" ? Een byte kan niet onderbroken worden door een interrupt, een 16-bits integer wel (in een 8-bits microcontroller die bijvoorbeeld in de Arduino Uno zit).

Je kunt 'n' definieren als "doe niets" bij een waarde van nul.

cpp code
volatile byte n = 0;   // n is de track, 0 is doe niets.

void loop()
{
if( n != 0) // a track to play ?
{
mp3_play( n); // play track
n = 0; // clear n
}
}

Berichten: 50
Geregistreerd: 12 Mrt 2016, 23:38

Re: Sketch opschonen

Berichtdoor Pexy » 06 Nov 2018, 12:40

n is een variabel nummer dat komt van een andere arduino via de i2c verbinding tussen de twee arduino's.
Deze nummers 1 t&m 8 worden niet in één puls gegeven maar constant achter elkaar,
dus bijvoorbeeld:
2
2
2
2
2
2
Probleem is echter dat audio bestand 2 niet afgespeeld word ivm het steeds de puls 2 krijgt.
Dus wanneer nummer 2 van variabel n komt moet audio bestand 2 1x afspelen totdat een ander nummer komt, en zo bij alle andere nummers.
vandaar dat ik states heb toegevoegd om iets 1 keer af te spelen.
Hoop dat ik het zo beter heb uitgelegd

Gebruikers-avatar
Berichten: 2655
Geregistreerd: 06 Aug 2016, 01:03

Re: Sketch opschonen

Berichtdoor Koepel » 06 Nov 2018, 15:08

Dan zou ik dat verbeteren in de andere Arduino, de Master-Arduino.
Het lijkt me logischer om één keer iets af te spelen als er één keer een commando wordt verstuurd.

Je kunt het eventueel in deze Slave-Arduino oplossen door de oude waarde te onthouden.

cpp code
volatile byte n = 0;
byte last_n = 0;

void loop()
{
if( n != 0 && n != last_n) // a new track to play ?
{
mp3_play( n); // play track
last_n = n; // remember this track to ignore it
}
}

Berichten: 4064
Geregistreerd: 16 Okt 2013, 14:31
Woonplaats: s hertogenbosch

Re: Sketch opschonen

Berichtdoor shooter » 06 Nov 2018, 19:59

een simpele array is al genoeg dus status [8] en dan kijken met een for loop welke je moet hebben.
uiteraard is koepel iets slimmer. maar deze array is jouw idee.
paul deelen
shooter@home.nl

Berichten: 50
Geregistreerd: 12 Mrt 2016, 23:38

Re: Sketch opschonen

Berichtdoor Pexy » 06 Nov 2018, 20:38

Bedankt Koepel en shooter!
Ik ga er straks mee aan de slag als ik klaar ben met werken.
Dat van Koepel scheelt wel enorm veel onnodig code terwijl ik eigelijk wel nieuwsgierig ben naar shooter, de optie met array’s.
Alleen hoe kies je de juiste state=1 en hoe zet je de andere state’s op 0 als ik me array’s zou werken.

Berichten: 4064
Geregistreerd: 16 Okt 2013, 14:31
Woonplaats: s hertogenbosch

Re: Sketch opschonen

Berichtdoor shooter » 07 Nov 2018, 14:19

state is gewoon 1 variabele die dus niet naar 0 hoeft.
je kunt wel aan het eind van de state dezze bveranderen naar 0 dus dan wordt er een andere state aangeroepen.
paul deelen
shooter@home.nl

Berichten: 50
Geregistreerd: 12 Mrt 2016, 23:38

Re: Sketch opschonen

Berichtdoor Pexy » 11 Nov 2018, 19:00

Ik ben toch voor de oplossing van koepel gegaan, die ziet er gewoon netjes en schoon uit en is in dit geval niet nodig om met array's te werken.

Berichten: 7
Geregistreerd: 27 Feb 2019, 21:51

Re: Sketch opschonen

Berichtdoor michielper » 27 Feb 2019, 22:36

Pexy schreef:Hallo beste forumleden.

Ik zou graag hulp willen vragen voor mijn sketch. Ik heb een aantal verschillende states, nu bijvoorbeeld 8 stuks.
Maar ik zou graag willen weten of het in een array kan zodat ik een stuk minder tekst en geheugen gebruik in de sketch.
De bedoeling is dat als state2 bijvoorbeeld word aangeroepen, dat state2=1 is en dan een audio bestand afspeelt en de rest van de states, state 1 en 3 t/m 8 =0 wordt.
Op de manier hoe ik het nu gedaan heb werkt maar kost veel tekst en weet zeker dat het anders kan, maar kom er niet aan uit.
Ik hoop dat jullie mij kunnen helpen.
Alvast bedankt.

Hieronder de sketch:
cpp code
// Arduino IDE 1.8.5

/*
Copyright: DFRobot
name: DFPlayer_Mini_Mp3 sample code
Author: lisper <lisper.li@dfrobot.com>
Date: 2014-05-30
Description: connect DFPlayer Mini by SoftwareSerial, this code is test on Uno
Note: the mp3 files must put into mp3 folder in your tf card
*/
#include <SoftwareSerial.h>
#include <DFPlayer_Mini_Mp3.h>

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


// Include the required Wire library for I2C
#include <Wire.h>

int n = 0;

int state1 = 0;
int state2 = 0;
int state3 = 0;
int state4 = 0;
int state5 = 0;
int state6 = 0;
int state7 = 0;
int state8 = 0;


void setup () {
Serial.begin (9600);
mySerial.begin (9600);
mp3_set_serial (mySerial); //set softwareSerial for DFPlayer-mini mp3 module
mp3_set_volume (20);
delay(2000);
mp3_play (0); //Play the first mp3

// Start the I2C Bus as Slave on address 9
Wire.begin(9);
// Attach a function to trigger when something is received.
Wire.onReceive(receiveEvent);
}
void receiveEvent(int bytes) {
n = Wire.read(); // read one character from the I2C
}


//
void loop () {

if (!state1 && n == 1) {
state1 = 1;
state2 = 0;
state3 = 0;
state4 = 0;
state5 = 0;
state6 = 0;
state7 = 0;
state8 = 0;
mp3_play (n);
}
if (!state2 && n == 2) {
state1 = 0;
state2 = 1;
state3 = 0;
state4 = 0;
state5 = 0;
state6 = 0;
state7 = 0;
state8 = 0;
mp3_play (n);
}
if (!state3 && n == 3) {
state1 = 0;
state2 = 0;
state3 = 1;
state4 = 0;
state5 = 0;
state6 = 0;
state7 = 0;
state8 = 0;
mp3_play (n);
}
if (!state4 && n == 4) {
state1 = 0;
state2 = 0;
state3 = 0;
state4 = 1;
state5 = 0;
state6 = 0;
state7 = 0;
state8 = 0;
mp3_play (n);
}
if (!state5 && n == 5) {
state1 = 0;
state2 = 0;
state3 = 0;
state4 = 0;
state5 = 1;
state6 = 0;
state7 = 0;
state8 = 0;
mp3_play (n);
}
if (!state6 && n == 6) {
state1 = 0;
state2 = 0;
state3 = 0;
state4 = 0;
state5 = 0;
state6 = 1;
state7 = 0;
state8 = 0;
mp3_play (n);
}
if (!state7 && n == 7) {
state1 = 0;
state2 = 0;
state3 = 0;
state4 = 0;
state5 = 0;
state6 = 0;
state7 = 1;
state8 = 0;
mp3_play (n);
}
if (!state8 && n == 8) {
state1 = 0;
state2 = 0;
state3 = 0;
state4 = 0;
state5 = 0;
state6 = 0;
state7 = 0;
state8 = 1;
mp3_play (n);
}
}


Misschien begrijp ik je probleem niet helemaal maar dit ziet er inderdaad weird uit. Je gebruikt het woord “state” (=toestand) ook op een wat vreemde manier. Lees eens iets over State Machines.

Bovenstaand lijkt erop dat er altijd maar 1 “state” op 1 staat; de boel kent dan maar 8 toestanden in totaal..... Waarom in hemelsnaam gebruik je dan 8 integers??? Gewoon 1 int variabele die je een waarde van 1 t/m 8 geeft is genoeg om 8 toestanden te hebben.

Berichten: 4064
Geregistreerd: 16 Okt 2013, 14:31
Woonplaats: s hertogenbosch

Re: Sketch opschonen

Berichtdoor shooter » 28 Feb 2019, 20:09

kijk op switch case.
dan hoef je niks te doen als alleen maar dus afhankelijk van een getal ga je naar een state toe.
paul deelen
shooter@home.nl

Volgende

Terug naar C code

Wie is er online?

Gebruikers in dit forum: Geen geregistreerde gebruikers en 9 gasten