Как зажечь точку на TM1637
- Войдите на сайт для отправки комментариев
Сб, 02/06/2018 - 18:42
Всем доброго времени суток, по тихой грусти пытаюсь освоить Arduino. В общем есть Nano, электромагнитное реле, ds18b20 и дисплей TM1637 от RoboDyn, в котором есть двоеточие (для часов) и точки для отображения десятичных дробей. Задумка создать устройство, включающее реле при одной температуре и выключающее при другой. Проблема возникла у меня в том, что не могу зажечь точку посредине, чтобы дисплей постоянно отображал температуру с точностью до 0,01. Интервал 0,01 до 99,99 мне полностью подходит. Свой код сворганил из тех, что нашел в нете, а также дополнил своими скудными познаниями в теме программирования.
#include <OneWire.h>
#include <TM1637.h>
#define DISP_CLK 2 // выход на семисегментный LED дисплей
#define DISP_DIO 3 // выход на семисегментный LED дисплей
TM1637 tm1637(DISP_CLK, DISP_DIO);
OneWire ds(8);
void setup() {
tm1637.init();
tm1637.set(BRIGHTEST);//установка яркости
pinMode(5, OUTPUT); // выход на реле
Serial.begin(9600);
}
void loop() {
byte i;
byte data[12];
byte addr[8];
float celsius;
// поиск адреса датчика
if ( !ds.search(addr)) {
ds.reset_search();
delay(100);
return;
}
ds.reset();
ds.select(addr);
ds.write(0x44, 1); // команда на измерение температуры
delay(100);
ds.reset();
ds.select(addr);
ds.write(0xBE); // команда на начало чтения измеренной температуры
// считываем показания температуры из внутренней памяти датчика
for ( i = 0; i < 9; i++) {
data[i] = ds.read();
}
int16_t raw = (data[1] << 8) | data[0];
// датчик может быть настроен на разную точность, выясняем её
byte cfg = (data[4] & 0x60);
if (cfg == 0x00) raw = raw & ~7; // точность 9-разрядов, 93,75 мс
else if (cfg == 0x20) raw = raw & ~3; // точность 10-разрядов, 187,5 мс
else if (cfg == 0x40) raw = raw & ~1; // точность 11-разрядов, 375 мс
// преобразование показаний датчика в градусы Цельсия
celsius = (float)raw / 16.0;
Serial.print("t=");
Serial.println(celsius);
float temperature = celsius; // температура с датчика
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;
tm1637.display(Digits); // команда вывода буфера на дисплей (из библиотеки)
{
if (celsius > 45.0) // включаем реле
digitalWrite(5,true);
if (celsius < 35.0) // выключаем реле
digitalWrite(5,false);
}
}
tm1637.point(POINT_ON);
Если для часов... там нет точек... только одно двоеточие...
дисплей TM1637 от RoboDyn, в котором есть двоеточие (для часов) и точки для отображения десятичных дробей
Ещё раз...
Если для часов... там нет точек... только одно двоеточие...
RobotDyn... только что проверил...
это каманда для двоеточия, мне же нужно зажечь точку
Все кажись разобрался, хоть на дисплее точки и есть, но зажечь их реально нельзя, вот ускоглазые...
Не помню как, но зажигались.
Правда было несколько разных библиотек
и мне они все казались неудобными.
В библиотеке есть пример DisplayDecimal. Чего проще, загрузи в Нано и убедись, что десятичные точки ЕСТЬ! Из скетча станет понятно как выводить DecPoint
Спасибо, загрузил и убедился что точек там нет, только двоеточие. Спс.
Значит эта библиотека не подходит :(
Под этим видео https://www.youtube.com/watch?v=m1CtIJsRoyM есть модифицированная библиотека и тестовые скетчи
Почитав отзывы и корявое описание на Ali понял, что RoboDyn делают дисплеи на TM1637 в которых визуально есть и точки и двоеточие посредине (мой случай), но физически там работает только двоеточие, а есть такие дисплейчики, в которых есть точки, но двоеточия нет, вот в них точки работают. То есть, насколько я понял, варианта с работающими и точками, и двоеточием не существует, по крайней мере у RoboDyn.
В общем, чтобы привычнее смотрелись цифры на дисплее, зажег двоеточие, а верхнюю точку закрасил черным маркером ))) Отображает дисплей от 00:00 до 99:99, а выглядит как от 00.00 до 99.99. Короче, пока сойдет.
ПавеJI, инструментальная точность DS18b20 порядка 0.2 - 0.5 градуса(см график ниже) - ну нафига вам выводит совершенно бесполезные 2 знака после запятой?
Особая точность мне и не нужна, я бы сказал что +-1 градус меня устраивает вполне. Дисплей там, кстати, тоже, неально не нужен, прикрутил я его потому что в оригинальном устройстве он есть, но его показания никто и никогда не учитывал и не смотрел. А то что отображает до сотых, пусть отображает, свободных разрядов зато не будет.
А можно и так - http://forum.amperka.ru/attachments/img_5245-jpg.5848/
Впринципе, можно попробовать и такое запилить, подскажите где почитать об этом?
http://forum.amperka.ru/threads/Индикатор-tm1637-с-точкой.9136/
Лучше чем знаки после запятой выводить , вывели бы знак "°С".
Думал такое сделать, но че-то не разобрался, поэтому плюнул. Визуально, конечно, лучше будет, но и так работает.
Я совсем новичек в теме программирования, для меня что-то новое в программировании изучать - тяжко, могу только на примерах учить, разбирая уже написаное кем-то, а потом переделывать под свои нужды. Устройство работает - это уже успех для меня.