problemen met code meerdere loops

Arduino specifieke Software
Gebruikers-avatar
Berichten: 3
Geregistreerd: 27 Jun 2020, 10:03

problemen met code meerdere loops

Berichtdoor -leeuwtje- » 27 Jun 2020, 10:31

beste iedereen,

ik ben hier nieuw op dit forum :)
ik ben 25 jaar oud :D en ben een beginneling in arduino. ik doe het ongeveer een jaar.


ik heb heel het internet al afgezocht en ik kan mijn probleem niet opgelost krijgen :cry:

ik zal mijn project eventjes uitleggen:

mijn vriendin is een modelbouw brandweerwagen aan het maken. nu kwam het idee naar boven om de lichtjes van de brandweer wagen allemaal werkend te krijgen.
nu hoop ik dat allemaal voor elkaar te krijgen met een arduino nano board.
ik wil het als volgt laten werken:
een app op mijn telefoon die allemaal aan en uit knoppen heeft voor elk onderdeel aan lampjes.
dus deel 1 zijn de gewone stadslichten, deel 2 de grote lichten, deel 3 en 4 de richting aanwijzers , deel 5 de blauwe knipperlampen , deel 6 de binnen verlichting en dan als dit mogelijk is deel 7 nog een sirene.
dit alles afzonderlijk geregeld; dat deel 2 bijv. aangezet word en dan deel 6 en dan ook deel 5 (knipperende lampen) en alles gewoon werkt.
En als ik 1 van deze uit zet dat de rest gewoon door blijft gaan; simpel aan staan (deel 2) of knipperend (deel 5) )

Ik heb een test-code geschreven die al een eind in de buurt komt naar mijn idee, maar hij werkt nog niet naar behoren. :cry:
ik gebruik als app de MIT app inverntor.

hier de code:

#include <SoftwareSerial.h>


int led1 = 5;
int led2 = 6;
int led3 = 7;
int incoming_value = 0 ;

int ledState1 = LOW;
int ledState2 = LOW;
int ledState3 = LOW;

unsigned long previousMillis1 = 0 ;
unsigned long previousMillis2 = 0 ;
unsigned long previousMillis3 = 0 ;

long interval1= 500;
long interval2= 200;
long interval3= 400;

boolean led1a = false ;
boolean led2a = false ;
boolean led3a = false ;


void setup() {
// initialize the digital pin as an output.
pinMode(led1, OUTPUT);
pinMode(led2, OUTPUT);
pinMode(led3, OUTPUT);

// initialize serial communication at 9600 bits per second:
Serial.begin(9600);


//set all pins to off as default to start with
digitalWrite(led1,LOW);
digitalWrite(led2,LOW);
digitalWrite(led3,LOW);




}

void loop()
{
if(Serial.available() > 0){
incoming_value = Serial.read();}

Serial.print (incoming_value);
Serial.print ("\n");



if (incoming_value == '1') boolean (led1a , true );

if (incoming_value == '2') boolean (led1a , false );

if (incoming_value == '3') boolean (led2a , true );

if (incoming_value == '4') boolean (led2a , false );

if (incoming_value == '5') boolean (led3a , true );

if (incoming_value == '6') boolean (led3a , false );

delay (100);

if (boolean (led1a == true)) { blauwe_knipperlichten_bovenkant(); }

if (boolean (led2a == true)) { blauwe_knipperlichten_voorkant ();}

if (boolean (led3a == true)) { links_knipperlicht ();}



}


void blauwe_knipperlichten_bovenkant()
{
{void ();

unsigned long currentMillis1 = millis();

while (boolean led1a = true ) ; {


if (currentMillis1 - previousMillis1 >= interval1)
// save the last time you blinked the LED
previousMillis1 = currentMillis1;

// if the LED is off turn it on and vice-versa:
if (ledState1 == LOW) {
ledState1 = HIGH;
} else {
ledState1 = LOW;
}

// set the LED with the ledState of the variable:
digitalWrite(led1, ledState1);


}
}
}



