迪文科技论坛

 找回密码
 立即注册
搜索
查看: 100|回复: 0

【2022.3.30获奖项目】基于迪文屏的智慧联网种植架方案

[复制链接]

567

主题

167

回帖

1万

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
11960
发表于 2024-1-10 16:41:29 | 显示全部楼层 |阅读模式
【开源】基于迪文屏的智慧联网种植架方案

该方案是基于迪文屏的智慧联网种植架方案,方案中涉及多个硬件模块和通讯方式,包括电源模块、继电器控制模块、时钟电路、485通讯、ESP8266和ESP32Wi-Fi等。


一、UI界面





二、电路设计

对这个电路图做一下解释:

上半部分,为电源模块。使用的是金升阳的一个电源模块,是AC-DC220伏转为12V。12V中过7805转到五V,然后再通过1117转到3.3V,给板子上面的各个模块供电。

最左边下一点呢,是四路的继电器控制模块。

靠中间上面点的呢,是一个时钟电路DS1302的和iic接口。

再在下面,是各个插接件的接口,还有一个按键复位和下载电路。

最右边一个485芯片的485通讯模块。最下面呢是两个MCU,都是国产的了,一个是ESP8266,另一个是ESP32,他们俩共同就是你可以选择任何一个开发方案去做,然后我们把所有的引脚都引出来了。


三、控件地址设计

对控件地址做一下解释:

这个是按照论坛里面一个大佬的那个设计思路来的。对于新手来说,迪文屏最麻烦的就是控件地址的设置。那我们是如何实现这个控件地址的呢?

首先它的空间地址是从每个屏都有特定的控件地址开始。然后你可以像我做的地址,每隔十个为一个控件。但是如果你想继续改进的话,你可以改设为一个界面,一个界面最多不可能会超过100个控件,你可以设置成你控件的地址。

我这样连续控件地址的设置的好处是什么呢?就是我可以直接对数据进行存储。我得到了数据,你串口输入过来以后,我直接对空间地址进行除法运算,这样的话我就可以得到一个数组,就是我传进来的值会得到一个数组,从零号数组开始就会得到一个数组。

然后呢,在这个项目中我采用了两个数组,一个是掉电保存,一个是状态。保存数组就是你要掉电保存的数组;另一个是实时状态数组,是根据这个设备的各个状态的数组。

这样的话呢,掉电保存和状态运行,他们两个非常容易保存和解析。然后如果你要再加的话,你可以加一个结构体,就是WiFi信息的结构体。因为ESP32会自动实现WiFi保存,所以就没有做WiFi信息的结构体。


四、主要代码

这个函数为串口屏下发处理函数,我建立了两个数组分别是掉电保存和实时状态

  1. uint8 save_buf[30];//存位操作
  2. uint8 operation_buf[30];//存位操作
  3. int16_t my_screen_message_parsing(uint8_t *buff,uint8_t len)
  4. {
  5.      int u=7;
  6.      uint8_t *rx_buf=NULL;
  7.      uint8 date_len;
  8.      uint8 i = 0;
  9.      uint16_t control_addr;
  10.      rx_buf=buff;
  11.      if((*(rx_buf)==0x5A)&&(*(rx_buf+1)==0xA5)&&(*(rx_buf+3)==0x83))//串口屏下发数据
  12.      {
  13.           date_len=*(rx_buf+6)*2;//信息长度单位是字长不是字节
  14.           //os_printf("date_len is %d \r\n",date_len);
  15.           if (*(rx_buf+4)==0x11)
  16.           {
  17.                local_date_change_flag=1;
  18.                if (*(rx_buf+5)==0x94)//输入的是账号
  19.                {      
  20.                            for ( i = 0; i < 32; i++)
  21.                            {
  22.                                  STA_Config_Struct.ssid=0;
  23.                            }
  24.                            for ( i = 0; i < date_len; i++)
  25.                            {
  26.                                   STA_Config_Struct.ssid= *(char*)(rx_buf+u);
  27.                                   u++;
  28.                                   if (*(rx_buf+u)==0xFF)
  29.                                   {
  30.                                          date_len=1;
  31.                                   }
  32.                                   //os_printf("get STA_Config_Struct.ssid [%s] ",STA_Config_Struct.ssid);
  33.                            }
  34.                     }
  35.                     if (*(rx_buf+5)==0x9E)//输入的是密码
  36.                    {
  37.                          for ( i = 0; i < 64; i++)
  38.                          {
  39.                               STA_Config_Struct.password=0;
  40.                          }
  41.                          for ( i = 0; i < date_len; i++)
  42.                          {
  43.                               STA_Config_Struct.password= *(char*)(rx_buf+u);
  44.                               u++;
  45.                               if (*(rx_buf+u)==0xFF)
  46.                               {
  47.                                    date_len=1;
  48.                               }
  49.                          }
  50.                     }
  51.                }
  52.                else if ((*(rx_buf+4)==0x13)&&(*(rx_buf+5)==0xA6))
  53.                {
  54.                     wifi_get_message_success_flag=1;
  55.                }
  56.                else if ((*(rx_buf+4)==0x10)&&date_len>=2)
  57.                {
  58.                     control_addr=((*(rx_buf+4)<<8|*(rx_buf+5))-4100)/10;//取出控件地址运算得到本地数组地址
  59.                     if (control_addr>=10)//输入的数据需要保存
  60.                     {
  61.                          if (control_addr==22)
  62.                          {
  63.                               local_date_change_flag=4;
  64.                          }
  65.                          else if (control_addr==23)
  66.                          {
  67.                               local_date_change_flag=5;
  68.                          }
  69.                          else if (control_addr==24)
  70.                          {
  71.                               local_date_change_flag=6;
  72.                          }
  73.                          save_buf[control_addr-10]=(*(rx_buf+8));
  74.                          os_printf("get save_buf[%d] is %d \r\n",control_addr-10,save_buf[control_addr-10]);
  75.                          need_flash_update_flag=1;
  76.                     }
  77.                     else//输入的实时数据
  78.                     {
  79.                          local_date_change_flag=3;
  80.                          operation_buf[control_addr]=(*(rx_buf+8));
  81.                          if (control_addr>4)
  82.                          {
  83.                               my_local_time_refresh_flag=1;
  84.                          }
  85.                          os_printf("get operation_buf[%d] is %d \r\n",control_addr,operation_buf[control_addr]);
  86.                     }
  87.                }  
  88.     }
  89. }
