Невозможно прочитать состояние светодиода
У меня возникла проблема с очень простой функциональностью.
Я хочу прочитать состояние светодиода. Я подтвердил, что при указанных обстоятельствах на светодиод подается напряжение 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.
@user1584421, 👍0
Обсуждение3 ответа
Лучший ответ:
Для логики CMOS порог обычно составляет 1/2 Vcc, поэтому вам может повезти с Arduino 3,3 В, но он все еще находится в неопределенной области. Этот обычный порог также может меняться в зависимости от рабочей температуры (например, 5V WS2812 переставал работать зимой, если вы использовали микроконтроллер 3V3 в качестве драйвера)
Итак, каковы возможные решения?
направьте его на контакт Ax и используйте условие AnalogRead + (в основном программный компаратор)
если предыдущее слишком медленное, вы можете использовать модуль переменного тока на mega328p (аналоговый компаратор), но вам, скорее всего, придется копаться в таблице данных и использовать определенный контакт или контакты (сравните его с внутренним 1V1 опорный или внешний, устанавливаемый потенциометром)
внешний операционный усилитель/компаратор (этот можно использовать с исходным выводом, обратите внимание, что компаратор нуждается в подтягивании, операционный усилитель — нет)
Транзистор NPN (1 кОм или больше между базой и анодом светодиода, внутренний подтягивающий или внешний между Vcc и коллектором, эмиттер на землю)
Я просто отмечаю, для завершения .... Если вы подключаете светодиод и пытаетесь прочитать его, убедитесь, что GND является общим между светодиодом и Arduino., @user1584421
Цифровой вход 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
Насколько я понимаю, это то, что вы сделали
Но я думаю, вы должны сделать это так
Вот код
целое значение; плавающий ввод; интервал времени задержки=500; недействительная установка () { pinMode (значение, ВВОД); Серийный.начать(9600); //серийная скорость бутонов } недействительный цикл () { значение = аналоговое чтение (A2); ввод=(значение*5.0)/1022.0; Serial.println (значение); Serial.println("Состояние светодиода:"); Serial.println (ввод); задержка (время задержки); }
- Пороговые напряжения цифрового ввода-вывода для ATmega32u4
- Как сканировать сигнал HIGH на digitalRead во время основного цикла, одновременно выполняя другие задачи?
- Как считать положительные электрические импульсы?
- Красный светодиод не выключается на игровой площадке Adafruit Circuit Classic
- Половинная яркость светодиода Arduino UNO при подключении к цифровому заземлению, но не к аналоговому
- Всегда ли установка значения означает установку pin Arduino?
- Быстрый цифровой ввод-вывод
- Есть ли способ воспроизводить звуки с Arduino без использования звукового экрана?
Какая у тебя светодиодная кнопка? Как он подключен? Какой ардуино вы используете?, @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