Светодиодный индикатор на базе ТМ1637
- >TEHb<
- Друг Кота
- Сообщения: 5723
- Зарегистрирован: Ср ноя 11, 2009 17:19:30
- Откуда: Воронеж
- Контактная информация:
Re: Светодиодный индикатор на базе ТМ1637
Можно можно через И2Ц. Через задницу, конечно, но возможно. Как минимум, компьютерная шина способна выводить цифры. А уж у микроконтроллера и подавно ноги развязаны.
"Привет!" - соврал он.
- DetSimen
- Родился
- Сообщения: 9
- Зарегистрирован: Пн окт 07, 2019 10:14:37
- Откуда: СФО, уездный город Н-ск
Re: Светодиодный индикатор на базе ТМ1637
Мошт, пригодицца кому
https://github.com/DetSimen/TM1637
https://github.com/DetSimen/TM1637
Праграмный кот. Хожу по цыкалу кругом.
Re: Светодиодный индикатор на базе ТМ1637
[uquote="DetSimen",url="/forum/viewtopic.php?p=4487269#p4487269"]Мошт, пригодицца кому[/uquote]
Да, дед, тебя тут склоняли и в пример ставили, по всякому.)
Да, дед, тебя тут склоняли и в пример ставили, по всякому.)
- DetSimen
- Родился
- Сообщения: 9
- Зарегистрирован: Пн окт 07, 2019 10:14:37
- Откуда: СФО, уездный город Н-ск
Re: Светодиодный индикатор на базе ТМ1637
Бывает.
З.ы Ох, блин, прочитал всю тему, а тут эта ссылка уже была. Я очень извиняюсь, что опять влез.
З.ы Ох, блин, прочитал всю тему, а тут эта ссылка уже была. Я очень извиняюсь, что опять влез.
Праграмный кот. Хожу по цыкалу кругом.
Re: Светодиодный индикатор на базе ТМ1637
Starichok51, очень непросто понять чужие мысли, потому буду спрашивать.
1. Зачем используется таймер2 на 0.1 сек и на 1 сек? Как я понял, 0.1 сек - период опроса клавиатуры. А 1 сек?
2. Зачем здесь еще 3 раза писать "минус" в память (в блоке, где вы переписываете коды символов в ОЗУ)?
3. Зачем здесь разделять принятый с клавиатуры байт на 2 части и сохранять эти 2 байта в ОЗУ и еще дописывать следом 2 пробела? Чтоб узнать код нажатой кнопки? Только это приходит на ум.
1. Зачем используется таймер2 на 0.1 сек и на 1 сек? Как я понял, 0.1 сек - период опроса клавиатуры. А 1 сек?
2. Зачем здесь еще 3 раза писать "минус" в память (в блоке, где вы переписываете коды символов в ОЗУ)?
Код: Выделить всё
ldi R26, _m
st Z+, R26
st Z+, R26
st Z+, R26
st Z+, R26Код: Выделить всё
rcall bin_to_2hex_and_vyvod
ldi R26, _x
st Z+, R26
st Z+, R26- Starichok51
- Модератор
- Сообщения: 19040
- Зарегистрирован: Сб авг 14, 2010 15:05:51
- Откуда: г. Озерск, Челябинская обл.
Re: Светодиодный индикатор на базе ТМ1637
1. таймер2 в том тексте идет по 4 мс..
да, 0.1 сек - период опроса клавиатуры. ты можешь сделать этот период, как тебе удобно или как тебе нравится.
1 сек. - последовательный вывод на индикацию бегущей строки. для "бег" строки через 1 сек. кажется удобным.
2. не 3, а 4 раза.
если ты запускал симуляцию, то должен был видеть, что после "F" в бегущей строке выводятся эти 4 минуса.
бегущая строка - 16 цифр и 4 минуса.
а пишу в ОЗУ потому, что бегущая строка берется из ОЗУ.
3. да, байт кода кнопки делится на 2 шестнадцатеричные цифры, которые сохраняются в ОЗУ. потом из ОЗУ выводятся.
да, чтобы посмотреть код кнопки. а как я увижу код кнопки без вывода на индикатор?
вывод пробелов можешь удалить, если тебе это хочется.
и вообще, этот текст - тестовый, из которого можно в рабочие программы брать отлаженный код работы с этой микрой.
а для теста я сделал так, как мне было удобно.
и ты тоже можешь брать отсюда отлаженный код в свои разработки.
в реальном проекте код кнопки выводить не надо - просто выполнить действия в соответствии с нажатой кнопкой.
вот тебе еще вариант проекта в Протеусе.
тут поочередно, через 0,5 сек., выводится код кнопки и бегущая строка.
когда нет нажатых кнопок, выводится код "FF." и выводятся 2 пробела.
когда кнопка нажата, выводится код кнопки и её номер.
опять-таки, это только тест.
здесь уже цифры кода кнопки не пишутся в ОЗУ, а сразу обрабатываются и выводятся на индикатор.
опять будут вопросы - опять спрашивай.
да, 0.1 сек - период опроса клавиатуры. ты можешь сделать этот период, как тебе удобно или как тебе нравится.
1 сек. - последовательный вывод на индикацию бегущей строки. для "бег" строки через 1 сек. кажется удобным.
2. не 3, а 4 раза.
если ты запускал симуляцию, то должен был видеть, что после "F" в бегущей строке выводятся эти 4 минуса.
бегущая строка - 16 цифр и 4 минуса.
а пишу в ОЗУ потому, что бегущая строка берется из ОЗУ.
3. да, байт кода кнопки делится на 2 шестнадцатеричные цифры, которые сохраняются в ОЗУ. потом из ОЗУ выводятся.
да, чтобы посмотреть код кнопки. а как я увижу код кнопки без вывода на индикатор?
вывод пробелов можешь удалить, если тебе это хочется.
и вообще, этот текст - тестовый, из которого можно в рабочие программы брать отлаженный код работы с этой микрой.
а для теста я сделал так, как мне было удобно.
и ты тоже можешь брать отсюда отлаженный код в свои разработки.
в реальном проекте код кнопки выводить не надо - просто выполнить действия в соответствии с нажатой кнопкой.
вот тебе еще вариант проекта в Протеусе.
тут поочередно, через 0,5 сек., выводится код кнопки и бегущая строка.
когда нет нажатых кнопок, выводится код "FF." и выводятся 2 пробела.
когда кнопка нажата, выводится код кнопки и её номер.
опять-таки, это только тест.
здесь уже цифры кода кнопки не пишутся в ОЗУ, а сразу обрабатываются и выводятся на индикатор.
опять будут вопросы - опять спрашивай.
- Вложения
-
- TM1637 sourse1 4x7s.zip
- (23.66 КБ) 113 скачиваний
Мудрость приходит вместе с импотенцией...
Когда на русском форуме переходят на Вы, в реальной жизни начинают бить морду.
Когда на русском форуме переходят на Вы, в реальной жизни начинают бить морду.
Re: Светодиодный индикатор на базе ТМ1637
[uquote="Starichok51",url="/forum/viewtopic.php?p=4486600#p4486600"]я там в проекте забыл нарисовать резисторы подтяжки на входах[/uquote]Резисторы по 10 кОм между плюсом питания и каждым из выводов CLK и DIO на плате TM1637 уже есть. Только конденсаторы по 10 нФ на CLK и DIO я убрал. Проверил, все работает без доп. задержек.

