Salve a tutti,
Il mio primo progetto con arduino è attualmente una specie di "trappola sonora", cioè un prototipo composto da:
-Arduino UNO
-Buzzer passivo
-Sensore ad ultrasuoni HC-SR04
-Una piccola breadboard
-Prototype shield
Lo scopo è quello di far partire una sequenza musicale, riprodotta dal buzzer, quando viene rimosso un oggetto posto sotto il sensore ad ultrasuoni. La melodia viene riprodotta una volta soltanto dopo di che arduino si spegne (entra in sleep mode).
Questo è il codice che ho utilizzato per realizzare questo piccolo prototipo
#include <avr/sleep.h>
#define REST 1
#define NOTE_C5 523
#define NOTE_G5 784
#define NOTE_A5 880
#define NOTE_B5 988
#define NOTE_C6 1047
#define NOTE_F5 698
#define NOTE_E5 659
#define NOTE_D5 587
#define NOTE_A4 440
#define NOTE_B4 494
#define NOTE_G4 392
#define NOTE_D6 1175
#define NOTE_DS6 1245
#define NOTE_AS5 932
#define NOTE_DS5 622
// notes in the melody:
int melody[] = {
NOTE_B5, NOTE_C6, NOTE_B5, NOTE_A5, NOTE_G5, NOTE_C5,
NOTE_G5, NOTE_F5, NOTE_E5, NOTE_D5, NOTE_E5, NOTE_A4,
NOTE_B4, NOTE_C5, NOTE_G5, NOTE_D5, NOTE_G4, NOTE_A4,
NOTE_B4, NOTE_C5, NOTE_G5, NOTE_D5, NOTE_E5, NOTE_B5,
NOTE_C6, NOTE_B5, NOTE_A5, NOTE_G5, NOTE_C5, NOTE_G5,
NOTE_F5, NOTE_E5, NOTE_D5, NOTE_E5, NOTE_A4, NOTE_B4,
NOTE_C5, NOTE_G5, NOTE_D5, NOTE_G5, NOTE_A5, REST,
NOTE_C6, NOTE_B5, NOTE_A5, NOTE_G5, NOTE_C5, NOTE_C6,
REST, NOTE_B5, NOTE_C6, NOTE_D6, NOTE_G5, NOTE_DS6,
REST, NOTE_D6, NOTE_C6, NOTE_AS5, NOTE_G5, NOTE_AS5,
NOTE_C6, NOTE_D6, NOTE_DS6, NOTE_C6, NOTE_DS5, NOTE_F5,
NOTE_G5
};
// note durations: 4 = quarter note, 8 = eighth note, etc.:
int noteDurations[] = {
8, 8, 8, 8, 4, 4, 8, 8, 8 ,8,
2, 8, 8, 8, 8, 4, 4, 8, 8, 8,
8, 4, 4, 8, 8, 8, 8, 4, 4, 8,
8, 8, 8, 2, 8, 8, 8, 8, 4, 4,
1, 16, 2, 8, 8, 2, 2, 2, 8, 8,
8, 2, 2, 2, 8, 8, 8, 2, 4, 4,
2, 4, 4, 2, 8, 8, 2,
};
int thisNote = 0;
const int triggerPort = 9;
const int echoPort = 10;
void setup() {
pinMode(triggerPort, OUTPUT);
pinMode(echoPort, INPUT);
Serial.begin(9600);
Serial.print( "Sensore Ultrasuoni: ");
}
void sleepNow(){
set_sleep_mode(SLEEP_MODE_PWR_DOWN);
sleep_enable();
sleep_mode();
}
void loop() {
//porta bassa l'uscita del trigger
digitalWrite( triggerPort, LOW );
//invia un impulso di 10microsec su trigger
digitalWrite( triggerPort, HIGH );
delayMicroseconds( 10 );
digitalWrite( triggerPort, LOW );
long durata = pulseIn( echoPort, HIGH );
long distanza = 0.034 * durata / 2;
Serial.print("distanza: ");
//dopo 38ms è fuori dalla portata del sensore
if( durata > 38000 ){
Serial.println("Fuori portata ");
}
else{
Serial.print(distanza);
Serial.println(" cm ");
}
if(distanza > 18){
delay(2100);
for (thisNote = 0; thisNote < 67; thisNote++) {
// to calculate the note duration, take one second
// divided by the note type.
//e.g. quarter note = 1000 / 4, eighth note = 1000/8, etc.
int noteDuration = 2420/ noteDurations[thisNote];
tone(8, melody[thisNote], noteDuration);
// to distinguish the notes, set a minimum time between them.
// the note's duration + 30% seems to work well:
int pauseBetweenNotes = noteDuration * 1.30;
delay(pauseBetweenNotes);
// stop the tone playing:
noTone(8);
}
if(thisNote == 67){
sleepNow();
}
}
}
Sono partito dagli esempi offerti per "Tone Melody" e per il funzionamento del sensore ad ultrasuoni, lasciando gli appunti vicino al codice per capirne il funzionamento e poi riadattarlo.
Il codice funziona benissimo e così il piccolo prototipo, almeno per i miei scopi, ma la domanda sorge spontanea:
C'è un modo più semplice per realizzare il tutto?
In che modo avrei potuto migliorare la scrittura del codice?
così in caso in futuro dovesse essere necessario realizzare un prop simile potrei farlo in una maniera più snella ed elegante imparando qualcosa di nuovo
grazie a tutti ;D