[MM32软件] 【EV Board (MM32L0136C7P)测评】红外遥控器完整作品

[复制链接]
1917|14
 楼主| wuxiubo 发表于 2022-12-17 13:59 | 显示全部楼层 |阅读模式
本次开发板提供的丰富外设还未体验完,暂时就把自己体验的几个外设功能给完善了下,然后通过一些外设做了一个遥控器的功能,同时兼具温湿度传感器的显示功能。
13114935c8f322525d99dbd85f23b4ae
最主要的是这个液晶显示,目前是段码屏。所以我们可以显示一些字母还有特殊定制的字符。
  1. void LCD_DisplayDataUpdate(void)

  2. {

  3. static u32 TemValue1,RhValue1;

  4. t++;

  5. if(t<15)

  6. {

  7. TemValue1 = TemValue*100;

  8. LCD_DisplayNumber1(0, ' ', 0);

  9. LCD_DisplayNumber1(1, ' ', 0);

  10. LCD_DisplayNumber1(2, '0' + ((TemValue1 / 1000) % 10), 0);

  11. LCD_DisplayNumber1(3, '0' + ((TemValue1 / 100 ) % 10), 1);

  12. LCD_DisplayNumber1(4, '0' + ((TemValue1 / 10 ) % 10), 0);

  13. LCD_DisplayNumber1(5, '0' + ((TemValue1 / 1 ) % 10), 0);

  14. LCD_DisplayUnit(4,1);

  15. LCD_DisplayNumber2(0, ' ', 0);

  16. }

  17. else if(t<30)

  18. {

  19. RhValue1 = RhValue*100;

  20. LCD_DisplayNumber1(0, 'H', 0);

  21. LCD_DisplayNumber1(1, ' ', 0);

  22. LCD_DisplayNumber1(2, '0' + ((RhValue1 / 1000) % 10), 0);

  23. LCD_DisplayNumber1(3, '0' + ((RhValue1 / 100 ) % 10), 1);

  24. LCD_DisplayNumber1(4, '0' + ((RhValue1 / 10 ) % 10), 0);

  25. LCD_DisplayNumber1(5, '0' + ((RhValue1 / 1 ) % 10), 0);

  26. LCD_DisplayUnit(4,0);

  27. LCD_DisplayNumber2(0, ' ', 0);

  28. }

  29. else

  30. {

  31. t=0;

  32. }

  33. }

  34. void LCD_Show_Heating_Temp(uint8_t temp)

  35. {

  36. LCD_DisplayNumber1(0, ' ', 0);

  37. LCD_DisplayNumber1(1, 'H', 0);

  38. LCD_DisplayNumber1(2, '-', 0);

  39. LCD_DisplayNumber1(3, '0' + ((temp / 10 ) % 10), 0);

  40. LCD_DisplayNumber1(4, '0' + ((temp / 1 ) % 10), 0);

  41. LCD_DisplayNumber1(5, 'C', 0);

  42. LCD_DisplayUnit(4,0);

  43. }

  44. void LCD_Show_Refrigeration_Temp(uint8_t temp)

  45. {

  46. LCD_DisplayNumber1(0, ' ', 0);

  47. LCD_DisplayNumber1(1, 'C', 0);

  48. LCD_DisplayNumber1(2, '-', 0);

  49. LCD_DisplayNumber1(3, '0' + ((temp / 10 ) % 10), 0);

  50. LCD_DisplayNumber1(4, '0' + ((temp / 1 ) % 10), 0);

  51. LCD_DisplayNumber1(5, 'C', 0);

  52. LCD_DisplayUnit(4,0);

  53. }

  54. void LCD_Show_Wind_Speed(uint8_t Wind_Speed)

  55. {

  56. switch(Wind_Speed)

  57. {

  58. case 0: //自动

  59. {

  60. LCD_DisplayNumber2(0, 'A', 0);

  61. break;

  62. }

  63. case 1: //低速

  64. {

  65. LCD_DisplayNumber2(0, 'L', 0);

  66. break;

  67. }

  68. case 2://中速

  69. {

  70. LCD_DisplayNumber2(0, 'I', 0);

  71. break;

  72. }

  73. case 3://高速

  74. {

  75. LCD_DisplayNumber2(0, 'H', 0);

  76. break;

  77. }

  78. }

  79. }