- Starichok51
- Модератор
- Сообщения: 19040
- Зарегистрирован: Сб авг 14, 2010 15:05:51
- Откуда: г. Озерск, Челябинская обл.
Re: Светодиодный индикатор на базе ТМ1637
да, на модуле резисторы подтяжки уже есть. конденсаторы я тоже удалил.
на модулях, которые я купил, резисторы и конденсаторы расположены по другому. но это не принципиально.
а по моему тестовому проекту у тебя вопросов больше нет?
на модулях, которые я купил, резисторы и конденсаторы расположены по другому. но это не принципиально.
а по моему тестовому проекту у тебя вопросов больше нет?
Мудрость приходит вместе с импотенцией...
Когда на русском форуме переходят на Вы, в реальной жизни начинают бить морду.
Когда на русском форуме переходят на Вы, в реальной жизни начинают бить морду.
Re: Светодиодный индикатор на базе ТМ1637
Пока нет, все нормуль. Спасибо!
- Starichok51
- Модератор
- Сообщения: 19040
- Зарегистрирован: Сб авг 14, 2010 15:05:51
- Откуда: г. Озерск, Челябинская обл.
Re: Светодиодный индикатор на базе ТМ1637
это хорошо.
Мудрость приходит вместе с импотенцией...
Когда на русском форуме переходят на Вы, в реальной жизни начинают бить морду.
Когда на русском форуме переходят на Вы, в реальной жизни начинают бить морду.
- electroget
- Друг Кота
- Сообщения: 4651
- Зарегистрирован: Ср сен 30, 2020 16:51:47
- Откуда: РФ
Re: Светодиодный индикатор на базе ТМ1637
Доброго времени суток.
Собрал макетную схему из Ардуины, энкодера и дисплея TM1637.
Состряпал вот такой код:
#include "GyverTM1637.h"
#define CLK SCL
#define DIO SDA
GyverTM1637 tm1637(CLK,DIO);
#define pin_CLK 2
#define pin_DT 3
#define pin_Btn 13
unsigned long CurrentTime, LastTime;
enum eEncoderState {eNone, eLeft, eRight, eButton};
int EncoderA, EncoderB, EncoderAPrev, counter;
bool ButtonPrev;
eEncoderState GetEncoderState() {
// Считываем состояние энкодера
eEncoderState Result = eNone;
CurrentTime = millis();
if (CurrentTime >= (LastTime + 10)) {
// Считываем не чаще 1 раза в 10мс для уменьшения ложных срабатываний
LastTime = CurrentTime;
if (digitalRead(pin_Btn) == LOW ) {
if (ButtonPrev) {
Result = eButton; // Нажата кнопка
ButtonPrev = 0;
}
}
else {
ButtonPrev = 1;
EncoderA = digitalRead(pin_CLK);
EncoderB = digitalRead(pin_DT);
if ((!EncoderA) && (EncoderAPrev)) { // Сигнал A изменился с 1 на 0
if (EncoderB) Result = eRight; // B=1 => энкодер вращается по часовой
else Result = eLeft; // B=0 => энкодер вращается против часовой
}
EncoderAPrev = EncoderA; // запомним текущее состояние
}
}
return Result;
}
void setup() {
pinMode (CLK, OUTPUT);
pinMode (DIO, OUTPUT);
pinMode(pin_DT, INPUT);
pinMode(pin_CLK, INPUT);
pinMode(pin_Btn, INPUT_PULLUP); // Кнопка не подтянута к +5 поэтому задействуем внутренний pull-up резистор
Serial.begin(115200);
counter =0;
tm1637.clear();
tm1637.brightness(6);
tm1637.clear();
}
void loop() {
switch (GetEncoderState()) {
case eNone: return;
case eLeft: {
counter--;
if(counter == -1)
{counter =255;}
break;
}
case eRight: {
counter++;
if(counter > 255)
{counter =0;}
break;
}
case eButton: {
counter = 0;
break;
}
}
Serial.println(counter);
tm1637.display(2,counter/10);
tm1637.display(3,counter%10);
}
При вращении энкодера индикация должна отображать числа от 1 до 255, а по факту отображает только до 99 (то есть индикатор только на 2 знака работает), а потом начинает с начала. При этом монитор порта показывает, что если крутить энкодер дальше, то счётчик продолжает увеличивать значение. Почему с индикацией на TM1637 так происходит?
Собрал макетную схему из Ардуины, энкодера и дисплея TM1637.
Состряпал вот такой код:
#include "GyverTM1637.h"
#define CLK SCL
#define DIO SDA
GyverTM1637 tm1637(CLK,DIO);
#define pin_CLK 2
#define pin_DT 3
#define pin_Btn 13
unsigned long CurrentTime, LastTime;
enum eEncoderState {eNone, eLeft, eRight, eButton};
int EncoderA, EncoderB, EncoderAPrev, counter;
bool ButtonPrev;
eEncoderState GetEncoderState() {
// Считываем состояние энкодера
eEncoderState Result = eNone;
CurrentTime = millis();
if (CurrentTime >= (LastTime + 10)) {
// Считываем не чаще 1 раза в 10мс для уменьшения ложных срабатываний
LastTime = CurrentTime;
if (digitalRead(pin_Btn) == LOW ) {
if (ButtonPrev) {
Result = eButton; // Нажата кнопка
ButtonPrev = 0;
}
}
else {
ButtonPrev = 1;
EncoderA = digitalRead(pin_CLK);
EncoderB = digitalRead(pin_DT);
if ((!EncoderA) && (EncoderAPrev)) { // Сигнал A изменился с 1 на 0
if (EncoderB) Result = eRight; // B=1 => энкодер вращается по часовой
else Result = eLeft; // B=0 => энкодер вращается против часовой
}
EncoderAPrev = EncoderA; // запомним текущее состояние
}
}
return Result;
}
void setup() {
pinMode (CLK, OUTPUT);
pinMode (DIO, OUTPUT);
pinMode(pin_DT, INPUT);
pinMode(pin_CLK, INPUT);
pinMode(pin_Btn, INPUT_PULLUP); // Кнопка не подтянута к +5 поэтому задействуем внутренний pull-up резистор
Serial.begin(115200);
counter =0;
tm1637.clear();
tm1637.brightness(6);
tm1637.clear();
}
void loop() {
switch (GetEncoderState()) {
case eNone: return;
case eLeft: {
counter--;
if(counter == -1)
{counter =255;}
break;
}
case eRight: {
counter++;
if(counter > 255)
{counter =0;}
break;
}
case eButton: {
counter = 0;
break;
}
}
Serial.println(counter);
tm1637.display(2,counter/10);
tm1637.display(3,counter%10);
}
При вращении энкодера индикация должна отображать числа от 1 до 255, а по факту отображает только до 99 (то есть индикатор только на 2 знака работает), а потом начинает с начала. При этом монитор порта показывает, что если крутить энкодер дальше, то счётчик продолжает увеличивать значение. Почему с индикацией на TM1637 так происходит?
Re: Светодиодный индикатор на базе ТМ1637
Смотреть в библиотеке дисплея надо.
(GyverTM1637)
и у Вас в программе всего два знакомества задействовано да с обычной десятичной обработкой:
Что задали - то и получили.

