Probleme commande moteur + LED

Bonjour, je souaite piloter un moteur avec courte acceleration et faire clignoter une LED pendant tout le temps que le moteur tourne. J'ai ecrit un programme avec une sortie analogique connectée à une LED pour simuler le moteur, et une autre LED pour le clignotement. Elle s'allume mais ne clignote pas. JE ne comprends pas pourquoi. Ci dessous le code :

void Ouverture() {
  Etat_fin_course_ouvert = digitalRead(fin_course_ouvert);
  previousTime=millis();
  currentTime=millis();
  while (Etat_fin_course_ouvert == LOW) {
    analogWrite(analog_Out_moteur_ouverture, Output_Moteur_Ouverture);
    currentTime = millis();
    if((currentTime-previousTime)>2000){
      previousTime=currentTime;
      if (etat_led_moteur == 0) {
        digitalWrite(led_moteur, HIGH);
       }
      else {
        digitalWrite(led_moteur, LOW);
      }
      etat_led_moteur == !etat_led_moteur;
    }
    if (Output_Moteur_Ouverture < 255) {
      Output_Moteur_Ouverture = Output_Moteur_Ouverture + 1 ;
      delay (Tempo_Acceleration) ;
    }
    Etat_fin_course_ouvert = digitalRead(fin_course_ouvert);
  }
analogWrite(analog_Out_moteur_ouverture, 0);
}

Merci pour votre aide

Bonjour,

Pour obtenir rapidement de l'aide, je te suggére de poster tout ton code
Setup et loop y compris, car là, on ne peut pas exemple déterminer exactement comment tu traite la sortie analogique.

Ok mais je ne l'avais pas mis car le pb n'est pas la sortie analogique mais la LED. Ci dessous la totalité

// These constants won't change. They're used to give names to the pins used: entrées sorties analogiques
const int analog_In_Photo = A0;  // Analog input photo resistance
const int analog_Out_moteur_ouverture = 11;  // Analog output pin that the LED Bleue is attached to (simul moteur ouverture)
const int analog_Out_moteur_fermeture = 10;  // Analog output pin that the LED Jaune is attached to (simul moteur fermeture)


// These constants won't change. They're used to give names to the pins used: sorties digitales
const int led_moteur = 7;    // pin moteur tourne (led rouge)
const int led_lumiere = 8;    // pin luminosité (LED verte)
const int led_manuel_auto = 12;   // pin manuel / auto (LED blanche)

// These constants won't change. They're used to give names to the pins used: entrées digitales
const int fin_course_ouvert = 2;  // pin fin de course ouvert
const int fin_course_ferme = 4;  // pin fin de course fermé

// These constants won't change
const int seuil_jour = 300;  // définition de la valeur du seuil de jour
const int seuil_nuit = 200;  // définition de la valeur du seuil de nuit

// variables will change:
int Etat_fin_course_ouvert = 0;  // variable for reading etat fin de course ouverture
int Etat_fin_course_ferme = 0;  // variable for reading etat fin de course fermeture
int etat_led_luminosite = 0; // variable d'état de la LED (allumée / éteinte)
int etat_led_moteur = 0; // variable d'état de la LED (allumée / éteinte)
int Mesure_Lumiere = 0;  // value read from the photo resistance
int Output_Moteur_Ouverture = 0;  // value output to the PWM (analog out)
int Output_Moteur_Fermeture = 0;  // value output to the PWM (analog out)
int Output_Value_min = 30; // valeur de démarrage moteur
int Tempo_Acceleration = 10; // tempo pour accélération moteur
// Gestion du temps
unsigned long currentTime=0;
unsigned long previousTime=0;

void setup() {
 // put your setup code here, to run once:
 // initialize the pushbutton pin as an input:
  pinMode(fin_course_ouvert, INPUT);
  pinMode(fin_course_ferme, INPUT);
 // initialize the LED pin as an output:
  pinMode(led_moteur, OUTPUT);
  pinMode(led_lumiere, OUTPUT);
  pinMode(led_manuel_auto, OUTPUT);
// init valeur sortie moteur
Output_Moteur_Ouverture = Output_Value_min;
Output_Moteur_Fermeture = Output_Value_min;
}

