RaspberryPi: Flera knappar på en Digital Pin (2 / 2 steg)
Steg 2: Programmet
Jag skrev detta på en ny hallon modell 2. Om du använder en äldre modell måste vissa omkalibrering. Talen i de fall uttalandena kommer att behöva vara högre. Kommentera ut hela switch uttalande och tillfälligt ersätta det med
printf ("%ld\n", ButtonReading);
Detta kommer att göra det lättare att hitta nya nummer om du vill kalibrera om det av någon anledning.
Och det bör fungera om du lägga till eller ta bort knappar.
Om du försöker trycka mer än en knapp i taget att endast högre numrerade knappen registrera.
Programmet innehåller en ny förbättrad version av funktionen RCtime() som jag använt i detta instructable:
/***********************************************************************
* Filnamn: Switches.c
* Detta program visar ett sätt att simulera en analog läsa genom att mäta
* den tid det tar för att ladda en kondensator via ett motstånd. Den använder
* motstånd i serie och knappar dem emellan.
***********************************************************************/
#include < stdio.h >
#include < stdlib.h >
#include < unistd.h >
#include < wiringPi.h >
int ButtonPin = 0; Motstånd i serie och kondensator ansluten till pin noll.
/***********************************************************************
* RCtime() - funktion, använder en digital pin för att mäta motstånd genom att först
* urladdning kondensator då mäta tiden det tar för att ladda den
* kondensator genom motståndet. När spänningen stiger till Vcc/2 det
* pin går hög.
***********************************************************************/
lång RCtime(int RCpin)
{
pinMode (RCpin, OUTPUT); Ställ in pinkodsskydd till utgång,
digitalWrite (RCpin, låg); och dra till låg.
Delay(4); Ge tid att låta kondensator ansvarsfrihet.
lång tid = micros();
pinMode (RCpin, indata); Nu ange PIN-koden till en ingång,
pullUpDnControl (RCpin, PUD_OFF); stänga av interna dra ner motstånd,
medan (digitalRead(RCpin) == låg); och vänta för att det ska gå högt.
lång PinVal = micros() - tid.
återvända PinVal;
}
/**************************************************************************
* loop() - funktionen körs i en kontinuerlig slinga tills programmet stoppas.
**************************************************************************/
void loop(void)
{
lång ButtonReading = RCtime(ButtonPin); Läs knappar i ButtonReading.
Switch(ButtonReading)
{
fallet 6200... 8000:
{
printf ("% ld - ingen knapp trycks. \n", ButtonReading);
bryta;
}
fallet 5500... 6199:
{
printf ("% ld - knappen en tryckte. \n", ButtonReading);
bryta;
}
fallet 4500... 5499:
{
printf ("% ld - knappen två pressade. \n", ButtonReading);
bryta;
}
fallet 3000... 4499:
{
printf ("% ld - knappen 3 pressande. \n", ButtonReading);
bryta;
}
fall 2000... 2999:
{
printf ("% ld - knappen fyra tryckte. \n", ButtonReading);
bryta;
}
fall 1000... 1999:
{
printf ("% ld - knappen fem tryckte. \n", ButtonReading);
bryta;
}
}
Delay(100);
}
/***********************************************************************
* setup() - funktionen drivs av Main () en gång när programmet startar.
***********************************************************************/
void setup(void)
{
wiringPiSetup(); Krävs.
RCtime(ButtonPin); Kasta ut första behandlingen.
}
/***********************************************************************
* Main () - krävs
***********************************************************************/
int main(void)
{
Setup();
While(1)
{
loop();
}
}
Ladda ner programmet och kompilera den med kommandot:
gcc -o växlar Switches.c - lwiringPi
Och kör programmet med kommandot:
sudo. / stänger