debounce maar dan anders?

Arduino specifieke Software
Berichten: 68
Geregistreerd: 28 Aug 2012, 15:14

Re: debounce maar dan anders?

Berichtdoor Nald » 22 Sep 2012, 19:19

de code die ik ontworpen heb (afstandsbediening die ik heb is een normale pushbutton - momentary release)

een keer drukken en vasthouden,menu 1
los alles stil
twwede keer drukken en vasthouden, menu 2
los alles stil
derde keer drukken en vasthouden, menu 3
los alles stil.
vierde keer drukken counter resetten naar 0

Denk niet dat de buren het fijn vinden, dat zodra ik de code upload mijn luchthoorns nooit meer stil gaan.

Bij jouw code load ik hem up, daarna druk ik 1 keer en gaat hij nooit meer uit en wisselt hij random tussen de menu's (ook volgen seriële monitor) De toeters gaan pas uit als ik of de arduino reset of een andere code upload.

Hardware matig is hij na te maken met een normale pushbutton (afstandsbediening) en 2 leds, waarvan 1 staat voor melody, de ander voor sound

menu 1 moet alleen melody branden
menu 2 moet melody en sound branden (instelling van luchthoorn om een monotone toon te krijgen)
menu 3 is melody (plus wat flikkerende ledjes)

dan kan je zelf ook je code controleren.

Advertisement

Gebruikers-avatar
Berichten: 700
Geregistreerd: 05 Mrt 2012, 21:56
Woonplaats: Appingedam

Re: debounce maar dan anders?

Berichtdoor pjh » 22 Sep 2012, 21:10

Dat is wel erg raar. Mijn code zou niet "random" moeten werken. Je hebt toevallig niet de pushButton op pin 3 veranderd oid? Het lijkt erop dat de interrupt steeds weer wordt aangesproken bij jou.

Berichten: 68
Geregistreerd: 28 Aug 2012, 15:14

Re: debounce maar dan anders?

Berichtdoor Nald » 22 Sep 2012, 21:30

nee heb niks veranderd. Ik werk nu nog steeds met dezelfde opstelling alleen uitgebreider. Hiermee ben ik tot de volgende code gekomen. Krijg nu alleen nog niet alles werkend.

de problemen waar ik nu tegenaanloop, wanneer de 30 sec zijn verstreken blijft hij op het 3e menu hangen (buttonpushcounter == 1)
tevens als ik in het 3e menu loop, loopt hij die hoe dan ook helemaal af (evenzo trekknop) ik wil hem zo hebben dat wanneer ik de knop loslaat ook alles stopt.

De code is een rommeltje, heb zelf alles moeten bedenken en ben een beginner.

Code: Alles selecteren
 int MistR=2;
 int buttonPin=3;
 int MistL=4;
 int KopL=5;
 int MistA=6;
 int KopR=7;
 int Sound=8;
 int KnipL=9;
 int KnipR=10;
 int Melody=11;
 int Switch=12;
 int Trek=13;

 int licht= A1;
 int potPin= A2;
 int onthoudt=A5;
 
 int lichtstate=0;
 int Trekstate = 0;
 int afstandbediening=0;
 
 int lastMillis = 0;
 int reading=0;
 long time =0;
 long bounce = 200;

 int onthoudtstate = LOW;
 int onthouden;
 int lastonthoudtstate = HIGH;

 int buttonState = HIGH;
 int buttonPushCounter = 0;
 int lastbuttonState=LOW;
 
 boolean lastButton =LOW;
 boolean currentButton =LOW;

void setup()
  {
  pinMode (KopL, OUTPUT);
  pinMode (KopR, OUTPUT);
  pinMode (MistL, OUTPUT);
  pinMode (MistR, OUTPUT);
  pinMode (KnipL, OUTPUT);
  pinMode (KnipR, OUTPUT);
  pinMode (Melody, OUTPUT);
  pinMode (Sound, OUTPUT);
  pinMode (MistA, OUTPUT);
  pinMode (Trek, INPUT);
  pinMode (buttonPin, INPUT);
  pinMode (onthoudt, INPUT);
  Serial.begin(9600);
  }

    boolean debounce(boolean last)
  { boolean current = digitalRead(buttonPin);
 if (last != current){
   delay(5);
   current = digitalRead(buttonPin); 
  }
    return current;
  }


