ebSkola

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.

  1. Izveido Tinkercad jaunu Circuit projektu ar Arduino Uno un maketo plati.
  2. Savieno 5V ar sarkano (+) līniju un GND ar melno (-) līniju.
  3. Pievieno LED diodi 13. pinam caur 220 omu rezistoru, īso kāju uz GND.
  4. Ievelc komponenti "Pushbutton" pāri maketo plates vidus gropītei, lai kājas ir abās pusēs.
  5. Savieno vienu pogas apakšējo kāju ar Arduino 2. pinu.
  6. 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.

  1. Pārslēdz redaktoru uz koda (Text) skatu.
  2. Ieraksti funkcijā setup() rindu Serial.begin(9600);.
  3. Pievieno tajā pašā setup() rindu pinMode(2, INPUT_PULLUP);.
  4. Ieraksti funkcijā loop() rindu int pogasStavoklis = digitalRead(2);.
  5. Pievieno zem tās Serial.println(pogasStavoklis); un delay(100);.
  6. Nospied "Start Simulation" un atver koda loga apakšā "Serial Monitor".
  7. 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.

  1. Pievieno funkcijā setup() rindu pinMode(13, OUTPUT);.
  2. Ieraksti funkcijā loop() zem pogas nolasīšanas rindu if (pogasStavoklis == LOW) {.
  3. Pārbaudi, ka salīdzināšanai lieto divas vienādības zīmes ==, nevis vienu.
  4. Ieraksti figūriekavās komandu digitalWrite(13, HIGH);.
  5. Pievieno zem tām } else { un komandu digitalWrite(13, LOW);.
  6. Palaid simulāciju un paspaid pogu.
  7. Pieraksti vienu secinājumu: kāpēc nospiesta poga dod LOW, nevis HIGH.

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.

  1. Ievelc maketo platē otru LED ar savu rezistoru un savieno to ar pin 12.
  2. Pievieno funkcijā setup() rindu pinMode(12, OUTPUT);.
  3. Ieraksti if daļā: 13. pins HIGH, 12. pins LOW.
  4. Ieraksti else daļā tieši pretēji: 13. pins LOW, 12. pins HIGH.
  5. 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īji INPUT, nevis INPUT_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
  }
}
        
Pēc simulācijas palaišanas LED diode nedegs. Nospiežot un turot pogu ar peli, LED diode iedegsies. Atlaižot pogu, tā uzreiz izslēgsies. Serial Monitor vienlaicīgi rādīs ciparu 0 (nospiesta) vai 1 (atlaista).