Arduino + Push Switch + Debouncing + avbryter
Programmet som jag arbetar på kräver användning av 2 tryckknappar, var kommer att länka till en Arduino (som ett avbrott) och kontrollera den aktuella positionen för motorn. Jag har 6 positioner som jag vill ha motorn i.
Jag ursprungligen satt upp min krets som så:
Problemet med denna setup var när knappen trycktes avbrottet var att vara kallade flera gånger och även växla andra knappar. Varför var detta händer? Det orsakas från en switch som studsar feedback. För att åtgärda detta, måste du ändra din krets runt detta sätt nedan:
Vad detta gjorde var när knappen var (= 1) PIN-koden var hög och bara högt. Det studsar aldrig runt som förr.
-----
Det projekt som jag arbetade på hade följande schematiska (skapad med PSpice Student 9.1).
Pin-konfiguration är följande:
- STIFT 2 - tryckknapp 1 (öka motor position)
- avbryta 0
- STIFT 3 - tryckknapp 2 (minska motor position)
- avbryta 1
- PIN 22 - LED 1 (position 1)
- PIN 24 - LED 2 (position 2)
- STIFT 26 - LED 3 (position 3)
- PIN 28 - LED 4 (position 4)
- STIFT 30 - LED 5 (position 5)
- PIN 32 - LED 6 (position 6)
Vad denna ansökan kommer att göra är start off i position 1 då som du tryckknapp 1, LED kommer att ändra baserat på den nya positionen. Jag kallar dessa positioner redskap. Här är Arudino koden... det är verkligen rakt fram.
CONST int led6 = 32.
CONST int led5 = 30.
CONST int led4 = 28;
CONST int led3 = 26.
CONST int led2 = 24.
CONST int led1 = 22.
volatile unsigned int current_gear = 1;
flyktiga lång lång timeout = 3000; 3 sekunder
flyktiga lång lång last_change_time = 0;
void loop()
{
Switch(current_gear)
{
fall 1:
digitalWrite(led1,HIGH);
digitalWrite(led2,LOW);
digitalWrite(led3,LOW);
digitalWrite(led4,LOW);
digitalWrite(led5,LOW);
digitalWrite(led6,LOW);
bryta;
fall 2:
digitalWrite(led1,LOW);
digitalWrite(led2,HIGH);
digitalWrite(led3,LOW);
digitalWrite(led4,LOW);
digitalWrite(led5,LOW);
digitalWrite(led6,LOW);
bryta;
fall 3:
digitalWrite(led1,LOW);
digitalWrite(led2,LOW);
digitalWrite(led3,HIGH);
digitalWrite(led4,LOW);
digitalWrite(led5,LOW);
digitalWrite(led6,LOW);
bryta;
fall 4:
digitalWrite(led1,LOW);
digitalWrite(led2,LOW);
digitalWrite(led3,LOW);
digitalWrite(led4,HIGH);
digitalWrite(led5,LOW);
digitalWrite(led6,LOW);
bryta;
fall 5:
digitalWrite(led1,LOW);
digitalWrite(led2,LOW);
digitalWrite(led3,LOW);
digitalWrite(led4,LOW);
digitalWrite(led5,HIGH);
digitalWrite(led6,LOW);
bryta;
fall 6:
digitalWrite(led1,LOW);
digitalWrite(led2,LOW);
digitalWrite(led3,LOW);
digitalWrite(led4,LOW);
digitalWrite(led5,LOW);
digitalWrite(led6,HIGH);
bryta;
}
}
void setup()
{
Serial.BEGIN(9600);
pinMode(led1,OUTPUT);
pinMode(led2,OUTPUT);
pinMode(led3,OUTPUT);
pinMode(led4,OUTPUT);
pinMode(led5,OUTPUT);
pinMode(led6,OUTPUT);
attachInterrupt(0,up,RISING); Digital stift 2 / / upp
attachInterrupt(1,down,RISING); Digital stift 3 / / ner
}
void up()
{
Serial.println ("---kommer---");
Serial.Print ("aktuell tid -");
Serial.println(Millis());
Serial.Print ("Senast ändra tid -");
Serial.println((Long) last_change_time);
int skillnaden = millis ()-last_change_time;
Serial.Print ("skillnad -");
Serial.println((Long) skillnad);
Serial.Print ("inom tröskel? - ");
om (skillnaden > timeout || last_change_time == 0)
{
Serial.println("yes");
}
annat
{
Serial.println("no");
}
Serial.Print ("föregående växel =");
Serial.println(current_gear);
om ((current_gear > 0 & & ((millis()-last_change_time)>timeout)) || last_change_time == 0)
{
om (current_gear < = 5 & & current_gear! = 6)
{
current_gear ++;
last_change_time = millis();
}
}
Serial.Print ("nya redskap =");
Serial.println(current_gear);
Delay(150);
}
void down()
{
Serial.println ("---kommer---");
Serial.Print ("aktuell tid -");
Serial.println(Millis());
Serial.Print ("Senast ändra tid -");
Serial.println((Long) last_change_time);
int skillnaden = millis ()-last_change_time;
Serial.Print ("skillnad -");
Serial.println((Long) skillnad);
Serial.Print ("inom tröskel? - ");
IF(Difference > timeout)
{
Serial.println("yes");
}
annat
{
Serial.println("no");
}
Serial.Print ("föregående växel =");
Serial.println(current_gear);
om (current_gear > 0 & & ((millis()-last_change_time)>timeout))
{
int tempGear = current_gear - 1;
om (tempGear! = 0)
{
current_gear--;
last_change_time = millis();
}
}
Serial.Print ("nya redskap =");
Serial.println(current_gear);
Delay(150);
}
Där har du det, en switch debouncer som fungerar i alla fall. Denna handledning har anpassats speciellt för Arduino! Njut av!!