Apparaat – Drukknop of schakelaar
Arduino
In dit voorbeeld gebruiken we een drukknop om een LEDje aan en uit te schakelen, er is echter een handigheidje nodig met een tijdsinterval om de ‘ruis’ van de digitale poort te onderdrukken, dit is omdat de digitale poort wel duizenden keren per seconde wordt uitgelezen, dit geeft voor een drukknop geen goed beeld, vandaar de ‘timer’, sluit het volgende aan via onderstaand schema:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 |
int DrukknopPin = 2; // de digitale poort waarop de drukknop is aangesloten. int LedPin = 5; // de digitale poort waarop de LED is aangesloten. int Ledstatus = HIGH; // de huidige (start) status van de LedPin. int uitlezing; // de huidige uitlezing van de LedPin. int vorigestatus = LOW; // de vorige (oude) status van de LedPin. long tijd = 0; // de laatste tijd wanneer de LedPin is geschakeld. long terugvaltijd = 200; // de terugvaltijd, hoger instellen als de LED knippert. void setup() { pinMode(DrukknopPin, INPUT); pinMode(LedPin, OUTPUT); } void loop() { uitlezing = digitalRead(DrukknopPin); // als de ingang van de drukknop van LAAG naar HOOG is gegaan en we hebben // lang genoeg gewacht om de ruis te onderdrukken, schakel de LedPin en onthoud // de tijd. if (uitlezing == HIGH && vorigestatus == LOW && millis() - tijd > terugvaltijd) { if (Ledstatus == HIGH) { Ledstatus = LOW; // Ledstatus = HOOG, de LED moet uit. } else { Ledstatus = HIGH; // Ledstatus = LAAG, de LED moet aan. } tijd = millis(); } digitalWrite(LedPin, Ledstatus); // zet LED aan of uit. vorigestatus = uitlezing; } |
Een ander voorbeeld met ingebouwde pull-up weerstand, dat scheelt componenten:
1 2 3 4 5 6 7 8 9 10 |
void setup() { pinMode(2, INPUT_PULLUP); } void loop() { if (digitalRead(2) == LOW) { //DO SOMETHING } } |
Raspberry Pi
In dit voorbeeld gaan we een schakelaar uitlezen via de GPIO pinnen van de Raspberry Pi met een python script.
Wat heb je nodig?
1) Python RPi.GPIO bibliotheek
Sluit een Schakelaar/Knop aan met weerstanden volgens onderstaand schema, gebruik als GPIO pin: 17
Floating tegen gaan
De weerstanden heb je nodig voor een pull-down op de ingang, anders is de ingang “floating”.
Voorbeeld schakelaar uitlezen:
Hieronder vind je een python script in om de schakelaar stand uit te lezen, dit wordt 4 x per seconde gedaan, de status wordt geprint naar de console.
Maak een bestand aan, bijvoorbeeld /usr/src/knop.py (evt onder root, en vergeet niet chmod te gebruiken om het bestand uit te kunnen voeren), voeg deze inhoud daar in toe:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 |
#!/bin/python # importeer de GPIO bibliotheek. import RPi.GPIO as GPIO # Importeer de time biblotheek voor tijdfuncties. from time import sleep # Zet de pinmode op Broadcom SOC. GPIO.setmode(GPIO.BCM) # Zet waarschuwingen uit. GPIO.setwarnings(False) # Zet de GPIO pin als ingang. GPIO.setup(17, GPIO.IN) try: while True: # Wacht 1/4 van een seconde sleep(.250) # Lees de status van de GPIO pin uit. if GPIO.input(22): # Schakelaar is AAN. print "Schakelaar AAN, GPIO status:", GPIO.input(22) else: # Schakelaar is UIT. print "Schakelaar UIT, GPIO status:", GPIO.input(22) except KeyboardInterrupt: # GPIO netjes afsluiten GPIO.cleanup() |
Run het script met: sudo python /usr/src/knop.py , druk een paar keer op de schakelaar, dit is de output:
Druk op CTRL+C om het script te stoppen!