void loop() {

  // put your main code here, to run repeatedly:
  
  // Lecture senseur
  Mesure_Lumiere = analogRead(analog_In_Photo);

  // pilotage LED verte en fonction luminosité : fixe, clignotement lent ou clignotement rapide
  if ( Mesure_Lumiere > seuil_jour) { // si lumière jour, vert continu
  digitalWrite(led_lumiere, HIGH); // allumage LED verte en continu
  Ouverture(); // ouverture poulailler
  }
  else if ( Mesure_Lumiere < seuil_nuit && etat_led_luminosite == 0) { // si lumière nuit, vert clignote lentement
  digitalWrite(led_lumiere, HIGH);
  delay (1000);
  etat_led_luminosite = 1;
  }
  else if ( Mesure_Lumiere < seuil_nuit && etat_led_luminosite == 1) { // si lumière nuit, vert clignote lentement
  digitalWrite(led_lumiere, LOW);
  delay (1000);
  etat_led_luminosite = 0;
  }
  else if (Mesure_Lumiere < seuil_jour && Mesure_Lumiere > seuil_nuit && etat_led_luminosite == 0) { // si ni jour ni nuit, vert clignote vite
  digitalWrite(led_lumiere, HIGH);
  delay (200);
  etat_led_luminosite = 1;
  }
  else  { // si lumière nuit, vert clignote vite
  digitalWrite(led_lumiere, LOW);
  delay (200);
  etat_led_luminosite = 0;
  }

  // read the state of the pushbutton value:
  Etat_fin_course_ouvert = digitalRead(fin_course_ouvert);
  Etat_fin_course_ferme = digitalRead(fin_course_ferme);
  
}

void Ouverture() {
  Etat_fin_course_ouvert = digitalRead(fin_course_ouvert);
  previousTime=millis();
  currentTime=millis();
  while (Etat_fin_course_ouvert == LOW) {
    analogWrite(analog_Out_moteur_ouverture, Output_Moteur_Ouverture);
    currentTime = millis();
    if((currentTime-previousTime)>2000){
      previousTime=currentTime;
      if (etat_led_moteur == 0) {
        digitalWrite(led_moteur, HIGH);
       }
      else {
        digitalWrite(led_moteur, LOW);
      }
      etat_led_moteur == !etat_led_moteur;
    }
    if (Output_Moteur_Ouverture < 255) {
      Output_Moteur_Ouverture = Output_Moteur_Ouverture + 1 ;
      delay (Tempo_Acceleration) ;
    }
    Etat_fin_course_ouvert = digitalRead(fin_course_ouvert);
  }
analogWrite(analog_Out_moteur_ouverture, 0);
}

Bonsoir vincent5157

J'ai fait quelques corrections dans ta boucle (mais pas essayé), essaies ça, j'ai laissé les lignes inutiles en remarque.

void Ouverture() {
	Etat_fin_course_ouvert = digitalRead(fin_course_ouvert);
	//previousTime=millis();
	currentTime=millis();
	while (Etat_fin_course_ouvert == LOW) {
		analogWrite(analog_Out_moteur_ouverture, Output_Moteur_Ouverture);
		//currentTime = millis();
		if((millis()-currentTime)>=2000){
			//previousTime=currentTime;
			currentTime = millis();     // Redémarrage du chrono
			if (etat_led_moteur == 0) {
				digitalWrite(led_moteur, HIGH);
			}
			else {
				digitalWrite(led_moteur, LOW);
			}
			etat_led_moteur == !etat_led_moteur;
		}
		if (Output_Moteur_Ouverture < 255) {
			Output_Moteur_Ouverture = Output_Moteur_Ouverture + 1 ;
			delay (Tempo_Acceleration) ;
		}
		Etat_fin_course_ouvert = digitalRead(fin_course_ouvert);
	}
	analogWrite(analog_Out_moteur_ouverture, 0);
}

A+
Cordialement
jpbbricole

Super, merci beaucoup. C'est plus clair comme ça. Il y a aussi une erreur ici :slight_smile: etat_led_moteur == !etat_led_moteur;
Un seul "=" nécessaire. Je ne comprends pas pourquoi ce n'est pas détecté par le compilateur.
J'ai encore beaucoup de trvail sur ce programme. C'est une porte d'ouverture de poulailler mais qui coince quelquefois à la descente (les poules déplacent des éléments qui peuvent bloquer la porte. Je dois ajouter deux tentatives de descente avec time out. Je crois que vous aller encore devoir supporter mes questions. Merci encore

Bonjour vincent5157

Parce que ce n'est pas une erreur mais en faisant ça:
etat_led_moteur == !etat_led_moteur;
tu "dis" etat_led_moteur est égal à l'inverse de etat_led_moteur et le résultat est toujours false.

Pour inverser une LED en une seule opération:
digitalWrite(led_moteur, !digitalRead(led_moteur));

Bonne journée
jpbbricole

Bonjour, j'utilise mon arduino uno depuis quelques mois. J'utilise toutes les entrees sorties 2 à 13 plus A0 à A3. Je voudrai ajouter une entrée digitale en A4 mais je n'y arrive pas. Elle est toujours lue comme active. J'ai d'abord cheché coté hardware et n'ai rien trouvé. Cablée comme les autres. Si je connecte A4 directement sur GND mon programme la lit toujours à 1 alors que ça fonctionne bien pour les autres. Donc je suppose que c'est mon soft qui n'est pas bon. J'ai retiré tout ce qui est inutile et joins le soft ci-dessous. Merci de votre aide et vos conseils.

