Feladat: Csináljunk villanytücsköt!

Ez olyan, mint egy kis rovar: a két sárga led a két szeme. Ha beesteledik, akkor azt észreveszi a fényérzékelővel, és elkezd ciripelni.

Villanytücsök akcióban

A videó sajnos picit halk, de tényleg ciripel :)

A hardver

A 0-ás portra jön a piezo. A 4-es portra a fényérzékelő. Az 5-ös és 6-os portra két ledet teszünk, ezek lesznek a szemek.

Villanytücsök

Sok a drót? Semmi gond, a logika egyszerű!

A szoftver

Ebben semmi újdonság! Van benne a szokásos beep() függvény, és csináltam egy crick() függvényt ami egy ciripelést csinál, miközben felvillantja a szemeket. (A tücsök neve angolul cricket.)

const int PIEZO=0;
const int EYE_RIGHT=6;
const int EYE_LEFT=5;
const int SENSOR=4;


void setup() {
  pinMode(PIEZO,OUTPUT);  // piezo 
  pinMode(EYE_LEFT,OUTPUT);  // bal szem
  pinMode(EYE_RIGHT,OUTPUT); // jobb szem
  pinMode(SENSOR,INPUT_PULLUP);  // fényérzékelő
  crick();
}

void beep(int freq,int duration) {
    tone(PIEZO,freq);
    delay(duration);
    noTone(PIEZO);
} 

void crick() {
    digitalWrite(EYE_LEFT,HIGH);
    digitalWrite(EYE_RIGHT,HIGH);
    beep(440,20);
    delay(5);
    beep(880,20);
    delay(5);
    beep(1600,20);
    digitalWrite(EYE_LEFT,LOW);
    digitalWrite(EYE_RIGHT,LOW);
}

void loop() {
  if (analogRead(6)>100) { // a 4-es port a 6-os analóg bemenet
      // sötét van
      crick();
      delay(200);      
      crick();
      delay(400);      
      crick();
      delay(200);      
      crick();
      delay(400+random(0,2000));      
  }
}

Talán ez az if érdekes egy picit? Eddig csak digitális bemeneteket kezeltünk, amik vagy bekapcsolva, vagy kikapcsolva vannak. A fény nagysága azonban... azonban valójában analóg, hiszen lehet picit sötét, picit világos, nappali világos, nagyon világos...

A fényérzékelőt most egy analóg bemenetre kötöttük. Az analogRead egy számot ad vissza 0..1023 között, ami arányos a porton lévő villany nagyságával. Minél sötétebb van, annál nagyobb lesz ez a szám. Megnézzük, hogy amit visszakapunk, az nagyobb-e mint 100 (ami egy remek hasraütésszerű kezdőérték), és ha ettől nagyobb, akkor elég sötét van, és mehet a cirip. Próbálkozz más számokkal, hogy hozzáigazítsd a környezethez a tücsköt.

Sajnálatos módon az Arduinoban össze van keverve az analóg portok számozása. Tekerj vissza a 08-as fejezetre a részletekért. A 4-es portra kötött fényérzékelőt tényleg az analogRead(6) olvassa. Hogy mi ebben a logika? Szerintem nincs benne logika :)

A feladat

Próbálkozz más hangokkal! Mondjuk, egy for-ciklussal 200-400Hz között változtatva a hangmagasságot, mi lenne?

for (int freq=200;freq<400;freq++) {
    beep(freq,10);
}

Vagy, ha a hang 20Hz-enként lenne magasabb, és közben szaggatott is lenne?

for (int freq=200;freq<400;freq+=20) {
    beep(freq,10);
    delay(10); // kicsi csönd
}

Vagy, ha 20 teljesen véletlen, random magasságú szaggatott hang lenne?

for (int x=0;x<20;x++) {
    beep(random(200,400),10);
    delay(10); // kicsi csönd
}

Vajon meg tudod csinálni, hogy R2D2-szerű hang legyen? Vagy valami más állat hangját utánoznád? Játssz vele!