迪文科技论坛

 找回密码
 立即注册
搜索
查看: 1358|回复: 5

【开源】迪文智慧联网种植架,可以作为工程模板

[复制链接]

2

主题

16

回帖

183

积分

注册会员

Rank: 2

积分
183
发表于 2022-3-30 22:26:58 | 显示全部楼层 |阅读模式
话不多说先上图







[在这里下载   ]







本帖子中包含更多资源

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

x
回复

使用道具 举报

2

主题

16

回帖

183

积分

注册会员

Rank: 2

积分
183
 楼主| 发表于 2022-3-30 23:00:41 | 显示全部楼层

对这个电路图做一下解释。上半部分,为电源模块。使用的是金升阳的一个电源模块,是AC-DC220伏转为12伏。12伏中过7805转到五伏,然后再通过1117转到3.3伏,给板子上面的各个模块供电。最左边下一点点呢,是四路的继电器控制模块。靠中间上面点点的呢,是一个时钟电路DS1302的和iic接口。在在下面,是各个插接件的接口,还有一个按键复位和下载电路。最右边一个485芯片的485通讯模块。最下面呢是两个MCU都是国产的了,一个是ESP8266,另一个是ESP32,他们俩共同就是你可以选择任何一个开发方案去做,然后我们把所有的引脚都领出来了。

本帖子中包含更多资源

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

x
回复

使用道具 举报

2

主题

16

回帖

183

积分

注册会员

Rank: 2

积分
183
 楼主| 发表于 2022-3-30 23:12:22 | 显示全部楼层


对控件地址做一下解释。这个是按照论坛里面,一个大佬的那个设计思路来的。这是对因为迪文屏的最主要的一个麻烦,就是控件的控件地址。对于新手来说,最麻烦的就是控件地址的设置。那我们是如何实现这个控件地址的呢?
首先它的空间地址是从每个屏都有特定的控件地址开始。然后你可以像我做的地址,每隔十个为一个控件,每隔十个为一个控件。
然后呢就这样,但是如果你想继续改进的话,你可以改设为一个界面,一个界面最多不可能会超过100个控件,你可以设置成你个控件的地址。
你像我这样子,连续控件地址的设置是有一个好处,是什么呢?就是我可以直接对数据进行存储。我得到了数据,你串口输入过来以后,我直接对空间地址进行除法运算,这样的话我就可以得到一个数组,就是我传进来的值会得到一个数组,从零号数组开始就会得到一个数组。
然后呢,在这个项目中我采用了两个数组,一个是掉电保存,一个是状态,保存数组就是你要掉电保存的数组,另一个是实时状态数组,这个实时状态数组呢,是根据这个设备的各个状态的的数组。这样的话呢,你掉电保存和你状态运行,他们两个非常容易保存和解析。然后还有一个,如果你要再加的话,你可以加一个结构体就是WiFi信息的结构体,因为ESP32会自动实现WiFi保存,所以就没有做WiFi信息的结构体。
代码我会贴一点点,因为毕竟代码还是比较敏感的。

本帖子中包含更多资源

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

x
回复

使用道具 举报

2

主题

16

回帖

183

积分

注册会员

Rank: 2

积分
183
 楼主| 发表于 2022-3-30 23:17:11 | 显示全部楼层
这个函数为串口屏下发处理函数
我建立了两个数组分别是掉电保存和实时状态
uint8 save_buf[30];//存位操作
uint8 operation_buf[30];//存位操作


