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.
A videó sajnos picit halk, de tényleg ciripel :)
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.
Sok a drót? Semmi gond, a logika egyszerű!
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.
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!