// Constantes Entrées Sorties Analogiques
const int analog_In_Photo = A0; // Analog input photo resistance


// Constantes Sorties digitales

// Constantes Entrees Digitales
const int fin_course_ouvert = 2; // pin fin de course ouvert (trappe)
const int fin_course_ferme = 4; // pin fin de course fermé (trappe)
const int Bouton_Man_Auto = A1;
const int Bouton_Ouvert_Ferme = A2;
const int Bouton_porte_fermee = A3; // Grande porte fermée = HIGH
const int Bouton_marche_forcee = A4; // Entree marche forcee si = HIGH (pilotage extérieur)

// Constantes pour le programme

// Variables :
int Etat_fin_course_ouvert = 0; // variable for reading etat fin de course ouverture
int Etat_fin_course_ferme = 0; // variable for reading etat fin de course fermeture
int Mesure_Lumiere = 0; // value read from the photo resistance
int Etat_bouton_auto = 0; // Etat bouton poussoir A/M (1 si appuyé => bascule)
int Etat_bouton_O_F = 0; // Etat bouton poussoir O/F (1 si appuyé = bascule)
int Etat_porte_fermee = 1; // Etat grande porte - Fermée = 1 ; Ouverte = 0
int Etat_bouton_Marche_Forcee = 0; // Etat entree marche forcee (pilotage exterieur)

// Gestion du temps

//Library version:1.1 Ecran LCD
#include <LiquidCrystal_I2C.h>
LiquidCrystal_I2C lcd(0x27,16,2); // set the LCD address to 0x27 for a 16 chars and 2 line display

void setup() {
// Initialisation Ecran LCD
lcd.init(); // initialize the lcd
// initialize the pushbutton pin as an input:
pinMode (fin_course_ouvert, INPUT); // pinMode (fin_course_ouvert, INPUT_PULLUP); // active la résistance interne de la broche concernée
pinMode (fin_course_ferme, INPUT); // pinMode (fin_course_ferme, INPUT_PULLUP); // active la résistance interne de la broche concernée
pinMode (Bouton_Man_Auto, INPUT); // pinMode (Bouton_Man_Auto, INPUT_PULLUP); // active la résistance interne de la broche concernée
pinMode (Bouton_Ouvert_Ferme, INPUT); // pinMode (Bouton_Ouvert_Ferme, INPUT_PULLUP); // active la résistance interne de la broche concernée
pinMode (Bouton_porte_fermee, INPUT); // pinMode (Bouton_porte_fermee, INPUT_PULLUP); // active la résistance interne de la broche concernée
pinMode (Bouton_marche_forcee, INPUT); // pinMode (Bouton_porte_fermee, INPUT_PULLUP); // active la résistance interne de la broche concernée

// Print a message to the LCD.
lcd.backlight();
lcd.setCursor(0,0);
lcd.print("Initialisation");

}

void loop() {
// put your main code here, to run repeatedly:

// Provisoire pour test

// Lectures entrées
Etat_porte_fermee = digitalRead (Bouton_porte_fermee);
Etat_bouton_auto = digitalRead (Bouton_Man_Auto);
Etat_fin_course_ouvert = digitalRead (fin_course_ouvert);
Etat_fin_course_ferme = digitalRead (fin_course_ferme);
Etat_bouton_O_F = digitalRead (Bouton_Ouvert_Ferme);
Etat_bouton_Marche_Forcee = digitalRead (Bouton_marche_forcee);
Mesure_Lumiere = analogRead(analog_In_Photo);

// Affichage état entrées
lcd.setCursor(0,1);
lcd.print(Mesure_Lumiere);
lcd.print(" ");
lcd.print(Etat_bouton_auto);
lcd.print(" ");
lcd.print(Etat_bouton_O_F);
lcd.print(" ");
lcd.print(Etat_porte_fermee);
lcd.print(" ");
lcd.print(Etat_fin_course_ferme);
lcd.print(" ");
lcd.print(Etat_fin_course_ouvert);
lcd.print(" ");
lcd.print(Etat_bouton_Marche_Forcee);
lcd.print(" ");
delay (200);

}

A4 et A5 sont utilisées par le bus I2C qui sert à piloter ton afficheur.

Bonjour je vous remercie. J’utilise les deux broches sda et l’autre pour l’afficheur (sur l’autre connecteur). Ce sont les mêmes où je peux utiliser ces deux autres broches comme i/o ?

SDA = A4
SCL = A5