当前位置:   article > 正文

ESP8266通过MQTT协议远程控制ESP8266_通过mqtt协议实现小程序客户端对esp8266的控制

通过mqtt协议实现小程序客户端对esp8266的控制

ESP8266按键手柄远程控制ESP8266远程遥控车(小黄车版本)
ESP8266通过MQTT协议远程控制ESP8266
ESP8266按键手柄代码

MQTT服务器我搭建的是EMQ的,腾讯云或者阿里云都可以,我有教程,需要的CSDN留言你的信息,我会联系你

按键手柄以及接收板PCB也将在CSDN进行发布!!主页查看

整套程序亲测可靠,人头担保,我用过!B站发过视频

B站视频:飞宇智控4G远程遥控车 里面按键手柄的同款
现不再销售,特此开源!
  • 1
  • 2

安装一下库

PubSubClient     Arduino IDE安装
WiFiManager     百度太极创客官网下载处下载
ESP8266 3.0以上        Arduino IDE安装
  • 1
  • 2
  • 3

下面是ESP8266做的按键手柄

#include <PubSubClient.h> //MQTT_TEST
#include <Ticker.h>

#include <WiFiManager.h>  // 引用WiFi管理员库
#include <EEPROM.h>     //使用EEPROM保存数据
#include <String.h>
#ifdef ESP8266                  // 若晶片类型是ESP8266
#include <ESP8266WiFi.h> 
#include <ESP8266mDNS.h>
#include <ESP8266WebServer.h>   // ESP8266网站服务器库
ESP8266WebServer server(80);    // 建立网站服务器
#elif defined(ESP32)            // 若晶片类型是ESP32
#include "WiFi.h"
#include <ESPmDNS.h>
#include <WebServer.h>    // ESP32网站服务器库
WebServer server(80);           // 建立网站服务器
#endif
/********************** 参数设置 *****************/
char publishTopic[] = "fff123" ;
// 设置wifi接入信息(请根据您的WiFi信息进行修改)
//const char* mqttServer = "mqtt-cn-i7m2omxjh0b.mqtt.aliyuncs.com";
const char* mqttServer = "114.132.158.66";//ip地址
// MQTT服务端连接用户名密码
//const char* mqttUserName = "Signature|LTAI5t7qtbYjGYBcpci2mjs9|mqtt-cn-i7m2omxjh0b";
//const char* mqttPassword = "AyjfUDaezp72ZxChHnYKAT4npwc=";

#define BUTTON_forward 4
#define BUTTON_RIGHT 12
#define BUTTON_BACK 5
#define BUTTON_LEFT 14
#define BUTTON_accelerate 13
#define BUTTON_decelerate 2
#define BUTTON_oil 16

byte forward_flag = 0;
byte back_flag = 0;
byte right_flag = 0;
byte left_flag =0;
byte accelerate_flag =0;
byte decelerate_flag =0;
byte oil_flag =0;

byte forward_foward = 0;
byte back_back = 0;
byte right_right = 0;
byte left_left = 0;
byte accelerate_accelerate =0;
byte decelerate_decelerate =0;
byte oil_oil =0;

byte pwm_ac_flag=0;
byte pwm_de_flag=0;
 
// 如以上MQTT服务器无法正常连接,请前往以下页面寻找解决方案
// http://www.taichi-maker.com/public-mqtt-broker/

Ticker ticker;
WiFiClient wifiClient;
PubSubClient mqttClient(wifiClient);

int count;    // Ticker计数用变量

#define AP_SSID "宇宙飞船遥控器" // 自定义的ESP设备AP名称
#define AP_PWD "12345678" // 自定义的AP密码
#define TRIGGER_PIN 0 // 启用「Wi-Fi设置入口」的按键引脚
unsigned int timeout = 180; // 设置入口的超时秒数
unsigned int startTime = millis(); // 记录设置入口的启动时间
bool portalRunning = false; // 设置入口是否执行中,默认为「否」


WiFiManager wifiManager;  // 建立WiFiManager对象


bool shouldSaveConfig = false;  //是否保存数据的标志位
//回调函数,用于通知我们需要保存配置
void saveConfigCallback () {
  Serial.println("Should save config");
  shouldSaveConfig = true;
}

/********************** 开始编程存储器部分 *****************/
#define EEPROM_SALT 12664   //用于校验读取的数据是否有效
typedef struct
{
  int   salt = EEPROM_SALT;
  char Secret_Key[15]  = "";
}WMSettings;//结构体, 用于保存秘钥数据

WMSettings blynk;   

//EEPROM读取函数
void eeprom_read()
{
  EEPROM.begin(3000);
  EEPROM.get(2500, blynk);
  EEPROM.end();
  
  Serial.print("从EEPROM读取到的秘钥为:");
  Serial.println(blynk.Secret_Key);
}

//EEPROM存储函数
void eeprom_saveconfig()
{
  EEPROM.begin(3000);
  EEPROM.put(2500, blynk);
  EEPROM.commit();
  EEPROM.end();
}


