【前言】这次参与迪文智能屏的试用,让我感触就是克服千难万苦,苦尽甘来。我这次设计是用迪文屏+CH582来控制固态继电器控制家用取暖器恒温系统。
【系统的搭建】CH582作为主控,接收迪文屏的开、关机以及预设温度值,同时通过AHT10来采集实时温度来控制固态继电器的导通与关闭。
【步聚一】制作迪文屏所需要的图片
【步聚二】然后依次添加相关控件如图所示:
按照官方的例程生成图片文件、0号字库,下载到迪文屏。屏的开发就此结束,在这里跟大家强调一下,大家没事别去下CFG文件,要不就是砖头一块。
【步聚二】编写CH582的主控程序。我这里只示例串口主要程序:
- void task_uart0_rec(void)
- {
- int i , l;
- if (SerialStr0.RecvLen > 0 ) {
- PRINT("RECV_LEN:%d",SerialStr0.RecvLen);
- if (SerialStr0.RecvLen == (SerialStr0.RecvBuff[2]+3)
- && SerialStr0.RecvBuff[0] == 0x5A
- && SerialStr0.RecvBuff[1] == 0xA5)
- {
- //接收到正确的数据
- DMG85480.state = RECV_WAIT_EXPLAN;
- DMG85480.data_len = SerialStr0.RecvBuff[2]-3;
- DMG85480.commad = SerialStr0.RecvBuff[3];
- PRINT("recv_CMMD:%Xn",DMG85480.commad);
- DMG85480.address = (uint16_t)SerialStr0.RecvBuff[4]<<8 | SerialStr0.RecvBuff[5];
- PRINT("recv_ADDRS:%Xn",DMG85480.address);
- i = SerialStr0.RecvBuff[2]-3;
- for (l = 0; l < i; ++l) {
- DMG85480.data[l] = SerialStr0.RecvBuff[l+6];
- }
- rev_explain();
- DMG85480.DMG_ERROR = RECV_OK;
- }
- else {
- DMG85480.DMG_ERROR = RECV_ERR;
- SerialStr0.RecvLen = 0;//丢弃无效的包
- }
- }
- SerialStr0.RecvLen = 0;
- }
- /*
- * 数据判断
- *
- */
- static void rev_explain(void)
- {
- uint8_t send_data[10];
- switch (DMG85480.commad) {
- case WRIT_DMG_DATA:
- if (DMG85480.address == SWITCH) {//如果是开关按键
- if (DMG85480.data[2] == 0x01) {//按下的是开键,转换到页面。
- PRINT("OPENn");
- Electric_Heater.work_state = OPEN;
- send_data[0] = 0x5A;
- send_data[1] = 0x01;
- send_data[2] = 0x00;
- send_data[3] = 0x01;
- DMG85480.state = IDEL;
- send_DMG(send_data, CHANG_PAGE, WRIT_DMG_CMD,4);
- //等待收到OK
- //设置开机模式
- }
- else if (DMG85480.data[2] == 0x00) { //关断了
- //关闭电加热丝 切换到0号页面
- Electric_Heater.work_state = CLOSE;
- PRINT("CLOSEn");
- send_data[0] = 0x5A;
- send_data[1] = 0x01;
- send_data[2] = 0x00;
- send_data[3] = 0x00;
- DMG85480.state = IDEL;
- send_DMG(send_data, CHANG_PAGE, WRIT_DMG_CMD,4);
- }
- }
- else if (DMG85480.address == SET_TEMP) { //温度设定改变
- //设置温度值
- PRINT("CHANGEn");
- Electric_Heater.set_temp = DMG85480.data[2];
- DMG85480.state = IDEL;
- }
- break;
- case WRIT_DMG_CMD:
- if (DMG85480.address == SEND_RECV_OK) {//返回写正确
- DMG85480.DMG_ERROR = SEND_OK;
- DMG85480.state = IDEL;
- }
- break;
- default:
- break;
- }
- }
- /*
- * 发送给串口屏
- * 参数1:数据
- * 参数2:指令 0x80-0x83
- * 参数3:串口屏地址
- * 参数4:数据长度
- */
- void send_DMG(uint8_t pdata[], uint16_t addr, uint8_t commd, uint8_t data_len)
- {
- uint8_t commd_len;
- while(DMG85480.state != IDEL);
- SerialStr0.TxBuff[0] = 0x5a;
- SerialStr0.TxBuff[1] = 0xa5;
- SerialStr0.TxBuff[2] = data_len + 3;//长度
- SerialStr0.TxBuff[3] = commd;
- SerialStr0.TxBuff[4] = (uint8_t)(addr>>8);
- SerialStr0.TxBuff[5] = (uint8_t)addr;
- for (commd_len = 0; commd_len < data_len; ++commd_len) {
- SerialStr0.TxBuff[6+commd_len] = pdata[commd_len];
- }
- DMG85480.state = SEND_WAIT;
- UART0_SendString(SerialStr0.TxBuff, 6+data_len);
- DMG85480.state = IDEL;
- }
处理串口数据需要花点心思,要不迪文屏与主控交互有时会失效。我这里使用的是CH582的TMOS进行控制的,后面还要增加蓝牙控制的部分。由于这里的主角是迪文屏,不作描述。
【试用总结】这次试用迪文屏,一波三折,终于在今天完成了,由于先前对屏的使用不熟悉的原因。导致变砖,影响了开发的进度。还好,迪文官方的小姐姐、
william hill官网
的工作人员给予了帮助,才能使得这次试用能按期完成。总的来说迪文屏非常强大,相对我原来用的屏来讲,如果熟悉了开发了以后,功能、分辨率等都是数一数二的。在以后的屏的选型中给了更多的先择。遗憾的就是由于售后的时间太久了,没有更多的时间还基于屏的开发,其实经过了解以后,发果能利用屏上的C51的进行开发,可以节省一块
单片机。
以后我还将基于屏的C51进行开发,特别是CAN的使用,也会将开发的一些经验分享给大家。
再次感
电子发烧友william hill官网
、迪文屏给予的这次试用的机会,感谢两个单位在这次试用给予的帮助。也感谢这次共同试用的朋友们,非常开心又认识了这么好的朋友们。
愿新冠疫情早点结束,伟大的祖国越来越强大!