(GyverTM1637)
и у Вас в программе всего два знакомества задействовано да с обычной десятичной обработкой:
Код: Выделить всё
tm1637.display(2,counter/10);
tm1637.display(3,counter%10);- electroget
- Друг Кота
- Сообщения: 4651
- Зарегистрирован: Ср сен 30, 2020 16:51:47
- Откуда: РФ
Re: Светодиодный индикатор на базе ТМ1637
[uquote="BOB51",url="/forum/viewtopic.php?p=4604635#p4604635"]у Вас в программе всего два знакомества задействовано да с обычной десятичной обработкой[/uquote]
А как надо сделать чтоб использовались 3 знака на дисплее TM1637?
А как надо сделать чтоб использовались 3 знака на дисплее TM1637?
- >TEHb<
- Друг Кота
- Сообщения: 5723
- Зарегистрирован: Ср ноя 11, 2009 17:19:30
- Откуда: Воронеж
- Контактная информация:
Re: Светодиодный индикатор на базе ТМ1637
Микросхема позволяет отображать до 6 знаков, а реально цифр 4. От индикатора к индикатору может меняться смещение.
Последний раз редактировалось >TEHb< Сб июл 20, 2024 20:14:08, всего редактировалось 1 раз.
"Привет!" - соврал он.
Re: Светодиодный индикатор на базе ТМ1637
Вывести на старшее знакомств сотни или пробел при отсутствии таковых.

