Скочи на садржај

Матурски задатак 4ЕТР-Б30 – Индикатор уласка

Враћамо се мало у прошлост, у време класичних фото-апарата и мрачних комора, средстава за развијање слика и њихово пребацивање са негатива на фото папир. Мрачна комора мора бити потпуно мрачна како би се слика успешно развила. Задатак у овом случају биће развој електронског кола чији је задатак управљање радом две диоде, црвене и зелене. Светлење црвене диоде означава да је комора заузета и да фотограф ради. Уколико светли зелена, комора је слободна и њена врата се смеју отворити. Радом диода се управља командама које се задају са рачунара.

Задатак

Контролисање рада две лед диоде помоћу команди са рачунара, под контролом се подразумева избор диоде која светли, као и периоде којом трепери. Корисник може задавати следеће команде: #crvena, #zelena, #uvecaj и #smanji.

У једном тренутку светли само једна диода.

Потребне компоненте

  • Ардуино УНО
  • Две лед диоде (црвена и зелена)
  • Два отпорника 220Ω

Електрична шема

Програм (скица)

const int diode[] = {4, 5}; 
const int perioda[] = {500, 1000, 1500, 2000}; 
int indexPeriode = 0; 
int indexDiode = -1; 
int duzinaNiza; 
String komanda; 

void setup() { 
  Serial.begin(9600); 
  duzinaNiza = sizeof(perioda) / sizeof(int) - 1; 
  for(int i=0; i<2; i++) {
    pinMode(diode[i], OUTPUT); 
    digitalWrite(diode[i], LOW); 
  }
} 

void loop() { 
  diodaTreperi(indexDiode);
} 

void diodaTreperi(int d) { 
  digitalWrite(diode[d], HIGH); 
  delay(perioda[indexPeriode]); 
  digitalWrite(diode[d], LOW); 
  delay(perioda[indexPeriode]); 
} 

void serialEvent() {
  if(Serial.available()) {
    komanda = Serial.readString();
    komanda.trim();
    
    if(komanda.equals("#CRVENA") || komanda.equals("#crvena")) {
      indexDiode = 0;
    }
    else if(komanda.equals("#ZELENA") || komanda.equals("#zelena")) { 
      indexDiode = 1; 
    }
    else if(komanda.equals("#UVECAJ") || komanda.equals("#uvecaj")) { 
      if(indexPeriode < duzinaNiza) indexPeriode++; 
    }
    else if(komanda.equals("#SMANJI") || komanda.equals("#smanji")) { 
      if(indexPeriode > 0) indexPeriode--; 
    } else { 
      Serial.println("Nepoznata komanda, nema promene stanja programa"); 
    }
  } 
}

Диоде које се користе у колу су повезане на дигиталне пинове 4 и 5, а у програму су дефинисане низом.

Периода којом диоде требају да трепере су такође дефинисане низом и дозвољене вредности су од 500 до 2000 што представља број милисекунди колико је диода укључена, односно искључена.

Индекс периоде је помоћна променљива која омогућава избор одговарајуће вредности за периоду којом ће диода треперети.

Декларација променљивих

Диоде су повезане на дигиталне пинове 4 и 5, што је у програму дефинисано низом diode чије су вредности 4 и 5. Периода којом диоде трепере је такође дефинисана низом са вредностима 500, 1000, 1500 и 2000. Ове вредности представљају временски интервал колико је диода укључена и искључена изражено у милисекундама. Променљива indexPeriode има почетну вредност 0, како би њена вредност показивала на први елемент низа perioda. Ово омогућава да по укључивању диоде, периода тереперења буде 500 милисекунди, што је дефинисано задатком. Још једна променљива indexDiode има почетну вредност -1, како би омогућила да на почетку програма ни једна диода не светли. Дужина низа је помоћна променљива која се користи код одређивања дужине низа perioda, како би се обезбедила логичка контрола за рад са низом.

Конфигурациона функција

Setup функција је једноставна и у њеном телу је смештена иницијализација серијске везе између Ардуина и рачунара, у фор петљи је подешено да пинови из низа diode раде у излазном режиму, као и да су диоде на почетку искључене.

Функција петље

У loop функцији постоји само један ред који позива функцију diodaTreperi са параметром који представља индекс диоде из низа diode која треба да буде укључена.

Корисничка функција – diodaTreperi

Као што је већ речено функција diodaTreperi има један параметар (индекс диоде која треба бити укључена) и омогућава ефекат треперења диоде. Одређена диода ће бити укључена/искључена што је одређено редовима digitalWrite(diode[d], HIGH/LOW). Период треперења се врши читањем одговарајуће вредности из низа perioda и то на следећи начин – delay(perioda[indexPeriode]);

Функција – SerialEvent

Најважнији део програма је садржан у функцији serialEvent. Ова функција се извршава на крају сваке итерације loop функције и то онда када постоје подаци уписани у серијски бафер Ардуина. Омогућује учитавање команди послате са рачунара и то #crvena, #zelena, #uvecaj и #smanji. Остали уноси корисника биће занемарени уз исписивање одговарајуће поруке. У овој функцији одређује се која ће диода бити укључена, што је одређено командама #crvena, #zelena. Командом #crvena се вредност променљиве indexDiode поставља на вредност 0, односно командом #zelena се поставља на вредност 1. Поред тога, одређује се и периода треперења диода, командама #uvecaj и #smanji. Ове команде увећавају, односно смањују вредност променљиве indexPeriode и имају логичку контролу да њена вредност не може бити мања од 0 и већа од вредности променљиве duzineNiza.