ESP8266 gestion des entrées

Bonjour à tous et à toutes.
Je cherche à faire un clignoteur sur une base d'ESP8266 (WEMOS D1 mini). Il y a deux poussoirs reliés aux PIN D5 et D6, D5 donne un type de clignotement et D6 un différent, D5 et D6 ensemble sont sensés produire encore un autre type de clignotement. Mais seulement, il n'y a que D6 qui est pris en compte. Voici mon code:

void loop() {
  // 1s/2s
  if (digitalRead(E1)==LOW) {
    Serial.println("D6");
    analogWrite(ledPin, lum);
    delay(1000);
    analogWrite(ledPin, 0);
    delay(2000);
  }
  // 0,5s/0,5s
  else if (digitalRead(E3)==LOW) {
    Serial.println("D5");
    analogWrite(ledPin, lum);
    delay(500);
    analogWrite(ledPin, 0);
    delay(500);
  }
  //0,5s/1s
  else if (digitalRead(E1)==LOW and digitalRead(E3)==LOW) {
    Serial.println("D6 et D5");
    analogWrite(ledPin, lum);
    delay(500);
    analogWrite(ledPin, 0);
    delay(1000);
  }

Si quelqu'un a une suggestion, je suis preneur.

postez tout le code :slight_smile:

n'utilisez pas delay()

Voici tout mon code:

#include "RTClib.h"
RTC_DS3231 rtc;

#include <sunset.h>
SunSet sun;

#include <Wire.h>

#define TIMEZONE 1
#define LATITUDE 48.856614
#define LONGITUDE 2.3522219

const int ledPin = D3; // SORTIE 1
const int E1 = D6;
const int E2 = D7;
const int E3 = D5;
const int E4 = D4;

int lum = 1023;

void setup() {
  pinMode(E1, INPUT_PULLUP);
  pinMode(E2, INPUT_PULLUP);
  pinMode(E3, INPUT_PULLUP);
  pinMode(E4, INPUT_PULLUP);

  Serial.begin(115200);
  Wire.begin();
  rtc.begin();
  rtc.adjust(DateTime(2022,02,19,17,51,0)); // année, mois, jour, heure, minute, seconde
  sun.setPosition(LATITUDE, LONGITUDE, TIMEZONE);
}

void loop() {
  // 1s/2s
  if (digitalRead(E1)==LOW) {
    Serial.println("D6");
    analogWrite(ledPin, lum);
    delay(1000);
    analogWrite(ledPin, 0);
    delay(2000);
  }
  // 0,5s/0,5s
  else if (digitalRead(E3)==LOW) {
    Serial.println("D5");
    analogWrite(ledPin, lum);
    delay(500);
    analogWrite(ledPin, 0);
    delay(500);
  }
  //0,5s/1s
  else if (digitalRead(E1)==LOW and digitalRead(E3)==LOW) {
    Serial.println("D6 et D5");
    analogWrite(ledPin, lum);
    delay(500);
    analogWrite(ledPin, 0);
    delay(1000);
  }
  // 1s/1s
  //else {

    //analogWrite(ledPin, lum);
    //delay(1000);
    //analogWrite(ledPin, 0);
    //delay(1000);
  //}
  

  soleil();
}

void soleil() {
  
  DateTime now = rtc.now();
  sun.setCurrentDate(now.year(), now.month(), now.day());

  int sunrise = sun.calcSunrise();
  int sunset = sun.calcSunset();
  int c_time = now.hour() * 60 + now.minute();  

  if (c_time <= sunrise){
    Serial.println("nuit matin");
    lum = 30;
  }
  else if (c_time >= sunset){
    Serial.println("nuit soir");
    lum = 30;
  }
  else {
    Serial.println("jour");
    lum = 1023;
  }
  Serial.print(c_time);
  Serial.print(":");
  Serial.print(sunrise);//lever du soleil
  Serial.print(":");
  Serial.print(sunset);//coucher du soleil
  Serial.println(" ");
}

Que puis-je utiliser à la place de delay()?

Ne faites pas de chaînes else-if, mettez seulement 3 Ifs.
Salutations.

J'ai essayé avec 3 if, mais le résultat n'est pas mieux, j'obtient à tour de rôle D5, puis D6, puis D5 et D6 en boucle.

Bonsoir
Tout ceci me semble normal puisque D5 && D6 LOW ne seront jamais atteints.
En effet, dans la condition D5 && D6 LOW, le if D6 est vrai en premier.
Essayez de remonter cette condition en premier.
Ou alors préciser l'état des 2 boutons à chaque condition ex : D6 == LOW && D5 == HIGH

Merci phil12, c'est une très bonne idée, je test ça de suite.

Effectivement, en remontant

if (digitalRead(E1)==LOW and digitalRead(E3)==LOW) {

Cela fonctionne parfaitement :grinning:
Merci Phil12, et à tous pour votre réactivité. :+1:

This topic was automatically closed 180 days after the last reply. New replies are no longer allowed.