Считывание 10-контактного 7-сегментного (2 цифры) сингла Arduino 1
спасибо, что нашли время прочитать это, я действительно ценю это. Я очень новичок в мире Arduino и микроконтроллеров, поэтому, пожалуйста, простите мое невежество.
Итак, у меня есть старый 7-сегментный дисплей, который отображает наружную температуру, и я хочу прочитать температуру в Arduino и зажечь светодиод, если температура становится высокой, и другой цвет, если температура становится низкой.
Я знаю, что могу использовать термометр, подключить его к Arduino и идти оттуда, но это было бы обманом. Итак, мой вопрос в том, могу ли я прочитать каждый вывод 7-сегментного дисплея и перевести его в число в Arduino?
Задача: Считайте двойной 10 - контактный сегмент 7, перепрыгивая провода в Arduino.
Настройка: я использую код и настройку, найденные здесь: "http://blog.rastating.com/using-a-7-segment-led-display-w-arduino-uno/" для отображения числа (21) в целях тестирования. Я хочу перепрыгнуть контакты в другой Arduino и прочитать "21".
пожалуйста, смотрите фотографии.
Любая помощь будет очень и очень признательна!!
Еще раз спасибо за чтение.
Эта последняя картинка показывает "21", используя код и настроенный по приведенной выше ссылке. Я хочу вставить другой Arduino в макет и прочитать "21" или любую другую температуру (зависит от внешнего термометра) в последовательный монитор. Теперь сложная часть-это код, я не очень хорош в кодировании, но я понимаю, что если бы у этого был 1 контакт для каждого светодиода, я бы просто прочитал каждый из них и перевел его на последовательный монитор. Однако это только 10 контактов, поэтому представляет собой проблему.
Любой вклад очень ценится, я даже не знаю, с чего начать.
@user3537, 👍3
Обсуждение4 ответа
Ваш дисплей мультиплексирован, поэтому вам нужно будет следить не только за сегментными линиями, но и за цифровыми.
Сначала выясните, является ли ваш дисплей "общим анодом" или "общим катодом", поскольку логика в одном случае будет инвертирована по сравнению с логикой в другом.
Для вашего тестового случая вы можете записать приводные и считывающие ардуино на дисплей таким же образом, но настроить все подключенные контакты на считывающем в качестве входов.
Сложнее всего будет определить, когда выбор сегмента изменился, но вы можете сделать это, сохранив текущее значение каждого выбранного контакта, а затем прочитав новое значение. Если вы видите, что старое значение было неактивным, а новое активным, подождите немного времени и прочитайте все строки сегмента. Вы хотите подождать достаточно долго, чтобы убедиться, что строки данных совпадают, но не настолько долго, чтобы получить данные для следующей цифры. Если у вас есть доступ к области видимости, вы можете найти наилучшее значение, но вы также можете поэкспериментировать, сделав задержку короткой, пока не получите неправильные данные, сделав ее длинной, пока не получите неправильные данные, а затем выбрав промежуточное значение.
Возможно, вам будет проще всего прочитать все 7 или 8 сегментных строк в одно байтовое значение, а затем сравнить его с каждым элементом таблицы поиска, который вы использовали в коде драйвера, пока не найдете совпадение.
Если вы не знаете точного расположения сегментов на неизвестной целевой плате, подумайте о том, чтобы распечатать байты на последовательном мониторе по мере изменения отображаемых значений (чашка ледяной воды, чашка горячей воды...) и записать значения сегментов по сравнению с предыдущими. цифры, которые вы видите на дисплее. Это будет головоломка, но вы должны быть в состоянии разгадать ее.
У меня есть общая настройка анода. Я действительно новичок в коде, есть ли где-нибудь пример, к которому я мог бы обратиться?, @user3537
Прежде всего, убедитесь, что напряжение ниже 5 В (но выше 2,5 В, чтобы оно могло регистрироваться как ВЫСОКОЕ на цифровом выводе). Если нет, то он либо спалит ваш Arduino, либо не будет работать.
Что касается кода, вы можете сделать одну из двух следующих вещей:
- Используйте библиотеку, такую как PinChangeInt, чтобы помочь вам определить, когда и что изменилось.
- Храните данные и проверяйте их время от времени.
У Криса Стрэттона была хорошая идея с байтом и сравнить его. Для этого вам нужно сделать что-то вроде этого:
byte data = 0;
if(digitalRead(10) == HIGH) {
data |= B00000001;
}
if(digitalRead(11) == HIGH) {
data |= B00000010;
}
if(digitalRead(12) == HIGH) {
data |= B00000100;
}
//...
По сути, это битовая математика, которая устанавливает один бит вашего байта равным 1. Если это 0, то вы оставляете его в покое (все биты по умолчанию равны 0 из-за того, как я объявил данные
).
Если бы контакты 10 и 12 были ВЫСОКИМИ, то байт выглядел бы так в двоичном формате:
00000101
Привет! итак, я понял, что 2 контакта, которые управляют этим переключателем на частоте 4 кГц, когда один включен, другой выключен, но есть время 6usec, когда оба контакта включены. Итак, что я пытаюсь сделать сейчас, это добавить "если правый бит == 1, если A=1 b=0 c=1 d=1... и так далее", то номер "код", @user3537
@user3537 Вам нужна помощь в этом? Если да, то чем я могу вам помочь?, @Anonymous Penguin
Было бы гораздо эффективнее прочитать весь регистр порта AVR, даже если несколько битов попадут в следующий. Поддерживает ли Arduino это чисто или только игнорируя его и выполняя необработанное чтение?, @Chris Stratton
итак, я понял, что 2 контакта, которые управляют этим переключателем на частоте 4 кГц, когда один включен, другой выключен, но есть время 6usec, когда оба контакта включены. Итак, что я пытаюсь сделать сейчас, это добавить "если правый бит == 1, если A=1 b=0 c=1 d=1... и так далее", то number = 6 затем сканируйте его. Я не знаю, как использовать эту библиотеку.
void loop() {
// считывание входного pin:
//int buttonState = digitalRead(pushButton);
int State_A = digitalRead(A);
int State_B = digitalRead(B);
int State_C = digitalRead(c);
int State_D = digitalRead(D);
int State_E = digitalRead(E);
int State_F = digitalRead(F);
int State_G = digitalRead(G);
int State_DP = digitalRead(DP);
int State_RIGHT = digitalRead(RIGHT);
int State_LEFT = digitalRead(LEFT);
if (State_LEFT==1)
{
if(State_A==0 & State_B==1 & State_C==0 & State_D==0 & State_E==0 & State_F==0 & State_G==0)
{
number=6;
Serial.println(number);
// Serial.print(State_LEFT);
}
я планирую добавить это для каждой цифры. есть ли более простой способ сделать это?
Это должно быть отредактировано в вашем вопросе, так как это не ответ., @Chris Stratton
Я бы лично привязал два вывода select к входу прерывания изменения уровня на Arduino. Затем, когда вы получаете прерывание от одной из цифр, у вас есть " все " время, чтобы прочитать сегменты. Когда вы не делаете прерывания, вы можете считывать сегменты из разных цифр. Дальнейшая оптимизация состояла бы в замене всех`digitalRead "на один" segments = PINB", который читал бы 8 входных строк за один раз., @jippie
Использование регистров портов было бы чище, но гораздо менее переносимым. Назначение портов у разных моделей Arduino разное., @Duncan C
"segments = PINB" как это работает? если у меня есть все 7 контактов a-g, @user3537
То, что вы пытаетесь сделать, сложно и неуклюже, и, вероятно, не стоит таких хлопот.
Это также выше вашего текущего уровня квалификации, как в аппаратном, так и в программном обеспечении.
Как было сказано на другом плакате, дисплей, скорее всего, мультиплексирован. Если это так, он отправляет значение в 1 цифру, затем в следующую и быстро чередует их. На самом деле горит только одна цифра за раз.
Также возможно, что цифры защелкнуты. Процессор посылает значение одной цифре за раз, и схема этой цифры запоминает значение до тех пор, пока оно снова не изменится. Однако это менее вероятно, потому что это более сложно и дорого сделать
Чтобы декодировать мультиплексированный дисплей, вам нужно будет выяснить, как выполняется мультиплексирование. Есть много разных способов сделать это.
Вы говорите, что это обычный анод. Он может иметь аноды цифры, соединенные вместе, и оба они подключены к контроллеру. Анод, который в данный момент отображается, будет подключен к +5, а катоды одинаковых сегментов от каждой цифры будут соединены параллельно. Чтобы управлять цифрой, схема управления соединяла анод этой цифры с положительным источником питания и соединяла отображаемые сегменты с землей. Все остальные соединения останутся плавающими. Затем он отсоединял анод первой цифры и подключал анод другой цифры к положительному источнику питания.
Дисплей также может иметь логический уровень, который определяет, какой сегмент управляется. Для 2-значного дисплея все, что вам нужно, - это одна строка, и ВЫСОКАЯ цифра будет управлять 1 цифрой, а НИЗКАЯ-другой цифрой.
Логический анализатор поможет вам разобраться в этом, но вам нужно знать, как им пользоваться.
Вы также можете попробовать исследовать используемый вами термометр и посмотреть, сможете ли вы найти его схему в документации, на веб-сайте производителя или в патенте
Как только вы выясните, как считывать значения сегментов из каждой цифры, вам понадобится таблица истинности, которая сопоставляет значения сегментов с числами, и вам нужно будет выполнить поиск. Это программирование на языке Си среднего уровня.
- Светодиоды: разница между общим анодом и общим катодом
- Как работать с аналоговыми контактами в цикле?
- Улучшенное циклическое переключение цветов RGB.
- Колебания показаний датчика температуры LM35 (+- 5°C) с Arduino UNO
- Отображение двоичных данных на светодиодах
- DHT11 аналоговый или цифровой?
- Зависание Arduino с OLED-дисплеем
- Отправка аналоговых входных данных из последовательного порта в Google Таблицы
Вы проверяли (например, с помощью DMM или осциллографа) напряжение между анодом и катодом для одного освещенного сегмента дисплея? Это скажет вам, если это может быть непосредственно использовано в качестве цифрового входа Arduino или это требует дополнительной схемы., @jfpoilpret
Чтобы получить значение от любого вывода дисплея, вам также понадобится заземление, которое вы можете подключить к Arduino GND, есть ли у вас такой вывод на плате дисплея, или у вас просто есть 8+2 контакта, 8 для 7 сегментов + DP, 2 для каждого общего анода?, @jfpoilpret
Этот пост помог мне разработать схему Arduino для чтения мультиплексного дисплея. Решение может быть найдено https://github.com/bunhoel/FT107m удачи, @Luis Bunhoel