====== Jingle bells, lucina ed alberino che si muove ====== #include // include la Libreria Servo.h Servo myservo; // crea l’oggetto di tipo Servo, myservo sarà l’oggetto su cui opererai int buzzerPin = 5; // pin a cui è attaccato il cicalino // sensore ad ultrasuoni int triggerPin = 11; // pin del trigger int echoPin = 12; // pin dell'echo int pericolo = 50; // distanza in cm. Se un oggetto supera la soglia si "attiva" il tutto int ledPin = 7; // pin della lucina int motorPin = 9; // pin del servomotore int pos =0; // posizione iniziale del servomotore int length = 26; // numero di "note" di jingle bells char notes[] = "eeeeeeegcde fffffeeeeddedg"; //note di jingle bells (all'americana) int beats[] = { 1, 1, 2, 1, 1, 2, 1, 1, 1, 1, 4, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 2, 2}; // lunghezza della nota int tempo = 300; // durata di un "beat" in millisecondi // nota corrente int nota = 0; void playTone(int tone, int duration) { for (long i = 0; i < duration * 1000L; i += tone * 2) { digitalWrite(buzzerPin, HIGH); delayMicroseconds(tone); digitalWrite(buzzerPin, LOW); delayMicroseconds(tone); } } void playNote(char note, int duration) { char names[] = { 'c', 'd', 'e', 'f', 'g', 'a', 'b', 'C' }; int tones[] = { 1915, 1700, 1519, 1432, 1275, 1136, 1014, 956 }; // play the tone corresponding to the note name for (int i = 0; i < 8; i++) { if (names[i] == note) { playTone(tones[i], duration); } } } void setup(){ // imposto i pin pinMode(buzzerPin,OUTPUT); pinMode(triggerPin,OUTPUT); pinMode(echoPin,INPUT); // inizializzo il servo motore myservo.attach(motorPin); myservo.write(0); } void loop() { //innesco il sensore ultrasonico digitalWrite(triggerPin,LOW); digitalWrite(triggerPin,HIGH); delay(10); digitalWrite(triggerPin,LOW); // calcolo quanto ci mette a rispondere il sensore (andata e ritorno!) long durata = pulseIn(echoPin,HIGH); // calcolo la distanza dell'oggetto dal sensore // note: velocità del suono circa 340 m/s long distanza = 0.034 * durata / 2; // se sono nel range del sensore e all'interno della zona di "pericolo" if (distanza < pericolo and distanza >0) { //suono la nota corrente della melodia if (notes[nota] == ' ') { delay(beats[nota] * tempo); // riposo } else { playNote(notes[nota], beats[nota] * tempo); } //imposto (ciclicamente) la nota successiva nota = (nota +1) % length; //accendo la lucina digitalWrite(ledPin,HIGH); //mando avanti (ciclicamente) il serv motore pos = (pos +10) % 180 ; myservo.write(pos); } else { //spengo la lucina digitalWrite(ledPin,LOW); } } Nota: il codice della melodia (leggermente modificato) è stato preso da [[https://gist.github.com/elubow/7844436]]