/*
Modification des codes IR suite au passage à la bibliothèque IRremote 4X.
Ligne 66 : désignation de la PIN A1 comme PIN IR. Diférent de l'exemple Github.
Peut être à modifier.
*/
#include "IRremote.h" //Bibliothèque commandes IR.
//IRrecv irrecv(A1); //Led IR Receiver en A1.
//decode_results results;
#include "Servo.h" //Bibliothèque Servomoteurs.
Servo PaupiereG;
Servo PaupiereD;
Servo Machoire;
#include "SoftwareSerial.h" //Bibilothèques DFPlayer.
SoftwareSerial mySerial(4,5); //RX,TX en broche 4 et 5.
#include "Wire.h" //Ecran LCD.
#include "LiquidCrystal_I2C.h"
LiquidCrystal_I2C LCD(0x27,16,2); // définit le type d'ecran lcd 16 x 2
//Variables.
bool stArt=false; //Pour le démarrage du programme.
const int relaiMoteur=11;
const int Yeux=3; //Relais pour alimenter les deux yeux en PWM.
const int LedStart=2; //Signal lumineux du départ. Leds oranges dans la machoire.
int analogHall=A0; //Capteur Hall en A0.
float analogVal; //Pour un arrêt dans la même position du pédalier.
float volts; //Affichage pour les tests.
unsigned long Timer=0; //Faire tourner le moteur un certain temps puis l'arrêter.
int Chrono;
int angleSys1=10; //angles d'ouverture des paupières.
int angleSys2=100;
int angleSys3=75;
int angleSys4=135;
int angleSys5=170;
int angleSysMF=35; //Machoire fermée.
int angleSysMO=80; //Machoire ouverte.
int angleSysMOG=150; //Machoire ouverte en grand.
//Smiley Bonhomme.
byte smiley1[8] =
{0b01100,
0b10010,
0b10010,
0b01100,
0b11111,
0b00100,
0b00100,
0b11111}; //Chaque 1 imprime un point noir.
//Smiley Sourir.
byte smiley2[8] =
{0b01010,
0b00000,
0b00000,
0b01010,
0b00100,
0b00000,
0b00000,
0b00000};
void setup() {
Serial.begin(9600);
//irrecv.enableIRIn();
IrReceiver.begin(A1,DISABLE_LED_FEEDBACK);
pinMode(LedStart,OUTPUT); //Leds Oranges signal START.
mySerial.begin(9600);
Machoire.attach(6); //Servos commandes.
Machoire.write(angleSysMF); //ICI !!! Ouverture machoire pour réglage tringle.
PaupiereG.attach(9);
PaupiereG.write(angleSys5);
PaupiereD.attach(10);
PaupiereD.write(angleSys1);
pinMode(Yeux,OUTPUT); //Relais
pinMode(relaiMoteur,OUTPUT);
pinMode(13,OUTPUT);
digitalWrite(13,LOW); //éteindre la Led de la Pin 13.
LCD.init(); // initialisation de l'afficheur LCD.backlight();
LCD.setCursor(1, 0);
LCD.print("HAPPY");
LCD.createChar(1, smiley1); //Respecter l'ordre, create-setCursor-Print.
LCD.setCursor(8, 0); // move cursor to (8, 0)
LCD.print(char(1));
LCD.setCursor(5, 1);
LCD.print("HALLOWEEN");
}
void loop() {
ZERO:
Serial.println("Point ZERO"); //Affichage pour le suivi du programme.
stArt=false; //reset des états.
digitalWrite(LedStart,LOW); //Leds Oranges off.
digitalWrite(Yeux,LOW);
PaupiereG.write(angleSys1); //paupières fermées.
PaupiereD.write(angleSys5);
digitalWrite(relaiMoteur,LOW);
//irrecv.enableIRIn(); //Sinon IR Receiver ne fonctionne plus après le retour à "ZERO".
delay(250);
//lecture du capteur IR pour démarrer la séquence.
//if(irrecv.decode(&results))
if(IrReceiver.decode()) {
//Serial.println(results.value);
Serial.println(IrReceiver.decodedIRData.decodedRawData);
//if (results.value == 4294967295) {stArt=true;} //Touche Play de la commande.
if(IrReceiver.decodedIRData.decodedRawData==1470693120) {stArt=true;}
IrReceiver.resume();}
//irrecv.resume();}
delay(100);
if(stArt==false){goto ZERO;} //Pas de "Commande" alors on recommence.
ONE:
digitalWrite(LedStart,HIGH); //2 Leds Oranges dans gueule annoncent le de début de séquence.
delay(1000);
PaupiereG.write(angleSys3); //Ouvertures des paupières, allumage des yeux.
delay(500);
digitalWrite(Yeux,HIGH);
delay(500);
PaupiereD.write(angleSys2);
delay(1500);
Timer=millis(); //Calcul du temps de battement des ailes.
digitalWrite(relaiMoteur,HIGH); //Battement des ailes
Machoire.write(angleSysMO); //Ouverture machoire, son Mp3, fermeture machoire.
delay(5);
LCD.clear(); //Efface Happy Halloween.
LCD.setCursor(3, 0); //Son Mp3. Remplacé par affichage LCD.
LCD.print("ROOHHAAAR");
Chrono=0;
TWO:
Chrono=(millis()-Timer);
Serial.print("Chrono: ");
Serial.println(Chrono/1000);
analogVal=analogRead(analogHall); //Détection Hall pour l'arrêt pédalier. À la masse sur Wokwi.
volts=(analogVal/1024)*5;
Serial.print("Voltage: ");
Serial.println(volts);
delay(250);
if(Chrono>=5000){Machoire.write(angleSysMF);}
if (Chrono>=6000 && volts<=1.50) //Arrêt pédalier en position.
{digitalWrite(relaiMoteur,LOW);
goto THREE;}
else {goto TWO;}
THREE:
LCD.clear();
digitalWrite(Yeux, LOW); //clignotement des yeux.
delay(500);
digitalWrite(Yeux, HIGH);
delay(500); //Permettre à la machoire de se refermer.
LCD.setCursor(1, 0); //Deuxième palabre.
LCD.print("QUI OSE");
LCD.setCursor(2, 1);
LCD.print("ME DERANGER !");
Machoire.write(angleSysMO);
delay(1200);
Machoire.write(angleSysMF);
delay(1200);
Machoire.write(angleSysMOG);
delay(1200);
Machoire.write(angleSysMF);
delay(1200);
LCD.clear();
delay(500);
LCD.setCursor(1, 0); //Essai d'affichage de données INT.
LCD.print("VOLTS");
LCD.setCursor(5, 1);
LCD.print(volts);
delay(1500);
LCD.clear(); //Toujours clearer LCD avant de re-écrire.
LCD.setCursor(1, 0);
LCD.print("Angle Servo:");
LCD.setCursor(2, 1);
LCD.print(angleSysMOG);
delay(1500);
LCD.clear();
LCD.setCursor(1, 0); //Deuxième palabre.
LCD.print("BONNE NUIT");
LCD.createChar(2, smiley2); //Respecter l'ordre, create-setCursor-Print.
LCD.setCursor(13, 0); // move cursor to (13, 0)
LCD.print(char(2));
LCD.setCursor(2, 1);
LCD.print("LES PETITS !!");
delay(1000);
PaupiereG.write(angleSys1); //clignement paupières G.
delay(500);
PaupiereG.write(angleSys3);
delay(500);
digitalWrite(Yeux, LOW); //clignotement des yeux.
delay(500);
digitalWrite(Yeux, HIGH);
delay(1000);
LCD.clear();
goto ZERO;
}