Despertador Bon Dia de la Maria (Arduino)
Salta a la navegació
Salta a la cerca
Introducció
Estem en el confinament de COVID-19. I a 3rD practiquen Arduino. Amb la Maria hem pensat fer un despertador amb Arduino. Un interruptor; un sensor LDR que detecti el nivell de llum; i un buzzer que faci sonar la melodia de Bon Dia dels Pets.
Esquema
Estudiem per separat cadascun dels blocs:
- codi mínim per a l'interruptor
- codi mínim per al sensor LDR
- codi mínim per al buzzer
- codi mínim per fer sonar una melodia
Després d'ha de posar tot junt.
Codi Arduino. Lògica del programa
- Si l'interruptor està apagat, no fer res.
- Quan encenem l'interruptor, llegim el sensor LDR.
- Si passem per sota d'un llindar de llum farem sonar la melodia en bucle, fins que s'apagui l'interruptor
- Ara l'interruptor està apagat, i continuarà així fins que torni a començar el procés.
script despertador_ldr.ino:
#include "pitches.h"
const int ldrPin = A0;
int inPin = 7;
int pwmPin = 9;
int reading;
int tempo = 1500; //per controlar el tempo, com més gran el valor, més lenta la melodia
int estat_interruptor;
bool entrem_en_bucle = true;
bool melodia_sonant = false;
int llindar_ldr = 800;
// notes in the melody:
//int melody[] = {
// NOTE_C4, NOTE_G3, NOTE_G3, NOTE_A3, NOTE_G3, 0, NOTE_B3, NOTE_C4
//};
int melodia_bon_dia[] = {
NOTE_E5, NOTE_E5, NOTE_C5, 0, 0, NOTE_C5, NOTE_D5, NOTE_D5, NOTE_D5, NOTE_D5, NOTE_G5, NOTE_F5,
NOTE_E5, NOTE_D5, NOTE_E5, NOTE_C5, 0, 0, NOTE_C5, NOTE_B4, NOTE_B4, NOTE_B4, NOTE_B4, NOTE_E5, NOTE_D5, NOTE_C5, NOTE_B4, NOTE_A4, 0, 0, NOTE_A4, NOTE_B4, NOTE_C5, NOTE_D5,
NOTE_C5, NOTE_G4, NOTE_G4, NOTE_G4, 0, NOTE_G4, NOTE_C5, NOTE_E5, NOTE_E5, NOTE_D5, NOTE_A4, NOTE_D5, NOTE_D5
};
// note durations: 4 = quarter note, 8 = eighth note, etc.:
//int noteDurations[] = {
// 4, 8, 8, 4, 4, 4, 4, 4
// 4, 4, 4, 4, 8, 8, 6, 16, 6, 16, 6, 16, 6, 16, 4, 4, 4, 8, 8, 6, 16, 6, 16, 6, 16,
//};
int noteDurations[] = {
4, 4, 4, 4, 8, 8, 6, 16, 6, 16, 6, 16, 6, 16, 4, 4, 4, 8, 8, 6, 16, 6, 16, 6, 16, 6, 16, 4, 4, 4, 6, 16, 6, 16, 6, 16, 6, 16, 6, 16, 6, 16, 4, 4, 4, 4, 1
};
void setup() {
Serial.begin(9600);
pinMode(ldrPin, INPUT);
pinMode(inPin, INPUT);
}
void loop() {
reading = digitalRead(inPin);
if(estat_interruptor!=reading || entrem_en_bucle) {
estat_interruptor=reading;
entrem_en_bucle = false;
Serial.println(estat_interruptor);
}
if (estat_interruptor && !melodia_sonant) {
//llegim el nivell del sensor
int ldrStatus = analogRead(ldrPin);
Serial.println(ldrStatus);
if (ldrStatus < llindar_ldr) {
melodia_sonant = true;
sonar_melodia();
}
}
delay(200);
}
void sonar_melodia() {
//la melodia sona en loop fins que tanquem l'interruptor
for (;;) {
Serial.println("fem sonar la melodia");
//la melodia dura 5 segons
//delay(5000);
play_bon_dia();
reading = digitalRead(inPin);
if(reading == 0) {
estat_interruptor=reading;
Serial.println("apaguem la melodia");
//sortim del bucle
break;
}
}
melodia_sonant = false;
}
void play_bon_dia() {
// iterate over the notes of the melody:
for (int thisNote = 0; thisNote < sizeof(melodia_bon_dia)/sizeof(int) ; 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 = tempo / noteDurations[thisNote];
tone(pwmPin, melodia_bon_dia[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);
}
}
video Maria
Arduinoblocks
joanqc@gmail.com / jq********
Per tal de pujar el codi a l'Arduino, necessito el ArduinoBlocks Connector
Mètode d'instal.lació alternatiu (terminal)
$ sudo dpkg -i abconnector_4_x64.deb
Mètode alternatiu d'execució (terminal)
$ /opt/abconnector/abconnector
creat per Joan Quintana Compte, maig 2020