int16_t my_screen_message_parsing(uint8_t *buff,uint8_t len)
{
    int u=7;
    uint8_t *rx_buf=NULL;
    uint8 date_len;
    uint8 i = 0;
    uint16_t control_addr;

    rx_buf=buff;
    if((*(rx_buf)==0x5A)&&(*(rx_buf+1)==0xA5)&&(*(rx_buf+3)==0x83))//串口屏下发数据
    {
        
        date_len=*(rx_buf+6)*2;//信息长度单位是字长不是字节
        //os_printf("date_len is %d \r\n",date_len);
        if (*(rx_buf+4)==0x11)
        {
          local_date_change_flag=1;
            if (*(rx_buf+5)==0x94)//输入的是账号
              {
               
                for ( i = 0; i < 32; i++)
                {
                  STA_Config_Struct.ssid=0;
                }
                for ( i = 0; i < date_len; i++)
                {
                  STA_Config_Struct.ssid= *(char*)(rx_buf+u);
                  u++;
                  if (*(rx_buf+u)==0xFF)
                  {
                    date_len=1;
                  }
                  //os_printf("get STA_Config_Struct.ssid [%s] ",STA_Config_Struct.ssid);
                }
               
              }
            if (*(rx_buf+5)==0x9E)//输入的是密码
              {
                for ( i = 0; i < 64; i++)
                {
                  STA_Config_Struct.password=0;
                }
                for ( i = 0; i < date_len; i++)
                {
                  STA_Config_Struct.password= *(char*)(rx_buf+u);
                  u++;
                  if (*(rx_buf+u)==0xFF)
                  {
                    date_len=1;
                  }
                }
              }
        }
        else if ((*(rx_buf+4)==0x13)&&(*(rx_buf+5)==0xA6))
        {
         
          wifi_get_message_success_flag=1;
        }
        else if ((*(rx_buf+4)==0x10)&&date_len>=2)
        {
         
          control_addr=((*(rx_buf+4)<<8|*(rx_buf+5))-4100)/10;//取出控件地址运算得到本地数组地址
          if (control_addr>=10)//输入的数据需要保存
          {
            if (control_addr==22)
            {
              local_date_change_flag=4;
            }
            else if (control_addr==23)
            {
              local_date_change_flag=5;
            }
            else if (control_addr==24)
            {
              local_date_change_flag=6;
            }
            save_buf[control_addr-10]=(*(rx_buf+8));
            os_printf("get save_buf[%d] is %d \r\n",control_addr-10,save_buf[control_addr-10]);
            need_flash_update_flag=1;
          }
          else//输入的实时数据
          {
            local_date_change_flag=3;
            operation_buf[control_addr]=(*(rx_buf+8));
            if (control_addr>4)
            {
              my_local_time_refresh_flag=1;
            }
            os_printf("get operation_buf[%d] is %d \r\n",control_addr,operation_buf[control_addr]);
          }
        }
        
         
        
        
    }
}





这个函数是一个刷屏函数,展示如何刷新wifi信息在串口屏上
int my_screen_wifi_message_sending(int k)//刷新wifi信息
{  
  int len=0;
  memset(aTxBuffer,0,sizeof(aTxBuffer));
  if(k==0)//刷屏账号
  {
    wifi_station_get_config(&STA_Config_Struct);
    len=strlen(STA_Config_Struct.ssid);
    aTxBuffer[0]  = 0x5A;         //帧头
    aTxBuffer[1]  = 0xA5;         //帧头
    aTxBuffer[2]  = len+3;         //数据长度
    aTxBuffer[3]  = 0x82;         //数据类型
    aTxBuffer[4]  = 0x11;         //地址高
    aTxBuffer[5]  = 0x94;   //地址低((*(rx_buf+4)<<8|*(rx_buf+5))-4280)/10
    strcat(aTxBuffer, STA_Config_Struct.ssid);
    uart0_tx_buffer(aTxBuffer,SENDBUFF_SIZE);
  }
  if(k==1)//刷屏账号
  {
    //wifi_station_get_config(&STA_Config_Struct);
    len=strlen(STA_Config_Struct.password);
    aTxBuffer[0]  = 0x5A;         //帧头
    aTxBuffer[1]  = 0xA5;         //帧头
    aTxBuffer[2]  = len+3;         //数据长度
    aTxBuffer[3]  = 0x82;         //数据类型
    aTxBuffer[4]  = 0x11;         //地址高
    aTxBuffer[5]  = 0X9E;   //地址低((*(rx_buf+4)<<8|*(rx_buf+5))-4280)/10
    strcat(aTxBuffer, STA_Config_Struct.password);
    uart0_tx_buffer(aTxBuffer,SENDBUFF_SIZE);
  }

}


回复

使用道具 举报

2

主题

16

回帖

183

积分

注册会员

Rank: 2

积分
183
 楼主| 发表于 2022-4-6 10:23:33 | 显示全部楼层
分享一下初步成果视频【[color=rgba(0, 0, 0, 0.85)]「1A2CBCBE58AE37C8DBFB08DB1B99741B.mp4」https://www.aliyundrive.com/s/9NPqhxdqiAx点击链接保存,或者复制本段内容,打开「阿里云盘」APP ,无需下载极速在线查看,视频原画倍速播放。
上面贴不了视频只能网盘分享了
回复

使用道具 举报

13

主题

89

回帖

2618

积分

金牌会员

Rank: 6Rank: 6

积分
2618
发表于 2023-4-12 13:55:29 | 显示全部楼层
顶,膜拜
回复

使用道具 举报

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

本版积分规则

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

GMT+8, 2024-11-21 23:22 , Processed in 0.057352 second(s), 22 queries .

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

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