ESP8266 WiFi物联网智能插座—下位机软件实现

目录

1、软件架构

2、开发环境 

3、软件功能

4、程序设计

4.1、初始化

4.2、主循环状态机

4.3、初始化模式

4.4、配置模式

4.5、运行模式

4.6、重启模式

4.7、升级模式

5、程序功能特点

5.1、日志管理

5.2、数据缓存队列


本篇博文开始讲解下位机插座节点的MCU软件程序是如何实现。

1、软件架构

下位机软件架构采用前后台控制系统,使用状态机思维实现程序设计。

2、开发环境 

开发环境使用Arduino IDE,IDE安装过程可参见:https\://handsome-man.blog.csdn.net/article/details/121195905

智能插座的控制器是ESP8266,需要在IDE中安装该开发包,如下图所示:

3、软件功能

下位机软件整功能如下图所示:

4、程序设计

4.1、初始化

节点上电后会执行初始化,初始化程序顺序执行,代码如下所示:

```cpp Init_Log(); Log.verboseln("config start!");

Log.verboseln("init IO"); Init_IO(); Log.verboseln("IO OK!");

Log.verboseln("init EEPROM"); InitEEPROM(); if(DeviceVariableInitial(MODE1) == STATUS_SUCCESS) { Log.verboseln("EEPROM OK!"); } else { Log.errorln("EEPROM ERROR!"); }

Log.verboseln("init data queue"); Init_queue(); Log.verboseln("data queue OK!");

Log.verboseln("init WiFi and server"); if(InitWIFI() == STATUSSUCCESS) { Log.verboseln("WiFi and server OK!"); } else { Log.errorln("WiFi and server ERROR!"); }

Log.verboseln("init time"); Init_Time(); Log.verboseln("time OK!");

Log.verboseln("init electrical parameter"); // Init_BL0942(); // 串口初始化时,已经初始化波特率 Log.verboseln("electrical parameter OK!");

Log.verboseln("config end!");

programstate.runstate = INIT_STATE; ```

初始化时候有两点需要注意:

1、节点的日志打印和采集电参数据使用同一路UART,在正式版本软件中,为了避免出现数据错乱的问题,需要将日志打印功能关闭,使 #define LOG_OFF 0

```cpp /**


* \brief 初始化log日志模块 * * \param 无 * * \retval 无 * **************************/ void InitLog(void) { Serial.begin(4800, SERIAL8N1); // 4800bps 无校验 Serial.println();

Log.setPrefix(printPrefix); // set prefix similar to NLog Log.setSuffix(printSuffix); // set suffix Log.begin(LOGLEVELVERBOSE, &Serial); Log.setShowLevel(false); // Do not show loglevel, we will do this in the prefix

#if LOGOFF DeInitLog(); #endif } ```

 2、E2PROM使用ESP8266内置的Flash模拟。默认情况下,每次线烧程序、OTA升级程序,这部分存储的配置并不会覆盖或者更新,只有上位机下发更新配置参数才会修改。如果想线烧程序更改配置,需要先将标志位 #define DEVICE_FLAG   0XAA55修改成非0XAA55的其他数值。

4.2、主循环状态机

在主循环中使用1ms周期调度维护软件状态机,节点运行有5种状态模式:初始化模式、配置模式、运行模式、重启模式和升级模式。节点默认处于运行模式,代码如下所示:

```cpp switch(programstate.runstate) { // 初始化模式 case INITSTATE: InitState();

break;

  // 配置模式
  case CONFIG_STATE:
    Config_State();

    break;

  // 运行模式
  case RUN_STATE:
    Run_State();

    break;

  // 重启模式
  case RESET_STATE:
    Reset_State();

    break;

  // 升级模式
  case UPDATA_STATE:
    Updata_State();

    break;
}

```

4.3、初始化模式

初始化模式中初始化一些变量数据。

初始化模式中,有一个机制,第一次连接立刻上传一次数据到服务器,否则就按照默认的60秒周期上报数据,第一次上报数据会很慢。代码如下所示:

```cpp /**


* \brief 初始化状态逻辑 * * \param 无 * * \retval 无 * **************************/ void InitState(void) { wifisenddata.devicehead = DeviceParamSave.devicehead + FUNCTIONID1; wi

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

weixin_44079197

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值