Réglages timer ON/OFF led avec 2 potentiomètres.

Bonjour,
Je bute toujours sur millis et après plusieurs essais je me dirige vers vous… :confused:

J’ai besoin de régler le temps d’allumage (DUREEHIGH)et le temps d’extinction (DUREELOW) d’une led, chacun des réglages s’effectue avec 1 potentiomètre différent.
Mon code me donne des comportements non désirés mais je ne comprends pas la façon de résoudre.
Une petite piste please :slight_smile:

int sensorHIGH = A0;    // select the input pin for the potentiometer
int sensorLOW  = A1;    // select the input pin for the potentiometer
int ledPin = 12;        // select the pin for the LED
  
int DUREEHIGH = 0;  // variable to store the value coming from the sensor
int DUREELOW  = 0;
int ledState = LOW;             // ledState used to set the LED
long previousMillisH = 0;       // will store last time LED was updated
long previousMillisL = 0;       // will store last time LED was updated

void setup() {
  Serial.begin(9600);
  pinMode(ledPin, OUTPUT);      
}

void loop()
{
 DUREEHIGH = analogRead(sensorHIGH); Serial.println("DUREE HIGH "); Serial.print(DUREEHIGH);Serial.print(" "); 
 DUREEHIGH = map(DUREEHIGH, 0, 1020, 50, 2000); Serial.print(DUREEHIGH); Serial.print("ms");
 Serial.println(" ");
 Serial.println(" ");   
 DUREELOW = analogRead(sensorLOW); Serial.println("DUREE LOW  "); Serial.print(DUREELOW); Serial.print(" "); 
 DUREELOW = map(DUREELOW, 0, 1020, 50, 2000); Serial.print(DUREELOW); Serial.print("ms");
 Serial.println("");  


  unsigned long currentMillisH = millis();  
  unsigned long currentMillisL = millis(); 
  
  
  if (currentMillisH - previousMillisH > DUREEHIGH) {
     previousMillisH = currentMillisH;   
     digitalWrite(ledPin, HIGH);
  } // Fin de IF

   
  if (currentMillisL - previousMillisL > DUREELOW) {
     previousMillisL = currentMillisL;   
  digitalWrite(ledPin, LOW);    
  } // Fin de IF

} // Fin de loop

il faut tenir compte de l'état de la LED - à garder dans une variable. Si elle est allumée, tu te préoccupes seulement de l'éteindre - et inversement. pas les deux à la fois !

Ok donc il faut bien que je garde un ledState comme dans l’exemple blinkwithoutdelay !
Je mis penche
Merci

J'arrive à qqch comme ça.. Mais ça m'échappe encore :/

void loop()
{
 DUREEHIGH = analogRead(sensorHIGH); Serial.print("DUREE HIGH   ");
 DUREEHIGH = map(DUREEHIGH, 0, 1020, 50, 2000); DUREEHIGH = constrain(DUREEHIGH, 50, 2000);
 Serial.print(DUREEHIGH); Serial.print("ms"); Serial.println(" ");
 DUREELOW = analogRead(sensorLOW); Serial.print("DUREE LOW    ");
 DUREELOW = map(DUREELOW, 0, 1020, 50, 2000); DUREELOW = constrain(DUREELOW, 50, 2000);
 Serial.print(DUREELOW); Serial.print("ms"); Serial.println(""); Serial.println("");  

  unsigned long currentMillisH = millis();  
  unsigned long currentMillisL = millis(); 
  
  
  if (currentMillisH - previousMillisH > DUREEHIGH) {
     previousMillisH = currentMillisH;       
   if (ledState == LOW)
      ledState = HIGH;
      digitalWrite(ledPin, ledState); 
  } // Fin de if HIGH
  
  if (currentMillisL - previousMillisL > DUREELOW) {
     previousMillisL = currentMillisL;  
      if (ledState == HIGH)
      ledState = LOW;
      digitalWrite(ledPin, ledState); 
  } // Fin de if LOW  

} // Fin de loop

Le plus simple serait d'utiliser une machine à états, il y a des tutos et des bibliothèques un peu partout sur le net

dans ton code j’utilise previousMillis qui sert à mémoriser le temps, une seule variable suffit vu que tu temporise l’allumage et l’instinction jamais en même temps, idem pour currentMillis une seule variable suffit elle reflète juste le temps qui cours, le temps actuel.
donc si la led est éteinte attendre que le temps actuel “currentMillis” soit plus grand que le temps mémorisé “previousMillis”+la durée et allumer la led
et inversement …

code à tester

int sensorHIGH = A0;    // select the input pin for the potentiometer
int sensorLOW  = A1;    // select the input pin for the potentiometer
int ledPin = 12;        // select the pin for the LED
 
int DUREEHIGH = 0;  // variable to store the value coming from the sensor
int DUREELOW  = 0;
int ledState = LOW;             // ledState used to set the LED

long previousMillis = 0;       // will store last time LED was updated


void setup() {
  Serial.begin(9600);
  pinMode(ledPin, OUTPUT);     
}

