Кастомная функция переключения светодиодов: один из трех светодиодов работает неправильно
Я подключил три светодиода к Arduino Uno и написал простой класс светодиодов. Я переключаю все светодиоды основного цикла, но по какой-то причине один светодиод (подключенный к pin7) всегда плохосебя ведет, пропускает один переключатель или остается включенным все время. Изначально все светодиоды выключены (в функции begin ()). Что может вызвать эту проблему?
main.cpp
#include "led.h"
#include <Arduino.h>
Led leds[] = {
Led(2),
Led(3),
Led(7)
};
void setup()
{
Serial.begin(9600);
for (Led& l : leds) l.begin();
}
void loop()
{
for (Led &l : leds) l.toggle();
delay(500);
}
Led.h
class Led {
public:
Led(int pin);
void begin();
void toggle();
private:
const int _pin;
};
Led.cpp
#include "led.h"
#include "Arduino.h"
Led::Led(int pin) : _pin(pin)
{}
void Led::begin()
{
pinMode(_pin, OUTPUT);
digitalWrite(_pin, LOW);
}
void Led::toggle()
{
digitalWrite(_pin, !digitalRead(_pin));
}
@Jurc192, 👍4
Обсуждение1 ответ
Лучший ответ:
▲ 2
Похоже, это аппаратная неисправность, как предполагали другие: Я подключил светодиод к другому контакту(8), и он работает отлично, каждый раз. Похоже, что-то внутренне сгорело на этом конкретном контакте
,
@Jurc192
Смотрите также:
- Светодиоды: разница между общим анодом и общим катодом
- Отображение двоичных данных на светодиодах
- Акцептант векселей ИКТ
- Встроенные светодиоды HIGH и LOW кажутся перевернутыми
- Как подключить светодиодную RGB-матрицу 8x8 к Uno?
- Проводная связь Arduino с MCP23008 GPIO pin expander для включения светодиода нажатием кнопки
- if/else в digitalRead не выполняется в части else
- DHT11 не работает со светодиодом в arduino
Проверьте проводку; нет никаких особых причин, по которым это было бы проблемой именно с этим контактом, если только нет проблем с проводкой или электричеством (которые могут быть внутренними). Обратите внимание, что
digitalRead
возвращает int, а не bool, и IMO должен быть закодирован как таковой, чтобы избежать нарушения изменений или проблем с кросс-архитектурой., @Dave NewtonАга, хорошо, Arduino, который я использую, прошел через многое, так что скоро я проверю это с помощью нового. Он может быть неисправен. Но что именно вы имеете в виду, говоря "это должно быть закодировано как таковое"? Должен ли я явно привести его к bool? Или написать это "долгий путь", проверяя, если digitalRead==0 или ==1?, @Jurc192
Re: последнее; это (постепенно) безопаснее проверить на
ВЫСОКИЙ
(илиНИЗКИЙ
) и использовать условный op. Я забыл тему, которая привела меня к мысли, что это может быть потенциальной проблемой для продвижения вперед-что-то на форумах Arduino. Извини, но, наверное, это тоже не имеет большого значения., @Dave NewtonРазозлился и нашел его: https://forum.arduino.cc/t/does-digitalread-on-an-output-pin-return-the-last-state-it-was-set-to/437863, @Dave Newton
Для вашего класса безопаснее иметь внутреннюю запись состояния светодиода, а не полагаться на digitalRead (), чтобы получить правильный результат., @Majenko
Ладно, я тоже рассматривал этот вариант. Не могли бы вы указать мне на некоторые ресурсы или объяснения, в чем причина этого? Что вы подразумеваете под словом "безопаснее"?, @Jurc192