Je met le code ici, il ne rentrait pas dans le premier post :
#include <PID_v1.h>
#include <Wire.h>
#include <LiquidCrystal_I2C.h>
// Déclare l'adressse série de l'afficheur (0x3F) avec 16 char de long et 2 lignes
LiquidCrystal_I2C lcd(0x3F,16,2);
// Déclaration des PIN
const int phot_res=2; //pin de la DO de la photoresistance
const int speed_33=7; //pin du sélecteur vitesse 33 rpm
const int speed_45=8; //pin du sélecteur vitesse 45 rpm
const int com_mot=3; //pin de la commande relais moteur
const int transi_mot=5; // Pin du PWN module transistor pilotage moteur
// Variables du code pour calcul RPM
float cons_rpm=0; // Consigne vitesse en RPM dans le loop
volatile byte rev_plat; // varibale correspondant aux de révolution du plateau
float rpm_count; // RPM calculé
unsigned long timeold; // compteur de temps entre deux calcul de révolution
// Variables pour PID de consigne moteur
float cons_mot=0;
//Define the aggressive and conservative Tuning Parameters
double aggKp=4, aggKi=0.2, aggKd=1;
double consKp=1, consKi=0.05, consKd=0.25;
//Convertion en double des float de mesure et consigne
double rpm_count_double=0, cons_mot_double=0, cons_rpm_double=0;
// Déclaration du PID
PID motPID(&rpm_count_double, &cons_mot_double, &cons_rpm_double, consKp, consKi, consKd, DIRECT);
// Varible pour pilotage MOSFET
float cons_old;
void setup()
{
// put your setup code here, to run once:
pinMode(phot_res, INPUT_PULLUP);
pinMode(speed_33, INPUT_PULLUP);
pinMode(speed_45, INPUT_PULLUP);
pinMode(com_mot, OUTPUT);
pinMode(transi_mot, OUTPUT);
attachInterrupt(digitalPinToInterrupt(phot_res), rpm_fun, RISING);
rev_plat = 0; // Initialisation des valeurs
rpm_count = 0;
timeold = 0;
cons_old=0;
motPID.SetMode(AUTOMATIC);
lcd.init(); // Cette ligne et celles d'en dessous commençant par "lcd." initialisent l'écran
lcd.backlight();
lcd.noCursor();
//Com moniteur série pour débug
Serial.begin(9600);
}
void loop()
{
// put your main code here, to run repeatedly:
func_affich();// Actu de l'affichange
cons_rpm=chxRPM(); // Appelle chxRPM qui choisie la consigne RPM
rpm_count=rpm_calc(); // calcule le RPM et le stock dans rpm_count
fonc_pil_mot(); //consigne sur transis de pilotage moteur & démarrage moteur (PID)
debug_moni();
}
float chxRPM() //Sélecteur de vitesse (choix de la consigne de vitesse)
{
float rpm=0;
if (digitalRead(speed_45)==HIGH) // à 0=33rpm, à 1=45rpm
{
rpm=45;
}
else
{
if (digitalRead(speed_33)==HIGH) // à 0=33rpm, à 1=45rpm
{
rpm=100/3;
}
}
return rpm;
}
void start_mot(float valeur_rpm) //pilote le relais d'actionnement moteur
{
if (valeur_rpm!=0) // Pilote le relais, l'allume si une consigne est demandé sur le commutateur 2 positions
{
digitalWrite(com_mot, HIGH);
if(cons_mot=0)//Si il n'y a aucune donnée de pilotage moteur (état du mosfet au démarrage) ...
{
cons_mot=95; // Lance un premier coup le moteur
}
}
else
{
digitalWrite(com_mot, LOW);
}
}
void rpm_fun()
{
rev_plat++;
// Compteur de révolutions plateau
}
float rpm_calc() // Calcul du RPM
{
float calc_rpm=0; //variable pour la boucle
if (millis() - timeold >= 1000) //Met à jour le compteur de RPM toutes les secondes
{
detachInterrupt(0);//empèche les interrupt le temps du calcul
calc_rpm = rev_plat * 60; // Converti en RPM, à raison de 1 interruption par rotation
rev_plat = 0; // Remet à zéro le compteur de rév
timeold = millis(); // met à jour le compteur de temps entre 2 calcul
attachInterrupt(digitalPinToInterrupt(phot_res), rpm_fun, RISING); //rétabli les interrupt
}
return calc_rpm; //renvoie la vitesse en RPM
}
void fonc_pil_mot()
{
//conversion float double
rpm_count_double=rpm_count*100;
cons_mot_double=cons_mot*100;
cons_rpm_double=cons_rpm*100;
//Rappel :
//
//PID motPID(&rpm_count_double, &cons_mot_double, &cons_rpm_double, consKp, consKi, consKd, DIRECT);
double gap = abs(cons_mot_double-rpm_count_double); //écart entre consigne et mesure (rappel c'est x100)
if (gap < 20)
{ //we're close to setpoint, use conservative tuning parameters
motPID.SetTunings(consKp, consKi, consKd);
}
else
{
//we're far from setpoint, use aggressive tuning parameters
motPID.SetTunings(aggKp, aggKi, aggKd);
}
motPID.Compute();
//conversion double float
rpm_count=rpm_count_double/100;
cons_mot=cons_mot_double/100;
cons_rpm=cons_rpm_double/100;
pil_trans_mot(cons_mot, cons_old);
start_mot(cons_rpm);
cons_old = cons_mot;
}
void func_affich() // Actu de l'affichange
{
int err=0;
err=(cons_rpm/rpm_count)*100;
lcd.home();
lcd.print("Cs:");
lcd.print(cons_rpm); // Affiche la consigne
lcd.print("|Me:");
lcd.print(rpm_count); // Affiche la mesure
lcd.setCursor(0,1);
lcd.print("Mot:");
lcd.print(digitalRead(com_mot)); // Donne l'état de la commande moteur
lcd.setCursor(8,1);
lcd.print("Err:"); // Affiche l'erreur Cons/mesure (variable err)
lcd.print(err);
lcd.setCursor(15,1);
lcd.print("%");
}
void pil_trans_mot(float consigne, float old_cons)
{
if (consigne<64) // Etalonne la commande transistor sur 64-->255 (6V-->24V, soit les valeurs limites du moteur)
{
consigne = 64;
}
if (consigne>255)
{
consigne = 255;
}
int a=consigne;
int b=old_cons;
if (consigne <= old_cons) // Détermine si la vitesse cible diminue ou augmente
{
for(int x = b; x <= a; x++) // Si elle augmente, augmente la tension progressivement
{
analogWrite(transi_mot, x);
delay(5);
}
}
else
{
for(int x = b; x >= a; x--) // diminue progressivement
{
analogWrite(transi_mot, x);
delay(5);
}
}
}
//Fonction pour débug moniteur série
void debug_moni()
{
Serial.print("Etat photores");
Serial.print(digitalRead(phot_res));
Serial.print("Mesure rpm");
Serial.print(rpm_count);
Serial.print("Consigne RPM (ds loop)");
Serial.print(cons_rpm);
Serial.print("Consignes émise transistor pilotage moteur");
Serial.print(analogRead(transi_mot));
Serial.print("Dernière consignes stockée");
Serial.print(cons_mot);
Serial.print("Commande relai moteur");
Serial.print(digitalRead(com_mot));
}