void blauwe_knipperlichten_voorkant()
{
{void ();

unsigned long currentMillis2 = millis();

while (boolean led2a = true ) ; {

if (currentMillis2 - previousMillis2 >= interval2)
// save the last time you blinked the LED
previousMillis2 = currentMillis2;

// if the LED is off turn it on and vice-versa:
if (ledState2 == LOW) {
ledState2 = HIGH;
} else {
ledState2 = LOW;
}

// set the LED with the ledState of the variable:
digitalWrite(led2, ledState2);


}
}
}



void links_knipperlicht ()
{
{void ();

unsigned long currentMillis3 = millis();

while (boolean led3a = true ) ; {

if (currentMillis3 - previousMillis3 >= interval3)
// save the last time you blinked the LED
previousMillis3 = currentMillis3;

// if the LED is off turn it on and vice-versa:
if (ledState3 == LOW) {
ledState3 = HIGH;
} else {
ledState3 = LOW;
}

// set the LED with the ledState of the variable:
digitalWrite(led3, ledState3);


}
}
}


als ik nu op de app led1 of led2 op led3 aan zet dan gaat hij aan.
als ik hem dan gelijk uit zet gaat hij uit.
maar als ik led1 aan zet (die gaat knipperen) en dan led2 aan zet, stopt led1 met knipperen maar blijft wel aan. led2 gaat dan wel netjes knipperen.
als ik vervolgens led3 aanzet blijft led1 aanstaan zonder te knipperen en stopt led2 ook met knipperen maar blijft wel aan. led3 gaat dan wel gewoon netjes knipperen.
als ik vervolgens op 1 van de aan knoppen druk van led1 of led2 gaat die weer netjes knipperen maar stopt degene met knipperen die hiervoor geknipperd heeft.


wat doe ik fout? :?: :?: :?:

groetjes -leeuwtje-

Advertisement

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

Re: problemen met code meerdere loops

Berichtdoor Koepel » 27 Jun 2020, 12:48

Hallo, en welkom op dit forum.

Arduino wil graag dat je "boolean" gebruikt: https://www.arduino.cc/reference/en/language/variables/data-types/boolean/.
Maar "bool" is de standaard, dus "bool" is veel beter ;)

Gebruik je SoftwareSerial ? Zo niet, kan die er uit ? Daar krijg ik jeuk van :o

Overweeg een Arduino Leonardo board. Dan heb je een aparte seriële verbinding om dingen te laten zien op de seriële monitor, en dan heb je een vrije hardware seriële poort voor Bluetooth.

Er is een 'led1', 'ledState1' en 'led1a'.
Iets met "pin" er bij en iets met "run" of "enable" er bij maakt het misschien duidelijker.
In mijn voorbeeld gebruik ik de naam "enableBlink" om een millis-timer aan en uit te zetten: https://github.com/Koepel/Fun_with_millis/blob/master/millis_within_millis.ino.
Je zou "runBlauwBoven" of "enableBlauwBoven" of zo iets kunnen kiezen.

Gebruik op dit forum de code-tags om je sketch tussen te zetten. Dat gaat met de knop "Code" en de sketch zet je tussen de [ code ] en [ / code ].

