Кастомная функция переключения светодиодов: один из трех светодиодов работает неправильно

Я подключил три светодиода к 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));
}

, 👍4

Обсуждение

Проверьте проводку; нет никаких особых причин, по которым это было бы проблемой именно с этим контактом, если только нет проблем с проводкой или электричеством (которые могут быть внутренними). Обратите внимание, что 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


1 ответ


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

2

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

,