目录
本篇博文开始讲解下位机插座节点的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