当前位置:首页 > 技术类 > MQTT服务器4G远程遥控小车代码

MQTT服务器4G远程遥控小车代码

微信用户1年前 (2023-01-08)技术类1123

接收机代码

#include <ESP8266WiFi.h>
#include <PubSubClient.h>
#include<Servo.h>

#include <DNSServer.h>
#include <ESP8266WebServer.h>
#include <WiFiManager.h>
// 设置wifi接入信息(根据小车要连接的WiFi信息进行修改)
WiFiServer server(80);

//MQTT服务器地址:broker.hivemq.com   test.ranye-iot.net
const char* mqttServer = "101.43.152.71";
String topicString = "lmwmm001";//与esp32代码中的该部分相同

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

Servo servoA;
Servo servoB;
Servo servoC;
//volatile uint16_t values[6] = {90};
int Avalue=90;
int Bvalue=90;
int Cvalue=90;

WiFiClient wifiClient;
PubSubClient mqttClient(wifiClient);

void setup() {
  Serial.begin(115200);               // 启动串口通讯(波特率为115200,波特率可以理解为串口传输数据的速度)
  pinMode(05,OUTPUT);
  pinMode(04,OUTPUT);
  pinMode(00,OUTPUT);
//  pinMode(15,OUTPUT);
//  pinMode(13,OUTPUT);
//  pinMode(12,OUTPUT);
  
  LED();
  
  servoA.attach(05,500,2500);
  servoA.write(90);
      
  servoB.attach(04);
  servoB.write(90);
      
  servoC.attach(00,500,2500);
  servoC.write(0);
      
//  servo[3].attach(13,500,2500);
//  servo[3].write(0);
//      
//  servo[4].attach(12,500,2500);
//  servo[4].write(0);
//      
//  servo[5].attach(14,500,2500);
//  servo[5].write(0);
  
  WiFiManager wifiManager;
  wifiManager.autoConnect("接收机配网");
  Serial.println("Connected.");
  server.begin();
  
  WiFi.mode(WIFI_STA);  //设置ESP8266工作模式为无线终端模式(8266像手机一样连接到wifi的模式)
  connectWifi();  // 连接WiFi
  mqttClient.setServer(mqttServer, 1883);// 设置MQTT服务器和端口号
  mqttClient.setCallback(receiveCallback);// 设置MQTT订阅回调函数
  connectMQTTserver();// 连接MQTT服务器
}

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

//  for (uint8_t i = 0; i < NUM; i++) 
//  {
//    servo[i].write(values[i]);   
//  }
//  delay(20);
  
}

// 连接MQTT服务器并订阅信息
void connectMQTTserver() {
  // 根据ESP8266的MAC地址生成客户端ID(避免与其它ESP8266的客户端ID重名)
  String clientId = "esp8266-" + 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);
    subscribeTopic(); // 订阅指定主题
  } else {
    Serial.print("MQTT Server Connect Failed. Client State:");
    Serial.println(mqttClient.state());
    //Stop();
    delay(5000);
  }
}

// 收到信息后的回调函数
char AA[4],BB[4],CC[4],DD[4],EE[4],FF[4];//储存接受到的油门和方向数据

int Alocation,Blocation,Clocation,Dlocation,Elocation,Flocation;

int TD1,TD2,TD3,TD4,TD5,TD6;  //CH1 CH2 CH3 CH4 CH5 CH6