void loop(){
 
  onthouden = digitalRead(onthoudt);
 
  if (onthouden == HIGH && lastonthoudtstate == LOW && millis() - time > bounce){
  if (onthoudtstate == HIGH)
   onthoudtstate = LOW;
   
      else
   
   onthoudtstate = HIGH;
   time= millis(); }
   digitalWrite(Sound, onthoudtstate);
 
  lastonthoudtstate = onthouden;
 
   lichtstate=analogRead(licht);
   
  if (lichtstate > 500){
    digitalWrite(KopL,HIGH);
    digitalWrite(KopR,HIGH);   
     }
       
  reading = analogRead(potPin);
   
  if(reading < 490 && millis() - time > bounce){
    digitalWrite(MistL,HIGH);
    digitalWrite(MistR,LOW);
    delay(1000);}
 
  if (reading > 540 && millis() - time > bounce){
    digitalWrite(MistR,HIGH);
    digitalWrite(MistL,LOW);
    delay(1000);}
 
  Trekstate = digitalRead(Trek);
 
  if (Trekstate ==HIGH && lichtstate < 500 && millis() - time > bounce){
    delay(250);
    digitalWrite(KnipR,HIGH);
    digitalWrite(KnipL,LOW);
    delay(75);
    digitalWrite(KnipR,LOW);
    delay(50);
    digitalWrite(KnipR,HIGH);
    delay(75);
    digitalWrite(KnipR,LOW);
    digitalWrite(KopR,HIGH);
    delay(150);
    digitalWrite(KopR,LOW);
    digitalWrite(MistR,HIGH);
    delay(150);
    digitalWrite(MistR,LOW);
    digitalWrite(MistL,HIGH);
    delay(150);
    digitalWrite(MistL,LOW);
    digitalWrite(KopL,HIGH);
    delay(150);
    digitalWrite(KopL,LOW);
    digitalWrite(KnipL,HIGH);
    delay(75);
    digitalWrite(KnipL,LOW);
    delay(50);
    digitalWrite(KnipL,HIGH);
    delay(75);
    digitalWrite(KnipL,LOW);
       }
     
     if (Trekstate ==HIGH && lichtstate > 500 && millis() - time > bounce){
    delay(250);
    digitalWrite(KnipR,HIGH);
    digitalWrite(KnipL,LOW);
    delay(75);
    digitalWrite(KnipR,LOW);
    delay(50);
    digitalWrite(KnipR,HIGH);
    delay(75);
    digitalWrite(KnipR,LOW);
    digitalWrite(KopR,HIGH);
    delay(150);
    digitalWrite(MistR,HIGH);
    delay(150);
    digitalWrite(MistR,LOW);
    digitalWrite(MistL,HIGH);
    delay(150);
    digitalWrite(MistL,LOW);
    digitalWrite(KopL,HIGH);
    delay(150);
    digitalWrite(KnipL,HIGH);
    delay(75);
    digitalWrite(KnipL,LOW);
    delay(50);
    digitalWrite(KnipL,HIGH);
    delay(75);
    digitalWrite(KnipL,LOW);
       } 
     
 
   
 currentButton = debounce(lastButton);
     
 buttonState = currentButton;
 
 if (buttonState != lastbuttonState ) {
 if (buttonState == HIGH) {
   buttonPushCounter++;
   Serial.println("on");
   Serial.print("number of button pushes:  ");
   Serial.println(buttonPushCounter);
   
      }else{
       
    Serial.println("off");}}
    lastbuttonState= buttonState;
  if (buttonPushCounter % 4 == 0 || millis()-lastMillis > 30000 ){
    buttonPushCounter =1;
    lastMillis = millis();}
   
  if (buttonPushCounter == 2 && currentButton == HIGH && millis() - time > bounce ){
    delay(250);
    onthoudtstate= LOW;
    digitalWrite(Sound, onthoudtstate);
    digitalWrite(Melody,HIGH);
       
      }else
     
  if (buttonPushCounter == 3 && currentButton == HIGH && millis() - time > bounce){
    delay(250);
    digitalWrite(Melody,HIGH);
    onthoudtstate= HIGH;
    digitalWrite(Sound, onthoudtstate);
         
      }else
     
  if (buttonPushCounter == 3 && currentButton == LOW && millis() - time > bounce){
    digitalWrite(Melody,LOW);
    onthoudtstate= LOW;
    digitalWrite(Sound, onthoudtstate);   
 
      }else
     
  if (buttonPushCounter == 1 && currentButton == HIGH && millis() - time > bounce){
    delay(250);
    onthoudtstate= LOW;
    digitalWrite(Sound, onthoudtstate);
    digitalWrite(Melody,HIGH);
    digitalWrite(KnipR,HIGH);
    digitalWrite(KnipL,LOW);
    delay(75);
    digitalWrite(KnipR,LOW);
    digitalWrite(Melody,HIGH);
    delay(50);
    digitalWrite(KnipR,HIGH);
    digitalWrite(Melody,HIGH);
    delay(75);
    digitalWrite(KnipR,LOW);
    digitalWrite(KopR,HIGH);
    digitalWrite(Melody,HIGH);
    delay(150);
    digitalWrite(KopR,LOW);
    digitalWrite(MistR,HIGH);
    digitalWrite(Melody,HIGH);
    delay(150);
    digitalWrite(MistR,LOW);
    digitalWrite(MistL,HIGH);
    digitalWrite(Melody,HIGH);
    digitalWrite(Sound,LOW);
    delay(150);
    digitalWrite(MistL,LOW);
    digitalWrite(KopL,HIGH);
    digitalWrite(Melody,HIGH);
    delay(150);
    digitalWrite(KopL,LOW);
    digitalWrite(KnipL,HIGH);
    digitalWrite(Melody,HIGH);
    delay(75);
    digitalWrite(KnipL,LOW);
    digitalWrite(Melody,HIGH);
    digitalWrite(Sound,LOW);
    delay(50);
    digitalWrite(KnipL,HIGH);
    digitalWrite(Melody,HIGH);
    delay(75);
    digitalWrite(KnipL,LOW);
           
       }else{
         
    digitalWrite(Melody,LOW);
    digitalWrite(Sound,LOW);
    digitalWrite(KopL,LOW);
    digitalWrite(KopR,LOW);
    digitalWrite(KnipL,LOW);
    digitalWrite(KnipR,LOW);
    digitalWrite(MistL,LOW);
    digitalWrite(MistR,LOW);
     

   }}