/********************** WIFI管理员参数配置以及重置函数 *****************/
WiFiManagerParameter custom_Secret_Key("KEY", "秘钥", blynk.Secret_Key, 15);

//用于重置WIFI设置以及秘钥
void doWiFiManager() 
{ // 执行WiFi管理员的工作
  if (portalRunning) 
  { // 若「设置入口」执行中…
    wifiManager.process(); // 处理「设置入口」的用户端连接请求
    // 如果「设置入口」已启用超过预设时间(180秒)…
    if ((millis() - startTime) > (timeout * 1000)) 
    {
      Serial.println("「Wi-Fi设置入口」操作超时…");
      portalRunning = false; // 设成「非执行中」
      if(strlen(custom_Secret_Key.getValue()) == 12)//简单判断填写的秘钥是否有效
      {
        strcpy(blynk.Secret_Key, custom_Secret_Key.getValue());
        Serial.print("写入EEPROM的秘钥为:");
        Serial.println(blynk.Secret_Key);
        eeprom_saveconfig();
      }
      wifiManager.stopConfigPortal(); // 停止「设置入口」
      Serial.println("正重启您的设备");
      delay(1000);
      ESP.restart();//重新启动ESP设备
//      Blinker.begin(blynk.Secret_Key, WiFi.SSID().c_str(), WiFi.psk().c_str());
//      Blinker.attachData(dataRead);
//      Button1.attach(button1_callback);
     }
    }
    
    // 若启用「设置入口」的接脚被按一下
    // 而且portalRunning的数值不为true…
    if (digitalRead(TRIGGER_PIN) == LOW && (!portalRunning)) 
    {
      Serial.println("按钮被按下了,启动设置入口。");
      wifiManager.setConfigPortalBlocking(false); // 设成「非搁置」模式
      wifiManager.startConfigPortal(AP_SSID, AP_PWD); // 启用Wi-Fi AP
  
      portalRunning = true; // 设成「设置入口」执行中
      startTime = millis(); // 纪录目前的时间
    }
}

void setup() {
    pinMode(BUTTON_forward, INPUT);
    digitalWrite(BUTTON_forward, HIGH);
    pinMode(BUTTON_RIGHT, INPUT);
    digitalWrite(BUTTON_RIGHT, HIGH);
    pinMode(BUTTON_BACK, INPUT);
    digitalWrite(BUTTON_BACK, HIGH);
    pinMode(BUTTON_LEFT, INPUT);
    digitalWrite(BUTTON_LEFT, HIGH);
     pinMode(BUTTON_accelerate, INPUT);
    digitalWrite(BUTTON_accelerate, HIGH);
    pinMode(BUTTON_decelerate, INPUT);
    digitalWrite(BUTTON_decelerate, HIGH);
    pinMode(BUTTON_oil, INPUT);
    digitalWrite(BUTTON_oil, HIGH);

 
    pinMode(TRIGGER_PIN, INPUT_PULLUP);   //配置触发重置函数的引脚//配置触发重置函数的引脚
    
    Serial.begin(115200);     

    WiFi.mode(WIFI_STA);  //Wi-Fi设置成STA模式;预设模式为STA+AP
    /****************************************************************/
    delay(500);
    eeprom_read();  //读取EEPROM中的秘钥数据
    //判断EEPROM中读取的秘钥数据是否被污染
    if (blynk.salt != EEPROM_SALT)
    {
      Serial.println("读取到 EEPROM 中无效的设置,已尝试使用默认值");
      WMSettings defaults;
      blynk = defaults;
    }
  
    
    wifiManager.addParameter(&custom_Secret_Key); //在WiFi管理员界面添加秘钥参数
    wifiManager.setSaveConfigCallback(saveConfigCallback);
    
    /********************** 只用于测试 *****************/
    //重置设置——进行测试
//    wifiManager.resetSettings();
    //设置信号的最小质量,这样它就忽略了在这个质量下的 AP
    //默认为 8%
//    wifiManager.setMinimumSignalQuality(30);
    //设置连接的超时时间
//    wifiManager.setConnectTimeout(CONNECT_TIMEOUT);
//    wifiManager.setTimeout(AP_TIMEOUT);
  
    //然后进入一个阻塞循环,等待配置
    if (!wifiManager.autoConnect(AP_SSID,AP_PWD)) 
    {
      Serial.println("未能连接或者超时");
      Serial.println("正重启您的设备");
      delay(1000);
      ESP.restart();
    }

    //到这里表示你已经连接上WiFi
    Serial.println("已经连接上WiFi:)");

    //简单判断秘钥是否有效
    if(strlen(custom_Secret_Key.getValue()) == 12)
    {
      strcpy(blynk.Secret_Key, custom_Secret_Key.getValue());
      Serial.print("秘钥为:");
      Serial.println(blynk.Secret_Key);
      eeprom_saveconfig();
    }//至此,结束数据保存

  
    // 自动连接WiFi。以下语句的参数是连接ESP8266时的WiFi名称
//    wifiManager.autoConnect("AutoConnectAP");
    
    // 如果希望该WiFi添加密码,可以使用以下语句:
    // wifiManager.autoConnect("AutoConnectAP", "12345678");
    // 以上语句中的12345678是连接AutoConnectAP的密码
    // WiFi连接成功后将通过串口监视器输出连接成功信息 
    Serial.println(""); 
    Serial.print("ESP8266 Connected to ");
    Serial.println(WiFi.SSID());              // 串口打印当前连接的WIFI名称
    Serial.print("IP address:\t");
    Serial.println(WiFi.localIP());           // 串口打印当前连接的WIFI的IP
    Serial.printf("password: %s\n", WiFi.psk().c_str());// 串口打印当前连接的WIFI密码 

     // 设置MQTT服务器和端口号
    mqttClient.setServer(mqttServer, 1883);
  
    // 连接MQTT服务器
    connectMQTTServer();
  
    // Ticker定时对象
    ticker.attach(1, tickerCount); 

}

