37款傳感器與執(zhí)行器的提法,在網(wǎng)絡(luò)上廣泛流傳,其實(shí)Arduino能夠兼容的傳感器模塊肯定是不止這37種的。鑒于本人手頭積累了一些傳感器和執(zhí)行器模塊,依照實(shí)踐出真知(一定要動手做)的理念,以學(xué)習(xí)和交流為目的,這里準(zhǔn)備逐一動手嘗試系列實(shí)驗,不管成功(程序走通)與否,都會記錄下來---小小的進(jìn)步或是搞不掂的問題,希望能夠拋磚引玉。
【Arduino】168種傳感器模塊系列實(shí)驗(資料代碼+仿真編程+圖形編程)
實(shí)驗一百零二:TM1638按鍵數(shù)碼管LED顯示模組8位數(shù)碼管\LED\按鍵智控模塊

TM1638
是一種帶鍵盤掃描接口的LED(發(fā)光二極管顯示器)驅(qū)動控制專用IC,內(nèi)部集成有MCU數(shù)字接口、數(shù)據(jù)鎖存器、LED驅(qū)動、鍵盤掃描等電路。本模塊質(zhì)量可靠、穩(wěn)定性好、抗干擾能力強(qiáng)。主要應(yīng)用于冰箱、空調(diào) 、家庭影院等產(chǎn)品的高段位顯示屏驅(qū)動。

TM1638
1、采用CMOS 工藝
2、顯示模式 10段×8 位
3、鍵掃描(8×3bit)
4、輝度調(diào)節(jié)電路(占空比8 級可調(diào))
5、串行接口(CLK,STB,DIO)
6、振蕩方式:RC 振蕩
7、內(nèi)置上電復(fù)位電路
8、封裝形式:SOP28







模塊功能介紹,包括以下資源:
1、8個按鍵,
2、8個LED
3、8位數(shù)碼管,共陰極LED數(shù)碼管;
4、可以和STC等單片機(jī)直接連接;
5、開始實(shí)驗ardiuno驅(qū)動程序

模塊電原理圖



該模塊所用芯片為TM1638,集合了單片機(jī)常見外圍電路,最大特點(diǎn)是只需占用單片機(jī)三個IO口即可驅(qū)動,掃描顯示和按鍵掃描不需要單片機(jī)干預(yù),只需要讀寫相關(guān)寄存器送顯示數(shù)據(jù)或檢測按鍵,節(jié)省MCU資源。試想下,我們平時使用單片機(jī)外接8個LED,8位數(shù)碼管,8個按鍵這需占用多少個IO口,遠(yuǎn)不止3個IO口吧,但用這個模塊就可以實(shí)現(xiàn)。經(jīng)實(shí)際應(yīng)用,按鍵靈敏顯示效果良好。
接線方法:
VCC GND接5V電源, STB CLK DIO接單片機(jī)IO口。


實(shí)驗程序一:TM1638模塊的演示文件庫(LED和鍵)
(1)Arduino參考開源代碼
/*
【Arduino】168種傳感器模塊系列實(shí)驗(資料代碼+仿真編程+圖形編程)
實(shí)驗一百零二: TM1638按鍵數(shù)碼管LED顯示模組8位數(shù)碼管\LED\按鍵智控模塊
1、安裝庫:IDE-工具-管理庫-搜索TM1638plus-安裝
2、項目:TM1638模塊的演示文件庫(LED和鍵)
3、接腳:
VCC → 5V
GND → GND
STROBE_TM D4
CLOCK_TM D6
DIO_TM D7
*/
#include <TM1638plus.h>
// GPIO I/O pins on the Arduino connected to strobe, clock, data,
//pick on any I/O you want.
#define STROBE_TM 4
#define CLOCK_TM 6
#define DIO_TM 7
//Constructor object
TM1638plus tm(STROBE_TM, CLOCK_TM , DIO_TM);
void setup() {
// Test 0 reset test
tm.setLED(0, 1);
delay(1000);
tm.reset();
// Test 1 Brightness and reset
for (uint8_t brightness = 0; brightness < 8; brightness++)
{
tm.brightness(brightness);
tm.displayText("00000000");
delay(1500);
}
tm.reset();
// restore default brightness
tm.brightness(0x02);
//Test 2 ASCII display 2.348
tm.displayASCIIwDot(0, '2');
tm.displayASCII(1, '3');
tm.displayASCII(2, '4');
tm.displayASCII(3, '8');
delay(2000);
//TEST 3 single segment
//In this case segment g (middle dash) of digit position 7
tm.display7Seg(7,0b01000000);
delay(2000);
// Test 4 Hex digits.
tm.displayHex(0, 1);
tm.displayHex(1, 2);
tm.displayHex(2, 3);
tm.displayHex(3, 4);
tm.displayHex(4, 5);
tm.displayHex(5, 6);
tm.displayHex(6, 7);
tm.displayHex(7, 8);
delay(2000);
tm.displayHex(0, 8);
tm.displayHex(1, 9);
tm.displayHex(2, 10);
tm.displayHex(3, 11);
tm.displayHex(4, 12);
tm.displayHex(5, 13);
tm.displayHex(6, 14);
tm.displayHex(7, 15);
delay(2000);
// Test 5 TEXT with dec point
// abcdefgh with decimal point for c and d
tm.displayText("abc.d.efgh");
delay(3000);
// Test6 TEXT + ASCII combo
// ADC=2.548
char text1[]= "ADC=.";
tm.displayText(text1);
tm.displayASCIIwDot(4, '2');
tm.displayASCII(5, '5');
tm.displayASCII(6, '4');
tm.displayASCII(7, '8');
delay(2000);
//Test 7 buttons and LED test
tm.displayText("EAGLER8 ");
}
void loop() {
uint8_t buttons = tm.readButtons();
doLEDs(buttons);
}
// scans the individual bits of value
void doLEDs(uint8_t value) {
for (uint8_t position = 0; position < 8; position++) {
tm.setLED(position, value & 1);
value = value >> 1;
}
}
(2)實(shí)驗場景圖