Gebruikers-avatar
Berichten: 700
Geregistreerd: 05 Mrt 2012, 21:56
Woonplaats: Appingedam

Re: debounce maar dan anders?

Berichtdoor pjh » 22 Sep 2012, 21:57

kijk, je werkt niet met de interrupt. En dat is wat ik zou doen. Dan zou ik elk oneven programma "alles uit" laten zijn. Dan krijg je dus
programma 0: toeters
programma 1: niks
programma 2: bellen
programma 3: niks
programma 4: toeters en bellen
programma 5: niks
et c.

Ik snapniet wat je op analoog A5 hebt.

Berichten: 68
Geregistreerd: 28 Aug 2012, 15:14

Re: debounce maar dan anders?

Berichtdoor Nald » 24 Sep 2012, 20:04

met jouw code betekend dat als ik mijn bereik verlies, het programma blijft lopen. Nu is het zo als ik mijn bereik verlies stopt alles. Wel zo veilig

op analaog A5 zit een "onthoud schakelaar" als ik die kort bekrachtig bekrachtigd die een relais, bij nogmaals drukken stopt hij met het bekrachtigen. Hij zit op A5 omdat al mijn andere poorten vol zijn.

Gebruikers-avatar
Berichten: 700
Geregistreerd: 05 Mrt 2012, 21:56
Woonplaats: Appingedam

Re: debounce maar dan anders?

Berichtdoor pjh » 24 Sep 2012, 21:34

Geloof dat ik het eindelik snap. Waar de schoen wringt, zal ik maar zeggen.
(Waar het in mijn programma alleen om te doen was, is de debounce en atatchInterrupt combinatie.)

Berichten: 68
Geregistreerd: 28 Aug 2012, 15:14

Re: debounce maar dan anders?

Berichtdoor Nald » 24 Sep 2012, 23:51

maar wat doet interrupt dan precies?

Gebruikers-avatar
Berichten: 700
Geregistreerd: 05 Mrt 2012, 21:56
Woonplaats: Appingedam

Re: debounce maar dan anders?

Berichtdoor pjh » 25 Sep 2012, 09:43

Met een interrupt kijkt je arduino zelf of je een knopje hebt ingedrukt. Daardoor hoef je dat in je LOOP niet te doen. Zo kun je in je loop andere dingen doen.
Wanneer jij met jouw programma ergens een delay() in je loop zet, wordt er niet meer naar je knopje gekeken. Een interrupt in der breekt zelf je loop om naar knopje te kijken.
Hoop dat het duidelijk is.

Berichten: 68
Geregistreerd: 28 Aug 2012, 15:14

Re: debounce maar dan anders?

Berichtdoor Nald » 03 Okt 2012, 18:58

pjh schreef:hier je eigen code met mijn aanpassingen.
Kijk maar of het werkt
heb je hardware niet hier.

Code: Alles selecteren
int buttonPin=3;
int Melody=11;
int Sound=8;