复制代码

这个函数是一个刷屏函数,展示如何刷新wifi信息在串口屏上

  1. int my_screen_wifi_message_sending(int k)//刷新wifi信息
  2. {
  3.     int len=0;
  4.     memset(aTxBuffer,0,sizeof(aTxBuffer));
  5.     if(k==0)//刷屏账号
  6.     {
  7.         wifi_station_get_config(&STA_Config_Struct);
  8.         len=strlen(STA_Config_Struct.ssid);
  9.         aTxBuffer[0]  = 0x5A;         //帧头
  10.         aTxBuffer[1]  = 0xA5;         //帧头
  11.         aTxBuffer[2]  = len+3;         //数据长度
  12.         aTxBuffer[3]  = 0x82;         //数据类型
  13.         aTxBuffer[4]  = 0x11;         //地址高
  14.         aTxBuffer[5]  = 0x94;   //地址低((*(rx_buf+4)<<8|*(rx_buf+5))-4280)/10
  15.         strcat(aTxBuffer, STA_Config_Struct.ssid);
  16.         uart0_tx_buffer(aTxBuffer,SENDBUFF_SIZE);
  17.     }
  18.     if(k==1)//刷屏账号
  19.     {
  20.         //wifi_station_get_config(&STA_Config_Struct);
  21.         len=strlen(STA_Config_Struct.password);
  22.         aTxBuffer[0]  = 0x5A;         //帧头
  23.         aTxBuffer[1]  = 0xA5;         //帧头
  24.         aTxBuffer[2]  = len+3;         //数据长度
  25.         aTxBuffer[3]  = 0x82;         //数据类型
  26.         aTxBuffer[4]  = 0x11;         //地址高
  27.         aTxBuffer[5]  = 0X9E;   //地址低((*(rx_buf+4)<<8|*(rx_buf+5))-4280)/10
  28.         strcat(aTxBuffer, STA_Config_Struct.password);
  29.         uart0_tx_buffer(aTxBuffer,SENDBUFF_SIZE);
  30.     }
  31. }
复制代码

五、视频演示

效果演示链接:https://www.aliyundrive.com/s/9NPqhxdqiAx



备注说明:如需源码,请参考此链接:http://inforum.dwin.com.cn:20080/forum.php?mod=viewthread&tid=5643&highlight=%E7%A7%8D%E6%A4%8D%E6%9E%B6&_dsign=0f077e05



本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有账号?立即注册

x
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

QQ|Archiver|手机版|小黑屋|迪文科技论坛 ( 京ICP备05033781号-1 )

GMT+8, 2024-11-22 10:06 , Processed in 0.064677 second(s), 22 queries .

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

快速回复 返回顶部 返回列表