这里面我用了好几个函数封装了要显示的内容,首先传感器显示数据,保留了两位小数,同时对于其温湿度采用了不同的显示方法,温度由于其段码上有一个字符,所以直接显示字符就行了,湿度我用了最开头一个数码管进行显示H。然后包括后面显示风俗也是一样,用数码管拼凑字母。紧接着的是显示制冷制热模式下的温度。
34d94d581379d788f82dcd5d58c0852c
之后是红外,这个在上篇中说了,产生38Khz方波,然后进行编码。
337f065eab04d43c3f602e25158d7104
按键的话只能用前面三个进行测试,最后的和段码屏冲突了,所以我们未使用,不过我们可以用组合按键方式进行新增功能。
  1. if(KEY1&&!KEY2)

  2. {

  3. delay_ms(15);

  4. if(KEY1&&!KEY2) //关机

  5. {

  6. AUX_SET_OFF();

  7. mode = 0;

  8. }

  9. }

  10. else if(KEY1) //制热

  11. {

  12. delay_ms(15);

  13. if(KEY1)

  14. {

  15. send_flag = 1;

  16. mode = 1;

  17. }

  18. }

  19. else if(!KEY2&&!KEY3) //显示温湿度

  20. {

  21. delay_ms(15);

  22. if(!KEY2&&!KEY3)

  23. {

  24. mode = 0;

  25. }

  26. }

  27. else if(!KEY2)//制冷

  28. {

  29. delay_ms(15);

  30. if(!KEY2)

  31. {

  32. send_flag = 1;

  33. mode = 2;

  34. }

  35. }

  36. else if(!KEY3)//设置风速

  37. {

  38. delay_ms(15);

  39. if(!KEY3)

  40. {

  41. send_flag = 1;

  42. if(wind_speed==3)//高速到自动

  43. {

  44. AUX_ON[4] = 0xE0;//自动

  45. wind_speed = 0;

  46. }

  47. else if(wind_speed == 0)

  48. {

  49. AUX_ON[4] = 0x60;//低速

  50. wind_speed = 1;

  51. }

  52. else if(wind_speed == 1)

  53. {

  54. AUX_ON[4] = 0x20;//中速

  55. wind_speed = 2;

  56. }

  57. else if(wind_speed == 2)

  58. {

  59. AUX_ON[4] = 0xA0;//高速

  60. wind_speed = 3;

  61. }

  62. mode = 3;

  63. }

  64. }

所以整个功能就做了5个,分别是制冷制热模式切换,风速大小切换,以及显示温湿度传感器数据,关闭空调。
ee45311c2d778e4b019f0324da1fad6e
空调控制还需要进行调温,这个是最主要的功能,调温的话我是采用了上面的滑动变阻器,然后其是接入到了ADC功能里面的,我们把ADC采集数据进行平均,然后就能完成温度调节了。
4477a6a77dda51216223f45137dcb691
我把其采集到的值进行了等分,然后只需要除去这个数即可。
  1. ADCVAL = GetAdcAverage(10);

  2. set_temp = ADCVAL/274;

  3. if(temp_change!=set_temp)

  4. {

  5. temp_change = set_temp;

  6. send_flag = 1;

  7. }

