led knipperen met twee knoppen Arduino

Ik werk met een Arduino twee knoppen en een led. Ik wil graag dat als ik op de ene knop druk dat het lichtje knippert (en dat hij dat blijft doen, ook als ik niet meer op de knop druk) en ik wil dan dat het lichtje blijft knipperen als ik op de volgende knop druk en dat het lichtje dan weer uitgaat als ik de tweede knop loslaat. (en dus beide knoppen niet meer zijn ingedrukt)

Ik heb al meerdere dingen geprobeerd en het wil maar niet lukken. Heeft iemand tips?

Dat zou niet zo moeilijk moeten zijn.. Wat heb je al ?

Op 7 november 2019 12:31:38 schreef Aart:
Dat zou niet zo moeilijk moeten zijn.. Wat heb je al ?

nou ik heb heel veel dingetjes al geprobeerd en ben telkens weer opnieuw begonnen. Ik heb geen idee met welke ik in de goeie richting zat, maar hier is een voorbeeld ( het knipperen doe ik trouwens met 2 lichtjes, zodat ze om en om aan en uit gaan):

const int LED1=12;
const int LED2=11;

const int button1Pin=7;
const int button2Pin=6;

int button1State=LOW;
int button2State=LOW;

int lastButton1State=LOW;
int lastButton2State=LOW;

void setup() {
Serial.begin(9600);
pinMode(LED1, OUTPUT);
pinMode(LED2, OUTPUT);

pinMode(button1Pin, INPUT);
pinMode(button2Pin, INPUT);

}

void loop() {
button1State = digitalRead(button1Pin);
Serial.println(button1State);

button2State = digitalRead(button2Pin);
Serial.println(button2State);

if(button1State == HIGH){
digitalWrite(LED1, HIGH);
digitalWrite(LED2, LOW);
delay(200);

digitalWrite(LED1, LOW);
digitalWrite(LED2, HIGH);
delay(200);

if(button1State == LOW){
digitalWrite(LED1, HIGH);
digitalWrite(LED2, LOW);
delay(200);

digitalWrite(LED1, LOW);
digitalWrite(LED2, HIGH);
delay(200);

if(button2State == HIGH){
digitalWrite(LED1, HIGH);
digitalWrite(LED2, LOW);
delay(200);

digitalWrite(LED1, LOW);
digitalWrite(LED2, HIGH);
delay(200);

if(button2State == LOW){
digitalWrite(LED1, HIGH);
digitalWrite(LED2, LOW);
delay(200);

digitalWrite(LED1, LOW);
digitalWrite(LED2, HIGH);
delay(200);

}}}

}}

Zoiets ?

c code:


const int LED1=12;
const int LED2=11;

const int button1Pin=7;
const int button2Pin=6;

void setup() {
  Serial.begin(9600);
  pinMode(LED1, OUTPUT);
  pinMode(LED2, OUTPUT);

  pinMode(button1Pin, INPUT); // Extern ontdenderde knopjes, actief hoog met externe pulldown
  pinMode(button2Pin, INPUT); 

}

void loop() {

  int button1State=0;
  int button2State=0;
  
  static int knipperen = 0;  // Knipper status
  static int lastbutton2State = 0; // laatste status van button 2. [edit, zie onder: 'static' toegevoegd] 
  
  // Lees knopjes
  button1State = digitalRead(button1Pin);
  Serial.println(button1State);

  button2State = digitalRead(button2Pin);
  Serial.println(button2State);

  // Ga knipperen als knopje 1 hoog is. 
  if(button1State == HIGH){
    knipperen = 1; 
  }

  // Stop knipperen als knopje twee losgelaten wordt
  if(button2State == LOW && lastbutton2State == HIGH) {
    knipperen = 0; 
  }
  lastbutton2State = button2State; 

  // knipper als er geknippert moet worden
  if (knipperen == 1) { 

    digitalWrite(LED1, HIGH);
    digitalWrite(LED2, LOW);
    delay(200);

    digitalWrite(LED1, LOW);
    digitalWrite(LED2, HIGH);
    delay(200);
  }
}