void receiveCallback(char* topic, byte* payload, unsigned int length) {
  
  int a=0,b=0,c=0,d=0,e=0,f=0,g=0,h=0,I=0,j=0;
  analogWrite(02,180);
  for ( int i = 0; i <5; i++) //CH1
  {
    if ((char)payload[i]!='A')
    {
      AA[a]=(char)payload[i];
      a+=1;
    }
     else
     {
       Blocation=i;
       break;
     }
   }
   
   for (int i = Blocation+1; i < length; i++) //CH2
   {
     if ((char)payload[i]!='B')
     {
        BB[b]=(char)payload[i];
        b+=1;
     }
     else
     {
        Clocation=i;
        break;
     }
    }

    for (int i = Clocation+1; i < length; i++) //CH3
   {
     if ((char)payload[i]!='C')
     {
        CC[c]=(char)payload[i];
        c+=1;
     }
     else
     {
        Dlocation=i;
        break;
     }
    }

    for (int i = Dlocation+1; i < length; i++) //CH4
   {
     if ((char)payload[i]!='D')
     {
        DD[d]=(char)payload[i];
        d+=1;
     }
     else
     {
        Elocation=i;
        break;
     }
    }

    for (int i = Elocation+1; i < length; i++) //CH5
   {
     if ((char)payload[i]!='E')
     {
        EE[e]=(char)payload[i];
        e+=1;
     }
     else
     {
        Flocation=i;
        break;
     }
    }

    for (int i = Flocation+1; i < length; i++) //CH6
   {
     if ((char)payload[i]!='F')
     {
        FF[f]=(char)payload[i];
        f+=1;
     }
     else
     {
        break;
     }
    }

    TD1=String(AA).toInt();
//    if(TD1>180){
//      TD1=180;  
//    }else if(TD1<0){
//      TD1=0;  
//    } 
    Avalue=TD1;
    
    TD2=String(BB).toInt();
//    if(TD2>180){
//      TD2=180;  
//    }else if(TD2<0){
//      TD2=0;  
//    } 
    Bvalue=TD2;
    
    TD3=String(CC).toInt();  
//    if(TD3<180)
//    {
//      TD3=0;  
//    }else{
//      TD3=180;  
//    }
    Cvalue=TD3;
    
//    TD4=String(DD).toInt();
//    if(TD4<0||TD4<90)
//    {
//      TD4=0;  
//    }else if(TD4>=90&&TD4<180)
//    {
//      TD4=90;  
//    }else{
//      TD4=180;
//    }
//    values[3]=TD4;
       
//    TD5=String(EE).toInt();   
//    if(TD5<0)
//    {
//      TD5=0;  
//    }else if(TD5>=180){
//      TD5=180;  
//    }
//    values[4]=TD5;
    
//    TD6=String(FF).toInt();   
//    if(TD6<0)
//    {
//      TD6=0;  
//    }else if(TD6>=180){
//      TD6=180;  
//    }
//    values[5]=TD6;

//    for(int i=0;i<NUM;i++){
//      Serial.print(values[i]);
//      Serial.print("\t");
//      }
//      Serial.println();
Serial.print(Avalue);
Serial.print("\t");
Serial.print(Bvalue);
Serial.print("\t");
Serial.print(Cvalue);
Serial.println();
Go();
  for (int i = 0; i < 3; i++) 
  {  
      AA[i]='\0';
      BB[i]='\0';
      CC[i]='\0';
      DD[i]='\0';
      EE[i]='\0';
      FF[i]='\0';
  } 
  analogWrite(02,0);
}

// 订阅指定主题
void subscribeTopic() {
  char subTopic[topicString.length() + 1];
  strcpy(subTopic, topicString.c_str());
  if (mqttClient.subscribe(subTopic)) {
    Serial.println("Subscrib Topic:");
    Serial.println(subTopic);
    analogWrite(02,180);
  } else {
    Serial.print("Subscribe Fail...");
    analogWrite(02,0);
   // Stop();
  }
}

void connectWifi() {
  //WiFi.begin(ssid, password);
  //等待WiFi连接,成功连接后输出成功信息
  while (WiFi.status() != WL_CONNECTED) {
    analogWrite(02,0);
    delay(1000);  
    //Stop();
    Serial.print(".");
    analogWrite(02,180);
  }
  Serial.println("");
  Serial.println("WiFi Connected!");
  Serial.println("");
  analogWrite(02,180);
}
void Go(){
  servoA.write(Avalue);
  servoB.write(Bvalue);
  servoC.write(Cvalue);
}
//void Stop()
//{
//  
//  servoA.write(90);
//  servoB.write(90);
//  servoC.write(90);
//  Avalue=90;
//  Bvalue=90;
//  Cvalue=90;
//}
void LED()
{
  analogWrite(02,0);
  for(int i=0;i<=150;i++)
  {
    analogWrite(02,i);
    delay(20);
  }
  for(int i=150;i>=0;i-=2)
  {
    analogWrite(02,i);
    delay(20);
  }
  for(int i=0;i<3;i++)
  {
    analogWrite(02,0);
    delay(180);
    analogWrite(02,180);
    delay(180);
  }
  analogWrite(02,0);
}

