普通2.4g遥控车改4g遥控车资料-8266
背景:传统遥控器都是航模为代表的2.4G遥控器,它们在室外且无障碍物时遥控距离很长,可达几千米,但是有障碍物时,遥控距离可能仅有10多米。市面上也有一些2.4g遥控改装4G的,是读取2.4g遥控信号,并转发至服务器,但是价格昂贵,几百到几千块!而且也没有开源的一体4g遥控器。
本次设计的这款遥控为4G遥控,只要有4G网络的地方,就能完美控制,延迟100ms左右。拥有它以后,你就能在家开着小车出去探险、出去买菜、取快递……本期从车架到遥控,都能白嫖立创!成本不过百元!
2.4g接收器所连8266
#include <ESP8266WiFi.h> #include <PubSubClient.h> // 设置wifi接入信息(要连接的wifi) const char* ssid = "WIFI"; const char* password = "密码"; String topicString = "lmwmm_car";//输入自己的通信暗号,能保证别人不和你重复就行 const char* mqttServer = "43.136.64.172";//test.ranye-iot.net(MQTT服务器域名或地址) int port=1883;//MQTT服务器端口 int LeTest=0;//改成1则可观察串口数据,方便调试(平时不建议开启,会占用运行性能) WiFiClient wifiClient; PubSubClient mqttClient(wifiClient); void setup() { Serial.begin(115200); Serial.println("初始化成功!"); pinMode(D1, INPUT); pinMode(D2, INPUT); pinMode(D3, INPUT); pinMode(D4, INPUT); pinMode(D5, INPUT); pinMode(D6, INPUT); pinMode(D7, INPUT); pinMode(D8, INPUT); WiFi.mode(WIFI_STA); //设置ESP8266工作模式为无线终端模式 connectWifi();// 连接WiFi mqttClient.setServer(mqttServer, port); // 设置MQTT服务器和端口号 connectMQTTServer(); // 连接MQTT服务器 } void loop() { if (mqttClient.connected()) { // 如果开发板成功连接服务器 pubMQTTmsg(); mqttClient.loop(); // 保持客户端心跳 } else { // 如果开发板未能成功连接服务器 connectMQTTServer(); // 则尝试连接服务器 } delay(10); } void connectMQTTServer(){ // 根据ESP32的MAC地址生成客户端ID(避免与其它ESP32的客户端ID重名) String clientId = "esp32-" + WiFi.macAddress(); // 连接MQTT服务器 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); } } int CH1,CH2,CH3,CH4,CH5,CH6,CH7,CH8; void pubMQTTmsg(){ static int value; // 客户端发布信息用数字 char publishTopic[topicString.length() + 1]; // 这么做是为确保不同用户进行MQTT信息发布时,ESP8266客户端名称各不相同, strcpy(publishTopic, topicString.c_str()); CH1 = pulseIn(D1,HIGH); CH2 = pulseIn(D2,HIGH); CH3 = pulseIn(D3,HIGH); CH4 = pulseIn(D4,HIGH); CH5 = pulseIn(D5,HIGH); CH6 = pulseIn(D6,HIGH); CH7 = pulseIn(D7,HIGH); CH8 = pulseIn(D8,HIGH);//读取通道信息 // 建立发布信息。信息内容以Hello World为起始,后面添加发布次数。 String messageString = "A"+String(CH1)+"B"+String(CH2)+"C"+String(CH3)+"D"+String(CH4)+"E"+String(CH5)+"F"+String(CH6)+"G"+String(CH7)+"H"+String(CH8)+"I"; char publishMsg[messageString.length() + 1]; strcpy(publishMsg, messageString.c_str()); // 实现ESP32向主题发布信息 if(mqttClient.publish(publishTopic, publishMsg)){ if(LeTest==1) {Serial.println(publishMsg);} } else { Serial.println("Message Publish Failed."); } } void connectWifi(){ WiFi.begin(ssid, password); //等待WiFi连接,成功连接后输出成功信息 while (WiFi.status() != WL_CONNECTED) { delay(1000); Serial.print("."); } Serial.println(""); Serial.println("WiFi Connected!"); Serial.println(""); }
电调、舵机所连8266
#include <ESP8266WiFi.h> #include <PubSubClient.h> #include <Servo.h> #include <Ticker.h> Ticker ticker; Servo CH1,CH2,CH3,CH4,CH5,CH6,CH7,CH8; //双摇杆舵机+L298N+8266开发板 // 设置wifi接入信息(根据小车要连接的WiFi信息进行修改) const char* ssid = "WIFI热点"; const char* password = "密码"; String topicString = "lmwmm_car";//与另一份代码中的该部分相同 const char* mqttServer = "43.136.64.172";//test.ranye-iot.net(MQTT服务器域名或地址) int port=1883;//MQTT服务器端口 int LeTest=0;//改成1则可观察串口数据,方便调试(平时不建议开启,会占用运行性能) int Ym,Fx,LeCar,Ym1,Fx1; WiFiClient wifiClient; PubSubClient mqttClient(wifiClient); void setup() { Serial.begin(115200); pinMode(LED_BUILTIN, OUTPUT); //设置内置LED引脚为输出模式以便控制LED// 启动串口通讯(波特率为9600,波特率可以理解为串口传输数据的速度) digitalWrite(LED_BUILTIN,LOW); CH1.attach(D1,1000,2000); CH2.attach(D2,1000,2000); CH3.attach(D3,1000,2000); CH4.attach(D4,1000,2000); CH5.attach(D5,1000,2000); CH6.attach(D6,1000,2000); CH7.attach(D7,1000,2000); CH8.attach(D8,1000,2000); WiFi.mode(WIFI_STA); //设置ESP8266工作模式为无线终端模式(8266像手机一样连接到wifi的模式) connectWifi(); // 连接WiFi mqttClient.setServer(mqttServer, port);// 设置MQTT服务器和端口号 mqttClient.setCallback(receiveCallback);// 设置MQTT订阅回调函数 connectMQTTserver();// 连接MQTT服务器 ticker.attach(0.1, touch);//0.1秒数据延迟 } void connectMQTTserver() { String clientId = "esp8266-" + WiFi.macAddress(); 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(3000); } } // 收到信息后的回调函数 int CH11,CH22,CH33,CH44,CH55,CH66,CH77,CH88; char CH01[5],CH02[5],CH03[5],CH04[5],CH05[5],CH06[5],CH07[5],CH08[5];//储存接受到的通道数据 int Alocation,Blocation,Clocation,Dlocation,Elocation,Flocation,Glocation,Hlocation,Ilocation; void receiveCallback(char* topic, byte* payload, unsigned int length) { if(LeTest==1) {for (int i = 0; i < length; i++) { Serial.print((char)payload[i]); if(i==length-1) {Serial.println("");} } } else { if((char)payload[0]=='A')//检测8266②号是否联网 { LeCar=1; int j=0; for ( int i = 1; i < 6; i++) {if ((char)payload[i]!='B') {CH01[j]=(char)payload[i]; j+=1;} else {Blocation=i,j=0; break;}}//寻找CH1数据 for (int i = Blocation+1; i < length; i++) {if ((char)payload[i]!='C') {CH02[j]=(char)payload[i]; j+=1;} else {Clocation=i,j=0; break;}}//寻找CH2数据 for (int i = Clocation+1; i < length; i++) {if ((char)payload[i]!='D') {CH03[j]=(char)payload[i]; j+=1;} else {Dlocation=i,j=0; break;}}//寻找CH3数据 for (int i = Dlocation+1; i < length; i++) {if ((char)payload[i]!='E') {CH04[j]=(char)payload[i]; j+=1;} else {Elocation=i,j=0; break;}}//寻找CH4数据 for (int i = Elocation+1; i < length; i++) {if ((char)payload[i]!='F') {CH05[j]=(char)payload[i]; j+=1;} else {Flocation=i,j=0; break;}}//寻找CH5数据 for (int i = Flocation+1; i < length; i++) {if ((char)payload[i]!='G') {CH06[j]=(char)payload[i]; j+=1;} else {Glocation=i,j=0; break;}}//寻找CH6数据 for (int i = Glocation+1; i < length; i++) {if ((char)payload[i]!='H') {CH07[j]=(char)payload[i]; j+=1;} else {Hlocation=i,j=0; break;}}//寻找CH7数据 for (int i = Hlocation+1; i < length; i++) {if ((char)payload[i]!='I') {CH08[j]=(char)payload[i]; j+=1;} else {Ilocation=i,j=0; break;}}//寻找CH8数据 CH11=String(CH01).toInt(); CH22=String(CH02).toInt(); CH33=String(CH03).toInt(); CH44=String(CH04).toInt(); CH55=String(CH05).toInt(); CH66=String(CH06).toInt(); CH77=String(CH07).toInt(); CH88=String(CH08).toInt(); for (int i = 0; i < 5; i++) {CH01[i]='\0';CH02[i]='\0';CH03[i]='\0';CH04[i]='\0'; CH05[i]='\0';CH06[i]='\0';CH07[i]='\0';CH08[i]='\0';}//重置通道临时数据 } else LeCar=0;} } void touch(){ if(LeCar==1) { CH1.write(CH11);CH2.write(CH22);CH3.write(CH33);CH4.write(CH44); CH5.write(CH55);CH6.write(CH66);CH7.write(CH77);CH8.write(CH88); } } void subscribeTopic() { 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..."); } } void connectWifi() { WiFi.begin(ssid, password); while (WiFi.status() != WL_CONNECTED) { digitalWrite(LED_BUILTIN,LOW); delay(500); digitalWrite(LED_BUILTIN,HIGH); delay(500); Serial.print("."); } Serial.println(""); Serial.println("WiFi Connected!"); Serial.println(""); digitalWrite(LED_BUILTIN,HIGH); } void loop() { if (mqttClient.connected()) { // 如果开发板成功连接服务器 mqttClient.loop(); // 处理信息以及心跳 } else { // 如果开发板未能成功连接服务器 connectMQTTserver(); // 则尝试连接服务器 } }