迪文智能屏
直播中

华仔stm32

3年用户 2869经验值
擅长:嵌入式技术
私信 关注
[经验]

【迪文COF结构智能屏试用体验】智能取暖器

   【前言】这次参与迪文智能屏的试用,让我感触就是克服千难万苦,苦尽甘来。我这次设计是用迪文屏+CH582来控制固态继电器控制家用取暖器恒温系统。
     【系统的搭建】CH582作为主控,接收迪文屏的开、关机以及预设温度值,同时通过AHT10来采集实时温度来控制固态继电器的导通与关闭。
     【步聚一】制作迪文屏所需要的图片
0关.png 1开.png
【步聚二】然后依次添加相关控件如图所示:
开机画面3.png 开机画面2.png 开机画面1.png 工作画面1.png 工作画面3.png
       按照官方的例程生成图片文件、0号字库,下载到迪文屏。屏的开发就此结束,在这里跟大家强调一下,大家没事别去下CFG文件,要不就是砖头一块。
【步聚二】编写CH582的主控程序。我这里只示例串口主要程序:
  1. void task_uart0_rec(void)
  2. {
  3.     int i , l;
  4.     if (SerialStr0.RecvLen > 0  ) {
  5.         PRINT("RECV_LEN:%d",SerialStr0.RecvLen);
  6.         if (SerialStr0.RecvLen == (SerialStr0.RecvBuff[2]+3)
  7.                 && SerialStr0.RecvBuff[0] == 0x5A
  8.                 && SerialStr0.RecvBuff[1] == 0xA5)
  9.         {
  10.            //接收到正确的数据
  11.             DMG85480.state = RECV_WAIT_EXPLAN;
  12.             DMG85480.data_len = SerialStr0.RecvBuff[2]-3;

  13.             DMG85480.commad = SerialStr0.RecvBuff[3];
  14.             PRINT("recv_CMMD:%Xn",DMG85480.commad);
  15.             DMG85480.address  = (uint16_t)SerialStr0.RecvBuff[4]<<8 | SerialStr0.RecvBuff[5];
  16.             PRINT("recv_ADDRS:%Xn",DMG85480.address);
  17.             i = SerialStr0.RecvBuff[2]-3;
  18.             for (l = 0; l < i; ++l) {
  19.                 DMG85480.data[l] = SerialStr0.RecvBuff[l+6];
  20.             }
  21.             rev_explain();
  22.             DMG85480.DMG_ERROR = RECV_OK;
  23.         }
  24.         else {
  25.             DMG85480.DMG_ERROR = RECV_ERR;
  26.             SerialStr0.RecvLen = 0;//丢弃无效的包
  27.         }
  28.     }
  29.     SerialStr0.RecvLen = 0;
  30. }

  31. /*
  32. * 数据判断
  33. *
  34. */
  35. static void  rev_explain(void)
  36. {
  37.     uint8_t send_data[10];
  38.     switch (DMG85480.commad) {
  39.         case WRIT_DMG_DATA:
  40.             if (DMG85480.address == SWITCH) {//如果是开关按键
  41.                 if (DMG85480.data[2] == 0x01) {//按下的是开键,转换到页面。
  42.                     PRINT("OPENn");
  43.                     Electric_Heater.work_state = OPEN;
  44.                     send_data[0] = 0x5A;
  45.                     send_data[1] = 0x01;
  46.                     send_data[2] = 0x00;
  47.                     send_data[3] = 0x01;
  48.                     DMG85480.state = IDEL;
  49.                     send_DMG(send_data, CHANG_PAGE, WRIT_DMG_CMD,4);
  50.                     //等待收到OK
  51.                     //设置开机模式
  52.                 }
  53.                 else if (DMG85480.data[2] == 0x00) { //关断了
  54.                     //关闭电加热丝 切换到0号页面
  55.                     Electric_Heater.work_state = CLOSE;
  56.                     PRINT("CLOSEn");
  57.                     send_data[0] = 0x5A;
  58.                     send_data[1] = 0x01;
  59.                     send_data[2] = 0x00;
  60.                     send_data[3] = 0x00;
  61.                     DMG85480.state = IDEL;
  62.                     send_DMG(send_data, CHANG_PAGE, WRIT_DMG_CMD,4);
  63.                 }
  64.             }
  65.             else if (DMG85480.address == SET_TEMP) { //温度设定改变
  66.                 //设置温度值
  67.                 PRINT("CHANGEn");
  68.                 Electric_Heater.set_temp = DMG85480.data[2];
  69.                 DMG85480.state = IDEL;
  70.             }
  71.         break;
  72.         case WRIT_DMG_CMD:
  73.             if (DMG85480.address == SEND_RECV_OK) {//返回写正确
  74.                     DMG85480.DMG_ERROR = SEND_OK;
  75.                     DMG85480.state = IDEL;

  76.             }
  77.             break;
  78.         default:
  79.         break;
  80.     }
  81. }
  82. /*
  83. * 发送给串口屏
  84. * 参数1:数据
  85. * 参数2:指令 0x80-0x83
  86. * 参数3:串口屏地址
  87. * 参数4:数据长度
  88. */
  89. void send_DMG(uint8_t pdata[], uint16_t addr, uint8_t commd, uint8_t data_len)
  90. {
  91.   uint8_t commd_len;
  92.   while(DMG85480.state != IDEL);
  93.   SerialStr0.TxBuff[0] = 0x5a;
  94.   SerialStr0.TxBuff[1] = 0xa5;
  95.   SerialStr0.TxBuff[2] = data_len + 3;//长度
  96.   SerialStr0.TxBuff[3] = commd;
  97.   SerialStr0.TxBuff[4] = (uint8_t)(addr>>8);
  98.   SerialStr0.TxBuff[5] = (uint8_t)addr;
  99.   for (commd_len = 0; commd_len < data_len; ++commd_len) {
  100.       SerialStr0.TxBuff[6+commd_len] = pdata[commd_len];
  101.   }
  102.   DMG85480.state = SEND_WAIT;
  103.   UART0_SendString(SerialStr0.TxBuff, 6+data_len);
  104.   DMG85480.state = IDEL;
  105. }
     处理串口数据需要花点心思,要不迪文屏与主控交互有时会失效。我这里使用的是CH582的TMOS进行控制的,后面还要增加蓝牙控制的部分。由于这里的主角是迪文屏,不作描述。
       【试用总结】这次试用迪文屏,一波三折,终于在今天完成了,由于先前对屏的使用不熟悉的原因。导致变砖,影响了开发的进度。还好,迪文官方的小姐姐、william hill官网 的工作人员给予了帮助,才能使得这次试用能按期完成。总的来说迪文屏非常强大,相对我原来用的屏来讲,如果熟悉了开发了以后,功能、分辨率等都是数一数二的。在以后的屏的选型中给了更多的先择。遗憾的就是由于售后的时间太久了,没有更多的时间还基于屏的开发,其实经过了解以后,发果能利用屏上的C51的进行开发,可以节省一块单片机
       以后我还将基于屏的C51进行开发,特别是CAN的使用,也会将开发的一些经验分享给大家。
      再次感电子发烧友william hill官网 、迪文屏给予的这次试用的机会,感谢两个单位在这次试用给予的帮助。也感谢这次共同试用的朋友们,非常开心又认识了这么好的朋友们。
      愿新冠疫情早点结束,伟大的祖国越来越强大!
待机图.jpg 效果图.jpg

实物展示

  • 工作画图二.png

更多回帖

发帖
×
20
完善资料,
赚取积分