1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122
| /* pins
GND breadboard <--> GND Arduino (en cas d'usage d'une breadboard)
D0, D1 connexion Serial
D2
D3 LED infrarouge (exemple TSAL 6200, (câblage pin 3 <-> R 200 Ohms <-> LED Anode || Led Cathode <-> GND)
D4 bouton poussoir haut (câblage pin 4 <-> bouton <-> GND)
D5 bouton poussoir bas (câblage pin 5 <-> bouton <-> GND)
D6
D7
D8
D9 IN1 = relais de montée
D10 IN2 = relais de descente
D11
D12
D13
A0
A1
A2
A3
A4
A5
*/
/* **************** la partie IR **************** */
#include <IRremote.h> // <a href="https://github.com/z3t0/Arduino-IRremote" target="_blank">https://github.com/z3t0/Arduino-IRremote</a>
// LED IR connectée sur la pin PWM 3
/* obtention du code on/off de la télécommande sony à obtenir avec IRrecvDumpV2
hypothèse ---> Decoded SONY: 542A (15 bits)
*/
const unsigned long codeProjecteurOFF = 0x542A; // (votre 21546)
const int longeurCodeSony = 15;
IRsend irsend;
/* **************** les relais et boutons **************** */
const byte pinRelaisMonter = 9; // IN1 = relais de montée
const byte pinRelaisDescendre = 10; // IN2 = relais de descente
const byte ACTIF = LOW;
const byte PASSIF = HIGH;
const unsigned long dureeCourseAscenseur = 10000UL;
const unsigned long dureeRefroidissement = 120000UL;
const byte pinBoutonHaut = 4; // bouton poussoir haut
const byte pinBoutonBas = 6; // bouton poussoir bas
/* **************** gestion de l'état **************** */
enum : uint8_t {PROJECTEUR_OFF, PROJECTEUR_ON} etat;
/* **************** fonctions **************** */
void relais(const byte etatMonter, const byte etatDescendre)
{
digitalWrite(pinRelaisMonter, etatMonter);
digitalWrite(pinRelaisDescendre, etatDescendre);
}
void appuiPower() // le protocole Sony dit qu'il faut envoyer la commande 3 fois
{
for (byte i = 0; i < 3; i++) {
irsend.sendSony(codeProjecteurOFF, longeurCodeSony);
delay(40);
}
}
void allumage()
{
relais(PASSIF, ACTIF); // active le relais descend et desactive le relais monte
delay(dureeCourseAscenseur); // attente de la descente
relais(PASSIF, PASSIF); // désactive les 2 relais
appuiPower();
etat = PROJECTEUR_ON;
}
void extinction()
{
appuiPower(); // désactive le retroprojecteur
delay(2000UL); // on attend deux secondes
appuiPower(); // confirmation désactivation du retroprojecteur
delay(dureeRefroidissement); // deux minutes de refroidissement
relais(ACTIF, PASSIF); // active le relais monte et desactive le relais descend
delay(dureeCourseAscenseur); // attente de la fermeture
relais(PASSIF, PASSIF); // désactive les 2 relais
etat = PROJECTEUR_OFF;
}
void setup()
{
pinMode(pinRelaisMonter, OUTPUT); //relais montée
pinMode(pinRelaisDescendre, OUTPUT); // relais descente
relais(PASSIF, PASSIF); //extinction des relais
etat = PROJECTEUR_OFF; // hypothèse, on a aucun moyen de savoir...
pinMode (pinBoutonHaut, INPUT_PULLUP); // activation du PULLUP interne
pinMode (pinBoutonBas, INPUT_PULLUP); // activation du PULLUP interne
}
void loop()
{
switch (etat) {
case PROJECTEUR_OFF:
if (digitalRead(pinBoutonBas) == ACTIF) {
allumage(); // appel bloquant ~10 secondes
}
break;
case PROJECTEUR_ON:
if (digitalRead(pinBoutonHaut) == ACTIF) {
extinction(); // extinction manuelle, appel bloquant plus de 2 minutes !
}
break;
}
} |
Partager