void herhalen tot status veranderd

Arduino specifieke Software
Berichten: 5
Geregistreerd: 29 Mrt 2018, 21:52

void herhalen tot status veranderd

Berichtdoor Vddkoen » 29 Mrt 2018, 22:01

Beste,
Is er een mogelijkheid om een void te herhalen tot de serial.read een andere waarde binnenkrijgt?
void rgbBlink zou moeten blijven herhalen tot state een andere waarde heeft (zie code)
Alvast bedankt!


cpp code
const int redPin = 6;
const int greenPin = 5;
const int bluePin = 3;


void setup()
{
// Start up serial connection
Serial.begin(9600); // baud rate
Serial.flush();
setColor (0, 0, 0); // red
}

void setColor(int red, int green, int blue) {
#ifdef COMMON_ANODE
red = 255 - red;
green = 255 - green;
blue = 255 - blue;
#endif
analogWrite(redPin, red);
analogWrite(greenPin, green);
analogWrite(bluePin, blue);
}

void rgbBlink() {

setColor(255, 0, 0); // red
delay(200);
setColor(0, 255, 0); // green
delay(200);
setColor(0, 0, 255); // blue
delay(200);
}

void loop() {
// Read any serial input
while (Serial.available() > 0) {
char state = Serial.read();

switch (state) {
case '1' :
rgbBlink();
break;

case '2' :
setColor(255, 0, 0);// red
break;

case '3' :
setColor(0, 255, 0);//green
break;

case '4' :
setColor(0, 0, 255);//blue
break;
}
}
}

Advertisement

Gebruikers-avatar
Berichten: 631
Geregistreerd: 15 Nov 2015, 11:54

Re: void herhalen tot status veranderd

Berichtdoor Gij Kieken » 29 Mrt 2018, 22:16

Misschien met een case default ---> setColor(x,y,z)

Berichten: 5
Geregistreerd: 29 Mrt 2018, 21:52

Re: void herhalen tot status veranderd

Berichtdoor Vddkoen » 29 Mrt 2018, 22:24

Helaas... deze erbij gezet maar geen suc6.

het is gewoon de bedoeling dat de void rgbBlink in een loop zit die blijft herhalen tot er een andere waarde in state komt.

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

Re: void herhalen tot status veranderd

Berichtdoor Koepel » 29 Mrt 2018, 22:38

Maak een globale boolean variabele: bool blinking;
Zet die op true bij "1" en op false bij alle andere waarden.

In de loop(), buiten de "while (Serial.available() > 0) {" kijk je naar die variabele.

Code: Alles selecteren
if( blinking)
{
  rgbBlink();
}


Omdat de loop() steeds herhaalt wordt, heb je een globale variabele nodig om de code een bepaalde richting op te sturen.

De rgbBlink() duurt 600 ms. Tijdens die 600 ms kun je geen andere code uitvoeren. Dat is er uit te halen, maar dan is het nodig om er een heel stuk code bij te schrijven en millis() te gaan gebruiken.

Hieronder een Tinkercad simulatie. Ha ha, dat werkt :lol: Maar echte ledjes zien knipperen is veel leuker. Een bord met boerenkool en rookworst is toch iets anders dan een plaatje van een bord met boerenkool en rookworst.
Bijlagen
tinkercad.png
tinkercad.png (13.41 KiB) 7101 keer bekeken
Laatst gewijzigd door Koepel op 29 Mrt 2018, 23:00, in totaal 3 keer gewijzigd.

Gebruikers-avatar
Berichten: 631
Geregistreerd: 15 Nov 2015, 11:54

Re: void herhalen tot status veranderd

Berichtdoor Gij Kieken » 29 Mrt 2018, 22:51

Aja is juist Koepel heeft mij verbetert, het moet buiten de while staan anders wordt er alsnog gewacht op input.

Berichten: 5
Geregistreerd: 29 Mrt 2018, 21:52

Re: void herhalen tot status veranderd

Berichtdoor Vddkoen » 29 Mrt 2018, 23:16

Dankjewel, ik probeer dit morgen eens uit.
Alvast bedankt!

Berichten: 5
Geregistreerd: 29 Mrt 2018, 21:52

Re: void herhalen tot status veranderd

Berichtdoor Vddkoen » 30 Mrt 2018, 10:29

Bedankt!!! dit werkt zoals het zou moeten ;-)
Hij loopt wel eerst de volledige void door voor hij stopt als er een ander nummer binnenkomt, maar dat is het minste.

Gebruikers-avatar
Berichten: 5043
Geregistreerd: 13 Mei 2013, 20:57
Woonplaats: Heemskerk

Re: void herhalen tot status veranderd

Berichtdoor nicoverduin » 30 Mrt 2018, 11:06

Hij loopt altijd de loop() door omdat ie eindeloos wordt aangeroepen. als de terminal zodanig is ingesteld dat er ook een CR/LF of LF wordt meegegeven staan er tekens in de buffer. Gevolg is dat hij de switch case afloopt.
Loop() kun je immers nooit stoppen tenzij je in de code van main.cpp gaat rotzooien.
daar staat o.a. het volgende in:
cpp code
int main(void)
{
init();

initVariant();

#if defined(USBCON)
USBDevice.attach();
#endif

setup();

for (;;) {
loop();
if (serialEventRun) serialEventRun();
}

return 0;
}

Hierin worden setup() en loop() aangeroepen en nog wat noodzakelijke toeters en bellen.
Docent HBO Technische Informatica, Embedded ontwikkelaar & elektronicus
http://www.verelec.nl

Berichten: 5
Geregistreerd: 29 Mrt 2018, 21:52

Re: void herhalen tot status veranderd

Berichtdoor Vddkoen » 30 Mrt 2018, 14:14

Kan de seriële verbinding vervangen worden door een nrf24l01 module?
De bedoeling is dat er een centrale arduino opdrachten krijgt via een vb.net programma en dat deze dan met de nrf24l01 verzend naar 12 ontvangers.
met andere woorden, 1 zender en 12 ontvangers die op hetzelfde moment dezelfde codes binnen krijgen

Gebruikers-avatar
Berichten: 5043
Geregistreerd: 13 Mei 2013, 20:57
Woonplaats: Heemskerk

Re: void herhalen tot status veranderd

Berichtdoor nicoverduin » 30 Mrt 2018, 18:49

Kan kijk maar eens naar de voorbeelden van de nRF24L01 in de library. De master en slave dezelfde pipes laten gebruiken. Je kan dus niet (vlgs mij) direct Serial vervangen voor een nRF protocol. Er is dus enig huiswerk voor noodzakelijk.
Wil je individuele reponsders maken van de slaves (lijkt mij handig omdat je anders nooit weet of elke slave het bericht heeft ontvangen), zal je een dialoog moeten maken hoe de communicatie plaats gaat vinden tussen de verschillende devices.
ik heb dit ooit gedaan waarbij een App praat met een Mega over WiFi en die vervolgens communiceerde met verschillende Arduinos.
Dit was een jaar of 5 terug. Inmiddels zullen die libraries ook wel veranderd zijn.
Docent HBO Technische Informatica, Embedded ontwikkelaar & elektronicus
http://www.verelec.nl

Terug naar Arduino software

Wie is er online?

Gebruikers in dit forum: Alexduh, ogopunoy en 20 gasten