Невозможно прочитать состояние светодиода

led digital digital-in

У меня возникла проблема с очень простой функциональностью.

Я хочу прочитать состояние светодиода. Я подтвердил, что при указанных обстоятельствах на светодиод подается напряжение 1,9 В.

Я пытаюсь прочитать его состояние с помощью этого кода:

#define LED_1  5

void setup()
{
pinMode(LED_1, INPUT);
}

void loop()
{
 int led_state = 0;
 if ( digitalRead(LED_1) ) led_state = 1;
 Serial.println("LED State is: ");
 Serial.println(led_state);
}

Однако в большинстве случаев led_state равно 0. Иногда он достигает 1, но затем быстро возвращается к 0.

Это из-за низкого напряжения?

РЕДАКТИРОВАТЬ: я подключаю питание непосредственно к одному контакту светодиода, а другой контакт подключается к GND (от того же источника питания постоянного тока). Кроме того, контакт питания светодиода входит внутрь цифрового контакта 5 Arduino.

, 👍0

Обсуждение

Какая у тебя светодиодная кнопка? Как он подключен? Какой ардуино вы используете?, @chrisl

Если он подключен так, как я думаю, для него будет лучше использовать аналог Read. Или внутренний модуль аналогового компаратора (зависит от MCU, для него может не быть библиотеки) или внешний операционный усилитель/компаратор, @KIIV

@chrisl Извините, это была не кнопка. Я допустил опечатку в вопросе, сейчас исправлю. Просто стандартный светодиод. Я использую ардуино уно., @user1584421

@KIIV Спасибо! Могу ли я сделать AnalogRead () на цифровом выводе 5 Arduino? Я на Ардуино Уно., @user1584421

Нет, вам придется подключить его к какому-нибудь аналоговому разъему. И тогда вам придется сравнить значение с некоторым порогом (в основном делая программный компаратор), @KIIV

@KIIV Поскольку напряжение составляет 2 В постоянного тока, почему это нельзя «прочитать» по цифровому каналу?, @user1584421

Прочитайте об уровнях логики 5V CMOS для ответа (UNO использует 5V). Например здесь: https://learn.sparkfun.com/tutorials/logic-levels/all, @KIIV

Подскажите, пожалуйста, схему подключения светодиода. Похоже, у вас нет токоограничивающего резистора последовательно со светодиодом., @sa_leinad

@sa_leinad Вы правы, я только что подключил его к генератору постоянного напряжения ... Однако я нашел решение., @user1584421

@KIIV Я сделал это с помощью AnalogRead(). Если хотите, вы можете опубликовать правильный ответ, чтобы я мог отметить его как выбранный. Хотя один ключевой момент. GND Arduino и источник питания должны быть соединены, иначе показания будут случайными., @user1584421

Я также должен отметить, что в прошлом я мог считывать состояние светодиода с помощью DigitalRead. Однако рабочее напряжение ардуино было 3,3 В. Таким образом, он мог считывать напряжение 1,9 В. Когда рабочее напряжение Arduino составляло 5 В, невозможно было измерить напряжение 1,9 В с помощью «digitalRead»., @user1584421


3 ответа


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

2

Для логики CMOS порог обычно составляет 1/2 Vcc, поэтому вам может повезти с Arduino 3,3 В, но он все еще находится в неопределенной области. Этот обычный порог также может меняться в зависимости от рабочей температуры (например, 5V WS2812 переставал работать зимой, если вы использовали микроконтроллер 3V3 в качестве драйвера)

Итак, каковы возможные решения?

  1. направьте его на контакт Ax и используйте условие AnalogRead + (в основном программный компаратор)

  2. если предыдущее слишком медленное, вы можете использовать модуль переменного тока на mega328p (аналоговый компаратор), но вам, скорее всего, придется копаться в таблице данных и использовать определенный контакт или контакты (сравните его с внутренним 1V1 опорный или внешний, устанавливаемый потенциометром)

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

  4. Транзистор NPN (1 кОм или больше между базой и анодом светодиода, внутренний подтягивающий или внешний между Vcc и коллектором, эмиттер на землю)

,

Я просто отмечаю, для завершения .... Если вы подключаете светодиод и пытаетесь прочитать его, убедитесь, что GND является общим между светодиодом и Arduino., @user1584421


3

Цифровой вход Arduino Uno гарантированно имеет значение LOW, если входное напряжение меньше 1,5 В. Гарантируется чтение HIGH если это напряжение выше 3,0 В. Для любого напряжения между ними вы не имеют никаких гарантий.

При этом в техническом описании микроконтроллера указаны некоторые «типичные» характеристики. Согласно тех, вход должен переключаться на HIGH, когда входное напряжение превысит 2,6 В, и переключитесь на НИЗКИЙ, когда оно опускается ниже 2,1 В. Существует гистерезисный диапазон в между.

Обратите внимание, однако, что нет гарантии, что введенные вами данные будут как в типичных характеристиках. Единственные гарантии для напряжения ниже 1,5 В и выше 3,0 В.

,

Я провел эксперимент, подав на светодиод до 5В. Я все еще мог видеть, как входной сигнал колеблется от 0 до 1 и обратно до 1. Почему это происходит? Я не преодолел порог 5В., @user1584421

@ user1584421: Я не знаю, что происходит в вашей установке, потому что: 1. Вы не можете «подать» 5 В на светодиод, не сгорая при этом. 2. Выложенный вами код даже не компилируется. Пожалуйста, отредактируйте свой вопрос: добавьте схему вашей схемы и версию кода, которую можно протестировать., @Edgar Bonet

Спасибо! Я обновил вопрос., @user1584421

@ user1584421: Вы никогда не должны включать светодиод таким образом, так как вы можете сжечь светодиод, блок питания или и то, и другое. Всегда используйте токоограничивающий резистор. Если ничего не сгорело, скорее всего, блок питания сам ограничивает ток и, таким образом, **не** подает 5 В на светодиод., @Edgar Bonet

Да, ты был прав. Блок питания ограничивал ток. Мне удалось решить эту проблему с помощью AnalogRead(). И имея общий GND между блоком питания и Arduino. Большое спасибо за ваш очень информативный пост!, @user1584421


0

Насколько я понимаю, это то, что вы сделали мое понимание

Но я думаю, вы должны сделать это так

как я думаю

Вот код

целое значение;
плавающий ввод;
интервал времени задержки=500;

недействительная установка () {
pinMode (значение, ВВОД);
Серийный.начать(9600); //серийная скорость бутонов
}

недействительный цикл () {

значение = аналоговое чтение (A2);
ввод=(значение*5.0)/1022.0;
Serial.println (значение);
Serial.println("Состояние светодиода:");
Serial.println (ввод);
задержка (время задержки);

}
,