赞
踩
ESP8266按键手柄远程控制ESP8266远程遥控车(小黄车版本)
ESP8266通过MQTT协议远程控制ESP8266
ESP8266按键手柄代码
MQTT服务器我搭建的是EMQ的,腾讯云或者阿里云都可以,我有教程,需要的CSDN留言你的信息,我会联系你
按键手柄以及接收板PCB也将在CSDN进行发布!!主页查看
整套程序亲测可靠,人头担保,我用过!B站发过视频
B站视频:飞宇智控4G远程遥控车 里面按键手柄的同款
现不再销售,特此开源!
安装一下库
PubSubClient Arduino IDE安装
WiFiManager 百度太极创客官网下载处下载
ESP8266 3.0以上 Arduino IDE安装
下面是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; } }
下面是车子接收端的代码,配合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..."); } }
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。