本次开发板提供的丰富外设还未体验完,暂时就把自己体验的几个外设功能给完善了下,然后通过一些外设做了一个遥控器的功能,同时兼具温湿度传感器的显示功能。
图片 1.png
最主要的是这个液晶显示,目前是段码屏。所以我们可以显示一些字母还有特殊定制的字符。
void LCD_DisplayDataUpdate(void)
  • {
  • static u32 TemValue1,RhValue1;
  • t++;
  • if(t<15)
  • {
  • TemValue1 = TemValue*100;
  • LCD_DisplayNumber1(0, ' ', 0);
  • LCD_DisplayNumber1(1, ' ', 0);
  • LCD_DisplayNumber1(2, '0' + ((TemValue1 / 1000) % 10), 0);
  • LCD_DisplayNumber1(3, '0' + ((TemValue1 / 100 ) % 10), 1);
  • LCD_DisplayNumber1(4, '0' + ((TemValue1 / 10  ) % 10), 0);
  • LCD_DisplayNumber1(5, '0' + ((TemValue1 / 1   ) % 10), 0);
  • LCD_DisplayUnit(4,1);
  • LCD_DisplayNumber2(0, ' ', 0);
  • }
  • else if(t<30)
  • {
  • RhValue1 = RhValue*100;
  • LCD_DisplayNumber1(0, 'H', 0);
  • LCD_DisplayNumber1(1, ' ', 0);
  • LCD_DisplayNumber1(2, '0' + ((RhValue1 / 1000) % 10), 0);
  • LCD_DisplayNumber1(3, '0' + ((RhValue1 / 100 ) % 10), 1);
  • LCD_DisplayNumber1(4, '0' + ((RhValue1 / 10  ) % 10), 0);
  • LCD_DisplayNumber1(5, '0' + ((RhValue1 / 1   ) % 10), 0);
  • LCD_DisplayUnit(4,0);
  • LCD_DisplayNumber2(0, ' ', 0);
  • }
  • else
  • {
  • t=0;
  • }
  • }
  • void LCD_Show_Heating_Temp(uint8_t temp)
  • {
  • LCD_DisplayNumber1(0, ' ', 0);
  • LCD_DisplayNumber1(1, 'H', 0);
  • LCD_DisplayNumber1(2, '-', 0);
  • LCD_DisplayNumber1(3, '0' + ((temp / 10 ) % 10), 0);
  • LCD_DisplayNumber1(4, '0' + ((temp / 1  ) % 10), 0);
  • LCD_DisplayNumber1(5, 'C', 0);
  • LCD_DisplayUnit(4,0);
  • }
  • void LCD_Show_Refrigeration_Temp(uint8_t temp)
  • {
  • LCD_DisplayNumber1(0, ' ', 0);
  • LCD_DisplayNumber1(1, 'C', 0);
  • LCD_DisplayNumber1(2, '-', 0);
  • LCD_DisplayNumber1(3, '0' + ((temp / 10 ) % 10), 0);
  • LCD_DisplayNumber1(4, '0' + ((temp / 1  ) % 10), 0);
  • LCD_DisplayNumber1(5, 'C', 0);
  • LCD_DisplayUnit(4,0);
  • }
  • void LCD_Show_Wind_Speed(uint8_t Wind_Speed)
  • {
  • switch(Wind_Speed)
  • {
  • case 0: //自动
  • {
  • LCD_DisplayNumber2(0, 'A', 0);
  • break;
  • }
  • case 1: //低速
  • {
  • LCD_DisplayNumber2(0, 'L', 0);
  • break;
  • }
  • case 2: //中速
  • {
  • LCD_DisplayNumber2(0, 'I', 0);
  • break;
  • }
  • case 3: //高速
  • {
  • LCD_DisplayNumber2(0, 'H', 0);
  • break;
  • }
  • }
  • }
  • 复制代码
    这里面我用了好几个函数封装了要显示的内容,首先传感器显示数据,保留了两位小数,同时对于其温湿度采用了不同的显示方法,温度由于其段码上有一个字符,所以直接显示字符就行了,湿度我用了最开头一个数码管进行显示H。然后包括后面显示风俗也是一样,用数码管拼凑字母。紧接着的是显示制冷制热模式下的温度。
    图片 2.png
    之后是红外,这个在上篇中说了,产生38Khz方波,然后进行编码。
    图片 3.png
    按键的话只能用前面三个进行测试,最后的和段码屏冲突了,所以我们未使用,不过我们可以用组合按键方式进行新增功能。
    if(KEY1&&!KEY2)
  • {
  • delay_ms(15);
  • if(KEY1&&!KEY2) //关机
  • {
  • AUX_SET_OFF();
  • mode = 0;
  • }
  • }
  • else if(KEY1) //制热
  • {
  • delay_ms(15);
  • if(KEY1)
  • {
  • send_flag = 1;
  • mode = 1;
  • }
  • }
  • else if(!KEY2&&!KEY3) //显示温湿度
  • {
  • delay_ms(15);
  • if(!KEY2&&!KEY3)
  • {
  • mode = 0;
  • }
  • }
  • else if(!KEY2) //制冷
  • {
  • delay_ms(15);
  • if(!KEY2)
  • {
  • send_flag = 1;
  • mode = 2;
  • }
  • }
  • else if(!KEY3)//设置风速
  • {
  • delay_ms(15);
  • if(!KEY3)
  • {
  • send_flag = 1;
  • if(wind_speed==3) //高速到自动
  • {
  • AUX_ON[4] = 0xE0; //自动
  • wind_speed = 0;
  • }
  • else if(wind_speed == 0)
  • {
  • AUX_ON[4] = 0x60; //低速
  • wind_speed = 1;
  • }
  • else if(wind_speed == 1)
  • {
  • AUX_ON[4] = 0x20; //中速
  • wind_speed = 2;
  • }
  • else if(wind_speed == 2)
  • {
  • AUX_ON[4] = 0xA0; //高速
  • wind_speed = 3;
  • }
  • mode = 3;
  • }
  • }
  • 复制代码
    所以整个功能就做了5个,分别是制冷制热模式切换,风速大小切换,以及显示温湿度传感器数据,关闭空调。
    图片 4.png
    空调控制还需要进行调温,这个是最主要的功能,调温的话我是采用了上面的滑动变阻器,然后其是接入到了ADC功能里面的,我们把ADC采集数据进行平均,然后就能完成温度调节了。
    图片 5.png
    我把其采集到的值进行了等分,然后只需要除去这个数即可。
    ADCVAL = GetAdcAverage(10);
  • set_temp = ADCVAL/274;
  • if(temp_change!=set_temp)
  • {
  • temp_change = set_temp;
  • send_flag = 1;
  • }
  • 复制代码
    这个是代码,首先是采集滤波,然后就是数值改变下才去调整下空调设定温度。
    switch(mode)
  • {
  • case 0:
  • {
  • // IRM_SetIRMData(1u);
  • SHT20_SoftReset();
  • SHT20_ReadValues();
  • LCD_DisplayDataUpdate();
  • break;
  • }
  • case 1:  //制热
  • {
  • if(send_flag)
  • {
  • send_flag = 0;
  • AUX_ON[1] = ((0x40>>3)+(set_temp))<<3|0x07;
  • AUX_ON[6] = 0x80;  
  • AUX_SET_HOT();
  • LCD_Show_Heating_Temp(set_temp+16);
  • LCD_Show_Wind_Speed(wind_speed);
  • }
  • break;
  • }
  • case 2: //制冷
  • {
  • if(send_flag)
  • {
  • send_flag = 0;
  • AUX_ON[1] = ((0x40>>3)+(set_temp))<<3|0x07;
  • AUX_ON[6] = 0x20;  
  • AUX_SET_HOT();
  • LCD_Show_Refrigeration_Temp(set_temp+16);
  • LCD_Show_Wind_Speed(wind_speed);
  • }
  • break;
  • }
  • case 3:
  • {
  • if(send_flag)
  • {
  • send_flag = 0;
  • AUX_ON[1] = ((0x40>>3)+(set_temp))<<3|0x07;
  • LCD_Show_Wind_Speed(wind_speed);
  • AUX_SET_HOT();
  • }
  • break;
  • }
  • }
  • 复制代码
    整体最后在函数里进行不同,模式切换就完成了。
    演示效果放视频中了,如下。