4-х разрядный семисегментный дисплей на базе драйвера TM1637 (Arduino)

4-х разрядный семисегментный дисплей на базе драйвера TM1637 с десятичными точками в разрядах, очень прост в использовании, библиотека Arduino TM1637.zip позволяет выводить на дисплей цифры и десятичные точки, а так же ряд символов. Так же имеется возможность менять яркость свечения сегментов.

Подключение дисплея к плате Arduino очень простое:

  • VCC to Arduino 5v
  • GND to Arduino GND
  • CLK к произвольному цифровому контакту Arduino, описанному в скетче
  • DIO к произвольному цифровому выходу Arduino, описанному в скетче

Вывод чисел

#include <TM1637.h>
 TM1637 print(3,2); //CLK,DIO
 
float i1 = 0.123,i2 = -1.25;
 
void setup(){
  print.set(7);//0...7 - яркость
  print.init(D4056A);//D4056A is the type of the module
}
 
void loop(){
  print.display(i1);
  delay(2000);
  print.display(i2);
  delay(2000);
}

Вывод чисел и символов

В этом примере показан вывод символов (список доступных указаны в скетче под номерами) и символов с цифрами.

#include <TM1637.h>
 TM1637 print(3,2); //CLK,DIO
 
int8_t arr0[] = {5, 14, 17, 10};// SEGA
int8_t arr1[] = { 2, 3, 4}; // int 324
 
void setup(){
  print.set(5);//0...7 - яркость
}
 
void loop(){
  print.point(false);
  print.display(arr0);
  delay(2000);
 
/* A 0x77 = 10, b 0x7c = 11, C 0x39 = 12, d 0x5e = 13, E 0x79 = 14, F 0x71 = 15,"-" 0x40 = 16, G 0x3d = 17, H 0x76 = 18, h 0x74 = 19, 
   i 0x04 = 20, J 0x1e = 21 ,L 0x38 = 22, l 0x18 = 23, M 0x37 = 24, n 0x54 = 25, P 0x73 = 26, r 0x50 = 27, t 0x78 = 28,
   U 0x3e = 29, u 0x1c = 30, Y 0x6E = 31, o верхнее 0x5c = 32, o нижнее 0x63 = 33 */
 
  print.point(false);
  print.display(0, 16);// минус
 
  print.point(false);
  print.display(1, arr1[0]);
 
  print.point(true);
  print.display(2, arr1[1]);
 
  print.point(false);
  print.display(3, arr1[2]);
  delay(2000);
}

Далее показан пример практического применения дисплея, на дисплей выводятся показания времени с модуля DS1302. Десятичная мигающая точка используется как индикатор такта секунд.

#include <iarduino_RTC.h>
#include <TM1637.h>
  iarduino_RTC time(RTC_DS1302, 6, 7, 8); // RST, CLK, DAT
  TM1637 print(3,2); //CLK,DIO
 
  unsigned long times;
 
void setup(){
  time.begin();
  print.set(5);//0...7 - яркость
   // time.settime(0,30,18,24,10,19,4); // Записываем время в модуль: сек, мин, час, дата, месяц, год (2019 = 19), день недели (пон = 1). 
}
 
void loop(){
  time.gettime();
 
  print.point(false);
  print.display(0,time.Hours / 10);
 
  if(millis()-times<500){print.point(true);}
  if(millis()-times>1000){times=millis();}
 
  print.display(1, time.Hours % 10);
 
  print.point(false);
  print.display(2, time.minutes / 10);
 
  print.point(false);
  print.display(3, time.minutes % 10);
 
}

В следующем примере на дисплей выводим показания цифрового датчика температуры DS18B20.

#include <OneWire.h>          
#include <DallasTemperature.h>
#include <TM1637.h>
 
  TM1637 print(3,2); //CLK,DIO
  OneWire oneWire(A0);// вход датчика 18b20
  DallasTemperature temp(&oneWire);
 
 float t1;
 
void setup(){
  print.init(D4056A);//D4056A is the type of the module
  temp.begin(); temp.setResolution(12);//12 бит  
  print.set(5);//0...7 - яркость
}
 
void loop(){
  temp.requestTemperatures();// опрос 18b20
  t1 = temp.getTempCByIndex(0); // снятие показаний 18b20
 
  print.display(t1);
}

