Preuzmi .fzz Preuzmi .ino
Preuzmi shemu spajanja u Fritzingu    Preuzmi programski kod za Arduino

 

 

POGLAVLJE 9 - Zadatak 46:

Na mikrokontroler spojite jadan fotootpornik, jednu zujalicu i jednu svjetleću diodu. Napišite program koji će omogućiti da smanjivanjem svjetlosti (koju zaklanjamo rukom) možemo svirati električni klavir sa osam tonova. Kada je fotootpornik skroz osvijetljen zujalica ne proizvodi nikakve tonove (ruka svirača ne zaklanja svjetlost). Kada je fotootpornik potpuno neosvijetljen (ruka svirača je vrlo blizu fotootpornika) na zujalici se generira ton C6. Kako svirač odmiče ruku tako je fotootpornik sve osvjetljeniji pa se frekvencija tona smanjuje prema tonu C5. Napišite program koji će, kada se pokrene mikrokontroler, očitati minimalnu i maksimalnu količinu svjetlosti te će njih iskoristiti za određivanje granica svjetlosti između pojedinih tonova. Kada se pokrene mikrokontroler uključuje se svjetleća dioda. To je znak da mikrokontroler mjeri maksimalnu količinu svjetlosti. Taj proces traje dvije sekunde tijekom kojih svirač ne smije zaklanjati svjetlost na fotootporniku. Nakon toga svjetleća dioda se isključuje. To je znak da mikrokontroler mjeri minimalnu količinu svjetlosti. Taj proces traje dvije sekunde tijekom kojih svirač mora približiti ruku vrlo blizu fotootporniku. Nakon završetka kalibracije svjetleća dioda se uključuje i na zujalici se čuje ton frekvencije 5000 Hz trajanja pola sekunde i svirač može započeti sa sviranjem. U program dogradite slanje serijskih podataka na računalo kako biste lakše pratili rad mikrokontrolera tijekom kalibracije i sviranja.


Ton

C5

D5

E5

F5

G5

A5

B5

C6

Frekvencija

523

587

659

698

784

880

988

1046


SHEMA:

EKSPERIMENTALNA PLOČICA:

RJEŠENJE:

int led = 3;                            //definiraj led = 3
int fo = A0;                            //definiraj pot = A0
int zuj = 5;                            //definiraj zuj = 5
int ocitanjefo;                         //definiraj varijablu ocitanjepot
int minimum = 1023;                     //definiraj varijablu minimum
int maksimum = 0;                       //definiraj varijablu maksimum
int brojac;                             //definiraj varijablu brojac
int interval;                           //definiraj varijablu interval
int c5, d5, e5, f5, g5, a5, b5, c6, ti; //granice tonova

void setup() {
  pinMode(led, OUTPUT);                 //postavi izvod led kao izlazni
  pinMode(zuj, OUTPUT);                 //postavi izvod zuj kao izlazni
  digitalWrite(led, LOW);               //isključi LED diodu - početno stanje
  Serial.begin(9600);                   //inicijalizaija serijske veze

  digitalWrite(led, HIGH);              //početak kalibracije - maksimum
  Serial.println("TRAZIM MAKSIMUM");    //pošalji poruku serijskim putem
  
  for (brojac=0; brojac<100; brojac++){ //ponovi 100 puta
    ocitanjefo=analogRead(fo);          //očitaj stanje analognog ulaza
    if (ocitanjefo>maksimum){           //ako je očitanje veće od najvećeg
      maksimum=ocitanjefo;              //pohrani očitanje kao najveće
    }
    delay(20);                          //čekaj 20 ms
  }
  
  Serial.println(maksimum);             //pošalji maksimum serijskim putem

  digitalWrite(led, LOW);               //početak kalibracije - minimum
  Serial.println("TRAZIM MINIMUM");     //pošalji poruku serijskim putem

  for (brojac=0; brojac<100; brojac++){ //ponovi 100 puta
    ocitanjefo=analogRead(fo);          //očitaj stanje analognog ulaza
    if (ocitanjefo<minimum){            //ako je očitanje manje od najmanjeg
      minimum=ocitanjefo;               //pohrani očitanje kao najmanje
    }
    delay(20);                          //čekaj 20 ms
  } 
 
  Serial.println(minimum);              //pošalji minimum serijskim putem
  
  interval=(maksimum-minimum)/8;        //izračunaj interval između tonova
  
  c6=minimum;                           //izračun granične vrijenosti tona
  b5=minimum+interval;                  //izračun granične vrijenosti tona
  a5=minimum+2*interval;                //izračun granične vrijenosti tona
  g5=minimum+3*interval;                //izračun granične vrijenosti tona
  f5=minimum+4*interval;                //izračun granične vrijenosti tona
  e5=minimum+5*interval;                //izračun granične vrijenosti tona
  d5=minimum+6*interval;                //izračun granične vrijenosti tona
  c5=minimum+7*interval;                //izračun granične vrijenosti tona
  ti=minimum+8*interval;                //izračun granične vrijenosti tona
  
  Serial.println("GRANICE TONOVA");     //pošalji poruku serijskim putem
  Serial.print("c5: ");                 //pošalji poruku serijskim putem
  Serial.println(c5);                   //pošalji poruku serijskim putem
  Serial.print("d5: ");                 //pošalji poruku serijskim putem
  Serial.println(d5);                   //pošalji poruku serijskim putem
  Serial.print("e5: ");                 //pošalji poruku serijskim putem
  Serial.println(e5);                   //pošalji poruku serijskim putem
  Serial.print("f5: ");                 //pošalji poruku serijskim putem
  Serial.println(f5);                   //pošalji poruku serijskim putem
  Serial.print("g5: ");                 //pošalji poruku serijskim putem
  Serial.println(g5);                   //pošalji poruku serijskim putem
  Serial.print("a5: ");                 //pošalji poruku serijskim putem
  Serial.println(a5);                   //pošalji poruku serijskim putem
  Serial.print("b5: ");                 //pošalji poruku serijskim putem
  Serial.println(b5);                   //pošalji poruku serijskim putem
  Serial.print("c6: ");                 //pošalji poruku serijskim putem
  Serial.println(c6);                   //pošalji poruku serijskim putem
}

void loop() { 
  ocitanjefo=analogRead(fo);            //očitaj stanje analognog ulaza
  
  if (ocitanjefo>=c6 && ocitanjefo<b5){
    tone(zuj, 1046);                    //generiraj ton prema granicama ocitanja
  } else if (ocitanjefo>=b5 && ocitanjefo<a5){
    tone(zuj, 988);                     //generiraj ton prema granicama ocitanja
  } else if (ocitanjefo>=a5 && ocitanjefo<g5){
    tone(zuj, 880);                     //generiraj ton prema granicama ocitanja
  } else if (ocitanjefo>=g5 && ocitanjefo<f5){
    tone(zuj, 784);                     //generiraj ton prema granicama ocitanja
  } else if (ocitanjefo>=f5 && ocitanjefo<e5){
    tone(zuj, 698);                     //generiraj ton prema granicama ocitanja
  } else if (ocitanjefo>=e5 && ocitanjefo<d5){
    tone(zuj, 659);                     //generiraj ton prema granicama ocitanja
  } else if (ocitanjefo>=d5 && ocitanjefo<c5){
    tone(zuj, 587);                     //generiraj ton prema granicama ocitanja
  } else if (ocitanjefo>=c5 && ocitanjefo<ti){
    tone(zuj, 523);                     //generiraj ton prema granicama ocitanja
  } else {            
    noTone(zuj);                        //isključi generiranje tona
  }  
}

Autor: Paolo Zenzerović