====== Happy birthday to you ====== #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 = 28; // numero di "note" di jingle bells char notes[] = "GGAGcB GGAGdc GGxecBA yyecdc"; //note di jingle bells (all'americana) int beats[] = { 2,2,8,8,8,16,1,2,2,8,8,8,16,1,2,2,8,8,8,8,16,1,2,2,8,8,8,16}; // lunghezza della nota int tempo = 200; // 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', 'd', 'e', 'f', 'g', 'a', 'b', 'x', 'y' }; int tones[] = { 1915, 1700, 1519, 1432, 1275, 1136, 1014, 956, 834, 765, 593, 468, 346, 224, 655 , 715 }; // play the tone corresponding to the note name for (int i = 0; i < 17; 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); } }