void loop() {
    doWiFiManager();
    if(!portalRunning)
    { if (mqttClient.connected())
  { // 如果开发板成功连接服务器
    // 每隔3秒钟发布一次信息
      pubMQTTmsg();   
    // 保持心跳
    mqttClient.loop();
  } else 
   {                  // 如果开发板未能成功连接服务器
    connectMQTTServer();    // 则尝试连接服务器
   }}

}
void tickerCount(){
  count++;
}

void connectMQTTServer(){
  // 根据ESP8266的MAC地址生成客户端ID(避免与其它ESP8266的客户端ID重名)
  String clientId = "esp8266-" + WiFi.macAddress();

  // 连接MQTT服务器
//  if (mqttClient.connect(clientId.c_str(),mqttUserName,mqttPassword)) { 
  if (mqttClient.connect(clientId.c_str())) { 
    Serial.println("MQTT Server Connected.");
    Serial.println("Server Address: ");
    Serial.println(mqttServer);
    Serial.println("ClientId:");
    Serial.println(clientId);
  } else {
    Serial.print("MQTT Server Connect Failed. Client State:");
    Serial.println(mqttClient.state());
    delay(3000);
  }   
}

// 发布信息
void pubMQTTmsg(){
  byte fac = 0;
  byte bac = 0;
  byte lac = 0;
  byte rac = 0;
  byte fde = 0;
  byte bde = 0;
  byte lde = 0;
  byte rde = 0;
  
if(digitalRead(BUTTON_accelerate) == LOW && pwm_ac_flag == 0){
  pwm_ac_flag = 1;
  if(digitalRead(BUTTON_forward) == LOW){mqttClient.publish(publishTopic, "fd_ac");fac=1;}
  if(digitalRead(BUTTON_BACK) == LOW){mqttClient.publish(publishTopic, "bk_ac");bac=1;}
  if(digitalRead(BUTTON_LEFT)== LOW){mqttClient.publish(publishTopic, "left_ac");lac=1;}
  if(digitalRead(BUTTON_RIGHT) == LOW){mqttClient.publish(publishTopic, "right_ac");rac=1;}
  if(fac==0&&bac==0&&lac==0&&rac==0){mqttClient.publish(publishTopic, "ac");}
}
else if(digitalRead(BUTTON_accelerate) == HIGH){pwm_ac_flag = 0;fac=0;bac=0;lac=0;rac=0;}


if(digitalRead(BUTTON_decelerate) == LOW && pwm_de_flag == 0){
  pwm_de_flag = 1;
  if(digitalRead(BUTTON_forward) == LOW){mqttClient.publish(publishTopic, "fd_de");fde=1;}
  if(digitalRead(BUTTON_BACK) == LOW){mqttClient.publish(publishTopic, "bk_de");bde=1;}
  if(digitalRead(BUTTON_LEFT)== LOW){mqttClient.publish(publishTopic, "left_de");lde=1;}
  if(digitalRead(BUTTON_RIGHT) == LOW){mqttClient.publish(publishTopic, "bk_de");rde=1;}
  if(fde==0&&bde==0&&lde==0&&rde==0){mqttClient.publish(publishTopic, "de");}
}
else if(digitalRead(BUTTON_decelerate) == HIGH){pwm_de_flag = 0;fde=0;bde=0;lde=0;rde=0;}


if(digitalRead(BUTTON_oil) == LOW &&  oil_oil == 0) {
   mqttClient.publish(publishTopic, "oil");
   oil_flag = 0;
   oil_oil = 1;
    Serial.println("油门");
 }
else if(digitalRead(BUTTON_oil) == HIGH && oil_flag==0)
{
  mqttClient.publish(publishTopic, "oil_");
   oil_flag = 1;
   oil_oil = 0;
}

if(digitalRead(BUTTON_forward) == LOW &&  forward_foward == 0 && fac==0&&fde==0 ) {
   mqttClient.publish(publishTopic, "fd");
   forward_flag = 0;
   forward_foward = 1;
    Serial.println("前进");
 }
else if(digitalRead(BUTTON_forward) == HIGH && forward_flag==0)
{
  mqttClient.publish(publishTopic, "fd_");
   forward_flag = 1;
   forward_foward = 0;
}

if(digitalRead(BUTTON_BACK) == LOW && back_back == 0 && bac==0&&bde==0 ) {
   mqttClient.publish(publishTopic, "bk");
   back_flag = 0;
   back_back = 1;
   Serial.println("后退");
 }
else if(digitalRead(BUTTON_BACK) == HIGH && back_flag==0)
{
  mqttClient.publish(publishTopic, "bk_");
   back_flag = 1;
   back_back = 0;
}

if(digitalRead(BUTTON_LEFT) == LOW && left_left==0 && lac==0&&lde==0 ) {
   mqttClient.publish(publishTopic, "left");
   left_flag = 0;
   left_left = 1;
   Serial.println("左转");
 }
else if(digitalRead(BUTTON_LEFT) == HIGH && left_flag==0)
{
  mqttClient.publish(publishTopic, "left_");
  left_flag = 1;
  left_left = 0;
}
 
if(digitalRead(BUTTON_RIGHT) == LOW && right_right==0 && rac==0&&lde==0 ) {
   mqttClient.publish(publishTopic, "right");
   right_flag = 0;
   right_right = 1;
   Serial.println("右转");
 }
else if(digitalRead(BUTTON_RIGHT) == HIGH && right_flag==0)
{
  mqttClient.publish(publishTopic, "right_");
  right_flag = 1;
  right_right = 0;
}
}
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22
  • 23
  • 24
  • 25
  • 26
  • 27
  • 28
  • 29
  • 30
  • 31
  • 32
  • 33
  • 34
  • 35
  • 36
  • 37
  • 38
  • 39
  • 40
  • 41
  • 42
  • 43
  • 44
  • 45
  • 46
  • 47
  • 48
  • 49
  • 50
  • 51
  • 52
  • 53
  • 54
  • 55
  • 56
  • 57
  • 58
  • 59
  • 60
  • 61
  • 62
  • 63
  • 64
  • 65
  • 66
  • 67
  • 68
  • 69
  • 70
  • 71
  • 72
  • 73
  • 74
  • 75
  • 76
  • 77
  • 78
  • 79
  • 80
  • 81
  • 82
  • 83
  • 84
  • 85
  • 86
  • 87
  • 88
  • 89
  • 90
  • 91
  • 92
  • 93
  • 94
  • 95
  • 96
  • 97
  • 98
  • 99
  • 100
  • 101
  • 102
  • 103
  • 104
  • 105
  • 106
  • 107
  • 108
  • 109
  • 110
  • 111
  • 112
  • 113
  • 114
  • 115
  • 116
  • 117
  • 118
  • 119
  • 120
  • 121
  • 122
  • 123
  • 124
  • 125
  • 126
  • 127
  • 128
  • 129
  • 130
  • 131
  • 132
  • 133
  • 134
  • 135
  • 136
  • 137
  • 138
  • 139
  • 140
  • 141
  • 142
  • 143
  • 144
  • 145
  • 146
  • 147
  • 148
  • 149
  • 150
  • 151
  • 152
  • 153
  • 154
  • 155
  • 156
  • 157
  • 158
  • 159
  • 160
  • 161
  • 162
  • 163
  • 164
  • 165
  • 166
  • 167
  • 168
  • 169
  • 170
  • 171
  • 172
  • 173
  • 174
  • 175
  • 176
  • 177
  • 178
  • 179
  • 180
  • 181
  • 182
  • 183
  • 184
  • 185
  • 186
  • 187
  • 188
  • 189
  • 190
  • 191
  • 192
  • 193
  • 194
  • 195
  • 196
  • 197
  • 198
  • 199
  • 200
  • 201
  • 202
  • 203
  • 204
  • 205
  • 206
  • 207
  • 208
  • 209
  • 210
  • 211
  • 212
  • 213
  • 214
  • 215
  • 216
  • 217
  • 218
  • 219
  • 220
  • 221
  • 222
  • 223
  • 224
  • 225
  • 226
  • 227
  • 228
  • 229
  • 230
  • 231
  • 232
  • 233
  • 234
  • 235
  • 236
  • 237
  • 238
  • 239
  • 240
  • 241
  • 242
  • 243
  • 244
  • 245
  • 246
  • 247
  • 248
  • 249
  • 250
  • 251
  • 252
  • 253
  • 254
  • 255
  • 256
  • 257
  • 258
  • 259
  • 260
  • 261
  • 262
  • 263
  • 264
  • 265
  • 266
  • 267
  • 268
  • 269
  • 270
  • 271
  • 272
  • 273
  • 274
  • 275
  • 276
  • 277
  • 278
  • 279
  • 280
  • 281
  • 282
  • 283
  • 284
  • 285
  • 286
  • 287
  • 288
  • 289
  • 290
  • 291
  • 292
  • 293
  • 294
  • 295
  • 296
  • 297
  • 298
  • 299
  • 300
  • 301
  • 302
  • 303
  • 304
  • 305
  • 306
  • 307
  • 308
  • 309
  • 310
  • 311
  • 312
  • 313
  • 314
  • 315
  • 316
  • 317
  • 318
  • 319
  • 320
  • 321
  • 322
  • 323
  • 324
  • 325
  • 326
  • 327
  • 328
  • 329
  • 330
  • 331
  • 332
  • 333
  • 334
  • 335
  • 336
  • 337
  • 338
  • 339
  • 340
  • 341
  • 342
  • 343
  • 344
  • 345
  • 346
  • 347
  • 348
  • 349
  • 350
  • 351
  • 352
  • 353
  • 354
  • 355
  • 356
  • 357
  • 358
  • 359
  • 360
  • 361
  • 362
  • 363
  • 364
  • 365
  • 366
  • 367
  • 368
  • 369
  • 370
  • 371
  • 372
  • 373
  • 374
  • 375
  • 376
  • 377
  • 378
  • 379
  • 380
  • 381
  • 382
  • 383
  • 384
  • 385

