Модуль TM1637 представляет собой 4-х разрядный семисегментный дисплей на базе драйвера TM1637. Дисплей имеет десятичные точки в разрядах. Для подключения используется всего 2 цифровых контакта (помимо питания от 3.3 до 5 В) отладочной платы на STM32 (базе микроконтроллера STM32F103C8T6).
Для работы с дисплеем TM1637 можно использовать простую в применении библиотеку STM32_TM1637_V1_3.zip , которая позволяет выводить на дисплей числа (float) от -999 до 9999, менять яркость свечения индикатора, кол-во знаков после запятой и выводить различные символы.
Для подключения библиотека использует цифровые входы STM32 PB0 (CLK) PB1 (DIO), но можно использовать и другие цифровые входы указав их значения в функции tm(PB0,PB1).
Перед заливкой скетча в STM32 Вам необходимо ознакомиться со следующей статьей — STM32 Arduino IDE
#include <STM32_TM1637.h> // http://forum.rcl-radio.ru/misc.php?action=pan_download&item=403&download=1 STM32_TM1637 tm(PB0,PB1);// CLK, DIO float h=-10.7; byte p=1; void setup(){ tm.brig(7); // ЯРКОСТЬ 0...7 } void loop(){ tm.print_float(h,p, 0,0,0,0); delay(500); } /* tm.print_float(h,p, h0,h1,h2,h3); float h = -999...9999 | 0.000...9.999 | -9.99...99.99 | -99.9...999.9 byte p = 0...3 - число знаков после запятой h0,h1,h2,h3 = 0 -неактивно A --- F | | B -G- E | | C --- D h0 h1 h2 h3 ----------- XGFEDCBA (X - запятая) 0b00000000 */
Библиотека содержит всего три функции:
- STM32_TM1637 tm(PB0,PB1);// CLK, DIO
- подключение CLK, DIO
- tm.brig(7); // ЯРКОСТЬ 0…7
- изменение яркости свечения индикатора от 0 до 7
- tm.print_float(h,p, 0,0,0,0);
- h — числа от -999 до 9999 при p = 0, от -99,9 до 999,9 при р = 1, от -9,99 до 99,99 при р = 2 и от 0 до 9,999 при р = 3.
- p — кол-во знаков после запятой.
- 0,0,0,0 — вставка произвольных символов. При вставке символов следует учитывать, что знакоместо не должно быть занято цифрой.
- значение 0 отключает режим вставки произвольного символа, а значение например 0b1111000 выводит символ t.
Форум — http://forum.rcl-radio.ru/viewtopic.php?pid=1023#p1023
Пример использования:
#include <Wire.h> #include <SPI.h> #include <Adafruit_Sensor.h> // http://rcl-radio.ru/wp-content/uploads/2018/08/Adafruit_Sensor.zip #include <Adafruit_BMP280.h> // http://rcl-radio.ru/wp-content/uploads/2018/08/Adafruit_BMP280.zip #include <STM32_TM1637.h> STM32_TM1637 tm(PB0,PB1);// CLK, DIO Adafruit_BMP280 bmp; // I2C // CLK PB0 (TM1637) // DIO PB1 (TM1637) // SDA PB7 (BMP280) // SCL PB6 (BMP280) void setup(){ tm.brig(7); // ЯРКОСТЬ 0...7 bmp.begin(); } void loop(){ tm.print_float(bmp.readTemperature(),1, 0b1111000,0,0,0); delay(3000); tm.print_float(bmp.readPressure()/133.3224,0, 0b01110011,0,0,0); delay(3000); }
Показанный выше скетч позволяет выводить на дисплей TM1637 показания датчика BMP280 (температура и давление). Показания меняются каждые 3 секунды.
На следующем примере подключим дополнительно датчик влажности DHT11 и будем так же выводить его показания с интервалом 3 секунды.
STM32_TM1637 tm(PB0,PB1);// CLK, DIO Adafruit_BMP280 bmp; // I2C DHT dht(PB5, DHT11); // выход DAT подключен к цифровому входу B5 // CLK PB0 (TM1637) // DIO PB1 (TM1637) // SDA PB7 (BMP280) // SCL PB6 (BMP280) // DAT PB5 (DHT11) int h; float c; void setup(){ tm.brig(7); // ЯРКОСТЬ 0...7 bmp.begin(); dht.begin(); } void loop(){ c = bmp.readTemperature(); h = dht.readHumidity();// влажность tm.print_float(c,1, 0b1111000,0,0,0); delay(3000); tm.print_float(bmp.readPressure()/133.3224,0, 0b01110011,0,0,0); delay(3000); tm.print_float(h,0, 0b01110110,0,0,0); delay(3000); }
В следующем примере добавим еще один датчик температуры DS18B20, который позволит использовать этот пример в качестве погодной станции. С датчика BMP280 получаем данные о атмосферном давлении и температуры в помещении, с датчика DHT11 получаем данные о влажности в помещении, а с датчика DS18B20 получаем данные от температуре на улице. Все датчики питаются от платы STM32 от напряжения 3,3 В.
#include <OneWireSTM.h> // Библиотека Arduino_STM32-master.zip #include <Wire.h> #include <SPI.h> #include <Adafruit_Sensor.h> // http://rcl-radio.ru/wp-content/uploads/2018/08/Adafruit_Sensor.zip #include <Adafruit_BMP280.h> // http://rcl-radio.ru/wp-content/uploads/2018/08/Adafruit_BMP280.zip #include <STM32_TM1637.h> #include <DHT.h> // http://rcl-radio.ru/wp-content/uploads/2018/08/DHT.zip STM32_TM1637 tm(PB0,PB1);// CLK, DIO Adafruit_BMP280 bmp; // I2C DHT dht(PB5, DHT11); // выход DAT подключен к цифровому входу B5 OneWire ds(7); // A7 // CLK PB0 (TM1637) // DIO PB1 (TM1637) // SDA PB7 (BMP280) // SCL PB6 (BMP280) // DAT PB5 (DHT11) // OUT PA7 (DS18B20) byte i,present = 0,type_s = 0, data[12], addr[8]; float celsius,c,ddd; int h; void setup(){ Serial.begin(9600); tm.brig(7); // ЯРКОСТЬ 0...7 bmp.begin(); dht.begin(); } void loop(){ c = bmp.readTemperature();// температура BMP280 h = dht.readHumidity();// влажность DHT11 ddd = bmp.readPressure()/133.3224; // давление BMP280 в мм.рт.ст ///////// 18b20 ////////////////////// if ( !ds.search(addr)) {ds.reset_search();delay(250);return;} ds.reset();ds.select(addr);ds.write(0x44, 1);delay(100); present = 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];if (type_s) {raw = raw << 3;}celsius = (float)raw / 16.0; //////// end 18b20 //////////////////// tm.print_float(celsius,0, 0b1111000,0,0,0); delay(3000); tm.print_float(c,0, 0b1111000,0b00010100,0,0); delay(3000); tm.print_float(ddd,0, 0b01110011,0,0,0); delay(3000); tm.print_float(h,0, 0b01110110,0,0,0); delay(3000); Serial.print("DS18B20 ");Serial.print(celsius);Serial.println(" C"); Serial.print("BMP280 ");Serial.print(c);Serial.println(" C"); Serial.print("BMP280 ");Serial.println(bmp.readPressure()/133.3224); Serial.print("DHT11 ");Serial.print(h);Serial.println(" %"); Serial.println("--------------------------"); }
Библиотеку так же можно использовать с индикаторами TM1637 которые имеют разделительное двоеточие вместо запятых. Для работы с таким индикатором добавлена функция print_time, которая адаптирована специально для вывода времени. Ниже показан скетч использования этой функции.
Для создания часов Вам понадобятся часы реального времени DS1307 (DS3231).
#include <Wire.h> #include <STM32_TM1637.h> // STM32_TM1637_V1_3.zip #include <uRTCLib.h>//https://github.com/Naguissa/uRTCLib.git STM32_TM1637 tm(PB0,PB1);// CLK, DIO uRTCLib rtc(0x68); // PB7 = SDA DS1307 (DS3231) // PB6 = SCL DS1307 (DS3231) // PB0 = CLK TM1637 // PB1 = DIO TM1637 float h; void setup(){ tm.brig(7); // ЯРКОСТЬ 0...7 Wire.begin(); // rtc.set(30, 29, 7, 2, 17, 12, 19); // RTCLib::set(byte second, byte minute, byte hour, byte dayOfWeek, byte dayOfMonth, byte month, byte year) } void loop(){ rtc.refresh();// опрос времени h = rtc.hour()*100 + rtc.minute();// 1223 - формат времени = 12 часов 23 минуты tm.print_time(h, 0); delay(500); tm.print_time(h, 1);// мигание двоеточием delay(500); i++; if(i==10){i=0;tm.print_float(rtc.temp()/100,0 ,0b1111000,0,0,0);delay(2000);}// вывод температуры DS3231 }
Дополнительные материалы:
- Библиотека STM32_TM1637 v2.0 — http://forum.rcl-radio.ru/viewtopic.php?pid=1023#p1023
- Библиотека STM32_TM1637 v1.3 — STM32_TM1637_V1_3
- https://github.com/liman324/TM1637-STM32FC103.git
tm.print_float(h,p, h0,h1,h2,h3);
float h = -999...9999 | 0.000...0.999 | -9.99...99.99 | -99.9...999.9
byte p = 0...3 - число знаков после запятой
h0,h1,h2,h3 = 0 - неактивно
A
---
F | | B
-G-
E | | C
---
D
h0 h1 h2 h3
-----------
XGFEDCBA (X - запятая)
0b00000000