ok pas de souci, je reprend tout sa :
#include <stdlib.h>
#include <stdio.h>
#include <Metro.h> // librairie remplacant la librairie <time.h>
#include <LiquidCrystal.h>
const int RS=12;
const int E=11;
const int D4=5;
const int D5=4;
const int D6=3;
const int D7=6;
int BP1State = 13; //BP1 branché sur la patte 13 (digitale), il en est de meme pour les autres boutons poussoir.
int BP3State = 8;
int BP4State = 9;
int BP5State = 10;
LiquidCrystal lcd(RS, E, D4, D5, D6, D7);
Metro ledMetro = Metro(2000); //temps d'une boucle, ici 2sec.
int nbre_impulsion;
int nbre_impulsion_vitesse;
volatile int front_montant = LOW;
void setup() // fonction setup - début de l'exécution du programme
{
Serial.begin(9600);
attachInterrupt(0, counter, RISING); //fonction permettant d’incrémenter le nbre_impulsion, avec la patte digitale de mon codeur branché sur l'entrée 3 digitale
pinMode(BP1State,INPUT); // déclaration de mes BP en tant que entrée
pinMode(BP3State,INPUT);
pinMode(BP4State,INPUT);
pinMode(BP5State,INPUT);
digitalWrite(BP1State, HIGH); // je ne sais plus pourquoi j'ai mis ces fonctions, je l'avais vu dans un autre programme ... peut être pour tester les BP
digitalWrite(BP3State, HIGH);
digitalWrite(BP4State, LOW);
digitalWrite(BP5State, LOW);
lcd.begin(20,4); // propriété de mon écran lcd : 20 caractère et 4 lignes
lcd.print("LCD OK"); // test du lcd
delay(2000);
lcd.clear();
delay(10);
}
void counter() //ici donc ma fonction, ou macro incrémentant le nbre_impulsion
{
++nbre_impulsion;
++nbre_impulsion_vitesse; // cette variable est nécéssaire, car contrairement, a nbre_impulsion, il ne se réinitialise pas en fin de boucle ledMetro.check
}
void loop()
{
int pos_rad;
int pos_deg;
int vitesse;
int vitesse_BP1;
int position_BP1_rad;
int position_BP1_deg;
int nbre_impulsion_vitesse;
int pos_deg1;
int pos_rad1;
while (digitalRead(BP3State) == HIGH); // tant que je n'appuie pas sur ce bouton, ici, il sert en gros a bouton d'arret d'urgence quoi ...
{
if (digitalRead(BP4State) == HIGH); // cet interrupteur indique s'il est actionné que le portail partira en position fermée
{
while (pos_deg < 90)
{
lcd.clear();
if (ledMetro.check() != 1) //si le temps est different de 2sec.
{
if (digitalRead(BP1State) == LOW); // si l'on appuie sur ce BP, alors on enregistre la position et la vitesse a ce moment
{
vitesse_BP1 = vitesse;
position_BP1_rad = pos_rad;
position_BP1_deg = pos_deg;
}
pos_rad = nbre_impulsion*(3.14/2)/90; // calculs pour avoir les position en radian, degré et la vitesse, précision : mon codeur envoie 1 impulsion par degré
pos_deg = nbre_impulsion;
vitesse = vitesse = (nbre_impulsion_vitesse*(3.14/2)/90)/2;
lcd.setCursor(0,0); // on affiche la position et la vitesse
lcd.print("POS DEG: ");
lcd.setCursor(9,0);
lcd.print(pos_deg);
lcd.setCursor(0,1);
lcd.print("POS RAD: ");
lcd.setCursor(9,1);
lcd.print(pos_rad);
lcd.setCursor(0,2);
lcd.print("vitesse: ");
lcd.setCursor(9,2);
lcd.print(vitesse);
}
if (ledMetro.check() == 1) // on efface toute les 2sec.
{
lcd.clear();
delay(100);
}
}
if(pos_deg >= 90) // quand la position en degré est égale a 90, ou un peu supérieure, alors on arrete, puisque le portail ne bouge plus
{
lcd.clear();
delay(10);
lcd.print("INFORMATIONS AU");
lcd.setCursor(0,1);
lcd.print("POINT VOULU");
delay(2000);
lcd.clear();
delay(10);
lcd.setCursor(0,0); // on affiche à ce moment la la vitesse et la position au moment ou l'on avais appuyé sur BP1
lcd.print("vit. BP1: ");
lcd.setCursor(10,0);
lcd.print(vitesse_BP1);
lcd.setCursor(0,1);
lcd.print("POS DEG BP1:");
lcd.setCursor(12,1);
lcd.print(position_BP1_deg);
lcd.setCursor(0,2);
lcd.print("POS RAD BP1:");
lcd.setCursor(12,2);
lcd.print(position_BP1_rad);
delay(100000000);
}
}
if (digitalRead(BP5State) == HIGH); //si BP5 est appuyé, c'est que le portail part en position ouverte, les calculs de positions sont donc différents
{
while (pos_deg1 > 0) // quand il finira de bouger, la position sera de 0
{
lcd.clear();
if (ledMetro.check() != 1)
{
pos_rad1 = (3.14/2)-(nbre_impulsion*(3.14/2)/90);
pos_deg1 = 90-nbre_impulsion;
vitesse = vitesse = (nbre_impulsion_vitesse*(3.14/2)/90)/2;
lcd.setCursor(0,0);
lcd.print("POS DEG: ");
lcd.setCursor(9,0);
lcd.print(pos_deg1);
lcd.setCursor(0,1);
lcd.print("POS RAD: ");
lcd.setCursor(9,1);
lcd.print(pos_rad1);
lcd.setCursor(0,2); // pour le reste, tout est pareil que quand BP4 est actionné au lieu de BP5
lcd.print("vitesse: ");
lcd.setCursor(9,2);
lcd.print(vitesse);
if (digitalRead(BP1State) == LOW);
{
vitesse_BP1 = vitesse;
position_BP1_rad = pos_rad1;
position_BP1_deg = pos_deg1;
}
}
if (ledMetro.check() == 1)
{
lcd.clear();
delay(100);
}
}
if (pos_deg <= 0)
{
lcd.print("INFORMATIONS AU");
lcd.setCursor(0,1);
lcd.print("POINT VOULU");
delay(2000);
lcd.clear();
delay(10);
lcd.setCursor(0,0);
lcd.print("vit. BP1: ");
lcd.setCursor(10,0);
lcd.print(vitesse_BP1);
lcd.setCursor(0,0);
lcd.print("POS DEG BP1:");
lcd.setCursor(12,1);
lcd.print(position_BP1_deg);
lcd.setCursor(0,2);
lcd.print("POS RAD BP1:");
lcd.setCursor(12,2);
lcd.print(position_BP1_rad);
delay(100000000);
}
}
}
if (digitalRead(BP3State) == LOW)
{
lcd.print("! Recommencez !"); // si on a appuyé sur BP3, ce message s'affiche, et le programme doit etre redémarré.
delay(10000000);
}
}