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

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

微信用户2年前 (2023-01-08)技术类1508

接收机代码

#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远程遥控小车代码” 的相关文章

Google传喜讯:请在 AdSense 中验证您的付款地址

Google传喜讯:请在 AdSense 中验证您的付款地址

我们于 三月 09 2022给您在 AdSense 中向我们提供的付款地址寄去了一个 PIN 码,即个人识别码。您在收到 PIN 码邮件后,请点击本电子邮件中的验证您的地址,然后在 AdSense 首页上的验证卡片中输入您的 PIN 码。...

【树莓派基础系列教程】1、配置和初始化树莓派

【树莓派基础系列教程】1、配置和初始化树莓派

从这周开始,给新手朋友们发布一些树莓派的基础教程~今天是第一课,简单介绍一下什么是树莓派,以及拿到树莓派后第一件要做的事情——配置和初始化树莓派! 什么是树莓派 树莓派的简介,看这里:树莓派是什么?能吃吗 树莓派基础外观图 树莓派外设图树莓...

“充电时真的别玩手机”上热搜,最大的危害是它

“充电时真的别玩手机”上热搜,最大的危害是它

你会在充电时玩手机吗?如今动辄两百多瓦的大功率快充时代,手机边用边充电时是否还会遭遇发热、卡顿、充电慢的问题呢?3月16日下午,“充电时真别玩手机”登上微博热搜榜首位。有很多网友担忧,边充电边玩手机,会不会导致手机爆炸?其实并不会。充电时手...

ChatGPT来了,到底创造了什么

ChatGPT来了,到底创造了什么

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

ChatGPT最强对手Claude上线Slack平台【附教程】

ChatGPT最强对手Claude上线Slack平台【附教程】

你好,这里是AIHub,继续跟你分享人工智能相关的新鲜见闻。近日,Anthropic公司宣布,旗下类ChatGPT产品Claude已经上线Slack平台,每个人都可以免费使用。非常关键的是,国内用户可以正常使用,不再像ChatGPT那样艰难...

「ChatGPT最强竞品」爆火:不限量不要钱免注册!一手实测体验在此

「ChatGPT最强竞品」爆火:不限量不要钱免注册!一手实测体验在此

金磊 丰色 发自 凹非寺免费、支持中文、无需注册、不用骚操作直接可用的类ChatGPT产品,它来了!(此等好事必须第一时间和家人们分享)毫不意外的,目前它的热度已经被炒到不行:而且已经有一波网友抢先体验了一番,铺天盖地的一致好评。例如微博博...