Maillochka

De Centre de Ressources Numériques - Labomedia
Révision de 28 février 2018 à 16:59 par Olivier (discussion | contributions)

(diff) ← Version précédente | Voir la version actuelle (diff) | Version suivante → (diff)
Aller à : navigation, rechercher

Code Arduino du prototype du système électronique de la Maillochka présente dans le spectacle Ni Gueux Ni Maître de la compagnie des Arracheurs de dents.

Principe

Six faisceaux infra-rouge sont placés sur le chemin du poids, coupé ou pas selon la hauteur atteinte par celui-ci. Selon les faisceaux coupés, des relais se déclenchent pour allumer des bandeaux de LED ou cracher des flammes.

Ressources

Code

// Copyright Olivier Baudu - 2018
// Publié sous les termes de la GPL v3.0

#include <IRremote.h>

#define CAPTEUR6 13 
#define CAPTEUR5 12
#define CAPTEUR4 11
#define CAPTEUR3 10
#define CAPTEUR2 9
#define CAPTEUR1 8

IRsend irsend; // Obligatoirement sur le pin 3, d'où le passage du pin 2 au pin 4 pour les relais.
const int RELAIS7 = 7;
const int RELAIS6 = 6;
const int RELAIS5 = 5;
const int RELAIS4 = 4;
const int RELAIS3 = 2;
const int RELAIS2 = 1;
const int RELAIS1 = 0;

boolean interupteur7 = false;
boolean interupteur6 = false;
boolean interupteur5 = false;
boolean interupteur4 = false;
boolean interupteur3 = false;
boolean interupteur2 = false;
boolean interupteur1 = false;

unsigned long last6 = millis();
unsigned long last5 = millis();
unsigned long last4 = millis();
unsigned long last3 = millis();
unsigned long last2 = millis();
unsigned long last1 = millis();

int temps6;
int temps5;
int temps4;
int temps3;
int temps2;
int temps1;

int duree_pause = 3000; // temps où tout reste allumé
int delais_descente = 500; // delais entre chaque extinction

void setup()
{
  pinMode(CAPTEUR6, INPUT);
  pinMode(CAPTEUR5, INPUT);
  pinMode(CAPTEUR4, INPUT);
  pinMode(CAPTEUR3, INPUT);
  pinMode(CAPTEUR2, INPUT);
  pinMode(CAPTEUR1, INPUT);
  pinMode(RELAIS7, OUTPUT);
  pinMode(RELAIS6, OUTPUT);
  pinMode(RELAIS5, OUTPUT);
  pinMode(RELAIS4, OUTPUT);
  pinMode(RELAIS3, OUTPUT);
  pinMode(RELAIS2, OUTPUT);
  pinMode(RELAIS1, OUTPUT);

  // éteind tous les relais au démarrage
  digitalWrite(RELAIS7, LOW);
  digitalWrite(RELAIS6, LOW);
  digitalWrite(RELAIS5, LOW);
  digitalWrite(RELAIS4, LOW);
  digitalWrite(RELAIS3, LOW);
  digitalWrite(RELAIS2, LOW);
  digitalWrite(RELAIS1, LOW);

  irsend.enableIROut(38); // crée une sortie modulée à 38KHz
  //Serial.begin(9600) // Attention, quand la communication série est active, les pin 0 et 1 sont inutilisables

}

void loop()
{
  irsend.mark(0); // allume la LED Infra-Rouge
  
  //////////////////////////////////////
  //////////////////////////////////////
  // 1 /////////////////////////////////
  //////////////////////////////////////
  boolean mesure11 = digitalRead(CAPTEUR1); 
  delay(1);                                 
  boolean mesure12 = digitalRead(CAPTEUR1); 
  boolean etat1  = mesure11 * mesure12;      

  if (etat1 == HIGH & interupteur1 == false) 
  {
    interupteur1 = true;
    last1 = millis();
    temps1 = duree_pause;
  }

  if(interupteur1 == true) {
    digitalWrite(RELAIS1, HIGH);
  }

  if(millis() - last1 > temps1) {
    interupteur1 = false;
    digitalWrite(RELAIS1, LOW);    
  }
  /////////////////////////////////////
  /////////////////////////////////////


  //////////////////////////////////////
  //////////////////////////////////////
  // 2 /////////////////////////////////
  //////////////////////////////////////
  boolean mesure21 = digitalRead(CAPTEUR2); 
  delay(1);                                 
  boolean mesure22 = digitalRead(CAPTEUR2); 
  boolean etat2  = mesure21 * mesure22;      

  if (etat2 == HIGH & interupteur2 == false) 
  {
    interupteur2 = true;
    last2 = millis();
    temps2 = duree_pause;

    interupteur1 = true;
    last1 = millis();
    temps1 = duree_pause + delais_descente;
  }

  if(interupteur2 == true) {
    digitalWrite(RELAIS2, HIGH);
  }

  if(millis() - last2 > temps2) {
    interupteur2 = false;
    digitalWrite(RELAIS2, LOW);    
  }
  /////////////////////////////////////
  /////////////////////////////////////

  //////////////////////////////////////
  //////////////////////////////////////
  // 3 /////////////////////////////////
  //////////////////////////////////////
  boolean mesure31 = digitalRead(CAPTEUR3); 
  delay(1);                                 
  boolean mesure32 = digitalRead(CAPTEUR3); 
  boolean etat3  = mesure31 * mesure32;      

  if (etat3 == HIGH & interupteur3 == false) 
  {
    interupteur3 = true;
    last3 = millis();
    temps3 = duree_pause;

    interupteur2 = true;
    last2 = millis();
    temps2 = duree_pause + delais_descente;

    interupteur1 = true;
    last1 = millis();
    temps1 = duree_pause + delais_descente*2;
  }

  if(interupteur3 == true) {
    digitalWrite(RELAIS3, HIGH);
  }

  if(millis() - last3 > temps3) {
    interupteur3 = false;
    digitalWrite(RELAIS3, LOW);    
  }
  /////////////////////////////////////
  /////////////////////////////////////

  //////////////////////////////////////
  //////////////////////////////////////
  // 4 /////////////////////////////////
  //////////////////////////////////////
  boolean mesure41 = digitalRead(CAPTEUR4); 
  delay(1);                                 
  boolean mesure42 = digitalRead(CAPTEUR4); 
  boolean etat4  = mesure41 * mesure42;      

  if (etat4 == HIGH & interupteur4 == false) 
  {
    interupteur4 = true;
    last4 = millis();
    temps4 = duree_pause;

    interupteur3 = true;
    last3 = millis();
    temps3 = duree_pause + delais_descente;

    interupteur2 = true;
    last2 = millis();
    temps2 = duree_pause + delais_descente*2;

    interupteur1 = true;
    last1 = millis();
    temps1 = duree_pause + delais_descente*3;
  }

  if(interupteur4 == true) {
    digitalWrite(RELAIS4, HIGH);
  }

  if(millis() - last4 > temps4) {
    interupteur4 = false;
    digitalWrite(RELAIS4, LOW);    
  }
  /////////////////////////////////////
  /////////////////////////////////////

  delay(1);
}