下面是车子接收端的代码,配合L298N驱动接线进玩具车轮子上

#include <PubSubClient.h>

#include <WiFiManager.h>  // 引用WiFi管理员库
#include <EEPROM.h>     //使用EEPROM保存数据
#include <String.h>
#ifdef ESP8266                  // 若晶片类型是ESP8266
#include <ESP8266WiFi.h> 
#include <ESP8266mDNS.h>
#include <ESP8266WebServer.h>   // ESP8266网站服务器库
ESP8266WebServer server(80);    // 建立网站服务器
#elif defined(ESP32)            // 若晶片类型是ESP32
#include "WiFi.h"
#include <ESPmDNS.h>
#include <WebServer.h>    // ESP32网站服务器库
WebServer server(80);           // 建立网站服务器
#endif
/********************** 参数设置 *****************/
//const char* mqttServer = "mqtt-cn-i7m2omxjh0b.mqtt.aliyuncs.com";
const char* mqttServer = "114.132.158.66";
#define AP_SSID "智控物联—小车" // 自定义的ESP设备AP名称
#define AP_PWD "12345678" // 自定义的AP密码
#define TRIGGER_PIN 0 // 启用「Wi-Fi设置入口」的按键引脚

#define fd_bk1 12
#define fd_bk2 14
#define lt_rt1 5
#define lt_rt2 4