发送端代码

#include <ESP8266WiFi.h>
#include <PubSubClient.h>

#include <DNSServer.h>
#include <ESP8266WebServer.h>
#include <WiFiManager.h>

//MQTT服务器地址:broker.hivemq.com   test.ranye-iot.net 43.136.64.172 101.43.152.71
const char* mqttServer = "43.136.64.172";
String topicString = "lmwmm001";

const int CH1=05;    //接收机1通道 
const int CH2=04;    //接收机2通道 
const int CH3=15;    //接收机3通道 
const int CH4=13;    //接收机4通道 
const int CH5=12;    //接收机5通道 
const int CH6=14;    //接收机6通道 

int A,B,C,D,E,F;
 
WiFiClient wifiClient;
PubSubClient mqttClient(wifiClient);
 
void setup() {
  Serial.begin(115200);

  pinMode(CH1,INPUT);
  pinMode(CH2,INPUT);
  pinMode(CH3,INPUT);
  pinMode(CH4,INPUT);
  pinMode(CH5,INPUT);
  pinMode(CH6,INPUT);

  LED();
  analogWrite(16,180);// 电源指示灯
  WiFiManager wifiManager;
  wifiManager.autoConnect("遥控器配网");
  Serial.println("Connected.");
  
  WiFi.mode(WIFI_STA);
  connectWifi();
  mqttClient.setServer(mqttServer, 1883);
  connectMQTTServer();
}
 
void loop() { 
  if (mqttClient.connected()) 
  { 
      // 如果开发板成功连接服务器
      pubMQTTmsg();
      analogWrite(02,180);
      // 保持心跳
      mqttClient.loop();
  } else {     
    analogWrite(02,0);
    connectMQTTServer();   
  }
}
 
void connectMQTTServer(){
  // 根据ESP8266的MAC地址生成客户端ID(避免与其它ESP8266的客户端ID重名)
  String clientId = "esp8266-" + 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);
  }   
}
 
// 发布信息
void pubMQTTmsg(){
  static int value; // 客户端发布信息用数字
  char publishTopic[topicString.length() + 1];  
  strcpy(publishTopic, topicString.c_str());

  A=pulseIn(CH1,HIGH);
  A=map(A/10,100,200,0,180);
  if(A<=0){
    A=0;  
  }else if(A>=180){
    A=180;  
  }
  
  B=pulseIn(CH2,HIGH);
  B=map(B/10,100,200,0,180);
  if(B<=0){
    B=0;  
  }else if(B>=180){
    B=180;  
  }
  
  C=pulseIn(CH3,HIGH);
  C=map(C/10,100,200,0,180);
  if(C<180){
    C=0;
  }else{
    C=180;
  }
  
//  D=pulseIn(CH4,HIGH);
//  D=map(D/10,100,200,0,180);
  D=90;
  if(D<90){
    D=0;
  }else if(D>=90&&D<180){
    D=90;
  }else{
    D=180;  
  }
  
//  E=pulseIn(CH5,HIGH);
//  E=map(E/10,100,200,0,180);
  E=90;
  if(E<0){
    E=0;
  }
  
//  F=pulseIn(CH6,HIGH);
//  F=map(F/10,100,200,0,180);
  F=90;
  if(F<0){
    F=0;
  }
    
  // 建立发布信息。信息内容以Hello World为起始,后面添加发布次数。
  String messageString = String(A)+"A"+String(B)+"B"+String(C)+"C"+String(D)+"D"+String(E)+"E"+String(F)+"F";  
  char publishMsg[messageString.length() + 1];   
  strcpy(publishMsg, messageString.c_str());
  
  // 实现ESP8266向主题发布信息
  if(mqttClient.publish(publishTopic, publishMsg)){
    Serial.println(publishMsg); 
    analogWrite(02,180);
    delay(30);
    analogWrite(02,0);
    delay(30); 
    analogWrite(02,180); 
    delay(30);
    analogWrite(02,0);
    delay(30);   
  } else {
    Serial.println("Message Publish Failed."); 
    analogWrite(02,0);
  }
}
 
