Kapcsolók

Kapcsolók, nyomógombok

5V HI aktív kapcsoló

Arduino kapcsoló HI aktív

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.

5V HI aktív kapcsoló
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ó

Arduino kapcsoló LO aktív

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ó

12V 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:

24V HI aktív kapcsoló

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.

Arduino 5V 8 párhuzamos kapcsoló

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:

Arduino 5V 3 állású kiválasztókapcsoló beolvasása analóg porton keresztül