unsigned int timeout = 180; // 设置入口的超时秒数
unsigned int startTime = millis(); // 记录设置入口的启动时间
bool portalRunning = false; // 设置入口是否执行中,默认为「否」
// MQTT服务端连接用户名密码
//const char* mqttUserName = "Signature|LTAI5t9XAHpNLn4LUaEKETez|mqtt-cn-i7m2omxjh0b";
//const char* mqttPassword = "0uNk+aVm2W7guPrEfo6iSr6tBow=";



WiFiManager wifiManager;  // 建立WiFiManager对象
WiFiClient wifiClient;
PubSubClient mqttClient(wifiClient);

bool shouldSaveConfig = false;  //是否保存数据的标志位
//回调函数,用于通知我们需要保存配置
void saveConfigCallback () {
  Serial.println("Should save config");
  shouldSaveConfig = true;
}

int pwm = 100;
int pwm_temp = 0;
byte flag = 0;
byte fd_flag = 1;
byte bk_flag = 2;
byte left_flag = 3;
byte right_flag = 4;
/********************** 开始编程存储器部分 *****************/
#define EEPROM_SALT 12664   //用于校验读取的数据是否有效
typedef struct
{
  int   salt = EEPROM_SALT;
  char Secret_Key[15]  = "";
}WMSettings;//结构体, 用于保存秘钥数据

WMSettings blynk;   

//EEPROM读取函数
void eeprom_read()
{
  EEPROM.begin(3000);
  EEPROM.get(2500, blynk);
  EEPROM.end();
  
  Serial.print("从EEPROM读取到的秘钥为:");
  Serial.println(blynk.Secret_Key);
}

//EEPROM存储函数
void eeprom_saveconfig()
{
  EEPROM.begin(3000);
  EEPROM.put(2500, blynk);
  EEPROM.commit();
  EEPROM.end();
}

/********************** 点灯Blinker的配置部分 *****************/

/********************** WIFI管理员参数配置以及重置函数 *****************/
WiFiManagerParameter custom_Secret_Key("KEY", "秘钥", blynk.Secret_Key, 15);

