J'ai trouvé une photorésistance dans un fond de tiroir. Elle doit bien avoir 40 ans.
J'ai donc un carillon qui fait un bruit de chien quand le détecteur de présence est activé, de la lumière qui s'allume s'il fait nuit, et une sonnerie (chants d'oiseaux) quand on appuie sur le bouton de sonnette.
Un switch permet de changer de mode pour la sonnette (chants d'oiseaux ou animaux divers).
Mon code commence à ressembler à quelque chose :
/*
* SD CARD is organized as shown below:
* FOLDER 01
* 001-dog.mp3
* 002-crocodile.mp3
* 003-aligator.mp3
* 004-gorilla.mp3
* FOLDER 02
* 001-cuckoo.mp3
* 002-finch.mp3
* 003-raven.mp3
* 004-crow.mp3
* 005-magpie.mp3
*/
#include "Arduino.h"
#include "SoftwareSerial.h"
#include "DFRobotDFPlayerMini.h"
#define BUTTON 2 // PullDown
#define PIR 3
#define SWITCH 4
#define LIGHT 7
#define LED 13
#define LUMINOSITY 1
SoftwareSerial mySoftwareSerial(5, 6); // RX, TX
DFRobotDFPlayerMini myDFPlayer;
void printDetail(uint8_t type, int value);
int buttonPressed;
int pirState = LOW;
int lightDuration = 5000;
void ButtonIsr(void)
{
static int enable;
static long lastDebounceTime = 0;
if (lastDebounceTime == 0 || (millis() - lastDebounceTime) > 200) {
if (enable) {
Serial.println("ButtonIsr");
lastDebounceTime = millis();
buttonPressed++;
}
enable = 1;
}
}
void readPir(void)
{
int val;
val = digitalRead(PIR); // read input value
if (val == HIGH) { // check if the input is HIGH
digitalWrite(LED, HIGH); // turn LED ON
delay(150);
if (pirState == LOW) {
Serial.println("Motion detected!");
pirState = HIGH;
}
} else {
digitalWrite(LED, LOW); // turn LED OFF
delay(300);
if (pirState == HIGH){
Serial.println("Motion ended!");
pirState = LOW;
}
}
}
void play(int folder, int file)
{
static int playing;
if (folder == 0 && file == 0) {
playing = false;
return;
}
if (!playing) {
Serial.print(F("Play the "));
Serial.print(folder);
Serial.print(", ");
Serial.println(file);
myDFPlayer.playFolder(folder, file);
playing = true;
}
}
int folder = 1;
int file = 1;
int nfile;
void setup()
{
mySoftwareSerial.begin(9600);
Serial.begin(115200);
Serial.println(F("DFRobot DFPlayer Mini Demo"));
Serial.println(F("Initializing DFPlayer ... (May take 3~5 seconds)"));
if (!myDFPlayer.begin(mySoftwareSerial)) { //Use softwareSerial to communicate with mp3.
Serial.println(F("Unable to begin:"));
Serial.println(F("1.Please recheck the connection!"));
Serial.println(F("2.Please insert the SD card!"));
while(true){
delay(0); // Code to be compatible with ESP8266 watch dog.
}
}
Serial.println(F("DFPlayer Mini online."));
myDFPlayer.volume(30); //Set volume value. From 0 to 30
attachInterrupt(digitalPinToInterrupt(BUTTON), ButtonIsr, RISING);
pinMode (BUTTON, INPUT_PULLUP);
pinMode (LED, OUTPUT);
digitalWrite(LED, LOW);
pinMode (LIGHT, OUTPUT);
digitalWrite(LIGHT, LOW);
pinMode (PIR, INPUT);
}
void loop()
{
static int night = 0;
static long lightStart;
if (lightStart && lightStart < millis() - lightDuration) {
digitalWrite(LIGHT, LOW);
}
int luminosity = analogRead(LUMINOSITY);
if (luminosity < 400) {
if (!night) {
Serial.println("NIGHT");
}
night = true;
}
else {
if (night) {
Serial.println("DAY");
}
night = false;
}
readPir();
if (pirState == HIGH) {
play(2, 1);
if (night) {
lightStart = millis();
digitalWrite(LIGHT, HIGH);
}
}
if (buttonPressed) {
Serial.println(F("BUTTON pressed"));
if (digitalRead(SWITCH) == HIGH) {
folder = 1;
}
else {
folder = 2;
}
nfile = myDFPlayer.readFileCountsInFolder(folder);
if (file > nfile) {
file = 1;
}
play(0, 0);
play(folder, file++);
buttonPressed = 0;
}
if (myDFPlayer.available()) {
printDetail(myDFPlayer.readType(), myDFPlayer.read()); //Print the detail message from DFPlayer to handle different errors and states.
}
}
void printDetail(uint8_t type, int value){
switch (type) {
case TimeOut:
Serial.println(F("Time Out!"));
break;
case WrongStack:
Serial.println(F("Stack Wrong!"));
break;
case DFPlayerCardInserted:
Serial.println(F("Card Inserted!"));
break;
case DFPlayerCardRemoved:
Serial.println(F("Card Removed!"));
break;
case DFPlayerCardOnline:
Serial.println(F("Card Online!"));
break;
case DFPlayerPlayFinished:
Serial.print(F("Number:"));
Serial.print(value);
Serial.println(F(" Play Finished!"));
play(0, 0);
break;
case DFPlayerError:
Serial.print(F("DFPlayerError:"));
switch (value) {
case Busy:
Serial.println(F("Card not found"));
break;
case Sleeping:
Serial.println(F("Sleeping"));
break;
case SerialWrongStack:
Serial.println(F("Get Wrong Stack"));
break;
case CheckSumNotMatch:
Serial.println(F("Check Sum Not Match"));
break;
case FileIndexOut:
Serial.println(F("File Index Out of Bound"));
break;
case FileMismatch:
Serial.println(F("Cannot Find File"));
break;
case Advertise:
Serial.println(F("In Advertise"));
break;
default:
Serial.println(F("????"));
break;
}
break;
default:
break;
}
}
EDIT : j'ai découvert que les mp3 pouvaient porter des noms plus explicites :
001-dog.mp3 plus sympa que 001.mp3