int KopL=5;
int KopR=7;
int MistL=4;
int MistR=2;
int KnipL=9;
int KnipR=10;

volatile int aantal_knop_drukken = 0;

void setup() {
  pinMode (Melody, OUTPUT);
  pinMode (Sound, OUTPUT);
  pinMode (KopL, OUTPUT);
  pinMode (KopR, OUTPUT);
  pinMode (MistL, OUTPUT);
  pinMode (MistR, OUTPUT);
  pinMode (KnipL, OUTPUT);
  pinMode (KnipR, OUTPUT);
  pinMode (buttonPin, INPUT);
 
  Serial.begin(9600);
 
 attachInterrupt(1, knop_is_gedrukt, RISING);
}

void loop() {
switch (aantal_knop_drukken){
  case 0:
    delay(250);
    digitalWrite(Melody,HIGH);
    break;
  case 1:
    delay(250);
    digitalWrite(Melody,HIGH);
    digitalWrite(Sound,HIGH);
    break;
  case 2:
    delay(250);
    digitalWrite(Melody,HIGH);
    digitalWrite(Sound,LOW);
    digitalWrite(KnipR,HIGH);
    digitalWrite(KnipL,LOW);
    delay(75);
    digitalWrite(KnipR,LOW);
    digitalWrite(Melody,HIGH);
    delay(50);
    digitalWrite(KnipR,HIGH);
    digitalWrite(Melody,HIGH);
    delay(75);
    digitalWrite(KnipR,LOW);
    digitalWrite(KopR,HIGH);
    digitalWrite(Melody,HIGH);
    delay(150);
    digitalWrite(KopR,LOW);
    digitalWrite(MistR,HIGH);
    digitalWrite(Melody,HIGH);
    delay(150);
    digitalWrite(MistR,LOW);
    digitalWrite(MistL,HIGH);
    digitalWrite(Melody,HIGH);
    delay(150);
    digitalWrite(MistL,LOW);
    digitalWrite(KopL,HIGH);
    digitalWrite(Melody,HIGH);
    delay(150);
    digitalWrite(KopL,LOW);
    digitalWrite(KnipL,HIGH);
    digitalWrite(Melody,HIGH);
    delay(75);
    digitalWrite(KnipL,LOW);
    digitalWrite(Melody,HIGH);
    delay(50);
    digitalWrite(KnipL,HIGH);
    digitalWrite(Melody,HIGH);
    delay(75);
    digitalWrite(KnipL,LOW);
    break;
  case 3:
    digitalWrite(Melody,LOW);
    digitalWrite(Sound,LOW);
    digitalWrite(KopL,LOW);
    digitalWrite(KopR,LOW);
    digitalWrite(KnipL,LOW);
    digitalWrite(KnipR,LOW);
    digitalWrite(MistL,LOW);
    digitalWrite(MistR,LOW);
    break;
  }
}

void knop_is_gedrukt(){
  static unsigned long vorige_interrupt = 0;
  unsigned long huidige_interrupt = millis();
  if (huidige_interrupt - vorige_interrupt > 300){
    aantal_knop_drukken++;
    if (aantal_knop_drukken > 3){
      aantal_knop_drukken = 0;
    }
    Serial.print("knop gedrukt. Programma: ");
    Serial.println(aantal_knop_drukken);
  }
  vorige_interrupt = huidige_interrupt;
}



De arduino, of beter gezegd: de ATMega328P-microcontroller, heeft een aantal interne timers. Een interrupt zit op zo'n timer. Als de timer afloopt, wordt de loop tijdelijk onderbroken en de status van een PIN bekeken. Deze kan laag zijn, hoog zijn gegaan, laag zijn gegaan, veranderd zijn. Genoeg hier over op arduino.cc
Je kunt met de opdracht attachInterrupt dus een PIN aan een interrupt en een void koppelen. Veranderd de pin, dan wordt je void uitgevoerd. ZONDER dat jeditin je void LOOP hoeft te doen.



Deze code reageert op elke knopverandering? Ik zie zo snel niet waar de knopverandering is toegewezen aan een speciale pin.

Gebruikers-avatar
Berichten: 700
Geregistreerd: 05 Mrt 2012, 21:56
Woonplaats: Appingedam

Re: debounce maar dan anders?

Berichtdoor pjh » 04 Okt 2012, 16:45

De interrupt 0 zit op pin 2. Dit light hardwarematig vast. Is wel wat verwarrend ja.

VorigeVolgende

Terug naar Arduino software

Wie is er online?

Gebruikers in dit forum: Geen geregistreerde gebruikers en 9 gasten