EspaceTrain.Com - Le Forum

Modélisme ferroviaire => Arduino et ses clones, digital, électricité, électronique, logiciels => Arduino et ses clones => Discussion démarrée par: cevenol38 le 19 Juin 2016 à 21:56:09

Titre: Gestion d'une coulisse avec Arduino
Posté par: cevenol38 le 19 Juin 2016 à 21:56:09
Bonjour à tous,

Alors voilà moi aussi je me lance dans l'aventure Arduino. Je pense qu'avec quelques lignes de code je vais arriver à gérer de façon automatique ma coulisse où peuvent stationner 6 trains dans chaque direction. J'ai trouvé sur le forum Locoduino les plans de détecteurs optiques. Maintenant je me lance dans le code et je vous propose de vous faire suivre l'avancée du projet.
Pour l'instant je détecte mais trains sur deux cantons et j'arrête l'alimentation électrique en fonction de l'occupation du canton N+1 :)

//Affectation des ports
//d'occupation
//const byte detect_v1[]={A0,A1,A2,A3,A4,A5};
const byte detect_v1[]={A0,A1,A0,A0,A0,A0};
//const byte detect_v2[]={A8,A9,A10,A11,A12,A13};
const byte detect_v2[]={A0,A0,A0,A0,A0,A0};
//de disjoncteurs
const int disj_v1[]={23,25,27,29,31,33};
const int disj_v2[]={22,24,26,28,30,32};
//des aiguillages;
const int p_aiguillages[]={34,36,38,40,42};
//Variables globales
// variable de temps en millisecondes
unsigned long liberation_v1[] = {0,0,0,0,0,0};   // derniere fois que le detecteur a changé
unsigned long liberation_v2[] = {0,0,0,0,0,0};   // derniere fois que le detecteur a changé
long Delai_liberation = 1000;   // delai d'une seconde pour valider un changement
int occup_vp1=0;
int occup_vp2=0;
int occup_v1[]={0,0,0,0,0,0};
int occup_v2[]={0,0,0,0,0,0};

//Fonctions
void init_canton(byte voie)
{
  Serial.print("Canton initialisé en mode INPUT");
  Serial.println(voie);
  pinMode(voie,INPUT);
}
void detection(byte canton,int num, int occup, int voie)
{
  int etat=analogRead(canton);
  if (etat>100)
  {
    //un train est détecté la valeur lue est supérieure à 100
    if (occup==0)
    {
      Serial.print("Valeur =");
      Serial.println(etat);
      occupation(canton,num,voie);
    }
  }
  else
  {
    if (occup==1)
    //le canton est libre
    {
     
      Serial.print("Valeur =");
      Serial.println(etat);
      liberation(canton,num,voie);
    }
   
  }
}
void occupation(byte canton,int num, int voie)
{
    if (voie==1)
    {
      occup_v1[num]=1;
      liberation_v1[num]=millis();
      Serial.print("Voie 1 Canton occupe :");
      Serial.println(canton);
      if ((num!=2)or(num!=5))
      //Si le canton n'est pas le dernier de la voie
      {
        if (occup_v1[num+1]==1)
        //Si le canton suivant est occupé alors on coupe le courant
        {
          couper_courant(canton,num,voie);
        }
        else
        {
          mettre_courant(canton,num,voie);
        }
       
      }
    }
    else if(voie==2)
    {
      occup_v2[num]=1;
      liberation_v2[num]=millis();
      Serial.print("Voie 2 Canton occupe :");
      Serial.println(canton);
      if ((num!=2)or(num!=5))
      //Si le canton n'est pas le dernier de la voie
      {
        if (occup_v2[num+1]==1)
        //Si le canton suivant est occupé alors on coupe le courant
        {
          couper_courant(canton,num,voie);
        }
        else
        {
          mettre_courant(canton,num,voie);
        }
       
      }
    }
   
   
}
void liberation(byte canton,int num, int voie)
{
  unsigned long time;
  time=millis();
  if (voie==1)
    {
      if (time-liberation_v1[num] > Delai_liberation)
      {
        occup_v1[num]=0;
        Serial.print("VOIE 1 Canton libre :");
        Serial.println(canton);
        num=num-1;
        mettre_courant(canton,num,voie);
      }
    }
    else if(voie==2)
    {
      if (time-liberation_v2[num] > Delai_liberation)
      {
        occup_v2[num]=0;
        Serial.print("VOIE 2 Canton libre :");
        Serial.println(canton); 
        mettre_courant(canton,num-1,voie);
      }
     
    }
}
void couper_courant(byte canton,int num, int voie)
{
  if (voie==1)
  {
    digitalWrite(disj_v2[num],LOW);
    Serial.print("VOIE 1 Alim ouvert canton :");
    Serial.println(canton);
   }
   else if(voie==2)
  {
     digitalWrite(disj_v2[num],LOW);
     Serial.print("VOIE 2 Alim ouvert canton :");
    Serial.println(canton);
  }
}
void mettre_courant(byte canton,int num, int voie)
{
  if (voie==1)
  {
    digitalWrite(disj_v1[num],HIGH);
    Serial.print("VOIE 1 Alim fermée canton :");
    Serial.print(num);
    Serial.print("->");
    Serial.println(canton);
   }
   else if(voie==2)
  {
    digitalWrite(disj_v2[num],HIGH);
     Serial.print("VOIE 2 Alim fermée canton :");
     Serial.print(num);
    Serial.print("->");
    Serial.println(canton);
  }
}
void setup() {
  // put your setup code here, to run once:
  Serial.begin(9600);           // set up Serial library at 9600 bps
  //for (int i=0;i<6;i++)
  for (int i=0;i<2;i++)
  {
    init_canton(detect_v1[i]);
    pinMode(disj_v1[i],OUTPUT);
    digitalWrite(disj_v1[i],LOW);
   // init_canton(detect_v2[i]);
   pinMode(disj_v2[i],OUTPUT);
   digitalWrite(disj_v2[i],LOW);
  }
}

void loop() {
  // put your main code here, to run repeatedly:
  //for (int i=0; i<6;i++)
  for (int i=0;i<2;i++)
  {
    detection(detect_v1[i],i,occup_v1[i],1);
    //detection(detect_v2[i],i,occup_v2[i],2);
  }

}