В следующем примере скетча реализован терморегулятор на микросхеме MAX6675 (модуль), которая предназначена для работы с термопарами типа К(ХА) в диапазоне температур от 0 до 1000ºС, регулировка температуры осуществляется в этом же диапазоне, дополнительно добавлена возможность регулировки гистерезиса. Значения регулировки температуры и гистерезиса хранятся в энергонезависимой памяти.

Регулировка осуществляет при помощи энкодера, при нажатии на кнопку энкодера происходит переход к параметрам регулятора (регулировка температуры, гистерезис). К выходу D13 платы Arduino подключается модуль реле для управления нагревателем.

#include <max6675.h> // http://rcl-radio.ru/wp-content/uploads/2018/07/max6675.zip
#include <TM1637.h> // http://rcl-radio.ru/wp-content/uploads/2019/10/TM1637-1.zip
#include <Encoder.h> // http://rcl-radio.ru/wp-content/uploads/2019/05/Encoder.zip
#include <EEPROM.h>  
#include <MsTimer2.h> // http://rcl-radio.ru/wp-content/uploads/2018/11/MsTimer2.zip
 TM1637 print(7,6); //CLK,DIO
 MAX6675 thermocouple(4,3,2);// CLK, CS, SO
 Encoder myEnc(9, 8);// DT, CLK
 
int t,t_sum,i,t_iz,t_reg,menu,zn,w,x,gis; 
byte a[3];
unsigned long time,oldPosition  = -999,newPosition;    
 
void setup() {
  print.set(1);//0...7 - яркость
  pinMode(10,INPUT);// КНОПКА SW энкодера
  pinMode(13,OUTPUT);// выход для управления нагрузкой
  MsTimer2::set(3, to_Timer);MsTimer2::start(); 
  t_reg = EEPROM.read(0)*256+EEPROM.read(1);gis = EEPROM.read(2);
}
 
void loop() {
  ////////////// управлние //////////////////////////////////////////////////////////////
  if(digitalRead(10)==LOW){menu++;if(menu>0){delay(200);}time=millis();w=1;if(menu>2){menu=0;};}
  if (newPosition != oldPosition&&menu==1){oldPosition = newPosition;
     t_reg=t_reg+newPosition;myEnc.write(0);newPosition=0;time=millis();w=1;if(t_reg>999||t_reg<0){t_reg=0;}}
  if (newPosition != oldPosition&&menu==2){oldPosition = newPosition;
     gis=gis+newPosition;myEnc.write(0);newPosition=0;time=millis();w=1;if(gis>10||gis<0){gis=0;}}     
  ////////////// измерение /////////////////////////////////////////////////////////////
  if(menu==0){myEnc.write(0);t=thermocouple.readCelsius();delay(200);
  t_sum=t_sum+t;
  if(i==5){t_iz = t_sum/5;t_sum=0;i=0;}i++;
  }
  ////////////// вывод на дисплей //////////////////////////////////////////////////////
  switch(menu){
    case 0:zn = 28;x=t_iz;break;
    case 1:zn = 27;x=t_reg;break;
    case 2:zn = 17;x=gis;break;}
 
  a[0]=x/100%10;
  a[1]=x/10%10;
  a[2]=x%10%10;
 
  print.point(false);
  print.display(0, zn);
  print.display(1, a[0]);
  print.display(2, a[1]);
  print.display(3, a[2]);
 ///////////// память ///////////////////////////////////////////////////////////////////
if(millis()-time>10000 && w==1){
     EEPROM.update(0,highByte(t_reg));EEPROM.update(1,lowByte(t_reg));EEPROM.update(2,gis);
     menu=0;w=0;} 
 //////////// управление реле //////////////////////////////////////////////////////////
  if(t_reg >= t_iz + gis){digitalWrite(13,HIGH);}
  if(t_reg <= t_iz - gis){digitalWrite(13,LOW);}
 
}
 
void to_Timer(){newPosition = myEnc.read()/4;}

Comments

  1. Подскажите, в скетче с температурой ошибка в компиляции: print.init(D4056A);//D4056A is the type of the module

    скетч с часами работает отлично, даже изменил на DS1307.

    И самый верхний пример не проходит компиляция.

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

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