Как крутить светодиоды по показаниям напряжения?

Я пытаюсь включить светодиоды в светодиодном мосту на основе показаний напряжения от источника питания. когда напряжение равно нулю, ничего не горит, а затем светодиоды постепенно загораются по мере увеличения напряжения, подключенного к выводу Ao. (Я использую профессиональный брелок 3В 120 МГц)

Это мой код:

const int analogPin = A0; // контакт, к которому прикреплен потенциометр
const int ledCount = 7; // количество светодиодов на гистограмме

int ledPins[] = { 3, 4, 5, 6, 8, 9, 10}; // массив номеров контактов, к которым подключены светодиоды

void setup() {
    // перебираем массив контактов и устанавливаем их все на вывод:
    for (int thisLed = 0; thisLed < ledCount; thisLed++) {
        pinMode(ledPins[thisLed], OUTPUT);
    }
}

void loop() {
    // читаем потенциометр:
    int sensorReading = analogRead(analogPin);
    // сопоставляем результат с диапазоном от 0 до количества светодиодов:
    int ledLevel = map(sensorReading, 0, 1023, 0, ledCount);

    // цикл по массиву светодиодов:
    for (int thisLed = 0; thisLed < ledCount; thisLed++) {
        // если индекс элемента массива меньшеledLevel,
        // включаем пин для этого элемента:
        if (thisLed < ledLevel) {
            digitalWrite(ledPins[thisLed], HIGH);
        }
        // отключаем все контакты выше значенияledLevel:
        else {
            digitalWrite(ledPins[thisLed], LOW);
        }
    }
}

Однако я не получаю желаемого результата. при нулевом напряжении загорается один светодиод, а не ничего. при наличии напряжения все подключенные светодиоды загораются независимо от напряжения

при отсутствии напряжения (плавающие провода) я получаю следующее:

когда я подаю любое напряжение при включенном источнике питания, результат тот же:

Примечание. Что я делаю не так? редактировать: соединения примерно такие, но с меньшим количеством цифровых контактов.

Примечание: что я делаю неправильно! РЕДАКТИРОВАТЬ: Мне удалось распечатать результат последовательного монитора:

  • когда источник питания ВЫКЛ, показания A0 (показания датчика):

Примечание. Что я делаю не так? Когда источник питания включен при любом значении, показания A0 (показания датчика) составляют:

(Примечание: что я делаю не так!)

, 👍3

Обсуждение

Попробуйте напечатать SensorReading и LEDLevel в своей программе и посмотрите, соответствуют ли они ожидаемым значениям., @Delta_G

Не могли бы вы добавить схему, показывающую, как вы подключили источник питания? Делитель напряжения, защитный резистор, заземление..., @Edgar Bonet

@Delta_G Я не могу связаться с Trinket Pro, так как он показывает порт, а USBISP, @Anwar Elhadad

Является ли Trinket вашим единственным Arduino?, @Juraj

В настоящее время да., @Anwar Elhadad

Подключен ли заземление Arduino к отрицательному проводу источника питания?, @Edgar Bonet

да @EdgarBonet, @Anwar Elhadad

Я не вижу соединения с отрицательной клеммой источника питания. Можете ли вы это показать? Где оно подключено?, @Delta_G

Я не вижу никаких резисторов последовательно со светодиодами. Где они?, @Nick Gammon


2 ответа


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

3

Вы используете полноразмерную макетную плату, в полноразмерных макетах шины питания разделены на две половины секции, как показано на этом рисунке, и вам необходимо иметь перемычки для соединения двух полусекций, если хотите. использовать их как единую полноразмерную секцию силовой трассы.

Итак, на вашей фотографии вы думали, что ваш синий провод (для GND) подключен к остальным контактам GND, но на самом деле он не подключен.

,

Это имеет смысл. Я попробую завтра или около того. ТЫ ГЕНИЙ. #Наблюдение, @Anwar Elhadad


2

Я могу сказать, что ваш код работает, но вам нужно проверить подключение вашей цепи.

Обратите внимание, что напряжение на выводе аналогового чтения не должно быть колебательным напряжением с низкой частотой, как напряжение переменного тока. Для получения правильного выходного сигнала должно быть постоянное стабильное напряжение.

Вот моя диаграмма ниже, чтобы вы могли внести изменения в свою . Я протестировал это в своем приложении для моделирования, и оно работает отлично.

Код


const int analogPin = A0; // контакт, к которому прикреплен потенциометр
const int ledCount = 7; // количество светодиодов на гистограмме
int ledPins[] = { 3, 4, 5, 6, 8, 9, 10}; // массив номеров контактов, к которым подключены светодиоды

void setup() { 
Serial.begin(9600);
// перебираем массив контактов и устанавливаем их все на вывод:
for (int thisLed = 0; thisLed < ledCount; thisLed++) { 
pinMode(ledPins[thisLed], OUTPUT); } 
} 

void loop() { // читаем потенциометр:
int sensorReading = analogRead(analogPin); 
Serial.print("sensor read : ");
Serial.println(sensorReading);

// сопоставляем результат с диапазоном от 0 до количества светодиодов:
int ledLevel = map(sensorReading, 0, 1023, 0, ledCount);
Serial.print("led Level : ");
Serial.println(ledLevel);

// цикл по массиву светодиодов:
for (int thisLed = 0; thisLed < ledCount; thisLed++) { 
// если индекс элемента массива меньше, чемledLevel, // включаем пин для этого элемента:
if (thisLed < ledLevel) { 
digitalWrite(ledPins[thisLed], HIGH); 
} 

// отключаем все контакты выше значенияledLevel:
else { 
digitalWrite(ledPins[thisLed], LOW); 
} }

//задержка(500); //для отладки
 }


Диаграмма

voltage-follower

Обратите внимание: если вы пытаетесь измерить напряжение выше 5 В, обязательно создайте схему делителя напряжения с резисторами подходящего номинала, чтобы получить выходное напряжение 5 В, поскольку это самое высокое напряжение, которое может выдержать Arduino. мера В приведенном ниже примере показано измерение напряжения батареи постоянного тока 12 В (обратите внимание, что 5 В — это самое высокое напряжение, подаваемое на Arduino, а не полные 12 В):

12 вольт

,