dwinForumAdmin 发表于 2022-4-24 13:49:44

【开源】COF案例分享:远程控灯

——文档转载自电子发烧友

一、页面自动切换测试程序

1.选择的屏型号是:DMG85480F050_01WTC, 分辨率为854x480。页面背景图命名范围:01.jpg—10.jpg。

    ......

2.将做好的图片加载到DWIN DGUS软件中,设置好分辨率:854x480 ,界面程序就做好了。点生成命令,就可以生成安装文件。


3.接下来需要将图片打包成*.ICL文件 。切换到欢迎使用版块,启动DWIN ICL 生成工具,选择所有用到的图片,然后启动转换。
注意生成的icl文件名一定要是23开头。我这里是23_BJ.icl ,这是界面图片制作部分。




4.接下来需要实现界面的切换程序编写,这个需要在KEIL中完成。参考了群资料里的例程。
#include "t5los8051.h"#include "sys.h"int main(void){       u8 cmd={0x5A,0x01,0x00,0x00};//5A01 0000 切换到0000界面    INIT_CPU();    T2_Init();    EA=1;    while(1)    {      P1_0=!P1_0;//P1.0 循环取反,0V / 3.3V      IF(cmd<10)         {            cmd++;            }      else{cmd=0;}      write_dgusii_vp(0x0084,cmd,4);// 界面0-10 之间循环切换      delay_ms(1000);    }}

源码很简单,就是程序核和界面核之间进行通讯,发送界面切换的命令:0x5A,0x01,0x00,0x00,0x5A 0x01是命令字,表示界面切换命令,而后面的0x00,0x00表示要切换到的界面编号,对应界面中的每个配景图片的编号,编译生成T5L51.hex文件。然后,需要用DownLoadFor8051程序将T5L.hex转成T5L51.bin文件。将这些文件都放到DWIN_SET文件夹中,拷贝到SD卡中。上手操作成功。



二、远程控灯
下面我来分享一下,通过迪文DMG85480F050-01和ESP8266 WIFI模块实现远程控制3个LED灯的小例程。先上个图:
   

迪文屏的显示控件和触控控件很丰富也挺有特点的,认真学习指南,并且找个官方例程仔细研究一番就能掌握,更多是通过图片切换产生动态效果。迪文屏的一个特点是,包含了GUI和OS两个核,GUI核用来做显控, OS核做控制。Adc最大为16位,尝试用光敏电阻实现了屏的亮度自动控制,效果还是可以的。就是在开启待机亮度的时候遇到点麻烦,不过厂家的技术支持很到位。GUI的部分主要做显示控制,51核部分,主要是通过串口实现和esp8266的通信,实现了I/O口的控制3个LED灯,esp8266中已经编好了程序,自动连接wifi以及贝壳物联平台,实现时间获取和平台下推数据的接收。
51核代码:
1.开关的触摸控制
每个开关图标上覆盖触控键,并设置相同的变量地址1000,分别设置键值0x0001,0x0002, 0x0003,程序循环中查询0x1000的值,判断是哪个触控键被触碰。


2.开关和灯的状态改变
当检测到第一个开关被触碰时,先读取该开关的状态,sys_read_vp(0x3100,(u8*)&s_kg,1); 然后翻转开关的状态,在写入到开关的状态变量中和灯的状态变量中。同时控制I/O口的电平。if(s_kg==1)            {               s_kg=0;               sys_write_vp(0x3100,(u8*)&s_kg,1);            sys_write_vp(0x3103,(u8*)&s_kg,1);            P1_0=0;                  }    While(1){sys_read_vp(0x1000,(u8*)&g_ss,1);       switch(g_ss)       {      case 1:            sys_read_vp(0x3100,(u8*)&s_kg,1);            if(s_kg==1)            {               s_kg=0;               sys_write_vp(0x3100,(u8*)&s_kg,1);            sys_write_vp(0x3103,(u8*)&s_kg,1);            P1_0=0;            }            else            {            s_kg=1;            sys_write_vp(0x3100,(u8*)&s_kg,1);            sys_write_vp(0x3103,(u8*)&s_kg,1);            P1_0=1;            }            g_ss=0;      sys_write_vp(0x1000,(u8*)&g_ss,1);            break;      case 2:                  sys_read_vp(0x3101,(u8*)&s_kg,1);            if(s_kg==1)            {               s_kg=0;               sys_write_vp(0x3101,(u8*)&s_kg,1);            sys_write_vp(0x3104,(u8*)&s_kg,1);            P1_1=0;            }            else            {            s_kg=1;            sys_write_vp(0x3101,(u8*)&s_kg,1);            sys_write_vp(0x3104,(u8*)&s_kg,1);            P1_1=1;            }            g_ss=0;      sys_write_vp(0x1000,(u8*)&g_ss,1);            break;      case 3:            sys_read_vp(0x3102,(u8*)&s_kg,1);            if(s_kg==1)            {               s_kg=0;               sys_write_vp(0x3102,(u8*)&s_kg,1);            sys_write_vp(0x3105,(u8*)&s_kg,1);            P1_2=0;            }            else            {            s_kg=1;            sys_write_vp(0x3102,(u8*)&s_kg,1);            sys_write_vp(0x3105,(u8*)&s_kg,1);            P1_2=1;               }            g_ss=0;      sys_write_vp(0x1000,(u8*)&g_ss,1);               break;      case 16:            sys_read_vp(0x2108,(u8*)&s_kg,1);            if(s_kg==1)            {               s_kg=0;               sys_write_vp(0x2108,(u8*)&s_kg,1);               auto_brt=0;            }            else            {            s_kg=1;            sys_write_vp(0x2108,(u8*)&s_kg,1);
            auto_brt=1;            }            g_ss=0;      sys_write_vp(0x1000,(u8*)&g_ss,1);            break;      }


3.远程控制的实现
这部分其实就是串口通信数据的解析,ESP8266已经做好了程序,每20s会通过串口发送时间的数据,格式如下:                {"M":"time","T":"2022-03-17-410:16:34"}平台下发的控制数据如下:                                                      {"M":"say","ID":"U1","NAME":"BIGIOT_SERVER","C":"play1","T":"1647483956"}                                                      {"M":"say","ID":"U1","NAME":"BIGIOT_SERVER","C":"stop1","T":"1647483956"}   其中:play1,stop1就是平台下发的命令,通过程序解析以后,发送到开关和灯的状态变量地址就实现了界面的变化和I/O控制。
str=strstr(uart2_buf,"\"C\":\"play1\",\"T\"");            if(str!=NULL && uart2_buf=='{')            {                  s_kg=1;            sys_write_vp(0x3100,(u8*)&s_kg,1);            sys_write_vp(0x3103,(u8*)&s_kg,1);            P1_0=1;            }                  str=strstr(uart2_buf,"\"C\":\"play2\",\"T\"");            if(str!=NULL && uart2_buf=='{')            {               s_kg=1;            sys_write_vp(0x3101,(u8*)&s_kg,1);            sys_write_vp(0x3104,(u8*)&s_kg,1);            P1_1=1;               }


演示视频链接:https://www.bilibili.com/video/BV1nF411u7Vw/https://www.bilibili.com/video/BV1nF411u7Vw/


1031793782 发表于 2023-2-2 16:36:33

您好 方便分享一下工程学习一下吗

Bensenl 发表于 2023-2-2 16:45:24

1031793782 发表于 2023-2-2 16:36
您好 方便分享一下工程学习一下吗
您好,这是原链接https://bbs.elecfans.com/jishu_2269432_1_1.html
页: [1]
查看完整版本: 【开源】COF案例分享:远程控灯