For-loop voortgang middels een knop

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

For-loop voortgang middels een knop

Berichtdoor Gij Kieken » 23 Jan 2018, 18:03

De bedoeling van het script om het te gebruiken bij het debuggen van een ander project waar ik in een for-loop drie adres lijnen van een Hef 4051Bp sequentieel aanspreek om dan via de nodige
level converters een gecombineerde venster comparator(lees 3xLM339) twee status lijnen uitlees.Vier niveaus 0..3 ,Rust ,Alarm ,Sabotage ,Tamper .De 8 lijnen(zones evt 16)zijn ook van einde lus weerstanden voorzien (rust 10K, alarm 20K, sabotage gnd, tamper open lus.De lussen werken op 12volt dc met batterij backup.

Onderstaande code lukt aardig, alleen wilde ik eigenlijk dat bij het ingedrukt houden van de knop de For-loop niet verder afloopt.

Ik blijf maar wat aanmodderen met de conditie van de while-loop maar geraak er niet uit en raak verzeilt met mijn vlag variabel.
Oorzaak gebrek aan ervaring.
Ik kan het oplossen met een hardware single-shot, maar dat is weerom zoals Nico het zo mooi omschrijft <symptoom bestrijding>.
Als een en ander goed loopt is het de bedoeling er een functie van te maken.
Graag jullie advies
Code: Alles selecteren
/*
   De bedoeling is om een for-loop verder te laten lopen door
   telkens een knop in te drukken.
   pull-up weerstand 1-zijde aan +5volt
   andere zijde aan digital-input
   knop tussen digital-input en gnd
*/
const byte knop = 10;                    //knop op digital input 10
byte knopStatus;                         //de huidige status van de input pin
byte vorigeKnopStatus = HIGH;            //de vorige status van de input pin
unsigned long vorigeAntidenderTijd = 0;  //tijd van de vorige schakeling
unsigned long antidenderVertraging = 250;//hoe lang de knop ingedrukt hoeft te zijn
boolean myFlag = HIGH;                   //myFlag is een hulpvariabel voor de knopstaus

void setup() {
  // put your setup code here, to run once:
  Serial.begin(9600);
  pinMode(knop, INPUT);
}

void loop() {
  // put your main code here, to run repeatedly:
  for (byte i = 0 ; i < 8; i++) {
    boolean myButton = HIGH; //variable gebruikt in de while-loop
    Serial.print(F("Dit is de "));
    Serial.print(i);
    Serial.println(F(" door de For-loop "));
    delay(1000);
    ////////////////////////////////////////////
    /*
       byte leesKnop = digitalRead(knop);//locale variabel voor inlezen knop
      if (leesKnop != vorigeKnopStatus) { //kijken of de knop verandert is van status
        vorigeAntidenderTijd = millis();//reset de antidender tijd
      }
      if ((millis() - vorigeAntidenderTijd) > antidenderVertraging) {
        //als de knop lang genoeg was ingedrukt, dus geen storing
        if (leesKnop != knopStatus) { //als de knop echt verandert is van toestand
          knopStatus = leesKnop;
          if (knopStatus == LOW) {
            Serial.println(F(" je hebt de knop ingedrukt "));
          }//end of if (knopStatus == LOW)
        }//end of if (leesKnop != knopStatus)
      }//end of if ((millis() - vorigeAntidenderTijd) > antidenderVertraging)
      vorigeKnopStatus = leesKnop;//bewaar de status voor de volgende keer door de loop
    */
    ////////////////////////////////////////////////

    while ((myButton == HIGH) || (myFlag  == HIGH)) {
      //Doe gewoon niks blijf hier wat rondhangen
      //Als de knop ingedrukt wordt is de conditie in de while-loop False en
      //gaat de For-loop verder
      if (digitalRead(knop) == HIGH) {
        myFlag = HIGH;
      }
      if (digitalRead(knop) == LOW) {
        delay(250);//antidender tijd,je moet dus echt de knop lang genoeg indrukken om storingen te vermijden
        myButton = digitalRead(knop);//myButton wordt LOW, dus spring uit de while lus
        myFlag = LOW;
      }//end of if (digitalRead(knop) == LOW)
    }//end of  while (digitalRead(knop) == HIGH)
  }//end of for (byte i = 0 ; i < 7; i++)
  Serial.println("");//print lege regel tussen loop-0 en loop-7

}//end of loop()



Advertisement

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

Re: For-loop voortgang middels een knop

Berichtdoor nicoverduin » 23 Jan 2018, 20:27

Samengevat:
Als de knop is ingedrukt wacht to hij is losgelaten?
Docent HBO Technische Informatica, Embedded ontwikkelaar & elektronicus
http://www.verelec.nl

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

Re: For-loop voortgang middels een knop

Berichtdoor Gij Kieken » 23 Jan 2018, 21:08

Hey, Nico
Dank voor de snelle reactie, het is nou net met die change state detection dat ik al een poos aan het knoeien ben.
Zal beter mijn best moeten doen .

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

Re: For-loop voortgang middels een knop

Berichtdoor Gij Kieken » 23 Jan 2018, 22:09

Nogmaals bedankt Nico.
Ik weet dat ik het kan, maar moet soms een zetje krijgen.
Onderstaand de wijzigingen voor de geïnteresseerden.
Het probleem in het andere project was inmiddels opgelost (de optocouplers doofden niet snel genoeg waardoor verkeerde uitlezing).

Code: Alles selecteren
/*
   De bedoeling is om een for-loop verder te laten lopen door
   telkens een knop in te drukken.
   pull-up weerstand 1-zijde aan +5volt
   andere zijde aan digital-input
   knop tussen digital-input en gnd
   De code is blocking en dit is ook de bedoeling
*/
const byte buttonPin = 10;        //knop op digital input 10

void setup() {
  // put your setup code here, to run once:
  Serial.begin(9600);
  pinMode(buttonPin, INPUT);
}

void loop() {
  // put your main code here, to run repeatedly:
  for (byte i = 0 ; i < 8; i++) {
    boolean myButton = HIGH; //variable gebruikt in de while-loop
    Serial.print(F("Dit is de "));
    Serial.print(i);
    Serial.println(F(" door de For-loop "));
    delay(1000);

    while (myButton == HIGH) {
      //Doe gewoon niks blijf hier wat rondhangen
      //Als de knop ingedrukt wordt is de conditie in de while-loop False en
      //gaat de For-loop verder
      if (digitalRead(buttonPin) == LOW) {
        delay(250);//antidender tijd,je moet dus echt de knop lang genoeg indrukken om storingen te vermijden
        if (digitalRead(buttonPin) == HIGH) {
          myButton = LOW; ;//myButton wordt LOW, dus spring uit de while lus
        }//end of if (digitalRead(buttonPin) == LOW)
        else {
          myButton = HIGH;
        }//end of else
      }//end of if (digitalRead(knop) == LOW)
    }//end of  while (digitalRead(knop) == HIGH)
  }//end of for (byte i = 0 ; i < 7; i++)
  Serial.println("");//print lege regel tussen loop-0 en loop-7
}//end of loop()



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

Re: For-loop voortgang middels een knop

Berichtdoor nicoverduin » 23 Jan 2018, 22:14

Ik zou gewoon die hele change state in de vuilnisbak pleuren en gewoon coderen zoals je het zegt.

cpp code
bool leesKnop(){
bool returnCode = false;
if digitalRead(button) == LOW) { // stel LOW is ingedrukt
delay(25); // simpele debounce
if (digitalRead(button) == LOW) {
returnCode = true;
}
}
return returnCode;
}

void (loop(){
while (leesKnop() {
Serial.println("Knop is ingedrukt);
}
Serial.println("knop is niet ingedrukt");
}
Docent HBO Technische Informatica, Embedded ontwikkelaar & elektronicus
http://www.verelec.nl

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

Re: For-loop voortgang middels een knop

Berichtdoor Gij Kieken » 23 Jan 2018, 22:26

Ziet er inderdaad veel eleganter uit ,zal dit eens goed bestuderen om vervolgens in andere projecten (waar nodig) in te voegen met iets als
#ifdef DEBUG,,,,

Terug naar Arduino software

Wie is er online?

Gebruikers in dit forum: Clarazkaessew, Kyliehooca en 23 gasten