Kombotoris

De Centre de Ressources Numériques - Labomedia
Aller à : navigation, rechercher

Le Kombo est une installation composée d'un ensemble d'objets équipés d'un capteur chacun. Un son est déclenché lorsqu'un capteur est activé. Les valeurs des capteurs sont récupérées par une arduino.

Voici un code fonctionnel:

///////////////// KOMBOTORIS ///////////////
//Variables globales//
const byte NEXT[8] = {0x7E, 0x01, 0x00, 0x00, 0x00, 0xFF, 0xFF, 0xEF};
const byte BASSE_CONSO[8] = {0x7E, 0x0A, 0x00, 0x00, 0x00, 0xFF, 0xF6, 0xEF};
const byte ACTIF[8] = {0x7E, 0x09, 0x00, 0x00, 0x02, 0xFF, 0xF5, 0xEF};
const byte JOUER0[8] = {0x7E, 0x0D, 0x00, 0x00, 0x00, 0xFF, 0xF3, 0xEF};
const byte JOUER1[8] = {0x7E, 0x0D, 0x00, 0x00, 0x01, 0xFF, 0xF3, 0xEF};
const byte DEBUT = 0x7E, CMD_LEC = 0x03, Fb = 0x00, FIN = 0xEF;

boolean RELEVER_VALEURS = true;
byte PARAM1_LEC = 0x00, PARAM2_LEC = 0x01, CS1 = 0xFF, CS2 = 0x00; 
byte PISTE[8] = {DEBUT, CMD_LEC, Fb, PARAM1_LEC, PARAM2_LEC, CS1, CS2, FIN};
boolean MSG=true;
boolean MSG_EXT=true;
int factDiv=0,i=0, j=0;

int valCapteurs[16] = {0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0}, valCapteursInit[16] = {0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0}; 
//const int pin0 = 0;
//const int pin1 = 1;
//const int pin2 = 2;
const int TEMPO=8000, NB_CAPTEURS = 4, SEUIL = 700;

int etat, element = 0;

/// unsigned long et non pas float! ///
unsigned long temps_init=0, temps_courant=0, temps_ecoule=0;


/////////////////////////////////////////////////////////////////
/////////////// INIT ////////////////////////////////////////////
/////////////////////////////////////////////////////////////////

void setup() {
  for(i=0; i<16; i++){pinMode(i, INPUT);} 
  etat = 0;
  temps_init = 0; temps_init=0; temps_ecoule=0;
pinMode(13, OUTPUT);
Serial.begin(115200);
//Serial1.begin(9600);
delay(1000);
cli(); //cesse les interruptions

//configuration du timer1
TCCR1A = 0; //mise à 0 du registre
TCCR1B = 0;
TCNT1 = 0; //initialisation du compteur à 0
//initialisation du registre comparateur pour obtenir une sous-fréquence à 20Hz
OCR1A = 3906; // correspond à (freqATMEL=16MHz)/(prescaler=1024*freq_voulue=20Hz) cette valeur doit être inférieure à 2exp16
TCCR1B |= (1<<WGM12); //mode CTC
TCCR1B |=(1<<CS12)|(1<CS10); //définition du prescaler. Correspond à 1024
TIMSK1 |= (1 <<OCIE1A);
sei(); //permet les interruptions
//// ET VOILÀ POUR LE TIMER. ////

delay(1000);
}

/// L'INTERRUPTION (PRIORITAIRE) NE FAIT QUE LEVER UN DRAPEAU (FLAG): ÉVITE DE BLOQUER LA BOUCLE ///
ISR(TIMER1_COMPA_vect){ RELEVER_VALEURS = true; }

////////////////////////////////////////////////////
void loop() {

///////////////////
//// AUTOMATE /////////
/////////////

//Serial.println(valCapteurs[0]);
  switch (etat) {
    case 0: 
//// LE DRAPEAU LEVÉ DANS L'INTERRUPTION EST UTILISÉ
////////////////////////// ICI! /////////////////////
/////////////////////////// |   /////////////////////
/////////////////////////// V   /////////////////////
    if(RELEVER_VALEURS == true){for(j = 0; j<NB_CAPTEURS; j++){valCapteurs[j] = analogRead(j);} RELEVER_VALEURS = false;}
    if(MSG) {Serial.println("ETAT INITIAL"); MSG = 0; Serial.print("valCapteurs[0]: "); Serial.println(valCapteurs[0]);}
    for(i = 0; i<NB_CAPTEURS; i++){
      if( valCapteurs[i]>SEUIL){ element = i; i=NB_CAPTEURS;
        etat=1; MSG = 1; 
        PARAM2_LEC = byte(element+1); CS2 = 0xFF - (CMD_LEC + PARAM2_LEC +1);
        PISTE[4] = PARAM2_LEC; PISTE[2] = CS2;
        
        ///////////// ENVOI COMMANDE //////////////////////////////////////////
        //Serial1.write(PISTE, 8);
        //////////////////////////////////////////////////////////////////////
        
            if(MSG_EXT==true){
                Serial.println("PASSAGE A ETAT 1"); Serial.print("entrée détectée: "); Serial.println(element);
                Serial.println(valCapteurs[element]); 
                Serial.print("commande envoyée: "); 
                Serial.print(PISTE[0], HEX); Serial.print(PISTE[1], HEX); Serial.print(PISTE[2], HEX);             
                Serial.print(PISTE[3], HEX);
                Serial.print(PISTE[4], HEX); Serial.print(PISTE[5], HEX); Serial.print(PISTE[6], HEX);       
                Serial.println(PISTE[7], HEX);
            }
            digitalWrite(13, HIGH);
        }
    }
      break;
      
    case 1:
       if(MSG){Serial.println("ETAT 1"); MSG = 0; temps_init = millis();} 
            temps_courant = millis();
            temps_ecoule = temps_courant-temps_init;
            if(temps_ecoule>TEMPO) {
              etat = 0; MSG=1;
              Serial.println("RETOUR ETAT 0. Temps ecoule:"); Serial.println(temps_ecoule); temps_ecoule = 0;
              digitalWrite(13, LOW);}     
      break;
      }