Светодиод не гаснет полностью с помощью функции 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 Ом. (наблюдение: резистор не закорочен, на моей макетной плате эти ряды разделены)
@tatu101, 👍0
Обсуждение1 ответ
Лучший ответ:
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
- ESP8266, похоже, убивает цикл while
- Код Arduino для управления 4 светодиодами с 4 кнопок
- NodeMCU отображает температуру и контрольный светодиод на веб-странице с автоматическим обновлением.
- Один светодиод управляется двумя кнопками - одна из которых действует как тумблер
- Как определить размер Flash?
- WebSocketsServer.h: No such file or directory
- Улучшенное циклическое переключение цветов RGB.
- В ESP-12E NodeMCU, какой выход PIN A0?
Этот резистор ничего не сделает, если под ним параллельно идет проводник., @timemage
Светодиоды не гаснут полностью
... откуда ты это знаешь? ... возможно, они включаются и выключаются очень быстро ... сократите код, чтобы включить светодиод, задержать на 1 секунду, выключить светодиод, задержать на 1 секунду и повторить, @jsotolaвы проверили соединение между проводами и попробовали новый светодиод?, @Iliketurtles
@timemage Извините, я забыл упомянуть, что на моей макетной плате нижний ряд почему-то отделен, @tatu101