Lühem ja lihtsam kood

Vaatame mõned näited, kuidas saab koodikirjutamist lihtsustada, et see oleks lühem ja ülevaatlikum.

Lühem ja lihtsam kood

if (r4 == 1 and lasto4 == 0){
if (r4){

 

// teegi tasandil juba eelmist i4 väärtust võrreldud
// ei ole vaja koodis enam definerida ega võrrelda

 

if (o1 == 0 and o2 == 0 and o3 == 0){
if (!(o1 + o2 + o3)){

 

// kui mitu muutujat peavad kõik olema nullis, siis peab ka 
// nende summa olema null, ehk ei ole midagi muud kui null

 

EnnePärast

//X-telg
if (r1 == 1 and lasto1 == 0){
  o1 = !o1;
    if (o1 and o4 == 0)
      print("X-telg Liigub edasi");
    else if (o4 == 0)
     print("X-telg ei liigu");


if (r1 == 1 and lasto1 == 0 and o4)
  if (o1){
    print("X-telg liigub tagasi");
}
  else if (o4 == 1){
    print("X-telg ei liigu");
}

//X-telg

if (r1){// kui mootor 1 nuppu vajutatakse

    o1 = !o1; // muuda re¾iim
    if (o1 & !o4)

        print("Mootor liigub edasi");  
    else if (o1)
        print("Mootor liigub tagasi");

    else

        print("Mootor seisab");

}

// dubleerib "X-telg ei liigu" lauset// lihtsustatud if ... else struktuur, ei dubleeri

 

EnnePärast

//X-telg

if (r1){// kui mootor 1 nuppu vajutatakse

    o1 = !o1; // muuda re¾iim
    if (o1 & !o4)

        print("Mootor liigub edasi");  
    else if (o1)
        print("Mootor liigub tagasi");

    else

        print("Mootor seisab");

}

//X-telg

if (r1){// kui mootor 1 nuppu vajutatakse

    o1 = !o1; // muuda re¾iim
    if (o1)

        print("Mootor liigub", !o4 ? "edasi":"tagasi");    

    else

        print("Mootor seisab");

}

// kasutab if ... else tingimuslauset// lühem tingimusoperaator ehk ternaarne operaator

 

Kui väljundid on 0 või 1 väärtusega, siis on need ka matemaatilistes tehetes kasutatavad, sh. liidetavad

EnnePärast

int loendur1 = 0;
// defineerib eelnevalt lisamuutuja

 

loendur1 = latch1+latch2+latch3;
if (loendur1 >= 2){// kui summa on üle 1

 

if ((o1+o2+o3) > 1){// summa üle 1

// kasutab eraldi int muutujat, liidab summa// lihtne liitmistehe tingimuslause sees

 

Enamasti on sulud täieliku kindlusega liitmisjärjekorda määravad, igaks juhuks tasub üle vaadata ka tingimuslausetes kasutatavate operaatorite prioriteetide järjekorra reeglid

 

Teegi tasandil on kõigi sisendite ja väljundite esmaseks andmetüübiks int, mis on omakorda paigutatud massiivi (ingl. array) ja neid saab kasutada indeksipõhiselt - näiteks esimene sisend on i[1], teine i[2] jne

Sarnaselt on defineeritud väljundid o[1], o[2] jne. tõususerv r[1], r[2] ning langev serv f[1], f[2] jne

Pikem, kordustegaLühem, for tsükliga

if (r[1]){

    o[1] = !o[1];

}

if (r[2]){

    o[2] = !o[2];

}

if (r[3]){

    o[3] = !o[3];

}

if (r[4]){

    o[4] = !o[4];

}

for (int a = 1; a < 5; a++){

    if (r[a]){

        o[a] = !o[a];

   }

}

// iga sarnane koodiplokk on korratud// for tsüklis dünaamiliselt

 

Teegi tasandil on kõigi sisendite ja väljundite esmaseks andmetüübiks int, mis on omakorda paigutatud massiivi (ingl. array) ja neid saab kasutada indeksipõhiselt - näiteks esimene sisend on i[1], teine i[2] jne

Sarnaselt on defineeritud väljundid o[1], o[2] jne. tõususerv r[1], r[2] ning langev serv f[1], f[2] jne

Loogeliste sulgudega, if lausegaTernaarse operaatoriga

for (int a = 1; a < 5; a++){

    if (r[a]){

        o[a] = !o[a];

   }

}

 

for (int a = 1; a < 5; a++)
    o[a] = r[a] ? !o[a] : o[a];

// kasutab if tingimust ja loogelisi sulge

// lühivariant, ternaarse operaatoriga

// nimetatud ka küsimärgi-kooloni operaatoriks

 

Eraldi liitmineTingimuslause sees

  int koik1 = o1 + o2 + o3;


  if (r4 == 1){
    if (koik1 >= 2){

  if (r4 == 1){
    if ((o1 + o2 + o3) // liidab kokku
        > 1){// kui lampidest vähemalt 2 on
Kasutab eraldi muutujat summa jaoksEraldi ridadel, tingimuslauses ja kommentaaridega

 

Geneeriline lahendus on oluliselt pikem, ega täida päris täpselt ülesandepüstituses kirjeldatut

GeneerilineTeegiga

const int btnPlus = 8;      // Nupp +1
const int btnMinus = 7;     // Nupp -1
const int btnInfo = A6;     // Nupp Info (Analoogsisend)

const int ledPlus = 12;   
const int ledMinus = 11; 
const int ledInfo = 10; 

int kogus = 0;              // Tomatikastide arv

// Nuppude eelmised olekud (et lugeda vajutust, mitte hoidmist)
bool lastStatePlus = false;
bool lastStateMinus = false;
bool lastStateInfo = false;

void setup(){
  // Seadistame jadaühenduse
  Serial.begin(9600); 

  // Seadistame sisendid ja väljundid
  pinMode(btnPlus, INPUT);
  pinMode(btnMinus, INPUT);
  // A6 on alati INPUT, pinMode pole kohustuslik, aga hea tava
  
  pinMode(ledPlus, OUTPUT);
  pinMode(ledMinus, OUTPUT);
  pinMode(ledInfo, OUTPUT);
  
  Serial.println("--- Tomatiloendur Valmis ---");
}

void loop(){
  // 1. Loeme nuppude hetkeolekud
  // A6 puhul eeldame, et nupp annab vajutades tugeva signaali (>500)
  bool p_plus = digitalRead(btnPlus);
  bool p_minus = digitalRead(btnMinus);
  bool p_info = analogRead(btnInfo) > 500; 

  // 2. NULLIMINE (Kõik kolm nuppu korraga)
  if (p_plus && p_minus && p_info){
    kogus = 0;
    digitalWrite(ledInfo, HIGH);
    Serial.println("Loendur on nullitud");
    
    // Ootame, kuni nupud vabastatakse, et vältida kohest uuesti lugemist
    while(digitalRead(btnPlus) || digitalRead(btnMinus) || analogRead(btnInfo) > 500){delay(10);}
    digitalWrite(ledInfo, LOW);
    return; // Alustame loopi otsast
 }

  // 3. Loendur +1
  if (p_plus && !lastStatePlus){// Tuvastame vajutuse hetke (rising edge)
    kogus++;
    digitalWrite(ledPlus, HIGH); // LED korraks põlema
    delay(100);                  // Väike viide ja debounce
    digitalWrite(ledPlus, LOW);
 }
  lastStatePlus = p_plus; // Salvestame oleku

  // 4. Loendur -1
  if (p_minus && !lastStateMinus){
    if (kogus > 0) kogus--; // Väldime negatiivseid kaste
    digitalWrite(ledMinus, HIGH);
    delay(100);
    digitalWrite(ledMinus, LOW);
 }
  lastStateMinus = p_minus;

  // 5. Info kuvamine (Serial Monitor)
  if (p_info && !lastStateInfo){
    digitalWrite(ledInfo, HIGH);
    // Kompaktne väljastus ühel real
    Serial.print("Loendur "); Serial.print(kogus); Serial.println(" kasti");
    delay(100);
    digitalWrite(ledInfo, LOW);
 }
  lastStateInfo = p_info;

  delay(50); 
}

  if (r1 == 1){
     c[1]++;
 }
  if (r2 == 1){
     c[1]--;
  }
  if (r3 == 1){
    pr("Loendur " + c[1] + " Kasti");
 }
  if (i1 + i2 + i3 == 3){
    c[1] = 0;
    pr("loendur on nullitud");
 }
  

 

Eesmärk on teha muutre¾iimis LED tulede o1-o4 lülitused ja anda jadapordi kaudu teada olekust

KordustegaTsükliga

if (r1){
      o1= !o1;
      pr("1. LED-i olek ", o1); 

}

 

if (r2){
      o2= !o2;
      pr("2. LED-i olek ", o2); 

}

 

if (r3){
      o3= !o3;
      pr("3. LED-i olek ", o3); 

}

 

if (r4){
      o4= !o4;
      pr("4. LED-i olek ", o4); 

}

for (int a = 1; a < 5; a++){
    if (r[a]){
      o[a] = !o[a];
      pr(a, ". LED-i olek ", o[a]); 
   }
}
Kasutab muutujaid r1, o1, r2, o2, r3, o3, r4 ja o4Massiivid indeksitega, r[a] ja o[a]

 

Monteeri lihtsalt ja kiiresti

Riistvara montaa¾ on jaotatud etappideks ja toetatud õppevideodega. Vaata lähemalt.

 

Tarkvaratugi

Loe riistvaralist portide lugemist ja muutujate defineerimist toetava tarkvarateegi kohta