//用于重置WIFI设置以及秘钥
void doWiFiManager() 
{ // 执行WiFi管理员的工作
  if (portalRunning) 
  { // 若「设置入口」执行中…
    wifiManager.process(); // 处理「设置入口」的用户端连接请求
    // 如果「设置入口」已启用超过预设时间(180秒)…
    if ((millis() - startTime) > (timeout * 1000)) 
    {
      Serial.println("「Wi-Fi设置入口」操作超时…");
      portalRunning = false; // 设成「非执行中」
      if(strlen(custom_Secret_Key.getValue()) == 12)//简单判断填写的秘钥是否有效
      {
        strcpy(blynk.Secret_Key, custom_Secret_Key.getValue());
        Serial.print("写入EEPROM的秘钥为:");
        Serial.println(blynk.Secret_Key);
        eeprom_saveconfig();
      }
      wifiManager.stopConfigPortal(); // 停止「设置入口」
      Serial.println("正重启您的设备");
      delay(1000);
      ESP.restart();//重新启动ESP设备
//      Blinker.begin(blynk.Secret_Key, WiFi.SSID().c_str(), WiFi.psk().c_str());
//      Blinker.attachData(dataRead);
//      Button1.attach(button1_callback);
     }
    }
    
    // 若启用「设置入口」的接脚被按一下
    // 而且portalRunning的数值不为true…
    if (digitalRead(TRIGGER_PIN) == LOW && (!portalRunning)) 
    {
      Serial.println("按钮被按下了,启动设置入口。");
      wifiManager.setConfigPortalBlocking(false); // 设成「非搁置」模式
      wifiManager.startConfigPortal(AP_SSID, AP_PWD); // 启用Wi-Fi AP
  
      portalRunning = true; // 设成「设置入口」执行中
      startTime = millis(); // 纪录目前的时间
    }
}

void setup() {

    pinMode(fd_bk1, OUTPUT);//
    pinMode(fd_bk2, OUTPUT);//
    pinMode(lt_rt1, OUTPUT);//
    pinMode(lt_rt2, OUTPUT);//
    digitalWrite(fd_bk1, 0);
    digitalWrite(fd_bk2, 0);
    digitalWrite(lt_rt1, 0);
    digitalWrite(lt_rt2, 0);
//    pinMode(LED_BUILTIN, OUTPUT);     // 设置板上LED引脚为输出模式
//    digitalWrite(LED_BUILTIN, HIGH);  // 启动后关闭板上LED
    WiFi.mode(WIFI_STA);  //Wi-Fi设置成STA模式;预设模式为STA+AP
    Serial.begin(115200);       
    /****************************************************************/
    delay(500);
    pinMode(TRIGGER_PIN, INPUT_PULLUP);   //配置触发重置函数的引脚
    eeprom_read();  //读取EEPROM中的秘钥数据
    //判断EEPROM中读取的秘钥数据是否被污染
    if (blynk.salt != EEPROM_SALT)
    {
      Serial.println("读取到 EEPROM 中无效的设置,已尝试使用默认值");
      WMSettings defaults;
      blynk = defaults;
    }
  
    
    wifiManager.addParameter(&custom_Secret_Key); //在WiFi管理员界面添加秘钥参数
    wifiManager.setSaveConfigCallback(saveConfigCallback);
    
    /********************** 只用于测试 *****************/
    //重置设置——进行测试
//    wifiManager.resetSettings();
    //设置信号的最小质量,这样它就忽略了在这个质量下的 AP
    //默认为 8%
//    wifiManager.setMinimumSignalQuality(30);
    //设置连接的超时时间
//    wifiManager.setConnectTimeout(CONNECT_TIMEOUT);
//    wifiManager.setTimeout(AP_TIMEOUT);
  
    //然后进入一个阻塞循环,等待配置
    if (!wifiManager.autoConnect(AP_SSID,AP_PWD)) 
    {
      Serial.println("未能连接或者超时");
      Serial.println("正重启您的设备");
      delay(1000);
      ESP.restart();
    }

    //到这里表示你已经连接上WiFi
    Serial.println("已经连接上WiFi:)");

    //简单判断秘钥是否有效
    if(strlen(custom_Secret_Key.getValue()) == 12)
    {
      strcpy(blynk.Secret_Key, custom_Secret_Key.getValue());
      Serial.print("秘钥为:");
      Serial.println(blynk.Secret_Key);
      eeprom_saveconfig();
    }//至此,结束数据保存

  
    // 自动连接WiFi。以下语句的参数是连接ESP8266时的WiFi名称
//    wifiManager.autoConnect("AutoConnectAP");
    
    // 如果希望该WiFi添加密码,可以使用以下语句:
    // wifiManager.autoConnect("AutoConnectAP", "12345678");
    // 以上语句中的12345678是连接AutoConnectAP的密码
    // WiFi连接成功后将通过串口监视器输出连接成功信息 
    Serial.println(""); 
    Serial.print("ESP8266 Connected to ");
    Serial.println(WiFi.SSID());              // 串口打印当前连接的WIFI名称
    Serial.print("IP address:\t");
    Serial.println(WiFi.localIP());           // 串口打印当前连接的WIFI的IP
    Serial.printf("password: %s\n", WiFi.psk().c_str());// 串口打印当前连接的WIFI密码 

      // 设置MQTT服务器和端口号
    mqttClient.setServer(mqttServer, 1883);
      // 设置MQTT订阅回调函数
    mqttClient.setCallback(receiveCallback);
 
    // 连接MQTT服务器
    connectMQTTserver();

}