// ESP8266连接wifi
void connectWifi(){
 
  //WiFi.begin(ssid, password);
 
  //等待WiFi连接,成功连接后输出成功信息
  while (WiFi.status() != WL_CONNECTED) {
    analogWrite(00,0);
    delay(1000);
    analogWrite(00,180);
    Serial.print(".");
  }
  Serial.println("");
  Serial.println("WiFi Connected!");  
  analogWrite(00,180);
  Serial.println(""); 
}
void LED()
{
  analogWrite(16,0);
  analogWrite(00,0);
  analogWrite(02,0);
  for(int i=0;i<=150;i++)
  {
    analogWrite(16,i);
    analogWrite(00,i);
    analogWrite(02,i);
    delay(20);
  }
  for(int i=150;i>=0;i-=2)
  {
    analogWrite(16,i);
    analogWrite(00,i);
    analogWrite(02,i);
    delay(20);
  }
  for(int i=0;i<3;i++)
  {
    analogWrite(16,0);
    analogWrite(00,0);
    analogWrite(02,0);
    delay(180);
    analogWrite(16,180);
    analogWrite(00,180);
    analogWrite(02,180);
    delay(180);
  }
  analogWrite(16,0);
  analogWrite(00,0);
  analogWrite(02,0);
  
}


扫描二维码推送至手机访问。

版权声明:本文由点度点度金讯时代-BLOG发布,如需转载请注明出处。

本文链接:https://lmwmm.com/post/493.html

分享给朋友:

“MQTT服务器4G远程遥控小车代码” 的相关文章

卫星视角俯瞰冬奥闭幕夜

卫星视角俯瞰冬奥闭幕夜

卫星视角俯瞰冬奥闭幕夜:夜幕中的北京流光溢彩、灯火璀璨 据央视新闻报道称, 2月20日晚,北京冬奥会闭幕式再次惊艳世界。这组卫星从太空中回传的照片中,夜幕中的北京流光溢彩,灯火璀璨。 2月20日,北京在奥运之火缓缓熄灭后...

IE霸占电脑20多年的“垃圾”,终于要彻底再见!

IE霸占电脑20多年的“垃圾”,终于要彻底再见!

这两天看到了一个新闻,微软再次提醒,IE浏览器将在今年6月正式退役。这让我是百感交集,从1995年至今,也有27个年头,在互联网的发展史上,已经可以算是一个“化石”级别的产品了。对于很多人来说,IE浏览器也应该要像“化石”那般,淹没在历史的...

重大突破,电脑能用鸿蒙系统了!

重大突破,电脑能用鸿蒙系统了!

近年来,“缺芯少魂”带来的卡脖子危机为众多行业敲响警钟,我们必须加快国产操作系统替代研发进程.可喜的是,随着国内操作系统市场快速增长以及政策投入力度的加大,国产操作系统正逐渐实现从无到有、从“可用”到“好用”的跨越式发展。同时,一批极具竞争...

专家建议:2G、3G退网,5G取代4G!!

专家建议:2G、3G退网,5G取代4G!!

2023年了,你升级5G网络了吗?近日,工信部公布数据显示,去年我国新建5G基站88.7万个,目前5G基站总量已达到231.2万个,占全球比例超过60%,5G网络建设稳步推进,网络覆盖能力持续提升。我国在用户占比上也领先全球水平,5G用户(...

安卓用户又遭殃?被知名APP偷删手机照片

安卓用户又遭殃?被知名APP偷删手机照片

近日,网友发布视频称,使用小红书 APP 时发现,后台删除自己手机里的相册照片,被手机系统拦截。该网友称:恰好拍到了,下拉菜单栏的时候发现有这个通知。提醒大家要多多注意隐私。该消息在网上引发热议。针对“后台删照片”一事,小红书官方认证的账号...

ChatGPT来了,到底创造了什么

ChatGPT来了,到底创造了什么

ChatGPT引爆“iPhone时刻”,其威力在于语言,使其勾连了物理、精神与观念三大世界;它会创造什么?又会如何革新人类“存在之家”?文丨FT中文网财经版主编 徐瑾ChatGPT持续走热,可以说是2023的年度事件。对此,有人欢呼,新风口...