nRF24L01, encoder, pca9685, pid

Dependencies:   mbed QEI-1 LibPN532 nRF24L01P xiugai

Committer:
brainliang
Date:
Thu Nov 07 06:31:09 2019 +0000
Revision:
7:6f8157c58241
V5

Who changed what in which revision?

UserRevisionLine numberNew contents of line
brainliang 7:6f8157c58241 1 /***************************************************************
brainliang 7:6f8157c58241 2 功能 : ESP8266物联车接口函数
brainliang 7:6f8157c58241 3 作者 : 马晓健
brainliang 7:6f8157c58241 4 邮箱 : jeasinema[at]gmail[dot]com
brainliang 7:6f8157c58241 5 声明 :
brainliang 7:6f8157c58241 6 本程序仅供学习与交流使用,如需他用,须联系作者
brainliang 7:6f8157c58241 7 本程序可以随意更改,但须保留本信息页
brainliang 7:6f8157c58241 8 All rights reserved
brainliang 7:6f8157c58241 9 2017.6.16
brainliang 7:6f8157c58241 10 ***************************************************************/
brainliang 7:6f8157c58241 11
brainliang 7:6f8157c58241 12 #include "esp8266.h"
brainliang 7:6f8157c58241 13
brainliang 7:6f8157c58241 14 #include <cstdarg>
brainliang 7:6f8157c58241 15 #include <cstring>
brainliang 7:6f8157c58241 16 #include <stdint.h>
brainliang 7:6f8157c58241 17 #include "mbed.h"
brainliang 7:6f8157c58241 18
brainliang 7:6f8157c58241 19 //extern Serial ser2usb;
brainliang 7:6f8157c58241 20
brainliang 7:6f8157c58241 21 static int ser_baud = 9600;
brainliang 7:6f8157c58241 22
brainliang 7:6f8157c58241 23 //定义了一个调试的宏,C语言语法
brainliang 7:6f8157c58241 24 #define ESP_CMD(format, ...) do{\
brainliang 7:6f8157c58241 25 char cmdbuf[128], *p;\
brainliang 7:6f8157c58241 26 ser2esp8266.printf("\r"); \
brainliang 7:6f8157c58241 27 sprintf(cmdbuf, format "\r", ##__VA_ARGS__);\
brainliang 7:6f8157c58241 28 for(p=cmdbuf;*p;p++){\
brainliang 7:6f8157c58241 29 ser2esp8266.putc(*p);\
brainliang 7:6f8157c58241 30 wait(0.02);\
brainliang 7:6f8157c58241 31 }\
brainliang 7:6f8157c58241 32 wait(0.3);\
brainliang 7:6f8157c58241 33 }while(0)
brainliang 7:6f8157c58241 34
brainliang 7:6f8157c58241 35
brainliang 7:6f8157c58241 36
brainliang 7:6f8157c58241 37 void Esp8266::gotResponse(char *token, char *param)
brainliang 7:6f8157c58241 38 {
brainliang 7:6f8157c58241 39 if(*token<'a' || *token>'z') return;
brainliang 7:6f8157c58241 40 // ser2usb.printf("gotResponse %s %s\r\n", token, param);
brainliang 7:6f8157c58241 41 if(strcmp(token, "connected") == 0)
brainliang 7:6f8157c58241 42 mqtt_start = true;
brainliang 7:6f8157c58241 43 else if(strcmp(token, "control") == 0){
brainliang 7:6f8157c58241 44 if(!control_cmd){
brainliang 7:6f8157c58241 45 strncpy(control_buf, param, sizeof(control_buf));
brainliang 7:6f8157c58241 46 control_cmd = true;
brainliang 7:6f8157c58241 47 }
brainliang 7:6f8157c58241 48 }
brainliang 7:6f8157c58241 49 else if(strcmp(token, "wifi") == 0){
brainliang 7:6f8157c58241 50 if(*param == '5')
brainliang 7:6f8157c58241 51 network_start = true;
brainliang 7:6f8157c58241 52 }
brainliang 7:6f8157c58241 53 }
brainliang 7:6f8157c58241 54
brainliang 7:6f8157c58241 55 bool Esp8266::get_control_cmd(char* actuator, char* value)
brainliang 7:6f8157c58241 56 {
brainliang 7:6f8157c58241 57 if(!control_cmd)
brainliang 7:6f8157c58241 58 return false;
brainliang 7:6f8157c58241 59
brainliang 7:6f8157c58241 60 char* plus = strchr(control_buf, '+');
brainliang 7:6f8157c58241 61 if(!plus){
brainliang 7:6f8157c58241 62 control_cmd = false;
brainliang 7:6f8157c58241 63 return false;
brainliang 7:6f8157c58241 64 }
brainliang 7:6f8157c58241 65 *plus = '\0';
brainliang 7:6f8157c58241 66 strcpy(actuator, control_buf);
brainliang 7:6f8157c58241 67 strcpy(value, plus+1);
brainliang 7:6f8157c58241 68 control_cmd = false;
brainliang 7:6f8157c58241 69 return true;
brainliang 7:6f8157c58241 70 }
brainliang 7:6f8157c58241 71
brainliang 7:6f8157c58241 72 // 接收 esp8266 侧数据的回调函数, 每次仅接收一个8位字符
brainliang 7:6f8157c58241 73 // 数据格式约定: #token+data
brainliang 7:6f8157c58241 74 void Esp8266::esp8266_rxCallback() {
brainliang 7:6f8157c58241 75 char in = ser2esp8266.getc();
brainliang 7:6f8157c58241 76 // ser2usb.putc(in);
brainliang 7:6f8157c58241 77 enum{STATE_WAIT, STATE_TOKEN, STATE_PARAM};
brainliang 7:6f8157c58241 78 static uint8_t state = STATE_WAIT;
brainliang 7:6f8157c58241 79 static int tokenLen, paramLen;
brainliang 7:6f8157c58241 80 switch(state){
brainliang 7:6f8157c58241 81 case STATE_WAIT:
brainliang 7:6f8157c58241 82 if(in == '#'){
brainliang 7:6f8157c58241 83 tokenLen = 0;
brainliang 7:6f8157c58241 84 state = STATE_TOKEN;
brainliang 7:6f8157c58241 85 }
brainliang 7:6f8157c58241 86 break;
brainliang 7:6f8157c58241 87 case STATE_TOKEN:
brainliang 7:6f8157c58241 88 if(in == '+' || in == '\r' || in == '\n'){
brainliang 7:6f8157c58241 89 esp_tokenBuf[tokenLen] = '\0';
brainliang 7:6f8157c58241 90 if(in == '+'){
brainliang 7:6f8157c58241 91 paramLen = 0;
brainliang 7:6f8157c58241 92 state = STATE_PARAM;
brainliang 7:6f8157c58241 93 }else{
brainliang 7:6f8157c58241 94 gotResponse(esp_tokenBuf, NULL);
brainliang 7:6f8157c58241 95 //memcpy(esp_token, esp_tokenBuf, tokenLen);
brainliang 7:6f8157c58241 96 //esp_token[tokenLen] = '\0';
brainliang 7:6f8157c58241 97 esp_buf_ready = true;
brainliang 7:6f8157c58241 98 state = STATE_WAIT;
brainliang 7:6f8157c58241 99 }
brainliang 7:6f8157c58241 100 }else if(tokenLen+1 < sizeof(esp_tokenBuf)){
brainliang 7:6f8157c58241 101 esp_tokenBuf[tokenLen++] = in;
brainliang 7:6f8157c58241 102 }
brainliang 7:6f8157c58241 103 break;
brainliang 7:6f8157c58241 104 case STATE_PARAM:
brainliang 7:6f8157c58241 105 if(in == '\r' || in == '\n'){
brainliang 7:6f8157c58241 106 esp_paramBuf[paramLen] = '\0';
brainliang 7:6f8157c58241 107 gotResponse(esp_tokenBuf, esp_paramBuf);
brainliang 7:6f8157c58241 108 //memcpy(esp_token, esp_tokenBuf, tokenLen);
brainliang 7:6f8157c58241 109 //memcpy(esp_param, esp_paramBuf, paramLen);
brainliang 7:6f8157c58241 110 //esp_token[tokenLen] = '\0';
brainliang 7:6f8157c58241 111 //esp_param[paramLen] = '\0';
brainliang 7:6f8157c58241 112 //ser2usb.putc('?');
brainliang 7:6f8157c58241 113 esp_buf_ready = true;
brainliang 7:6f8157c58241 114 state = STATE_WAIT;
brainliang 7:6f8157c58241 115 }else if(paramLen+1 < sizeof(esp_paramBuf)){
brainliang 7:6f8157c58241 116 esp_paramBuf[paramLen++] = in;
brainliang 7:6f8157c58241 117 }
brainliang 7:6f8157c58241 118 break;
brainliang 7:6f8157c58241 119 }
brainliang 7:6f8157c58241 120 }
brainliang 7:6f8157c58241 121
brainliang 7:6f8157c58241 122
brainliang 7:6f8157c58241 123 Esp8266::Esp8266(PinName TX, PinName RX, const char *wifi_ssid, const char *wifi_passwd) //定义类的函数
brainliang 7:6f8157c58241 124 : network_start(false), mqtt_start(false), control_cmd(false), esp_buf_ready(false), ser2esp8266(TX, RX)
brainliang 7:6f8157c58241 125 {
brainliang 7:6f8157c58241 126 // serial to esp8266 init
brainliang 7:6f8157c58241 127 ser2esp8266.baud(ser_baud);
brainliang 7:6f8157c58241 128 ser2esp8266.attach(callback(this,&Esp8266::esp8266_rxCallback), Serial::RxIrq);
brainliang 7:6f8157c58241 129 //if (mode == 0) { // client mode
brainliang 7:6f8157c58241 130 this->reset();
brainliang 7:6f8157c58241 131 this->connect_wifi(wifi_ssid, wifi_passwd);
brainliang 7:6f8157c58241 132 while(!is_connected()){
brainliang 7:6f8157c58241 133 wait(0.5);
brainliang 7:6f8157c58241 134 }
brainliang 7:6f8157c58241 135 this->weblogin();
brainliang 7:6f8157c58241 136 //} else {
brainliang 7:6f8157c58241 137 //
brainliang 7:6f8157c58241 138 //}
brainliang 7:6f8157c58241 139 }
brainliang 7:6f8157c58241 140
brainliang 7:6f8157c58241 141 bool Esp8266::reset() { //定义类的函数
brainliang 7:6f8157c58241 142 ESP_CMD("node.restart()");
brainliang 7:6f8157c58241 143 wait(2); // 延迟2s
brainliang 7:6f8157c58241 144 return true;
brainliang 7:6f8157c58241 145 }
brainliang 7:6f8157c58241 146
brainliang 7:6f8157c58241 147 bool Esp8266::connect_wifi(const char *wifi_ssid, const char *wifi_passwd) { //定义类的函数
brainliang 7:6f8157c58241 148 ESP_CMD("wifi.setmode(wifi.STATION)");
brainliang 7:6f8157c58241 149 ESP_CMD("wifi.sta.config([[%s]],[[%s]])", wifi_ssid, wifi_passwd);
brainliang 7:6f8157c58241 150 wait(2);
brainliang 7:6f8157c58241 151 // set auto autoconnect
brainliang 7:6f8157c58241 152 ESP_CMD("wifi.sta.autoconnect(1)");
brainliang 7:6f8157c58241 153 return true;
brainliang 7:6f8157c58241 154 }
brainliang 7:6f8157c58241 155
brainliang 7:6f8157c58241 156 bool Esp8266::is_connected()
brainliang 7:6f8157c58241 157 {
brainliang 7:6f8157c58241 158 ESP_CMD("print('\\035wifi+'..wifi.sta.status())");
brainliang 7:6f8157c58241 159 wait(0.4);
brainliang 7:6f8157c58241 160 return network_start;
brainliang 7:6f8157c58241 161 }
brainliang 7:6f8157c58241 162
brainliang 7:6f8157c58241 163 bool Esp8266::weblogin() { //定义类的函数
brainliang 7:6f8157c58241 164 // not implemented yet
brainliang 7:6f8157c58241 165 return true;
brainliang 7:6f8157c58241 166 }
brainliang 7:6f8157c58241 167
brainliang 7:6f8157c58241 168 void Esp8266::buildCapability(char *out, const char* infoList[][2])
brainliang 7:6f8157c58241 169 {
brainliang 7:6f8157c58241 170 out[0] = '\0';
brainliang 7:6f8157c58241 171 for (int i = 0; infoList[i][0]; ++i)
brainliang 7:6f8157c58241 172 {
brainliang 7:6f8157c58241 173 strcat(out, infoList[i][0]);
brainliang 7:6f8157c58241 174 strcat(out, ",");
brainliang 7:6f8157c58241 175 strcat(out, infoList[i][1]);
brainliang 7:6f8157c58241 176 strcat(out, "\\n");
brainliang 7:6f8157c58241 177 }
brainliang 7:6f8157c58241 178 }
brainliang 7:6f8157c58241 179
brainliang 7:6f8157c58241 180 bool Esp8266::connect_mqtt_broker(char *ip, const char *node_name, const char* sensors[][2], const char* actuator[][2]) { //定义类的函数
brainliang 7:6f8157c58241 181
brainliang 7:6f8157c58241 182 ESP_CMD("node_name = '%s'", node_name);
brainliang 7:6f8157c58241 183 ESP_CMD("m = mqtt.Client('i_' .. node.chipid(), 120)");
brainliang 7:6f8157c58241 184 ESP_CMD("m:connect(\"%s\",1883,0,function(conn)print (\"\\035connected\"); end)", ip);
brainliang 7:6f8157c58241 185
brainliang 7:6f8157c58241 186 do{
brainliang 7:6f8157c58241 187 wait(0.5);
brainliang 7:6f8157c58241 188 }while(!mqtt_start);
brainliang 7:6f8157c58241 189
brainliang 7:6f8157c58241 190 ESP_CMD("m:on(\"message\", function(conn, topic, data)");
brainliang 7:6f8157c58241 191 ESP_CMD("if topic:find(\"^/control/\") then");
brainliang 7:6f8157c58241 192 ESP_CMD("local tok = topic:match(\"^/control/.+/(.+)\")");
brainliang 7:6f8157c58241 193 ESP_CMD("if tok then print(\"\\035control+\"..tok..\"+\"..data) end");
brainliang 7:6f8157c58241 194 ESP_CMD("end");
brainliang 7:6f8157c58241 195 ESP_CMD("end)");
brainliang 7:6f8157c58241 196
brainliang 7:6f8157c58241 197 ESP_CMD("m:publish('/events/'..node_name..'/online','',1,0)");
brainliang 7:6f8157c58241 198 wait(0.1);
brainliang 7:6f8157c58241 199
brainliang 7:6f8157c58241 200 char * capabilities = new char[512];
brainliang 7:6f8157c58241 201
brainliang 7:6f8157c58241 202 if(sensors){
brainliang 7:6f8157c58241 203 buildCapability(capabilities, sensors);
brainliang 7:6f8157c58241 204 ESP_CMD("m:publish('/capability/'..node_name..'/values','%s',1,1)", capabilities);
brainliang 7:6f8157c58241 205 wait(0.1);
brainliang 7:6f8157c58241 206 }
brainliang 7:6f8157c58241 207 if(actuator){
brainliang 7:6f8157c58241 208 buildCapability(capabilities, actuator);
brainliang 7:6f8157c58241 209 ESP_CMD("m:publish('/capability/'..node_name..'/control','%s',1,1)", capabilities);
brainliang 7:6f8157c58241 210 wait(0.1);
brainliang 7:6f8157c58241 211 for (int i = 0; actuator[i][0]; ++i)
brainliang 7:6f8157c58241 212 subscribe_control(actuator[i][0]);
brainliang 7:6f8157c58241 213 }
brainliang 7:6f8157c58241 214
brainliang 7:6f8157c58241 215 delete[ ] capabilities;
brainliang 7:6f8157c58241 216
brainliang 7:6f8157c58241 217 return true;
brainliang 7:6f8157c58241 218 }
brainliang 7:6f8157c58241 219
brainliang 7:6f8157c58241 220 bool Esp8266::publish_value(const char *topic, const char *data) { //定义类的函数
brainliang 7:6f8157c58241 221 //if (mqtt_start) {
brainliang 7:6f8157c58241 222 ESP_CMD("m:publish('/values/'..node_name..'/%s',\"%s\",0,0)", topic, data);
brainliang 7:6f8157c58241 223 wait(0.1);
brainliang 7:6f8157c58241 224 //}
brainliang 7:6f8157c58241 225 return true;
brainliang 7:6f8157c58241 226 }
brainliang 7:6f8157c58241 227
brainliang 7:6f8157c58241 228 bool Esp8266::subscribe_control(const char *topic, const char *data) { //定义类的函数
brainliang 7:6f8157c58241 229 //if (mqtt_start) {
brainliang 7:6f8157c58241 230 ESP_CMD("m:subscribe('/control/'..node_name..'/%s', 0)", topic);
brainliang 7:6f8157c58241 231 wait(0.1);
brainliang 7:6f8157c58241 232 //}
brainliang 7:6f8157c58241 233
brainliang 7:6f8157c58241 234 // ESP_CMD("m:unsubscribe(\"%s\")", topic);
brainliang 7:6f8157c58241 235 return true;
brainliang 7:6f8157c58241 236 }