void loop() {
    doWiFiManager();
    if(!portalRunning){if (mqttClient.connected()) { // 如果开发板成功连接服务器
    mqttClient.loop();          // 处理信息以及心跳
  } else {                      // 如果开发板未能成功连接服务器
    connectMQTTserver();        // 则尝试连接服务器
  }}
}

// 连接MQTT服务器并订阅信息
void connectMQTTserver(){
  // 根据ESP8266的MAC地址生成客户端ID(避免与其它ESP8266的客户端ID重名)
 String clientId = "esp8266-" + WiFi.macAddress();
 
  // 连接MQTT服务器
//  if (mqttClient.connect(clientId.c_str(),mqttUserName,mqttPassword)) { 
  if (mqttClient.connect(clientId.c_str())) { 
    Serial.println("MQTT Server Connected.");
    Serial.println("Server Address:");
    Serial.println(mqttServer);
    Serial.println("ClientId: ");
    Serial.println(clientId);
    subscribeTopic(); // 订阅指定主题
  } else {
    Serial.print("MQTT Server Connect Failed. Client State:");
    Serial.println(mqttClient.state());
    delay(5000);
  }   
}
 
// 收到信息后的回调函数
void receiveCallback(char* topic, byte* payload, unsigned int length) {
  char recode[20]={0};
  Serial.print("Message Received [");
  Serial.print(topic);
  Serial.print("] ");
  for (int i = 0; i < length; i++) {
     Serial.println(length);
    Serial.print((char)payload[i]);
    recode[i] = payload[i];
  }
//  Serial.println("");
//  Serial.print("Message Length(Bytes) ");
//  Serial.println(length);
// 
//  if ((char)payload[0] == '1') {     // 如果收到的信息以“1”为开始
//    digitalWrite(BUILTIN_LED, LOW);  // 则点亮LED。
//    Serial.println("接收到1");
//  } 

  if( !strcmp(recode,"ac") || !strcmp(recode,"fd_ac")|| !strcmp(recode,"bk_ac")|| !strcmp(recode,"left_ac")||!strcmp(recode,"right_ac") && pwm<1000){                           
    if(pwm<250){ pwm += 10; } //每按一下加速键,加速50,可调
     Serial.println("加速__");
  } 
  if( !strcmp(recode,"de") || !strcmp(recode,"fd_de")|| !strcmp(recode,"bk_de")|| !strcmp(recode,"left_de")||!strcmp(recode,"bk_de") && pwm>0){                           
     if(pwm>0){pwm -= 10; }  //每按一下加速键,减速50,可调
     Serial.println("减速__");
  } 
  if( !strcmp(recode,"oil")){       //按下油门键后全速往前                    
    digitalWrite(fd_bk1, 0);
    digitalWrite(fd_bk2, 1);
    Serial.println("油门");
  } else if(!strcmp(recode,"oil_")){ //油门键松手后停止 
    digitalWrite(fd_bk1, 0);
    digitalWrite(fd_bk2, 0);
   }

  if( !strcmp(recode,"fd")||!strcmp(recode,"fd_ac")|| !strcmp(recode,"fd_de")){   //按下前进键,按当前速度往前开                        
    digitalWrite(fd_bk1, 0);
    analogWrite(fd_bk2, pwm);
//   Serial.println("前进");
  } else if(!strcmp(recode,"fd_")){ //前进键松手,小车停止
    digitalWrite(fd_bk1, 0);
    digitalWrite(fd_bk2, 0);
//    Serial.println("停止前进");
   }
   
  if( !strcmp(recode,"bk")|| !strcmp(recode,"bk_ac")|| !strcmp(recode,"bk_de")){  //按下后退键,按当前速度往后退
    analogWrite(fd_bk1, pwm);
    digitalWrite(fd_bk2, 0);                      
// Serial.println("后退");
}else if(!strcmp(recode,"bk_")){ //松手后停止后退
    digitalWrite(fd_bk1, 0);
    digitalWrite(fd_bk2, 0);
//    Serial.println("停止后退");
   }
   
  if( !strcmp(recode,"left")|| !strcmp(recode,"left_ac")|| !strcmp(recode,"left_de")){  //按下左转键,按当前速度左转
    analogWrite(lt_rt1, 150);
    digitalWrite(lt_rt2, 0);                       
// Serial.println("左转");
}else if(!strcmp(recode,"left_")){ //松手后停止
    digitalWrite(lt_rt1, 0);
    digitalWrite(lt_rt2, 0);   
//    Serial.println("停止左转");
   }
   
  if( !strcmp(recode,"right")||!strcmp(recode,"right_ac")||!strcmp(recode,"bk_de")){ //按下有右转键,按当前速度右转
    digitalWrite(lt_rt1, 0);
    analogWrite(lt_rt2, 150);                             
// Serial.println("右转");
}else if(!strcmp(recode,"right_")){//松手后停止
    digitalWrite(lt_rt1, 0);
    digitalWrite(lt_rt2, 0); 
//    Serial.println("停止右转");
   }

}
 