Je hebt een delay(100) in de loop(). Die maakt alles trager zonder reden.
Je zou alleen iets kunnen doe als er ook echt iets binnen komt:
Code: Alles selecteren
  if (Serial.available() > 0)
  {
    incoming_value = Serial.read();

    if( isprint( incoming_value))   // is het een normale letter of cijfer ?
    {
      Serial.print (incoming_value);
      Serial.print ("\n");

      if (incoming_value == '1')
        ...


De functies die de leds laten knipperen horen niet binnen dat if-statement. Die horen in gewoon in de loop(). Vaak wordt zo'n functie "update" genoemd.

Dit begrijp ik niet:
Code: Alles selecteren
if (incoming_value == '1') boolean (led1a , true );


En dat ook nog met het "boolean" type (door Arduino er bij verzonnen). Dat is dubbel risico dat het mis gaat.
Kun je dit doen ?
Code: Alles selecteren
if (incoming_value == '1')
  led1a = true;


Dit hoeft niet:
Code: Alles selecteren
if (boolean (led1a == true))


Dat gaat op deze manier:
Code: Alles selecteren
if( led1a)


Kun je dit weghalen:
Code: Alles selecteren
void ();


De while heeft geen ';' achter de conditie. De ';' is het afsluiten van het while-statement.
Code: Alles selecteren
while (boolean led2a = true ) ;

Die led2a verandert nooit binnen de while, ook niet na het weghalen van de ';'.

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

Re: problemen met code meerdere loops

Berichtdoor shooter » 30 Jun 2020, 10:02

zo koepel is al aardig bezig
je kunt de loop twee of meer functies laten doen dus 1 functie is het ontvangen van commandos,
de volgende is bijhouden wat aan/uit staat
en een functie om het knipperen te doen dus als knipper links aan is dan na een seconde (met een millis() weer uit zetten.
paul deelen
shooter@home.nl

Gebruikers-avatar
Berichten: 3
Geregistreerd: 27 Jun 2020, 10:03

Re: problemen met code meerdere loops

Berichtdoor -leeuwtje- » 10 Sep 2020, 19:58

hej mensen ,

dankjewel voor jullie reacties ! :D

ik ben eventjes een poosje :roll: weggeweest maar hier ben ik weer .

ik heb wat aanpassingen gedaan Koepel, maar nu ben ik bang dat ik er nog steeds niet ui kom als leerling code schrijver :oops:

hier de code wat ik nu heb staan:

Code: Alles selecteren

int led1 = 5;
int led2 = 6;
int led3 = 7;
int incoming_value = 0 ;

int ledState1 = LOW;
int ledState2 = LOW;
int ledState3 = LOW;

unsigned long previousMillis1 = 0 ;
unsigned long previousMillis2 = 0 ;
unsigned long previousMillis3 = 0 ;
unsigned long currentMillis1  = 0 ;
unsigned long currentMillis2  = 0 ;
unsigned long currentMillis3  = 0 ;


long interval1= 500;
long interval2= 200;
long interval3= 400;

bool led1a = false ;
bool led2a = false ;
bool led3a = false ;


void setup() {               
  // initialize the digital pin as an output.
  pinMode(led1, OUTPUT); 
  pinMode(led2, OUTPUT);
  pinMode(led3, OUTPUT); 
   
  // initialize serial communication at 9600 bits per second:
  Serial.begin(9600);

 
      //set all pins to off as default to start with
      digitalWrite(led1,LOW);
      digitalWrite(led2,LOW);
      digitalWrite(led3,LOW);



 
}

void loop()
{
if(Serial.available() > 0)
     
      incoming_value = Serial.read();
     
     
Serial.print (incoming_value);
Serial.print ("\n");



if (incoming_value == '1') {led1a = true;}

if (incoming_value == '2') {led1a = false;}

if (incoming_value == '3') {led2a = true ;}

if (incoming_value == '4') {led2a = false;}

if (incoming_value == '5') {led3a = true ;}

if (incoming_value == '6') {led3a = false;}






if (led1a == true)  {void blauwe_knipperlichten_bovenkant();


   

    while (led1a == true)  {

   
     if (currentMillis1 - previousMillis1 >= interval1)   // save the last time you blinked the LED
     
         previousMillis1 = currentMillis1;

          // if the LED is off turn it on and vice-versa:
     if (ledState1 == LOW) {
         ledState1 = HIGH;
     } else {
       ledState1 = LOW;
     }

          // set the LED with the ledState of the variable:
      digitalWrite(led1, ledState1);

   
    }
    }
 






     
if (led2a == true)  {void blauwe_knipperlichten_voorkant();

 
   

    while (led2a == true )  {

     if (currentMillis2 - previousMillis2 >= interval2)
           // save the last time you blinked the LED
         previousMillis2 = currentMillis2;

           // if the LED is off turn it on and vice-versa:
     if (ledState2 == LOW) {
         ledState2 = HIGH;
    } else {
      ledState2 = LOW;
    }

           // set the LED with the ledState of the variable:
      digitalWrite(led2, ledState2);


  }
  }
 





if (led3a == true)  {void links_knipperlicht ();


 
    while (led3a == true )  {

    if (currentMillis3 - previousMillis3 >= interval3)
          // save the last time you blinked the LED
        previousMillis3 = currentMillis3;

          // if the LED is off turn it on and vice-versa:
    if (ledState3 == LOW) {
      ledState3 = HIGH;
    } else {
      ledState3 = LOW;
    }

          // set the LED with the ledState of the variable:
    digitalWrite(led3, ledState3);


  }
  }
 
}


het volgende probleem doet er op:

als ik nu in mijn app een van de leds aan zet gaat hij aan maar knippert niet. En als ik deze weer uitzet in de app blijft hij simpelweg gewoon aan. En als er een van de leds aanstaat kan ik in de app op andere knoppen drukken wat ik wil maar er gebeurd niks meer. niks gaat aan en niks gaat uit.
net alsof hij 1 keer leest wat hij krijgt en daarna niks meer doet.

dus wat zou ik hier aan kunnen doen?

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

Re: problemen met code meerdere loops

Berichtdoor Koepel » 11 Sep 2020, 01:24

Maak de tekst van de code netter.
Begin met op Ctrl+T te drukken in de Arduino IDE.
Maak het dan nog mooier, zet ieder inspringen, iedere spatie, iedere komma, iedere nieuwe regel, enzovoorts, correct.
Als er ergens een spatie staat waar je niet over hebt nagedacht, dan klopt er iets niet.

Dit is geen grap.
Bij een duidelijke layout van de tekst, zie je de structuur van het programma en valt een probleem meteen op.

In de loop() kijk je of er iets is binnengekomen op de seriële poort, en dan lees je die.
Vervolgens wordt de rest van de code altijd uitgevoerd, ongeacht of er iets op de seriële poort was binnengekomen. Dat is niet de bedoeling.
Dit heb ik al geschreven.

Iets netter gemaakt, heb je nu dit:
Code: Alles selecteren
void loop()
{
  if (Serial.available() > 0)
  {
    incoming_value = Serial.read();
  }

  Serial.print (incoming_value);
  Serial.print ("\n");
Dat is dus niet goed.

Je doet een while (led2a == true ) maar de led2a verandert nooit binnen de while.
Dit heb ik ook al geschreven.

Loop eens door deze pagina: https://www.arduino.cc/reference/en/.
Voor de code zijn er: for, while, if, do...while, switch-case.
Dat is voldoende om alles te kunnen doen.
Arduino heeft echter de loop() functie die heel vaak steeds opnieuw wordt uitgevoerd. Daardoor is meestal geen while-statement nodig. De Arduino loop() functie gaat goed samen met software-timers met millis(), maar niet als die millis() binnen een while-statement zit die ook nog binnen een if-statement zit.
Kijk nog eens naar de Blink Without Delay: https://www.arduino.cc/en/tutorial/BlinkWithoutDelay.
Het knipperen gebeurt dus niet binnen een while-statement, maar gewoon binnen de Arduino loop() functie.

Wanneer je jouw sketch netjes hebt gemaakt, durf je het dan aan om die te laten zien ? :lol:
Hier staan een paar voorbeelden van mij: https://github.com/Koepel/Fun_with_millis. Kijk maar of er ergens een komma of spatie staat waar niet over is nagedacht ;)

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

Re: problemen met code meerdere loops

Berichtdoor shooter » 11 Sep 2020, 20:12

een knipper led kun je maken door led != led te schrijven dat is wat simpeler.
verder kun je beter een status gaan zetten want dan kun je ook volgordes gaan doen zoals eerst links twee keer dan rechts twee keer etc.
verder kijk eens naar de if led1a regel want daar staat een definitie van een functie achter en dat hoort niet.
je zet eerst allerlei functies op en die kun je dan aanroepen.
maar je bent goed bezig hoor,
paul deelen
shooter@home.nl

Gebruikers-avatar
Berichten: 3
Geregistreerd: 27 Jun 2020, 10:03

Re: problemen met code meerdere loops

Berichtdoor -leeuwtje- » 22 Okt 2020, 19:36

hej mannen ,
ik heb weer ffkes een poosje code taal geschreven en ben eventjes helemaal overnieuw begonnen. :D ;)

hier mijn nieuwe code: 8-)

Code: Alles selecteren






const int ledPin5 =  5 ;// het nummer van de ledpin
const int ledPin6 =  6 ;
const int ledPin7 =  7 ;

// Variabbelen die zullen/kunnen  veranderen:
bool lichtA = false;            // hier slaan we de data in op wat de seriële poort binnen krijgt,
bool lichtB = false;           // nadat we dit hebben uitgelezen en hebben bepaald wat de stand van de bool moet zijn.
bool lichtC = false;

int ledState5 = LOW;             // ledstaat die de led meekrijgt als alles aan gaan (high is aan,  low is uit)
int ledState6 = LOW;
int ledState7 = LOW;



// normaal gesproken gebruik je unsigned long om variabbelen op te slaan die met tijd te maken heeft.
// de getalling zouden snel de groot worden om op te slaan in een int.
unsigned long previousMillis5 = 0;        // dit zal de laatste tijd opslaan dat de led is aan of uitgeweest
unsigned long previousMillis6 = 0;
unsigned long previousMillis7 = 0;

// constanten die niet gaan veranderen:
const long interval5 = 1000;           // op welke interval de leds moet knipperen in milliseconden
const long interval6 = 300;
const long interval7 = 600;


void setup() {
  // zet de serial communicatie op 9600 bits per seconde:
  Serial.begin(9600);

  // dit zet de digitale pin als uitgang:
  pinMode(ledPin5, OUTPUT);
  pinMode(ledPin6, OUTPUT);
  pinMode(ledPin7, OUTPUT);


}
void loop() {
  // hier zet je de code die altijd loopt

  if (Serial.available() > 0) // hier word er gelezen of er iets uit de seriële poort komt
  {
    Serial.println(); // hier word de gelezen data geprint in de seriële monitor
  }

  int inkomendedata = Serial.read();


  if (inkomendedata == 1) {
    bool lichtA (true);
    if (inkomendedata == 2) {
      bool lichtA (false);
      if ((inkomendedata < 1) && ( inkomendedata > 2)) {
        bool lichtA (bool lichtA);
      }
    }
  }
  if (inkomendedata == 3) {
    bool lichtB (true);
    if (inkomendedata == 4) {
      bool lichtB (false);
      if ((inkomendedata < 3) && (inkomendedata > 4)) {
        bool lichtB (bool lichtB);
      }
    }
  }

  if (inkomendedata == 5) {
    bool lichtC (true);
    if (inkomendedata == 6) {
      bool lichtC (false);
      if ((inkomendedata < 5) && (inkomendedata > 6)) {
        bool lichtC (bool lichtB);
      }
    }
  }

  if (lichtA = true) {
   
    unsigned long currentMillis5 = millis();  /* controleert of het tijd is om de LED te laten knipperen; dat wil zeggen, als het verschil
    tussen de huidige tijd en de laatste keer dat hij geknipperd heeft,
    groter is dan de interval waarmee je de LED wilt laten knipperen.
*/

    if (currentMillis5 - previousMillis5 >= interval5) {
      // hier sla je op wanneer de led als laatste heeft geknippert
      previousMillis5 = currentMillis5;

      // als de led aan is zet je hem uit, en als hij weer uit is zet je hem weer aan ; en dat heel de tijd door
      if (ledState5 == LOW) {
        ledState5 = HIGH;
      } else {
        ledState5 = LOW;
      }

      // hier zet je de led op de variabel van de ledstaat
      digitalWrite(ledPin5, ledState5);
    }
  }

  if (lichtB = true) {
    unsigned long currentMillis6 = millis();

    if (currentMillis6 - previousMillis6 >= interval6) {
      // hier sla je op wanneer de led als laatste heeft geknippert
      previousMillis6 = currentMillis6;

      // als de led aan is zet je hem uit, en als hij weer uit is zet je hem weer aan ; en dat heel de tijd door
      if (ledState6 == LOW) {
        ledState6 = HIGH;
      } else {
        ledState6 = LOW;
      }

      // hier zet je de led op de variabel van de ledstaat
      digitalWrite(ledPin6, ledState6);
    }
  }

  if (lichtC = true) {
    unsigned long currentMillis7 = millis();

    if (currentMillis7 - previousMillis7 >= interval7) {
      // hier sla je op wanneer de led als laatste heeft geknippert
      previousMillis7 = currentMillis7;

      // als de led aan is zet je hem uit, en als hij weer uit is zet je hem weer aan ; en dat heel de tijd door
      if (ledState7 == LOW) {
        ledState7 = HIGH;
      } else {
        ledState7 = LOW;
      }

      // hier zet je de led op de variabel van de ledstaat
      digitalWrite(ledPin7, ledState7);
    }
  }
}


De problemen zijn als volgt: :oops:

ten eerste : alle leds knipperen netjes op hun interval; :mrgreen: per direct als ik het programma op de arduino nano heb geüpload.
Dit mag dus niet. :( Dit mag pas als ze daar de opdracht voor krijgen van mijn telefoon door de HC-05 bluetooth module. :!:

ten tweede :het board voert de opdrachten niet uit. ik zie door de kleine lampjes op het board van de arduino nano dat hij wel de data binnen krijgt. maar de lampjes blijven er heerlijk op los knipperen zonder enige verandering :roll:

ik ben benieuwd naar jullie commentaar :D

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

Re: problemen met code meerdere loops

Berichtdoor Koepel » 22 Okt 2020, 21:50

Koepel schreef:Iets netter gemaakt, heb je nu dit:
Code: Alles selecteren
void loop()
{
  if (Serial.available() > 0)
  {
    incoming_value = Serial.read();
  }

  Serial.print (incoming_value);
  Serial.print ("\n");
Dat is dus niet goed.


Je hebt nog steeds hetzelfde:

Code: Alles selecteren
void loop() {
  // hier zet je de code die altijd loopt

  if (Serial.available() > 0) // hier word er gelezen of er iets uit de seriële poort komt
  {
    Serial.println(); // hier word de gelezen data geprint in de seriële monitor
  }

  int inkomendedata = Serial.read();


Zal ik dat in woorden uitschrijven ?

Begin de Arduino loop() functie :D
Begin van een if-statement :D
Is het aantal ontvangen bytes dat beschikbaar is groter dan nul ? :D
Druk het dan af naar de seriële poort :D
Einde van if-statement :?
Lees de seriele data in een variabele, ongeacht of er iets beschikbaar was :evil:
Ga met die variabele aan de slag, ongeacht of dat geldige data is of niet :evil:


Oh nee:
Code: Alles selecteren
if (lichtA = true) {
if (lichtB = true) {
if (lichtC = true) {
Een vergelijking is met ==

Maar omdat de conditie van het if-statement al 'waar' of 'niet waar' is, dan is dit mooier:
Code: Alles selecteren
if (lichtA) {
if (lichtB) {
if (lichtC) {

Terug naar Arduino software

Wie is er online?

Gebruikers in dit forum: ilipavudekejo en 16 gasten