Run while loop en blijf luisteren naar remote

Arduino specifieke Software
Berichten: 7
Geregistreerd: 28 Jan 2016, 10:40

Run while loop en blijf luisteren naar remote

Berichtdoor pfamet » 28 Jan 2016, 11:03

Hoi Allemaal,

Ik ben net nieuw met Arduino. Gisteren mijn eerste pakketje ontvangen en ben er meteen mee aan de slag gegaan.
Het lukte allemaal aardig maar nu loop ik toch tegen een probleempje aan.

Ik ben gestart met deze voorbeeld code http://www.hackerstore.nl/PDFs/IRSensorLezen/IRSensorLezen.ino
Wat ik nu wil doen is dat als ik op een specifieke knop druk op de remote er een actie wordt aangeroepen. Dat werk ook dus als ook op de play button druk dan vangt hij dat af in de loop functie en roept hij een andere functie onPlayButton(); aan. Het probleem is nu dat onPlayButton(); een while loop heeft, deze while loop moet lopen totdat er op een andere knop op de remote wordt gedrukt. Wat er nu gebeurd is dat de onPlayButton(); wordt aangeroepen en uitgevoerd maar dat daarna de signalen van de remote niet meer worden opgevangen.

Het lijkt mij dat dit komt omdat de loop functie pas verder gaat als de onPlayButton(); is afgelopen, maar deze blijft nu dus oneindig doorgaan. Is het mogelijk om een functie aan te roepen in de loop functie zodat de loop functie niet wacht totdat de andere functie klaar is? Dat ze dus eigenlijk allebei te gelijk lopen?

Ik hoop dat het een beetje duidelijk is uitgelegd en dat iemand mij kan helpen. Ik heb trouwens een Arduino Uno.

Dit is de code die ik nu heb:
cpp code
#include <IRremote.h>

#define IR_PEN 7

IRrecv IR(IR_PEN);
decode_results result;
bool otherButtonPressed = false;

void setup() {
Serial.begin(9600);
IR.enableIRIn(); // Start IR-ontvanger
}

void loop() {
if (IR.decode(&result)) {
Serial.println(result.value, DEC);

switch (result.value) {
case 2747854299:
otherButtonPressed = false;
onPlayButton();
break;
default: otherButtonPressed = true;
}
IR.resume(); // Ontvang de volgende waarde
}
}

void onPlayButton() {
while (!otherButtonPressed) {
Serial.println("Do this until an other remote button is pressed");
}
}
Laatst gewijzigd door pfamet op 28 Jan 2016, 11:55, in totaal 1 keer gewijzigd.

Advertisement

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

Re: Run while loop en blijf luisteren naar remote

Berichtdoor nicoverduin » 28 Jan 2016, 12:16

iets gewijzigind die ongetwijfeld vragen zal oproepen. Samenvattend kijk je of er een toets is ingedrukt. Zo ja dan kijk je of deze is veranderd, zo ja bepaal je welke functie je wilt uitvoeren.
de enum is een tabelletje die de naam automatisch vertaald naar een getal beginnend bij 0. Op die manier praat je over de functie ipv een of andere code.

cpp code
#include <IRremote.h>

#define IR_PEN 7

IRrecv IR(IR_PEN);
decode_results result;
bool otherButtonPressed = false;

decode_results oudeResult; // waarde van de vorige indruk

enum programmaModi { // hier kun je gewoon een lijstje programma modi zetten (worden vertaald van 0 tot ....
modeNietsDoen, // niets doen
modeOnPlayButton, // onPlayButton
};
uint8_t programmaMode = modeNietsDoen; // bepaalt wat het programma gaat doen


void setup() {
Serial.begin(9600);
IR.enableIRIn(); // Start IR-ontvanger
//
// oude result ff op 0
//
oudeResult.value = 0;
}

void loop() {
//
// eerst de laatst bekende waarde ophalen
//
if (IR.decode(&result)) {
//
// ff laten zien
//
Serial.println(result.value, DEC);
//
// kijk eerst of deze is veranderd
//
if (result.value != oudeResult.value) {
//
// er is een andere knop ingedrukt
// dus eerst bewaren voor de volgende keer
//
oudeResult.value = result.value;
//
// en gelijk alvast de programma modus bepalen
//
switch (result.value) {
case 2747854299:
programmaMode = modeOnPlayButton;
break;
default:
programmaMode = modeNietsDoen;
break;
}
}
}
//
// we weten nu de programma modus dus deze gewoon aanroepen
//
switch (programmaMode) {
case modeNietsDoen:
//
// wat je wilt doen als er niets is
//
break;
case modeOnPlayButton:
onPlayButton();
break;
default:
break;
}
IR.resume(); // Ontvang de volgende waarde
}

void onPlayButton() {
Serial.println("Do this until an other remote button is pressed");
}
Docent HBO Technische Informatica, Embedded ontwikkelaar & elektronicus
http://www.verelec.nl

Berichten: 7
Geregistreerd: 28 Jan 2016, 10:40

Re: Run while loop en blijf luisteren naar remote

Berichtdoor pfamet » 28 Jan 2016, 12:55

Dankjewel! Ik begrijp het denk wel. Je houdt het oude resultaat bij waardoor onPlayButton(); constant wordt aangeroepen als er niet op een knop wordt gedrukt. Aan deze manier had ik nog niet gedacht, slim ;). Het is dus niet mogelijk om in Arduino meerdere processen (threads) te hebben?

Ik heb trouwens de IR.resume(); iets omhoog moeten plaatsen, aan het einde van het if (IR.decode(&result)) {} block. Anders werkte het niet.

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

Re: Run while loop en blijf luisteren naar remote

Berichtdoor nicoverduin » 28 Jan 2016, 13:07

Multi threading gaat je op zich niet lukken. Maar je kan wel semi threading toepassen. Je moet dan ook eigenlijk het proces van boven bekijken. In de mainline (loop) check je voor elk proces of timer, of iets moet doen. Zo nee gelijk overslaan. Door gebruik van de enum en switch case kan je een heel proces doorlopen ergens te gaan wachten.

Dus bijvoorbeeld een timer:
cpp code
uint32_t timer = 0;

void setup(){
//
// start de timer
//
timer = millis();
...
...
}

void loop(){
//
// check of er een timer loopt
//
if (timer != 0){
if ((millis() - timer) > GEWENSTE_DUUR){
//
// timer is verlopen dus doe wat er moet gebeuren
//
....
//
// als de timer door moet lopen dan timer weer zetten. Anders gewoon 0 maken
//
timer = millis();
}
}
}
Docent HBO Technische Informatica, Embedded ontwikkelaar & elektronicus
http://www.verelec.nl

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

Re: Run while loop en blijf luisteren naar remote

Berichtdoor shooter » 28 Jan 2016, 17:41

er staat een while NOT otherbuttonpressed, dus blijft je programma gewoon daar staan draaien, als je die regel weghaalt, dan gaat je hele programma wel verder maar omdat er nog steeds geen andere is lijkt het hetzelfde.

en zoals nico zegt nee je kunt niet simultaan werken, maar wel steeds even een uitstapje maken naar een functie vanuit je loop, en dan dingen doen zoals servo motoren zetten, serial sturen etc.
paul deelen
shooter@home.nl

Terug naar Arduino software

Wie is er online?

Gebruikers in dit forum: Geen geregistreerde gebruikers en 80 gasten