// 订阅指定主题
void subscribeTopic(){
 
  // 建立订阅主题。主题名称以Taichi-Maker-Sub为前缀,后面添加设备的MAC地址。
  // 这么做是为确保不同设备使用同一个MQTT服务器测试消息订阅时,所订阅的主题名称不同
  String topicString = "fff123" ;
  char subTopic[topicString.length() + 1];  
  strcpy(subTopic, topicString.c_str());
  
  // 通过串口监视器输出是否成功订阅主题以及订阅的主题名称
  if(mqttClient.subscribe(subTopic)){
    Serial.println("Subscrib Topic:");
    Serial.println(subTopic);
  } else {
    Serial.print("Subscribe Fail...");
  }  
}
 

  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22
  • 23
  • 24
  • 25
  • 26
  • 27
  • 28
  • 29
  • 30
  • 31
  • 32
  • 33
  • 34
  • 35
  • 36
  • 37
  • 38
  • 39
  • 40
  • 41
  • 42
  • 43
  • 44
  • 45
  • 46
  • 47
  • 48
  • 49
  • 50
  • 51
  • 52
  • 53
  • 54
  • 55
  • 56
  • 57
  • 58
  • 59
  • 60
  • 61
  • 62
  • 63
  • 64
  • 65
  • 66
  • 67
  • 68
  • 69
  • 70
  • 71
  • 72
  • 73
  • 74
  • 75
  • 76
  • 77
  • 78
  • 79
  • 80
  • 81
  • 82
  • 83
  • 84
  • 85
  • 86
  • 87
  • 88
  • 89
  • 90
  • 91
  • 92
  • 93
  • 94
  • 95
  • 96
  • 97
  • 98
  • 99
  • 100
  • 101
  • 102
  • 103
  • 104
  • 105
  • 106
  • 107
  • 108
  • 109
  • 110
  • 111
  • 112
  • 113
  • 114
  • 115
  • 116
  • 117
  • 118
  • 119
  • 120
  • 121
  • 122
  • 123
  • 124
  • 125
  • 126
  • 127
  • 128
  • 129
  • 130
  • 131
  • 132
  • 133
  • 134
  • 135
  • 136
  • 137
  • 138
  • 139
  • 140
  • 141
  • 142
  • 143
  • 144
  • 145
  • 146
  • 147
  • 148
  • 149
  • 150
  • 151
  • 152
  • 153
  • 154
  • 155
  • 156
  • 157
  • 158
  • 159
  • 160
  • 161
  • 162
  • 163
  • 164
  • 165
  • 166
  • 167
  • 168
  • 169
  • 170
  • 171
  • 172
  • 173
  • 174
  • 175
  • 176
  • 177
  • 178
  • 179
  • 180
  • 181
  • 182
  • 183
  • 184
  • 185
  • 186
  • 187
  • 188
  • 189
  • 190
  • 191
  • 192
  • 193
  • 194
  • 195
  • 196
  • 197
  • 198
  • 199
  • 200
  • 201
  • 202
  • 203
  • 204
  • 205
  • 206
  • 207
  • 208
  • 209
  • 210
  • 211
  • 212
  • 213
  • 214
  • 215
  • 216
  • 217
  • 218
  • 219
  • 220
  • 221
  • 222
  • 223
  • 224
  • 225
  • 226
  • 227
  • 228
  • 229
  • 230
  • 231
  • 232
  • 233
  • 234
  • 235
  • 236
  • 237
  • 238
  • 239
  • 240
  • 241
  • 242
  • 243
  • 244
  • 245
  • 246
  • 247
  • 248
  • 249
  • 250
  • 251
  • 252
  • 253
  • 254
  • 255
  • 256
  • 257
  • 258
  • 259
  • 260
  • 261
  • 262
  • 263
  • 264
  • 265
  • 266
  • 267
  • 268
  • 269
  • 270
  • 271
  • 272
  • 273
  • 274
  • 275
  • 276
  • 277
  • 278
  • 279
  • 280
  • 281
  • 282
  • 283
  • 284
  • 285
  • 286
  • 287
  • 288
  • 289
  • 290
  • 291
  • 292
  • 293
  • 294
  • 295
  • 296
  • 297
  • 298
  • 299
  • 300
  • 301
  • 302
  • 303
  • 304
  • 305
  • 306
  • 307
  • 308
  • 309
  • 310
  • 311
  • 312
  • 313
  • 314
  • 315
  • 316
  • 317
  • 318
  • 319
  • 320
  • 321
  • 322
  • 323
  • 324
  • 325
  • 326
  • 327
  • 328
  • 329
  • 330
  • 331
  • 332
  • 333
  • 334
  • 335
  • 336
  • 337
  • 338
  • 339
  • 340
  • 341
  • 342
  • 343
  • 344
  • 345
声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/小小林熬夜学编程/article/detail/718237
推荐阅读
相关标签
  

闽ICP备14008679号