Прошу помощи, как вывести температуру с DS18B20 на 4 разрядный 7 сегментный модуль на ТМ1637 вот такой: http://www.aliexpress.com/item/4-Digit-LED-Display-Tube-7-segments/32591091564.html Как работать с датчиком температуры понятно, как подключить модуль дисплея тоже понятно, как выводить цифры на дисплей ясно. Но как вывести температуру я не могу понять, потому, что температуру нужно разбить на отдельные цифры, я не пойму как это сделать. К примеру показания датчика 25.67 , как его разбить на отдельные числа и вывести на дисплей и как точку зажечь?
Код (C++): #include "TM1637.h" // https://github.com/avishorp/TM1637 // возможно, у тебя другая библиотека #define DISP_CLK 12 // выход на семисегментный LED дисплей #define DISP_DIO 13 // выход на семисегментный LED дисплей TM1637 TM1637(DISP_CLK, DIS_DIO); // инициализация дисплея void loop() { float temperature = 25.67; // температура с датчика - заменить на свой код unsigned int RAWtemp = temperature * 100; // переводим в целое число int8_t Digits[] = {0x00,0x00,0x00,0x00}; // буфер для цифр LED-индикатора Digits[0] = (byte)(RAWtemp / 1000) % 10; // раскидываем 4-значное число на цифры Digits[1] = (byte)(RAWtemp / 100) % 10; Digits[2] = (byte)(RAWtemp / 10) % 10; Digits[3] = (byte)(RAWtemp) % 10; ТМ1637.display(Digits); // команда вывода буфера на дисплей (из библиотеки) }
Tomasina СПАСИБО! за ответ, но по вашему примеру не корректно отображается температура на 3 сегменте Digits[2]. Вероятно по тому, что остаток от деления не одна цифра, а две ( 2567 / 10 = 256.7 % 10 = 67) и на сегмент выводятся странные числа. Немого повозился с вычислениями, вот что получилось: #include "TM1637.h" #define CLKKL 20 #define DIOKL 21 TM1637 tm1637KL(CLKKL, DIOKL); float tempSensorKOL = 165.67; // температура с датчика - заменить на свой код //float temperature = 25.67; // температура с датчика - заменить на свой код void KLLCD() { int8_t Digits[] = {0x00, 0x00, 0x00, 0x00}; int KL1 = tempSensorKOL; int KL2 = (tempSensorKOL - KL1) * 100; if (KL1 > 99)(KL1 = tempSensorKOL - 100); tm1637KL.point(POINT_ON); Digits[0] = (KL1 / 10); // раскидываем 4-значное число на цифры Digits[1] = (KL1 % 10); Digits[2] = (KL2 / 10); Digits[3] = (KL2 % 10); tm1637KL.display(Digits); } void setup() { // put your setup code here, to run once: tm1637KL.init(); tm1637KL.set(BRIGHT_TYPICAL);//BRIGHT_TYPICAL = 2,BRIGHT_DARKEST = 0,BRIGHTEST = 7; } void loop() { KLLCD(); } Объеденил в функцию, будет использоваться этот кусок кода в другой программе. Вроде работает, правильно ли я все сделал? И вопрос про точку, выражение : tm1637KL.point(POINT_ON); включает двоеточие на модуле, а у меня на модуле на каждом сегменте есть еще точка, хотел бы сделать вывод температуры в ракурсе 25.56 а не 25:67, но не знаю как включить точку на каждом сегменте, подскажите кто знает, спасибо за ранее
у меня дисплей только с двоеточием. В библиотеке от продавца есть куча примеров: https://github.com/bremme/arduino-tm1637/tree/master/examples Посмотрите, может там есть вывод точек.
Скажите пожалуйста, что надо заменить на свой код? float temperature = 25.67; // температура с датчика - заменить на свой код
С разрешения ТС можно вопрос по теме. Для работы с 1637 использую библиотеку TD1637.h Задался вопросом на 1637 вывести символы: -, +. Т.е чтобы дисплей выводил положительную и отрицательную температуру.. Не могу понять как это можно сделать. Подскажите плиз. благодарю
Библиотека ТМ1637 позволяет выводить либо число через функцию disp.Display() , либо поразрядно цифры через ту же функцию , но в скобках указать сначала разряд, а потом значение через запятую disp.Display(0, 3) - в первом слева (нулевом) разряде пропишется цифра 3. Можно влезть в библиотеку и в массиве static int8_t TubeTab[] посмотреть где какой знак находится, я добавлял туда знак Цельсия, чтоб на термометр выводить. Его значение 0x63 и находится он в массиве под индексом 18. соответственно, чтоб вывести число со знаком у меня получилось Код (C++): //функция вывода температуры на 1637 disp.display(temp); //вывод значения температуры disp.display(3, {18}); //вывод знака Цельсия в 4й разряд отсчет разрядов дисплея идет слева направо и начинается с нуля. Стоп, а разве нельзя в функции написать например -25.6 ?? Только что проверил на макете- замечательно выводит знак минус без всяких поразрядных танцев с бубном. Переменная , которая значение принимает (temp) должна быть float.
Благодарю. Я не только хочу чтобы на 1637 выводилась температура, но и давление с пометкой возрастает оно, падает, либо постоянное. На обычный трехстрочный экран я вывожу следующую информацию: 740+ - давление возрастает, 740- - понижается, 740* - постоянное. Очень удобно, сразу видно "куда катится погода".
Столкнулся с проблемкой- вывожу на 1637 показания с двух датчиков через 2 функции попеременно. Функции сменяются через millis(). Один из датчиков 18b20 у которого в библиотеке delay и это негативно влияет на отображение- при показе какого-либо значения в течение времени происходит промаргивание пустых разрядов, вроде бы ничего страшного, но неприятно. Грешу на библу 18в20, потому что без нее все нормально. Возможно ли как то отправлять данные на этот дисплей коротким импульсом , чтоб запись в переменную и соответственно ее вывод шла не постоянно, а кратко, а потом ожидание следующего получения?
Я не могу понять как выводить десятичную точку в нужный разряд. Если писать в функцию число int , то точка появляется как надо, но тогда не корректно отображается знак градуса в 4м разряда ( моргает), а если разбивать число по разрядам, то не высвечивается точка. С библиотекой разобраться не могу в силу малого опыта программирования. Где точка в библе и как она управляется? Вот так нет точки, но знак градуса не дрожит Спойлер: код Код (C++): void loop() { int16_t temp = 26.7*10; disp.display(0, (temp /100) % 10); disp.display(1, (temp /10) % 10); disp.display(2, (temp % 10)); disp.display(3 , {18}); // индекс знака градуса в массиве библиотеки } А вот так градус с ума сходит Спойлер: код2 Код (C++): void loop() { disp.display(26.7); disp.display(3 , {18}); } Спойлер: Изменения в библиотеке Код (C++): temp[0] = (Decimal /1000 % 10); //Decimal %= 1000; temp[1] = (Decimal / 100 % 10); // Decimal %= 100; temp[2] = Decimal / 10 % 10; temp[3] = {17}; // индекс пустышки в массиве