2.2 Pogas un If-Else loģika
Stundas uzdevums: Pareizi pieslēgt spiedpogu maketo platei, nolasīt tās stāvokli (nospiesta vai atlaista) un izveidot C++ programmu, kas ieslēdz LED diodi tikai tad, kad poga ir nospiesta.
Datorika 7. klase (D.7.2.1., D.7.3.1., D.7.6.1.)70 min plāns: Teorija un paraugs (~10 min) · 1. uzdevums (~15 min) - saliec shēmu ar pogu un LED · 2. uzdevums (~20 min) - izdrukā pogas stāvokli Serial Monitor · 3. uzdevums (~25 min) - liec pogai ieslēgt diodi ar if-else. Papildu uzdevumu sāc tikai tad, ja pārējie trīs ir gatavi.
Pirms sāc: atver tinkercad.com un savu 2.1 stundas shēmu - to varēsi izmantot kā sākuma punktu, jo LED slēgums paliek tāds pats.
Teorija: Kā Arduino nolasa pogas spiedienu?
Iepriekš mēs devām komandas uz āru (OUTPUT), lai ieslēgtu gaismu. Tagad mums jāsaņem informācija iekšā (INPUT) no pogas. Bet elektrībā ir kāds āķis – ja vads "karājas gaisā" un nav nekur pieslēgts, tas uztver traucējumus un "kļūst traks" (Floating pin). Lai to novērstu, mēs izmantosim iebūvēto drošības sistēmu – PULL-UP rezistoru.
- Spiedpoga (Pushbutton): Tinkercad vidē spiedpogai ir 4 kājas. Tomēr pa diagonāli izvietotās kājas ir savienotas kopā. Kad pogu nospiež, tā savieno kreiso un labo pusi.
- INPUT_PULLUP: Rakstot
pinMode(2, INPUT_PULLUP);, Arduino iekšēji pieslēdz pinu pie 5V (HIGH). Ja pogu savienosim ar mīnusu (GND), nospiežot to, strāva aizskries uz mīnusu un rādījums kļūs LOW. Tātad: Poga atlaista = HIGH; Poga nospiesta = LOW. - digitalRead(pin): Šī komanda nolasa, vai pinā ir strāva (HIGH) vai nav (LOW). Mēs šo vērtību varam saglabāt mainīgajā, piemēram:
int pogasStavoklis = digitalRead(2); - If-Else sintakse: C++ valodā "Ja-Tad" bloks izskatās šādi:
if (nosacījums) { ...kods... } else { ...kods... }. Pārbaudot, vai kaut kas ir vienāds ar kaut ko citu, OBLIGĀTI jāraksta divas vienādības zīmes ==, nevis viena!
Vizuālais orientieris: pogai jābūt pāri maketo plates viduslīnijai; viena puse savienojas ar GND, otra ar Arduino 2. pinu.
Praktiskie uzdevumi
1. uzdevums -
Saliec shēmu ar pogu un LED
Beigās tavā shēmā būs gan diode uz 13. pina, gan poga uz 2. pina.
- Izveido Tinkercad jaunu Circuit projektu ar Arduino Uno un maketo plati.
- Savieno 5V ar sarkano (+) līniju un GND ar melno (-) līniju.
- Pievieno LED diodi 13. pinam caur 220 omu rezistoru, īso kāju uz GND.
- Ievelc komponenti "Pushbutton" pāri maketo plates vidus gropītei, lai kājas ir abās pusēs.
- Savieno vienu pogas apakšējo kāju ar Arduino 2. pinu.
- Savieno otru pogas apakšējo kāju ar melno GND līniju.
Gatavs, kad: poga sēž pāri gropītei un no tās iet tieši divi vadi - uz 2. pinu un uz GND.
2. uzdevums -
Izdrukā pogas stāvokli Serial Monitor
Beigās tu ekrānā redzēsi ciparu 1, kad poga ir atlaista, un 0, kad nospiesta.
- Pārslēdz redaktoru uz koda (Text) skatu.
- Ieraksti funkcijā
setup()rinduSerial.begin(9600);. - Pievieno tajā pašā
setup()rindupinMode(2, INPUT_PULLUP);. - Ieraksti funkcijā
loop()rinduint pogasStavoklis = digitalRead(2);. - Pievieno zem tās
Serial.println(pogasStavoklis);undelay(100);. - Nospied "Start Simulation" un atver koda loga apakšā "Serial Monitor".
- Paspaid pogu ar peli un vēro, kā mainās skaitlis.
Gatavs, kad: Serial Monitor rāda 1, kamēr poga ir vaļā, un 0 tieši tajā brīdī, kad to spied.
3. uzdevums -
Liec pogai ieslēgt diodi ar if-else
Beigās diode degs tikai tik ilgi, kamēr tu turi pogu nospiestu.
- Pievieno funkcijā
setup()rindupinMode(13, OUTPUT);. - Ieraksti funkcijā
loop()zem pogas nolasīšanas rinduif (pogasStavoklis == LOW) {. - Pārbaudi, ka salīdzināšanai lieto divas vienādības zīmes
==, nevis vienu. - Ieraksti figūriekavās komandu
digitalWrite(13, HIGH);. - Pievieno zem tām
} else {un komandudigitalWrite(13, LOW);. - Palaid simulāciju un paspaid pogu.
- Pieraksti vienu secinājumu: kāpēc nospiesta poga dod
LOW, nevisHIGH.
Gatavs, kad: diode iedegas, kad turi pogu, un nodziest, tiklīdz to atlaid.
Papildu uzdevums - "Reversais" luksofors
Ja pamatdarbs ir gatavs, pievieno otru diodi tā, lai vienmēr deg tieši viena.
- Ievelc maketo platē otru LED ar savu rezistoru un savieno to ar
pin 12. - Pievieno funkcijā
setup()rindupinMode(12, OUTPUT);. - Ieraksti
ifdaļā: 13. pinsHIGH, 12. pinsLOW. - Ieraksti
elsedaļā tieši pretēji: 13. pinsLOW, 12. pinsHIGH. - Palaid simulāciju un pārbaudi abus stāvokļus.
Gatavs, kad: vienmēr deg tieši viena diode - nekad abas un nekad neviena.
Biežākās kļūdas (un kā tās labot):
- Poga visu laiku lēkā starp 0 un 1 pati no sevis: Tu
setup()daļā uzrakstījiINPUT, nevisINPUT_PULLUP. Bez pull-up rezistora pins karājas gaisā un uztver traucējumus. - Kods nestrādā, un rāda kļūdu pie "if" rindiņas: Pārbaudi vienādības zīmes! Salīdzināšanai jāraksta
if (pogasStavoklis == LOW). Ar vienu=dators domā, ka tu maini mainīgā vērtību, nevis uzdod jautājumu. - Pogu nospiežot nekas nenotiek, shēma ir pareiza: Ja poga ievietota vienā līnijā, nevis pāri gropītei, tās kājas saslēdzas īssavienojumā uzreiz. Vienmēr liec pogu pāri maketo plates vidum.
Koda piemērs (INPUT_PULLUP un == - grūtākā daļa)
// Divas vietas, kur šajā stundā apstājas gandrīz visi:
// 1) pinMode(..., INPUT_PULLUP) - bez PULLUP poga "lēkā" pati no sevis
// 2) if (x == LOW) - ar vienu = zīmi kods nesalīdzina, bet PIEŠĶIR vērtību
int buttonPin = 2; // Nodefinējam portus ar vārdiem ērtībai
int ledPin = 13;
void setup() {
pinMode(ledPin, OUTPUT);
// INPUT_PULLUP pieslēdz iekšējo rezistoru, padarot pinu HIGH (1)
pinMode(buttonPin, INPUT_PULLUP);
Serial.begin(9600);
}
void loop() {
// Nolasām pogas stāvokli (0 vai 1)
int pogasStavoklis = digitalRead(buttonPin);
// Drukājam monitorā testēšanai
Serial.println(pogasStavoklis);
// Ja poga nospiesta (savienota ar zemi / LOW)
if (pogasStavoklis == LOW) {
digitalWrite(ledPin, HIGH); // Ieslēdz LED
} else {
digitalWrite(ledPin, LOW); // Izslēdz LED
}
}