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

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

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

接收机代码

#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://www.lmwmm.com/post/493.html

分享给朋友:

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

“如果飞机平安落地,我笑着送你走出客舱,如果不能,我陪你走到最后。”

“如果飞机平安落地,我笑着送你走出客舱,如果不能,我陪你走到最后。”

中国民航安全运行记录...4227天,今日归零。最新消息除了人数上更新为132人(原先报道是133人),暂无其他。民航局已启动应急机制,派出工作组赶赴现场。从下午3点半开始,看着无数民航人朋友圈的我,真的破防了...眼泪绷不住的往出冒。也许...

最近挺火的开灯壁纸×2

最近挺火的开灯壁纸×2

这两天刷抖音看到都在要这个壁纸,分享上来!壁纸源自于网络,我看到了下载出来分享上来,侵权联系删除!这个壁纸保存就是原图!本篇文章来源于微信公众号:             &nbs...

抖音宣布全量开放帐号IP属地功能

抖音宣布全量开放帐号IP属地功能

       4月29日消息,稍早前,有用户发现,抖音也支持了IP属地功能,即作者、评论显示地理位置。今日晚间,“抖音安全中心”微信公众号宣布,抖音一直致力于维护真实有序的社区讨论氛围,确保平台传播内...

【树莓派基础系列教程】2、远程连接树莓派

【树莓派基础系列教程】2、远程连接树莓派

远程连接树莓派核心思想 在联网的状态下,我们可以通过一个叫做SSH的东西,从本地登陆到任何一台我们已知用户名和密码,并且开放了22端口的Linux主机上。SSH本质是建立在应用层基础上的一种安全协议,有兴趣的可以自行Google一下。所以,...

编辑Hosts文件的方法

编辑Hosts文件的方法

Hosts是一个没有扩展名的系统文件,可以用记事本等工具打开,其作用就是将一些常用的网址域名与其对应的IP地址建立一个关联“数据库”,当用户在浏览器中输入一个需要登录的网址时,系统会首先自动从Hosts文件中寻找对应的IP地址,一旦找到,系...

谷歌CEO要求全员测试Bard AI聊天机器人

谷歌CEO要求全员测试Bard AI聊天机器人

2月16日早间消息,据报道,当地时间周三,谷歌母公司Alphabet CEO桑达尔·皮查伊发送内部备忘录,要求谷歌员工贡献2至4个小时,帮助该公司改善其人工智能(AI)聊天机器人Bard。这封邮件称,谷歌目前急需采取行动,赢得下一代AI搜索...