本次开发板提供的丰富外设还未体验完,暂时就把自己体验的几个外设功能给完善了下,然后通过一些外设做了一个遥控器的功能,同时兼具温湿度传感器的显示功能。
最主要的是这个液晶显示,目前是段码屏。所以我们可以显示一些字母还有特殊定制的字符。
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。然后包括后面显示风俗也是一样,用数码管拼凑字母。紧接着的是显示制冷制热模式下的温度。
之后是红外,这个在上篇中说了,产生38Khz方波,然后进行编码。
按键的话只能用前面三个进行测试,最后的和段码屏冲突了,所以我们未使用,不过我们可以用组合按键方式进行新增功能。
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个,分别是制冷制热模式切换,风速大小切换,以及显示温湿度传感器数据,关闭空调。
空调控制还需要进行调温,这个是最主要的功能,调温的话我是采用了上面的滑动变阻器,然后其是接入到了ADC功能里面的,我们把ADC采集数据进行平均,然后就能完成温度调节了。
我把其采集到的值进行了等分,然后只需要除去这个数即可。
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; } }
复制代码整体最后在函数里进行不同,模式切换就完成了。
演示效果放视频中了,如下。