eagler8 发表于 2019-9-5 16:54:37

该模块所用芯片为TM1638,集合了单片机常见外围电路,最大特点是只需占用单片机三个IO口即可驱动,扫描显示和按键扫描不需要单片机干预,只需要读写相关寄存器送显示数据或检测按键,节省MCU资源。试想下,我们平时使用单片机外接8个LED,8位数码管,8个按键这需占用多少个IO口,远不止3个IO口吧,但用这个模块就可以实现。经实际应用,按键灵敏显示效果良好。

接线方法:
VCC GND接5V电源, STB CLK DIO接单片机IO口。

eagler8 发表于 2019-9-5 16:57:02

eagler8 发表于 2019-9-5 17:47:41

/*
【Arduino】108种传感器模块系列实验(资料+代码+图形+仿真)
实验一百零六: TM1638按键数码管LED显示模组8位数码管\LED\按键智控模块
1、安装库:IDE-工具-管理库-搜索TM1638plus-安装
2、项目:TM1638模块的演示文件库(LED和键)
《作者:加文·莱昂斯(Gavin Lyons)》
3、接脚:
VCC→ 5V
GND → GND
STROBE_TMD4
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.
#defineSTROBE_TM 4
#defineCLOCK_TM 6
#defineDIO_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 1Brightness 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 casesegment 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 TEXTwith dec point
   // abcdefgh with decimal point for c and d
   tm.displayText("abc.d.efgh");
   delay(3000);
   
   // Test6TEXT + 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;
}
}

eagler8 发表于 2019-9-5 17:49:21

eagler8 发表于 2019-9-5 18:29:26

/*
【Arduino】108种传感器模块系列实验(资料+代码+图形+仿真)
实验一百零六: TM1638按键数码管LED显示模组8位数码管\LED\按键智控模块
1、安装库:IDE-工具-管理库-搜索TM1638-安装
2、项目:自锁LED,按键计数器
3、接脚:
VCC→ 5V
GND → GND
STROBE_TMD4
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; //这里定义了那三个脚
//共阴数码管显示代码
unsigned char tab[]={0x3F,0x06,0x5B,0x4F,0x66,0x6D,0x7D,0x07,
                           0x7F,0x6F,0x77,0x7C,0x39,0x5E,0x79,0x71};
unsigned char num;                //各个数码管显示的值                     
void setup ()
{
pinMode(STB,OUTPUT);
pinMode(CLK,OUTPUT);
pinMode(DIO,OUTPUT); //让三个脚都是输出状态
}
void loop()
    {
        unsigned char i;
        init_TM1638();                                   //初始化TM1638
        for(i=0;i<8;i++)
        Write_DATA(i<<1,tab);                       //初始化寄存器       
        while(1)
        {
                i=Read_key();                        //读按键值
                if(i<8)
                {
                  num++;
                  while(i==Read_key());                     //等待按键释放
                  if(num>15)
                  num=0;
                  Write_DATA(i*2,tab]);
                  Write_allLED(1<<i);
                }
        }
}



void TM1638_Write(unsigned char        DATA)                        //写数据函数
{
        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)                                        //读数据函数
{
        unsigned char i;
        unsigned char temp=0;;       
      pinMode(DIO,INPUT);//设置为输入
        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)                //发送命令字
{
      digitalWrite(STB,LOW);
        TM1638_Write(cmd);
      digitalWrite(STB,HIGH);
}
unsigned char Read_key(void)
{
        unsigned char c,i,key_value=0;
      digitalWrite(STB,LOW);
        TM1638_Write(0x42);                           //读键扫数据 命令
        for(i=0;i<4;i++)               
        {
            c=TM1638_Read();
      }
      digitalWrite(STB,HIGH);                                                   //4个字节数据合成一个字节
        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)                //指定地址写入数据
{
        Write_COM(0x44);
      digitalWrite(STB,LOW);
        TM1638_Write(0xc0|add);
        TM1638_Write(DATA);
      digitalWrite(STB,HIGH);
}
void Write_allLED(unsigned char LED_flag)                                        //控制全部LED函数,LED_flag表示各个LED状态
{
        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初始化函数
void init_TM1638(void)
{
        unsigned char i;
        Write_COM(0x8b);       //亮度 (0x88-0x8f)8级亮度可调
        Write_COM(0x40);       //采用地址自动加1
      digitalWrite(STB,LOW);                           //
        TM1638_Write(0xc0);    //设置起始地址
        for(i=0;i<16;i++)           //传送16个字节的数据
          TM1638_Write(0x00);
      digitalWrite(STB,HIGH);
}

eagler8 发表于 2019-9-5 18:31:11

eagler8 发表于 2019-9-5 20:18:38

37款传感器与模块的提法,在网络上广泛流传,其实Arduino能够兼容的传感器模块肯定是不止37种的。鉴于本人手头积累了一些传感器和模块,依照实践出真知(一定要动手做)的理念,以学习和交流为目的,这里准备逐一动手试试做实验,不管成功与否,都会记录下来---小小的进步或是搞不定的问题,希望能够抛砖引玉。

【Arduino】108种传感器模块系列实验(资料+代码+图形+仿真)
实验一百零七: 2262/2272四路无线遥控套件M4非锁接收板 配四键无线遥控器模组

eagler8 发表于 2019-9-5 21:35:08



PT2262/PT2272
是台湾普城公司生产的一种CMOS 工艺制造的低功耗低价位通用编解码电路,PT2262/PT2272 最多可有12 位(A0-A11)三态地址端管脚(悬空,接高电平,接低电平),任意组合可提供531441地址码,PT2262 最多可有6 位(D0-D5)数据端管脚,设定的地址码和数据码从17 脚串行输出,可用于无线遥控发射电路。编码芯片PT2262 发出的编码信号由:地址码、数据码、同步码组成一个完整的码字,解码芯片PT2272 接收到信号后,其地址码经过两次比较核对后,VT 脚才输出高电平,与此同时相应的数据脚也输出高电平,如果发送端一直按住按键,编码芯片也会连续发射。当发射机没有按键按下时,PT2262 不接通电源,其17 脚为低电平,所以315MHz 的高频发射电路不工作,当有按键按下时,PT2262 得电工作,其第17 脚输出经调制的串行数据信号,当17 脚为高电平期间315MHz 的高频发射电路起振并发射等幅高频信号,当17 脚为低平期间315MHz 的高频发射电路停止振荡,所以高频发射电路完全受控于PT2262 的17 脚输出的数字信号,从而对高频电路完成幅度键控(ASK 调制)相当于调制度为100%的调幅。

eagler8 发表于 2019-9-5 21:47:29



PT2262
构成发射电路,PT2262-IR的VDD是通过按键接通后向芯片供电,这样静态时,PT2262-IR并不耗电,特别适合是电池供电的场合。如果使用电源电压较低(如3V),二极管应选用低压差的型号(如1N60等),工作原理相近。无线发射电路是由三极管加上电阻,电容,三极管,声表面滤波器,天线组成。红外线发射电路比较简单,由电阻、三极管和红外线发射管组成。编码电路主要由编码芯片完成,每个遥控器上面的编码都是通过集成电路芯片来完成的。只要我们按下按键,编码将通过发射电路以无线的形式发送出去。

eagler8 发表于 2019-9-5 21:49:41

eagler8 发表于 2019-9-5 21:51:21

eagler8 发表于 2019-9-5 21:52:39

eagler8 发表于 2019-9-5 21:53:52

eagler8 发表于 2019-9-5 21:55:09

eagler8 发表于 2019-9-5 21:56:43

页: 128 129 130 131 132 133 134 135 136 137 [138] 139 140 141 142 143 144 145 146 147
查看完整版本: 【Arduino】108种传感器模块系列实验(资料+代码+图形+仿真)