这个是代码,首先是采集滤波,然后就是数值改变下才去调整下空调设定温度。
  1. switch(mode)

  2. {

  3. case 0:

  4. {

  5. //IRM_SetIRMData(1u);

  6. SHT20_SoftReset();

  7. SHT20_ReadValues();

  8. LCD_DisplayDataUpdate();

  9. break;

  10. }

  11. case 1: //制热

  12. {

  13. if(send_flag)

  14. {

  15. send_flag = 0;

  16. AUX_ON[1] = ((0x40>>3)+(set_temp))<<3|0x07;

  17. AUX_ON[6] = 0x80;

  18. AUX_SET_HOT();

  19. LCD_Show_Heating_Temp(set_temp+16);

  20. LCD_Show_Wind_Speed(wind_speed);

  21. }

  22. break;

  23. }

  24. case 2: //制冷

  25. {

  26. if(send_flag)

  27. {

  28. send_flag = 0;

  29. AUX_ON[1] = ((0x40>>3)+(set_temp))<<3|0x07;

  30. AUX_ON[6] = 0x20;

  31. AUX_SET_HOT();

  32. LCD_Show_Refrigeration_Temp(set_temp+16);

  33. LCD_Show_Wind_Speed(wind_speed);

  34. }

  35. break;

  36. }

  37. case 3:

  38. {

  39. if(send_flag)

  40. {

  41. send_flag = 0;

  42. AUX_ON[1] = ((0x40>>3)+(set_temp))<<3|0x07;

  43. LCD_Show_Wind_Speed(wind_speed);

  44. AUX_SET_HOT();

  45. }

  46. break;

  47. }

  48. }

整体最后在函数里进行不同,模式切换就完成了。
演示效果放视频中了,如下。


xld0932 发表于 2022-12-17 20:02 | 显示全部楼层
对着空调实际操作,一下子感觉到效果了
xu@xupt 发表于 2022-12-19 10:30 | 显示全部楼层
博主强大,感谢分享
szt1993 发表于 2022-12-21 21:03 | 显示全部楼层
楼主这个可以,学习到了
tpgf 发表于 2023-1-5 15:09 | 显示全部楼层
正常情况下  红外遥控器的可靠使用距离是多远啊
xiaoqizi 发表于 2023-1-5 15:25 | 显示全部楼层
一般情况下什么原因会导致红外连接的断开呢
木木guainv 发表于 2023-1-5 15:34 | 显示全部楼层
红外发送的这个波 是可以通过什么手段进行捕捉呢
aoyi 发表于 2023-1-5 15:43 | 显示全部楼层
使用红外连接发送数据的最快速度是多少啊
tfqi 发表于 2023-1-5 15:56 | 显示全部楼层
一个红外遥控器 可以同时控制多个红外设备吗
Jacquetry 发表于 2023-1-5 17:01 | 显示全部楼层
红外连接发送数据的最快速度是多少啊
 楼主| wuxiubo 发表于 2023-1-6 16:59 | 显示全部楼层
tpgf 发表于 2023-1-5 15:09
正常情况下  红外遥控器的可靠使用距离是多远啊

这个传感器很小,还是贴片的,所以估计得一米以内,其实做个多的一般是5个灯,像最早小米出的那种万能遥控器,就是这样,这样基本做到一个屋子里设备都能控制了
 楼主| wuxiubo 发表于 2023-1-6 16:59 | 显示全部楼层
Jacquetry 发表于 2023-1-5 17:01
红外连接发送数据的最快速度是多少啊

这个不是看速度的,看协议,协议规定了,就只能按协议速度走,他的38KHZ只是载波
 楼主| wuxiubo 发表于 2023-1-6 17:00 | 显示全部楼层
tfqi 发表于 2023-1-5 15:56
一个红外遥控器 可以同时控制多个红外设备吗

可以的,就是你要修改代码了,能做成万能遥控器那种,都需要有对应的红外设备库了
 楼主| wuxiubo 发表于 2023-1-6 17:00 | 显示全部楼层
木木guainv 发表于 2023-1-5 15:34
红外发送的这个波 是可以通过什么手段进行捕捉呢

可以用逻辑分析仪看,这个最准确,用手机摄像头只能看他亮了
 楼主| wuxiubo 发表于 2023-1-6 17:01 | 显示全部楼层
xiaoqizi 发表于 2023-1-5 15:25
一般情况下什么原因会导致红外连接的断开呢

他这个目前贴片的红外灯,比较受限制,换自己做的板子就会好点,多组红外发射灯就好了
您需要登录后才可以回帖 登录 | 注册

本版积分规则

67

主题

259

帖子

2

粉丝
快速回复 在线客服 返回列表 返回顶部