| 12
 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