STM32 + TM1637 (Arduino)

Модуль 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
  }

 


Дополнительные материалы:

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 

Добавить комментарий

Войти с помощью: