Jingle bells, lucina ed alberino che si muove

 
#include <Servo.h> // 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