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

Матурски задатак 4ЕТР-Б12 – Баци коцку

Иако овај задатак намеће нека етичка питања, бавићу се решавањем овог проблема. Задатак је пројектовање игре на срећу за основце (тако каже текст задатка), где ће се на ЛЦД дисплеју исписивати случајно изабран број од 1 до 6 – једноставније речено, ради се о симулацији бацања коцке.

Анализа и препоруке за решавање задатка

Почећу од рада са тастером, као што је у ранијем тексту наведено, најбољи метод за рад са тастерима је коришћење прекида. Ово је неопходно како би се тренутно регистровао притисак тастера и одмах реаговало на тај догађај. У овом случају је то генерисање насумичног броја између 1 и 6. Може да се каже и да се притиском на тастер позива функција генеришиБрој.

Повезивање ЛЦД дисплеја је мање више стандарндо, више се може наћи у тексту о ЛЦД дисплеју. На дигиталне пинове Ардуино плочице се повезују пинови модула ЛЦД дисплеја RS (Register Select), E (Enable) као и пинови података од D4 до D7 (коришћење 4 пина за пренос података што значи да ЛЦД дисплеј ради у 4 битном режиму).

Од константи у решењу постоји једна која се односи на пин на који је повезан тастер.

Од променљивих постоје четири, једна која ће представљати модул ЛЦД дисплеја, затим стринг који ће садржати поруку о генерисаном броју (приказ стринга формата „Ваш Х број је У“), потребан је и бројач који ће садржати информацију о броју бацања коцке и нестална променљива која ће чувати податак о случајно генерисаном броју.

У структурној организацији кода волим да користим функције како би сам код био читљивији и организован у логичке блокове који раде одређени задатак. То су функције генеришиБрој, креирајПоруку и прикажиПоруку.

Електрична шема и повезивање кола

Електрично коло се састоји од:

  • микроконтролера,
  • ЛЦД дисплеја,
  • потенциометра,
  • тастера и
  • осталих потребних компонената за реализацију кола.