實(shí)驗程序二:自鎖LED,按鍵計數(shù)器
(1)Arduino參考開源代碼
/*
【Arduino】168種傳感器模塊系列實(shí)驗(資料代碼+仿真編程+圖形編程)
實(shí)驗一百零二: TM1638按鍵數(shù)碼管LED顯示模組8位數(shù)碼管\LED\按鍵智控模塊
1、安裝庫:IDE-工具-管理庫-搜索TM1638-安裝
2、項目:自鎖LED,按鍵計數(shù)器
3、接腳:
VCC → 5V
GND → GND
STROBE_TM D4
CLOCK_TM D6
DIO_TM D7
*/
#define DATA_COMMAND 0X40
#define DISP_COMMAND 0x80
#define ADDR_COMMAND 0XC0
//TM1638模塊引腳定義
int DIO = 7;
int CLK = 6;
int STB = 4; //這里定義了那三個腳
//共陰數(shù)碼管顯示代碼
unsigned char tab[]={0x3F,0x06,0x5B,0x4F,0x66,0x6D,0x7D,0x07,
0x7F,0x6F,0x77,0x7C,0x39,0x5E,0x79,0x71};
unsigned char num[8]; //各個數(shù)碼管顯示的值
void setup ()
{
pinMode(STB,OUTPUT);
pinMode(CLK,OUTPUT);
pinMode(DIO,OUTPUT); //讓三個腳都是輸出狀態(tài)
}
void loop()
{
unsigned char i;
init_TM1638(); //初始化TM1638
for(i=0;i<8;i++)
Write_DATA(i<<1,tab[0]); //初始化寄存器
while(1)
{
i=Read_key(); //讀按鍵值
if(i<8)
{
num++;
while(i==Read_key()); //等待按鍵釋放
if(num>15)
num=0;
Write_DATA(i*2,tab[num]);
Write_allLED(1<<i);
}
}
}
void TM1638_Write(unsigned char DATA) //寫數(shù)據(jù)函數(shù)
{
unsigned char i;
pinMode(DIO,OUTPUT);
for(i=0;i<8;i++)
{
digitalWrite(CLK,LOW);
if(DATA&0X01)
digitalWrite(DIO,HIGH);
else
digitalWrite(DIO,LOW);
DATA>>=1;
digitalWrite(CLK,HIGH);
}
}
unsigned char TM1638_Read(void) //讀數(shù)據(jù)函數(shù)
{
unsigned char i;
unsigned char temp=0;;
pinMode(DIO,INPUT);//設(shè)置為輸入
for(i=0;i<8;i++)
{
temp>>=1;
digitalWrite(CLK,LOW);
if(digitalRead(DIO)==HIGH)
temp|=0x80;
digitalWrite(CLK,HIGH);
}
return temp;
}
void Write_COM(unsigned char cmd) //發(fā)送命令字
{
digitalWrite(STB,LOW);
TM1638_Write(cmd);
digitalWrite(STB,HIGH);
}
unsigned char Read_key(void)
{
unsigned char c[4],i,key_value=0;
digitalWrite(STB,LOW);
TM1638_Write(0x42); //讀鍵掃數(shù)據(jù) 命令
for(i=0;i<4;i++)
{
c=TM1638_Read();
}
digitalWrite(STB,HIGH); //4個字節(jié)數(shù)據(jù)合成一個字節(jié)
for(i=0;i<4;i++)
{
key_value|=c<<i;
}
for(i=0;i<8;i++)
{
if((0x01<<i)==key_value)
break;
}
return i;
}
void Write_DATA(unsigned char add,unsigned char DATA) //指定地址寫入數(shù)據(jù)
{
Write_COM(0x44);
digitalWrite(STB,LOW);
TM1638_Write(0xc0|add);
TM1638_Write(DATA);
digitalWrite(STB,HIGH);
}
void Write_allLED(unsigned char LED_flag) //控制全部LED函數(shù),LED_flag表示各個LED狀態(tài)
{
unsigned char i;
for(i=0;i<8;i++)
{
if(LED_flag&(1<<i))
Write_DATA(2*i+1,1);
else
Write_DATA(2*i+1,0);
}
}
//TM1638初始化函數(shù)
void init_TM1638(void)
{
unsigned char i;
Write_COM(0x8b); //亮度 (0x88-0x8f)8級亮度可調(diào)
Write_COM(0x40); //采用地址自動加1
digitalWrite(STB,LOW); //
TM1638_Write(0xc0); //設(shè)置起始地址
for(i=0;i<16;i++) //傳送16個字節(jié)的數(shù)據(jù)
TM1638_Write(0x00);
digitalWrite(STB,HIGH);
}
(2)實(shí)驗場景圖