Ik ben ook ongeveer zo ver gekomen, alleen liep ik (en nu weer) tegen deze problemen aan:
-de leds blijven niet knipperen als ik button 1 loslaat (ze blijven gewoon stil staan)
-de leds gaan/blijven niet knipperen als ik daarna button 2 indruk
-de leds gaan niet uit als ik button 2 loslaat

[Bericht gewijzigd door Karliku op donderdag 7 november 2019 13:08:46 (69%)

Wat wordt er voor schakeling gebruikt rond de drukknoppen ? Ik uit gegaan van:

// Extern ontdenderde knopjes, actief hoog met externe pulldown

Mogelijk gaat daar iets mis ?
Ik weet uit mijn hoofd niet zeker hoe het zit met interne pulldowns bij AVR/Arduino.
Als de schakeling nog te wijzigen is is dat mogelijk te overwegen, INPUT_PULLUP is er zeker.

Ontdendering zou in dit speciale geval eigenlijk niet zo van belang moeten zijn, of vergis ik mij ?

[Bericht gewijzigd door Aart op donderdag 7 november 2019 13:17:11 (17%)

De initialisatie zat in de loop. LastState en knipperen werden telkens 0 gemaakt. Dat moet niet. En we moeten ook even het licht uit doen voor het geval knipperen 0 wordt.

Weet je zeker dat je normaal met je knop een LOW hebt en bij indrukken een HIGH? Ik neem aan dat je dat ziet in je console. Welke pull down/up gebruik je?

c code:




const int LED1=12;
const int LED2=11;

const int button1Pin=7;
const int button2Pin=6;

void setup() {
  Serial.begin(9600);
  pinMode(LED1, OUTPUT);
  pinMode(LED2, OUTPUT);

  pinMode(button1Pin, INPUT); // Extern ontdenderde knopjes, actief hoog met externe pulldown
  pinMode(button2Pin, INPUT); 
int button1State=0;
  int button2State=0;
  
  int knipperen = 0;  // Knipper status
  int lastbutton2State = 0; // laatste status van button 2. 
  
}


void loop() {

  // Lees knopjes
  button1State = digitalRead(button1Pin);
  
  button2State = digitalRead(button2Pin);
  
  // en nu gaan we serieus debuggen!!!

   Serial.println("button 1:");
   Serial.println(button1State);
   Serial.println("button 2:");
   Serial.println(button2State);
   Serial.println("lastButton2:");
   Serial.println(lastButton2State);
   Serial.println("knipperen:");
   Serial.println(knipperen);

  // Ga knipperen als knopje 1 hoog is. 
  if(button1State == HIGH){
    knipperen = 1; 
  }

  // Stop knipperen als knopje twee losgelaten wordt
  if(button2State == LOW && lastbutton2State == HIGH) {
    Serial.println("bt2 losgelaten");
    knipperen = 0; 
  }
  lastbutton2State = button2State; 

  // knipper als er geknippert moet worden
  if (knipperen == 1) { 
    // grapje tijdens het debuggen:
    Serial.println("all your leds are belong 2 us"); 
    digitalWrite(LED1, HIGH);
    digitalWrite(LED2, LOW);
    delay(200);

    digitalWrite(LED1, LOW);
    digitalWrite(LED2, HIGH);
    delay(200);
    // even alles uitzetten voor het geval dat knipperen 0 wordt
    digitalWrite(LED2, LOW);

  }
}

Dat gaat niet zo, in ieder geval in Arduino, het geeft "'.. was not declared in this scope"-errors.

Maar K7Jz legt wel de vinger op de zere plek, ik was het static keyword (weer eens ;) ..) vergeten waardoor ze onbedoeld in iedere loop opnieuw geinitialiseerd werden.

c code:


static int knipperen = 0;  // Knipper status
static int lastbutton2State = 0; // laatste status van button 2. 

Ik heb het nu maar even getest, aangepast naar knopjes die ik bij de hand heb naar gnd, dus met INPUT_PULLUP en wat inversies. Daar mee werkt het. Denderen geeft hier inderdaad geen problemen zo lijkt het.