void loop()
{
 DUREEHIGH = analogRead(sensorHIGH); Serial.println("DUREE HIGH "); Serial.print(DUREEHIGH);Serial.print(" ");
 DUREEHIGH = map(DUREEHIGH, 0, 1020, 50, 2000); Serial.print(DUREEHIGH); Serial.print("ms");
 Serial.println(" ");
 Serial.println(" ");   
 DUREELOW = analogRead(sensorLOW); Serial.println("DUREE LOW  "); Serial.print(DUREELOW); Serial.print(" ");
 DUREELOW = map(DUREELOW, 0, 1020, 50, 2000); Serial.print(DUREELOW); Serial.print("ms");
 Serial.println(""); 


  unsigned long currentMillis = millis(); 

 
 
  if (!digitalRead(ledPin) and currentMillis > previousMillis + DUREEHIGH) { // si la led est éteinte on attend que currentMillis soit plus grand que previousMillis + DUREEHIGH
     previousMillis = currentMillis;   // mémorise le temps actuel 
     digitalWrite(ledPin, HIGH);
  } // Fin de IF

   
  if (digitalRead(ledPin) and currentMillis > previousMillis > DUREELOW) {// si la led est allumée on attend que currentMillis soit plus grand que previousMillis + DUREELOW
     previousMillis = currentMillis;        // mémorise le temps actuel 
  digitalWrite(ledPin, LOW);   
  } // Fin de IF

} // Fin de loop

Merci pour vos réponses, j’ai pu intégré “une machine à états” mais par pour le blink, pour savoir si je suis en mode blink ou en mode fade et lire dans la EEPROM ce que l’arduino à écrit précédemment.

Je fabrique un tout petit arduino à base de attiny 85 qui permet de faire clignoter une guirlande de led via un transistor.
Un bouton pour choisir BLINK ou FADE et deux potentiomètre, un pour le DUREEHIGH et un pour la DUREELOW.
J’ai réussi l’ensemble sauf que je bute sur le fade without delay avec le réglage prédéfinit des deux potentiomètres.

#include "OneButton.h"
OneButton button1(2, true);

#include <EEPROM.h>
int addr = 0;  //Adresse de l'EEPROM

#define LED_PIN 1
int DUREEHIGH = 0;         //milliseconds
int DUREELOW  = 0;
int sensorHIGH = A1;       // potentiometre 1
int sensorLOW  = A3;       // potentiometre 2
unsigned long MillisH;     //time from millis()
unsigned long pMillisH;    //last time the LED changed state

unsigned long MillisSerial;
unsigned long pMillisSerial;
int interval = 1000;       // Interval Serial

boolean ledState;          //current LED state

enum {BLINK, FADE} BLINKorFADE;

void setup(void)
{
  Serial.begin(9600); while (!Serial) ;  // Pour Arduino Micro
  if (EEPROM.read(0) == 0) { BLINKorFADE = FADE; Serial.println ("EEPROM read BLINK"); }  // EEPROM read pour BLINKorFADE
   else { BLINKorFADE = BLINK; Serial.println ("EEPROM read FADE"); }
  button1.attachClick(QUESTION);
  pinMode(LED_PIN, OUTPUT);
}  // Fin de SETUP

void loop(void)
{
    MillisH = millis();
    MillisSerial = millis();
    button1.tick();
    potent();
     
 if (BLINKorFADE == FADE) 
 {   
  if (MillisH - pMillisH > (ledState ? DUREEHIGH : DUREELOW)) 
   { digitalWrite(LED_PIN, ledState = !ledState);
     pMillisH = MillisH;
   } // Fin de if
}  // Fin de if BLINKorFADE == FADE

 if (BLINKorFADE == BLINK) 
 {   
     digitalWrite(LED_PIN, LOW);
  } // Fin de if BLINKorFADE == BLINK
} // Fin de LOOP


/////////////////////////////////////////////////////
                     //FONCTIONS
/////////////////////////////////////////////////////

void QUESTION()
{
 switch (BLINKorFADE) {
  case BLINK :
  EEPROM.write(addr, 0);
  Serial.println("BLINK to EEPROM");
  BLINKorFADE = FADE;
  break;

  case FADE :
  EEPROM.write(addr, 1);
  Serial.println("FADE to EEPROM");
  BLINKorFADE = BLINK;
  break;
}  //Fin de Switch
} //Fin de QUESTION


void potent()
{
 DUREEHIGH = analogRead(sensorHIGH); 
 DUREEHIGH = map(DUREEHIGH, 10, 1020, 30, 5000);
 DUREEHIGH = constrain(DUREEHIGH, 30, 5000);
 DUREELOW = analogRead(sensorLOW); 
 DUREELOW = map(DUREELOW, 10, 1020, 30, 5000);
 DUREELOW = constrain(DUREELOW, 30, 5000);

 if (MillisSerial - pMillisSerial > interval)
 {
  pMillisSerial = MillisSerial;
  Serial.print("DUREE HIGH   ");
  Serial.print(DUREEHIGH);
  Serial.print("ms");
  Serial.println(" ");
  Serial.print("DUREE LOW    ");
  Serial.print(DUREELOW);
  Serial.print("ms");
  Serial.println("");
  Serial.println("");
  } // Fin de if Serial
} // Fin de void potent