Светодиод не гаснет полностью с помощью функции digitalWrite(led, LOW);

Когда я тестировал программу, я обнаружил странное поведение ESP8266.

Светодиоды не гаснут полностью в первом digitalWrite(led, LOW), просто яркость светодиода падает, но он гаснет во втором digitalWrite(led , НИЗКИЙ).

Не знаю, связано ли это с кодом или схемой, поэтому вот и то, и другое (программа — это просто два разных визуальных шаблона светодиодов, переключаемых кнопкой)

#define led1 D0
#define led2 D1
#define led3 D2
#define led4 D3
#define button D7

unsigned long pressedButton;
bool change = 0;
unsigned long previousTime = millis();
unsigned int difference;


void setup() {
  pinMode(led1, OUTPUT);
  pinMode(led2, OUTPUT);
  pinMode(led3, OUTPUT);
  pinMode(led4, OUTPUT);
  pinMode(button, INPUT_PULLUP);
}


void loop(){
  if (!digitalRead(button) && millis()-pressedButton>200){       //проверяем, была ли нажата кнопка, чтобы изменить визуальный рисунок светодиодов
      pressedButton = millis();
      change = !change;
      digitalWrite(led1, LOW);         //здесь светодиод полностью выключаем
      digitalWrite(led2, LOW);
      digitalWrite(led3, LOW);   
      digitalWrite(led4, LOW);
      previousTime = millis();
  }

  difference = millis()-previousTime;
  
  if (!change){                                     //визуальный шаблон светодиодов по умолчанию
    if (!digitalRead(led1) && difference>=200){
      digitalWrite(led1, HIGH);
    }
    if (!digitalRead(led2) && difference>=400){
      digitalWrite(led2, HIGH);
    }
    if (!digitalRead(led3) && difference>=600){
      digitalWrite(led3, HIGH);
    }
    if (!digitalRead(led4) && difference>=800){ 
      digitalWrite(led4, HIGH);
    }
    if (difference>=1000){
      digitalWrite(led4, LOW);           //здесь светодиоды просто сжимаются
    }
    if (difference>=1200){
      digitalWrite(led3, LOW);
    }
    if (difference>=1400){
      digitalWrite(led2, LOW);
    }
    if (difference>=1600){
      digitalWrite(led1, LOW);
      previousTime = millis();
    }
  }
  
  if (change){                    //альтернативный шаблон
     if (!digitalRead(led1) && difference>=200 && change){
       digitalWrite(led1, HIGH);
       digitalWrite(led4, HIGH);
       digitalWrite(led2, LOW);
       digitalWrite(led3, LOW);
    }
    if (digitalRead(led1) && difference>=400 && change){
       digitalWrite(led1, LOW);
       digitalWrite(led4, LOW);
       digitalWrite(led2, HIGH);
       digitalWrite(led3, HIGH);
       previousTime = millis();
    }
  }
}

На самом деле это NodeMCU Esp8266, контакты которого определены в коде, и резистор сопротивлением 470 Ом. (наблюдение: резистор не закорочен, на моей макетной плате эти ряды разделены)

, 👍0

Обсуждение

Этот резистор ничего не сделает, если под ним параллельно идет проводник., @timemage

Светодиоды не гаснут полностью... откуда ты это знаешь? ... возможно, они включаются и выключаются очень быстро ... сократите код, чтобы включить светодиод, задержать на 1 секунду, выключить светодиод, задержать на 1 секунду и повторить, @jsotola

вы проверили соединение между проводами и попробовали новый светодиод?, @Iliketurtles

@timemage Извините, я забыл упомянуть, что на моей макетной плате нижний ряд почему-то отделен, @tatu101


1 ответ


Лучший ответ:

2
if (!digitalRead(led3) && difference>=600){
  digitalWrite(led3, HIGH);
}
if (!digitalRead(led4) && difference>=800){ 
  digitalWrite(led4, HIGH);
}
if (difference>=1000){
  digitalWrite(led4, LOW);           //здесь светодиоды просто сжимаются
}
if (difference>=1200){
  digitalWrite(led3, LOW);
}

Представьте, что произойдет, когда разница составит >= 1000.

Если светодиод не горит, вы включаете его (поскольку он проходит первый тест, разница составляет >= 600), а через мгновение выключаете его. Поэтому светодиоды включаются и выключаются в быстрой последовательности, из-за чего они кажутся тусклыми.

Попробуйте изменить порядок тестов и добавлять else для каждого последующего. Кажется, это работает для меня:

  if (!change){                                     //Визуальный шаблон светодиодов по умолчанию
    if (difference>=1600){
      digitalWrite(led1, LOW);
      previousTime = millis();
    }
    else if (difference>=1400){
      digitalWrite(led2, LOW);
    }
    else if (difference>=1200){
      digitalWrite(led3, LOW);
    }
    else if (difference>=1000){
      digitalWrite(led4, LOW);
    }
    else if (!digitalRead(led4) && difference>=800){ 
      digitalWrite(led4, HIGH);
    }
    else if (!digitalRead(led3) && difference>=600){
      digitalWrite(led3, HIGH);
    }
    else if (!digitalRead(led2) && difference>=400){
      digitalWrite(led2, HIGH);
    }
    else if (!digitalRead(led1) && difference>=200){
      digitalWrite(led1, HIGH);
    }
  }

Кроме того, этот резистор в нижнем ряду ни на что не влияет, потому что все контакты нижнего ряда соединены вместе, поэтому он просто закорочен. Это вредно для светодиодов и процессора.

,

Спасибо! Я не увидел этой проблемы в коде. И извините, я забыл упомянуть, что на моей макетной плате нижний ряд отделен, поэтому он не закорочен., @tatu101