Kapcsolók, nyomógombok
Kapcsolók, nyomógombok hardveres bekötései
5V HI aktív kapcsoló
A fenti képen egy HI aktív kapcsolóbekötés látható. Az áramkör nyitott, nyugalmi helyzetében az Arduino egy 10 kΩ-os (lehúzó) ellenálláson keresztül a grundra van kötve, így LO állapotban van. A nyomógomb lenyomásával a tápot kötjük rá (ajánlott egy 100Ω-oes ellenállást azért elékötni) a bemenetre, így az HI állapotba kerül.
forrás: https://www.arduino.cc/en/Tutorial/Button
A lenti példaprogram a nyomógomb állapota alapján a beépített LED-et kapcsolgatja. Alatta a példaprogram az egyszerű befűzéshez (copy-paste):
/* Button Turns on and off a light emitting diode(LED) connected to digital pin 13, when pressing a pushbutton attached to pin 2. The circuit: - LED attached from pin 13 to ground - pushbutton attached to pin 2 from +5V - 10K resistor attached to pin 2 from ground - Note: on most Arduinos there is already an LED on the board attached to pin 13. created 2005 by DojoDave <http://www.0j0.org> modified 30 Aug 2011 by Tom Igoe This example code is in the public domain. http://www.arduino.cc/en/Tutorial/Button */ // constants won't change. They're used here to set pin numbers: const int buttonPin = 2; // the number of the pushbutton pin const int ledPin = 13; // the number of the LED pin // variables will change: int buttonState = 0; // variable for reading the pushbutton status void setup() { // initialize the LED pin as an output: pinMode(ledPin, OUTPUT); // initialize the pushbutton pin as an input: pinMode(buttonPin, INPUT); } void loop() { // read the state of the pushbutton value: buttonState = digitalRead(buttonPin); // check if the pushbutton is pressed. If it is, the buttonState is HIGH: if (buttonState == HIGH) { // turn LED on: digitalWrite(ledPin, HIGH); } else { // turn LED off: digitalWrite(ledPin, LOW); } }
Mindez tömörebben (copy-paste-hez):
const int buttonPin = 2; // the number of the pushbutton pin // variables will change: int buttonState = 0; // variable for reading the pushbutton status void setup() { // initialize the pushbutton pin as an input: pinMode(buttonPin, INPUT); } void loop() { // read the state of the pushbutton value: buttonState = digitalRead(buttonPin); if (buttonState == HIGH) { // button state on: ; } else { // button state off: ; } }
5V LO aktív kapcsoló
A fenti képen egy LO aktív kapcsolóbekötés látható. Az áramkör nyitott, nyugalmi helyzetében az Arduino egy 10 kΩ-os (felhúzó) ellenálláson keresztül a tápra (ajánlott egy 100Ω-oes ellenállást azért elékötni) van kötve, így HI állapotban van. A nyomógomb lenyomásával a grundot kötjük rá a bemenetre, így az LO állapotba kerül.
Belső felhúzóellenállás
Az Arduino-kben található belső felhúzóellenállás is, mely board-típusonként változó, az Uno-nál ez 20kΩ - 50kΩ, míg a Due-nél 50kΩ - 150kΩ között változik ennek az éréke. Ez a belső ellenállás kétféle módon kapcsolható be:
Hivatalosan így:
pinMode(pin,INPUT_PULLUP);
de ez nem minden esetben működik, több board-nál a fordító hibát dod rá. Ilyenkor a megoldás:
pinMode(pin, INPUT); // set pin to input digitalWrite(pin, HIGH); // turn on pullup resistors
Nyilván ezzel a módszerrel legalább egy ellenállás megspórolható az 5V HI aktív kapcsoló-hoz képest, de ha a vezeték a kapcsolóig hosszú, vagy sok zavarójel várható a környezetből, a nagy ellenállás hibás észlelésekhez vezethet.
12V/24V HI aktív kapcsoló
Az Arduino 5V HI aktív kapcsoló természetesen nagyobb tápfeszültségről is alkalmazható bemeti ellenállások beiktatásával. A konenzátor és a 100 Ω-os bemeneti ellenállás opcionális. Problémás bemenet esetén mindenképpen érdemes opto-t használni a kritikus részek leválasztására.
24V-os táppal a kapcsolás:
5V 8 párhuzamos kapcsoló
A lenti példán 8 nyomógomb beolvasása látható egy analóg bemeneten keresztül. A nyomógombok bemeneti ellenállásai 100kΩ-mal vannak egymástól elválasztva, így lenyomásuk hatására más-más értéket fog adni a bemenet. A bemeneti pin alapértelmezetten a grund-ra van kötve egy fél megaohmos (lehúzó)ellenálláson keresztül.
A lenti kódban a fényképnek megfelelően a lenyomott nyomógomb kódját kiírja a kétsoros I2C LCD-kijelző és a szerial-monitor is.
Pontatlan működés esetén a nyomógombokhoz tartozó minimális analóg-értékeket (mins array) be kell állítani!
Alapértelmezett kimenet (gombnyomás nélkül): 9.
Példaprogram
#include <Wire.h> #include <LCD.h> #include <LiquidCrystal_I2C.h> #define I2C_ADDR 0x3F // Define I2C Address where the PCF8574A is #define BACKLIGHT_PIN 3 #define En_pin 2 #define Rw_pin 1 #define Rs_pin 0 #define D4_pin 4 #define D5_pin 5 #define D6_pin 6 #define D7_pin 7 int sw = 0; int mins[] = {1024, 1000, 800, 740, 640, 560, 520, 480, 400, -100}; LiquidCrystal_I2C lcd(I2C_ADDR,En_pin,Rw_pin,Rs_pin,D4_pin,D5_pin,D6_pin,D7_pin); int sensorPin = A0; int sensorValue = 0; int ledPin = 13; // select the pin for the LED void setup() { pinMode(ledPin, OUTPUT); Serial.begin(9600); while (!Serial) ; // wait for serial delay(200); lcd.begin (16,2); // Switch on the backlight lcd.setBacklightPin(BACKLIGHT_PIN,POSITIVE); lcd.setBacklight(HIGH); lcd.home (); // go home lcd.print("button pressed:"); lcd.setCursor ( 0, 1 ); // go to the 1nd line lcd.print(" (9:none)"); } void loop() { // read the value from the sensor: sensorValue = analogRead(sensorPin); sw = 0; for (int i = 1; sw == 0; i++) { if (sensorValue > mins[i]) { sw = i; } } Serial.print (sensorValue); Serial.print (" >> button pressed: "); Serial.print (sw); Serial.println (" (9: none) "); lcd.setCursor ( 0, 1 ); // go to the 1nd line lcd.print(sw); delay(1000); }
5V 3 állású kiválasztókapcsoló
A háromállású kapcsolót az egyik programhoz akartam beolvasni, és nem egyet, hanem rögtön négyet, de nem volt már ennyi szabad digitális pin. Viszont volt még 4 szabad analóg bemenet, ezek tökéletesen megfeleltek a célnak. Az alábbi bekötést követően a grund-ra kötött bemenet 0-t, az 5V-ra 1024-et, a középső állás pedig nagyjából 600-at ad eredményként: