Despertador Bon Dia de la Maria (Arduino)

De wikijoan
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

Maria qv croquis SketchUp.png
Maria qv croquis circuit.png

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