For-loop voortgang middels een knop
6 berichten
• Pagina 1 van 1
- Gij Kieken
- Berichten: 636
- Geregistreerd: 15 Nov 2015, 11:54
For-loop voortgang middels een knop
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
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
- nicoverduin
- Berichten: 5043
- Geregistreerd: 13 Mei 2013, 20:57
- Woonplaats: Heemskerk
Re: For-loop voortgang middels een knop
Samengevat:
Als de knop is ingedrukt wacht to hij is losgelaten?
Als de knop is ingedrukt wacht to hij is losgelaten?
- Gij Kieken
- Berichten: 636
- Geregistreerd: 15 Nov 2015, 11:54
Re: For-loop voortgang middels een knop
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 .
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 .
- Gij Kieken
- Berichten: 636
- Geregistreerd: 15 Nov 2015, 11:54
Re: For-loop voortgang middels een knop
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).
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()
- nicoverduin
- Berichten: 5043
- Geregistreerd: 13 Mei 2013, 20:57
- Woonplaats: Heemskerk
Re: For-loop voortgang middels een knop
Ik zou gewoon die hele change state in de vuilnisbak pleuren en gewoon coderen zoals je het zegt.
cpp code
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");
}
- Gij Kieken
- Berichten: 636
- Geregistreerd: 15 Nov 2015, 11:54
Re: For-loop voortgang middels een knop
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,,,,
#ifdef DEBUG,,,,
6 berichten
• Pagina 1 van 1
Wie is er online?
Gebruikers in dit forum: Geen geregistreerde gebruikers en 2 gasten