Arduino之 Mixly 数码管时钟实验
一、数据管的串接
首先,需要Arduino、TM1637数码管、若干排线等硬件。
CLK串口连接管脚5,DIO串口连接管脚6,当然,可以连接0-13各个管脚。
负极串口接GND,正极接5v。
二、实验部分
【实验一】实现滚动显示自定义字符串
通过上述数据管连接后,若设备硬件无问题即可上传图形化代码进行编译并运行。
以下为米思齐Mixly IDE编程软件中的图形化代码
以下为具体代码
#include <TM1637.h>
TM1637 tm1637(5,6);
void setup(){
tm1637.init();
}
void loop(){
int8_t NumTab[]={10,11,12,13,14};
int8_t ListDisp[4];
int8_t run=1;
unsigned char i = 0;
unsigned char count = 0;
delay(150);
while(run){
i = count;
count++;
if(sizeof(NumTab)<5)
run=0;
if(count == sizeof(NumTab))
count = 0;
for(unsigned char BitSelect = 0;BitSelect < sizeof(NumTab);BitSelect ++)
{
ListDisp[BitSelect] = NumTab[i];
i++;
if(i == sizeof(NumTab))
i = 0;
}
for(unsigned char k = 0;k <sizeof(NumTab);k ++)
{
tm1637.display(k,ListDisp[k]);
};
delay(500);
}
}
据视频,LED屏幕上显示了"abcde"5个字符的滚动效果,实验成功!
【实验二】实现显示自定义时间
按照实验一中的数码管串接方式接着我们的第二个实验——显示自定义时间
图形化代码如下:
首先初始化管脚以及TM1637设备的参数,设置其亮度为20
此时设置显示的时间为12:26分,时钟点设为高表示LED屏亮,且亮度为20;反之,若设为低,则LED屏不亮。
以下为具体代码:
#include <SevenSegmentExtended.h>
#include <SevenSegmentTM1637.h>
SevenSegmentExtended display(5,6);
void setup(){
display.begin();
display.setBacklight(20);
}
void loop(){
display.printTime(12,26,HIGH);
}
以下为实验结果图:
由结果图可见,LED屏成功显示我们预设内容,实验成功!
【实验三】实现显示秒表
继承以上两个实验的设备安装接口,进行我们的第三个实验——显示秒表
该实验内容需要LED屏显示秒、毫秒两部分内容,通过事先导入库插件maker17(如下)
我们直接利用该插件中自带的图形化代码完成该实验的代码编译任务,简单粗暴,图形化代码如下:
具体代码如下:
#include <EEPROM.h>
#include <avr/pgmspace.h>
#include <TimerOne.h>
#include <TM1637.h>
int8_t TimeDisp[] = {0x00,0x00,0x00,0x00};
unsigned char ClockPoint = 1;
unsigned char Update;
unsigned char microsecond_10 = 0;
unsigned char second;
unsigned char _microsecond_10 = 0;
unsigned char _second;
unsigned int eepromaddr;
boolean Flag_ReadTime;
#define ON 1
#define OFF 0
TM1637 tm1637(6,9);
void TimeUpdate2(void)
{
if(ClockPoint)tm1637.point(POINT_ON);
else tm1637.point(POINT_OFF);
TimeDisp[2] = _microsecond_10 / 10;
TimeDisp[3] = _microsecond_10 % 10;
TimeDisp[0] = _second / 10;
TimeDisp[1]= _second % 10;
Update = OFF;
}
void TimingISR2()
{
microsecond_10 ++;
Update = ON;
if(microsecond_10 == 100)
{
second ++;
if(second == 60)
{
second = 0;
}
microsecond_10 = 0;
}
ClockPoint =(~ClockPoint) & 0x01;
if(Flag_ReadTime == 0)
{_microsecond_10 = microsecond_10;
_second = second;
}
}
void readTime(){
Flag_ReadTime = 1;
if(eepromaddr == 0)
{
Serial.println("The time had been read");
_microsecond_10 = 0;
_second = 0;
}
else{
_second = EEPROM.read(-- eepromaddr);
_microsecond_10 = EEPROM.read(-- eepromaddr);
Serial.println("List the time");
}
Update = ON;
}
void saveTime()
{
EEPROM.write(eepromaddr ++,microsecond_10);
EEPROM.write(eepromaddr ++,second);
}
void stopwatchPause()
{
TCCR1B &= ~(_BV(CS10) | _BV(CS11) | _BV(CS12));
}
void stopwatchReset()
{
stopwatchPause();
Flag_ReadTime = 0;
_microsecond_10 = 0;
_second = 0;
microsecond_10 = 0;
second = 0;
Update = ON;
}
void stopwatchStart()
{
Flag_ReadTime = 0;
TCCR1B |=Timer1.clockSelectBits;
}
void setup(){
tm1637.init();
tm1637.set();
tm1637.init();
Timer1.initialize(10000);
Timer1.attachInterrupt(TimingISR2);
}
void loop(){
stopwatchStart();
if(Update == ON)
{
TimeUpdate2();
tm1637.display(TimeDisp);
}
}
根据视频内容,秒表显示成功!
三、实验结论与体会
通过本次实验,熟悉了arduino数码管的串接,通过数码管的连接懂得如何编写图形化代码。
懂得如何通过图形化编码进行物联网的应用,使硬件通过代码来运作。
并且对一些电信号的符号有所了解,知道如何知识迁移,能够掌握安装其他硬件的数码管。