Tekstitykset
Kytkimet ja tilan vaihto
Johdanto
Aiemmassa harjoituksessa vaihdoit ledin tilaa aina, kun nappi oli pohjassa. Tämä johti siihen, että ledin tila vaihtui tuhansia kertoja napin ollessa pohjassa ja siten ledi jäi hieman sattumanvaraisesti joko päälle tai pois päältä.
Tässä harjoituksessa opit ohjelmoimaan rakenteen, jolla ledin tai muun outputin tila vaihdetaan päinvastaiseksi aina, kun nappia klikataan eli painetaan pohjaan ja päästetään ylös.
Tällainen ohjelma on todella hyödyllinen oikeastaan aina, kun haluat laittaa asioita päälle ja pois päältä Arduinon välityksellä. Yhdellä klikkauksella saat laitteen päälle ja seuraavalla pois päältä.
Alla olevassa videossa käyteään tämänkaltaista mekanismia valojen vaihtamiseksi käsiä taputtamalla. Videossa Arduinoon kytkettävää mikrofonia pääsetkin käyttämään seuraavassa luvussa.
Hamza Qayyum: Adding a Clap Switch to my Room!
Tarvikkeet
Mehackit boardin (tai Arduinon), USB-johdon, koekytkentälevyn ja johtimien lisäksi tarvitset seuraavat komponentit.
Osa | Kuva | Kuvaus |
---|---|---|
LED x 3 | Pidempi jalka (kuvassa mutkallinen) eli anodi + -napaan eli Arduinon porttiin. Lyhyempi jalka eli katodi miinus-napaan eli maahan. | |
Vastus 330 Ω x 3 | Vastus vastustaa sähkövirran kulkua. Vastuksen arvo mitataan ohmeissa (Ω) ja ilmoitetaan komponentissa eri värisinä raitoina (tässä oranssi, oranssi, ruskea ja kulta). | |
Painonappi x 3 | Mehackit Maker Kitin painonappi on valkoinen, ei ruskea. |
Virtapiiri
- Kytke nappi porttiin 2 ja maahan.
- Kytke ledin pidempi jalka porttiin 5 ja lyhyempi jalka vastuksen kautta maahan.
Ohjelman tavoite
Kun kytkintä “klikataan” (suljetaan ja avataan), ledin tila vaihtuu. Ledi menee siis pois päältä jos se oli aiemmin päällä, ja päälle jos se oli aiemmin pois päältä.
Tutut komennot
- pinMode(portti, asetus)
- digitalRead(portti): Lukee digitaalisen portin tilan.
- If-rakenne: Ehtolauseiden tekeminen.
- int-muuttujan luominen: int-tyypin muuttujaan voidaan tallentaa kokonaislukuarvoja.
Uudet komennot
- arvojen yhtäsuuruus (==): Näin voidaan verrata, ovatko kaksi arvoa keskenään identtiset.
- arvojen erisuuruus (!=): Näin voidaan verrata, ovatko kaksi arvoa keskenään erilaiset.
Ohjelmointi 1/3
Kuten aiemmin esiteltiin, voit luoda useita muuttujia samaa ohjelmaa varten. Usein on hyödyllistä vertailla näiden muuttujien saamia arvoja keskenään.
Jos muuttujiin tallennetaan arvoja kytkimistä, ovat ne aina 1 tai 0, eli päällä tai pois päältä. Näitä arvoja voidaan vertailla seuraavilla tavoilla.
if (buttonState == lastButtonState){
//Tämä osa ohjelmaa tapahtuu, jos muuttujat ovat yhtä suuria
}
Huomaa, että edellisen esimerkin merkintää “==” käytetään aina, jos kokeillaan arvojen yhtäsuuruutta! Jos taas muuttujalle halutaan asettaa arvo, käytetään merkintää “=”.
Alla on toisenlainen esimerkki.
if (buttonState != lastButtonState){
//Tämä osa ohjelmaa tapahtuu, jos muuttujat ovat erisuuruisia
}
Tässä esimerkissä if-lause suoritetaan, jos arvot ovat keskenään erilaiset.
int buttonState = 0;
int lastButtonState = 1;
int counter = 0;
void loop(){
if (buttonState != lastButtonState){
if (buttonState == 1){
counter = 1;
}
}
}
Mikä on muuttujan counter arvo, kun ohjelman koodirivit on suoritettu kerran läpi?
Ohjelmointi 2/3
int buttonState = 0;
int lastButtonState = 0;
int counter = 0;
void setup(){
pinMode(2, INPUT_PULLUP);
Serial.begin(9600);
}
void loop(){
buttonState = digitalRead(2);
if (buttonState != lastButtonState){
if (buttonState == 1){
counter = counter + 1;
}
}
lastButtonState = buttonState;
Serial.println(counter);
}
Milloin muuttujaan counter lisätään aina arvo 1?
Ohjelmointi 3/3
int buttonState = 0;
int lastButtonState = 0;
int ledState = 0;
int counter = 0;
void setup() {
pinMode(2, INPUT_PULLUP);
pinMode(5, OUTPUT);
Serial.begin(9600);
}
void loop() {
Serial.println(counter);
buttonState = digitalRead(2);
if (buttonState != lastButtonState){
if(buttonState == HIGH){
ledState = !ledState;
counter = counter + 1;
}
}
lastButtonState = buttonState;
digitalWrite(5, ledState);
}
```