Оно што је потребно да се изврши по покретању програма је да се:

  • прикаже натпис „Добро дошли“ који ће се померати са лева на десно 3 секунде и затим још 3 секунде са десна на лево;
  • након приказа поруке добродошлице на дисплеју се приказује порука „Баци коцку“;
  • притиском тастера на дисплеју се у горњем реду исписује „Ваш Х број је У“ (где је Х редни број бацања, а У случајан број од 1 до 6;
  • у доњем реду је потребно исписати поруку „Поновите бацање“ уколико је добијен број 6.

Видео туторијал

Програм – скица

#include <LiquidCrystal.h>
const int btn = 2;
volatile int randBroj = 0;
int brojac = 1;
String poruka;

LiquidCrystal lcd(12, 11, 7, 6, 5, 4);

void setup() {
  lcd.begin(16, 2);
  lcd.setCursor(0, 0);
  lcd.print("Dobar dan");
  prikaziPoruku();
  attachInterrupt(digitalPinToInterrupt(btn), generisiBroj, RISING);
}

void loop() {
  if(randBroj != 0) {
    poruka = kreirajPoruku(brojac, randBroj);
    lcd.setCursor(0,0);
    lcd.clear();
    lcd.print(poruka);
    if(randBroj == 6) {
      lcd.setCursor(0,1);
      lcd.write("Ponovite bacanje");
      brojac++;
    } else {
      brojac = 1;
    }
  }
  randBroj = 0;
}

void generisiBroj() {
  randBroj = random(7);
}


String kreirajPoruku(int brojac, int broj) {
  String poruka = "Vas ";
  poruka.concat(brojac);
  poruka.concat(" broj je ");
  poruka.concat(broj);
  return poruka;
}

void prikaziPoruku() {
  for(int i = 0; i < 7; i++) {
    lcd.scrollDisplayRight();
    delay(500);
  }
  for(int i = 7; i > 0; i--) {
    lcd.scrollDisplayLeft();
    delay(500);
  }
  lcd.noAutoscroll();
  lcd.clear();
  lcd.print("Baci kocku");

}
#include <LiquidCrystal.h>
const int btn = 2;
LiquidCrystal lcd(12, 11, 7, 6, 5, 4);

void setup() {
  lcd.begin(16, 2);
  lcd.setCursor(0, 0);
  lcd.print("Dobar dan");
  attachInterrupt(digitalPinToInterrupt(btn), ispisiZdravo, RISING);
}

void loop() {}

void ispisiZdravo() {
  lcd.clear();
  lcd.print("Zdravo");
}

Објашњење програма (скице)

Одељак дефиниција

У овом задатку је наглашено да се користи ЛЦД дисплеј за приказ насумично генерисаног броја. Како би се несметано радило са овим модулом потребно је укључити спољну библиотеку LiquidCrystal.hиз форме управника библиотека.

Променљива btn је дефинисана као целобројна константа и њена вредност је 2 (на дигитални пин 2 Ардуина је повезан тастер, отуда и та вредност). Као константа, њена вредност се не мења током извршавања програма (у противном би дошло до нежељеног понашања електричног кола).

Наредна променљива randBroj чуваће податак о насумичном броју. Овој променљивој ће се додељивати вредност у ИСР функцији генеришиБрој која се извршава на сваки притисак тастера. Ово је могуће коришћењем прекида. Добра пракса је да се таква променљива дефинише као volatile.

Променљива brojac чува информацију о броју бацања. Вредност ове променљиве ће бити 1, осим када насумични број има вредност 6. У том случају се brojac повећава за 1.

Помоћна променљива типа Стринг која чува поруку која се приказује на дисплеју је наравно poruka. Детаљније ће њена намена бити објашњена код функције креирајПоруку.

За крај следи дефинисање променљиве lcd која ће представљати модул ЛЦД дисплеја. Њени параметри су ардуино пинови на које су повезани пинови модула редом RS, E, D4-D7.

Одељак конфигурације

Кратак садржај функције setup али зато омогућава пуно тога. Најпре се иницијализује ЛЦД модул и дефинише његова величина. Модул има 16 колона и 2 реда, отуда и ове вредности у функцији begin.

Позива се функција прикажиПоруку. Детаљније о њој нешто касније.

За крај се саопштава програму да очекује промену сигнала на дигиталном пину број 2 Арудина. Оног тренутка када се деси промена, позваће се функција генеришиБрој. Промену у овом случају изазива притисак тастера.

Одељак петље

На почетку петље стоји if блок чија је намена логичка контрола. Приликом генерисања насумичног броја могуће вредности су између 0 и 6, тако да овим if блоком се елеминише та могућност да насумично генерисани број има вредност 0. Онога тренутка када вредност насумичног броја буде различита од 0, услов if блока биће тачан и извршиће се код у телу блока.

Најпре се у променљиву poruka смешта стринг који враћа функција kreirajPoruku. Више о функцији биће у наставку.

Потом се курсор дисплеја поставља на прву колону, функцијом setCursor. Индексирање редова и колона почиње од 0, зато су наведене ове вредности у позиву функције. Садржај дисплеја се брише и потом се приказује стринг смештен у променљивој poruka.

Задатком је дефинисано да се у другом реду прикаже порука „Понови бацање“ уколико је корисник добио број 6. Ово реализујемо другим if блоком. Уколико је добијена вредност 6, услов ће бити тачан и извршиће се позиционирање курсора на прву колону другог реда, исписаће се тражени стринг „Понови бацање“ и увећаће се вредност променљиве brojac за 1 јер коцку поново баца исти играч. Уколико је услов нетачан, променљива brojac ће задржати вредност 1.

Ван првог if блока поново се поставља вредност променљиве randBroj на 0. Ово се чини како би се услов првог if блока одржавао нетачним све до тренутка притиска тастера. На овај начин се избегава неконтролисано увећавање променљиве brojac и треперење текста на дисплеју, што су нежељена понашања у раду електричног кола.

Функција – generisiBroj

Ово је ИСР (енг. ISR – Interrupt Service Routine) функција, што значи да се извршава оног тренутка када се деси прекид, онако како је дефинисано у функцији attachInterrupt(предња ивица импулса на дигиталном пину број 2 Ардуина). Једино што ће ова функција урадити је да генерише насумични број коришћењем функције random.

Функција – kreirajPoruku

Оно што је карактеристично за ову функцију је да она има повратну вредност типа String, што се види код њеног дефинисања. Ово практично значи да је намена функције креирање повратног стринга на одређени начин. Тај стринг ће бити формата „Ваш Х број је У“. Вредности које прослеђујемо функцији су целобројне вредности brojac и broj који одговарају вредности Х односно У. Број бацања коцке се налази у променљивој brojac док се вредност насумично генерисаног броја прослеђује преко променљиве broj. Онога тренутка када се позове функција, врши се надовезивање низа функцијом concat чији је једини параметар стринг који се надовезује на постојећи. Кључном речи return се враћа формирани стринг и смешта у променљиву poruka. Ова функција ће се позивати само онда када је вредност randBroj различита од 0.

Функција – prikaziPoruku

Ово можда делује најкомпликованије, али је у ствари врло једноставно. Функција прикажиПоруку у ствари само врши приказ и анимирање текста на почетку извршавања програма. Поставља се курсор у прву колону, првог реда и приказује порука „Добро дошли“. Прва for има 6 итерација и помераће текст „Добро дошли“ за по једну колону до десне ивице екрана. Ово се једноставно врши функцијом scrollDisplayLeft. Постоји 6 итерација ове петље са кашњењем од 500милисекунди. Када се ове две вредности помноже, добија се трајање анимације од 3 секунде као што је дефинисано задатком. Друга for ради потпуно исту ствар у лево.

Након извршења ове две for функцијом noAutoscroll се „искључује“ даље анимирање текста који ће бити приказан на екрану. Потом се брише садржај екрана, да би се приказала порука „Баци коцку“.