Maillochka
De Centre de Ressources Numériques - Labomedia
Révision de 28 février 2018 à 16:59 par Olivier (discussion | contributions)
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);
}