- electroget
- Друг Кота
- Сообщения: 4651
- Зарегистрирован: Ср сен 30, 2020 16:51:47
- Откуда: РФ
Re: Светодиодный индикатор на базе ТМ1637
Вот так сделал:
Код: Выделить всё
Serial.println(counter);
tm1637.display(1,counter/100%10);
tm1637.display(2,counter/10%10);
tm1637.display(3,counter%10);Re: Светодиодный индикатор на базе ТМ1637
относительно знакомест возможно и верно...
Относительно данных... Там ведь исходно и 0 может иметь место...
0/100 =?
...

Относительно данных... Там ведь исходно и 0 может иметь место...
0/100 =?
...
- Starichok51
- Модератор
- Сообщения: 19040
- Зарегистрирован: Сб авг 14, 2010 15:05:51
- Откуда: г. Озерск, Челябинская обл.
Re: Светодиодный индикатор на базе ТМ1637
BOB51, 0/100 = 0.
Мудрость приходит вместе с импотенцией...
Когда на русском форуме переходят на Вы, в реальной жизни начинают бить морду.
Когда на русском форуме переходят на Вы, в реальной жизни начинают бить морду.
Re: Светодиодный индикатор на базе ТМ1637
Ну деда же вроде как отмечали. Вы что ребята? Толчёте воду в ступе.
Всё что хочешь у него сделано. Ни о чём не думай! Или будем изобретать велосипед? Ужос(.
Всё что хочешь у него сделано. Ни о чём не думай! Или будем изобретать велосипед? Ужос(.
- electroget
- Друг Кота
- Сообщения: 4651
- Зарегистрирован: Ср сен 30, 2020 16:51:47
- Откуда: РФ
Re: Светодиодный индикатор на базе ТМ1637
[uquote="OKF",url="/forum/viewtopic.php?p=4604749#p4604749"]Ну деда же вроде как отмечали. (.[/uquote]
В смысле?
В смысле?