ESP32F--基于MQTT的数据发布

版权声明:孜孜不辍 https://blog.csdn.net/calculate23/article/details/84992583

前言

大创项目是做一个类似手环的部分功能的东西,其中包括传感器的监测,然后在LED屏上显示,WIFI的连接,数据的上传以及服务器端分析结果的接收显示。


流程

Created with Raphaël 2.2.0 开始 设备端口初始化, 包括连接服务器 端、订阅主题等 OK? 读取传感器模拟信号 备份 离线? 断线重连 收到消息推送? 加入到本地,准备显示 发布消息? 发布消息(MQTT) 关闭? 结束 中断 yes no yes no yes no yes no yes no

模块拼接:

硬件

ESP32F、OLED 128*64、心率传感器[采用PPG光电容积脉搏波描记法(PhotoPlethysmoGraphy)测量心率]

数据

MQTT:使用MQTT进行消息通信,模块通过MQTT发布消息到服务器上,而通过订阅分析者的主题得到分析数据

Json:使用Json这种轻量级的格式能够方便数据处理


代码:

main:

#include <Wire.h> 
#include "UI_HeartMechine_Run.h"
#include "UI_Change_View.h"
#include "MQTT_Connection.h"
#include"PubSubClient.h"
#include "Name.h"


//OLED_SDA -- GPIO15
//OLED_SCL -- GPIO14
//OLED_RST -- GPIO16

int cnt = 0,temp = 0,temp1 = 0,k = 0;

void setup() {
  heartValue = 0;
  
  //OLED串口设置
  pinMode(16,OUTPUT);
  digitalWrite(16, LOW);
  delay(50); 
  digitalWrite(16, HIGH); 
  
  Serial.begin(115200);
  Serial.println();

  display.init();

  display.flipScreenVertically();
 // UI_Change();
  delay(50);
 display.setFont(ArialMT_Plain_16);  
 display.clear();
 display.drawString(32, 28, "WiFi:" + ssid);
 display.display();
 delay(5000);
 
 UI_Change();
  delay(50);
  display.setFont(ArialMT_Plain_16);

  WiFi.begin(ssid.c_str(),password.c_str());
  while (WiFi.status()!= WL_CONNECTED) {
    delay(500);
    Serial.println("Connectingto WiFi..");
  }
  Serial.println("Connectedto the WiFi network");  
}

void loop() {
  display.clear();
  Run();  //运行界面
  display.display();

  if (!client.connected()) {
    reconnect();
  }
  client.loop();  
  
  cnt++;
  if(cnt/10 == 1)  //控制时间
  {
    cnt=0;
    My_Time_Demo();
    if(temp==0) {
      data="{device:"+String(MQTT_view)+",'"+String(heartValue)+"':'"+h1+":"+m1+":"+s1+"'}";
      client.publish(MQTT_view,data.c_str());  //硬件端发布消息到服务器端
      temp=0;
    }
    else
      temp++;

    if(temp1==5) {  //模拟服务端发送消息推送  服务器端搭建完成后改代码块无效
      temp1=0;
      ++k%=3;
      client.publish(service_topic,content_table[k].c_str());      
    }
    else
      temp1++;     
   }
   
  delay(100);  //心率传感器刷新频率
}

MQTT_connection:

#include"MQTT_Connection.h"
#include"PubSubClient.h"
 
void callback(char*topic, byte* payload, unsigned int length) {  //接收消息
  Serial.print("Messagearrived in topic: ");
  Serial.println(topic);
  Serial.print("Message:");
  for (int i = 0; i< length; i++) {
    Serial.print((char)payload[i]);
  }
  Serial.println();
  if(strcmp(topic,service_topic) == 0) {
      string_update(payload,length);
      service_speak_time = 50;
      Serial.println(service_message);
  }
  Serial.println("-----------------------");
}

void reconnect() {    //重连
  client.setServer(mqttServer,mqttPort);
  client.setCallback(callback);
  while (!client.connected()){
    Serial.println("Connectingto MQTT...");
    if (client.connect(MQTT_view,mqttUser,mqttPassword)) {
      Serial.println("connected");
      client.subscribe(service_topic);
      client.subscribe(MQTT_view);
    }else {
      Serial.print("failedwith state ");
      Serial.print(client.state());
      delay(2000);
    }
  }  
}

void string_update(byte* payload,unsigned int length) 
{
    for(int i=0;i<length;i++) {
      service_speak_content[i] = (char)payload[i];  
    }
    service_speak_content[length] = 0;
    JsonObject& root = jsonBuffer.parseObject(service_speak_content);
    service_message = root[String("name")].as<String>() + " " + root[String("situation")].as<String>() ;
}

变量声明:

#ifndef TOUCH_VIEW_H_INCLUDE
#define TOUCH_VIEW_H_INCLUDE

#include "SSD1306.h" 
#include<WiFi.h>
#include"PubSubClient.h"
#include "ArduinoJson.h"

extern WiFiClient espClient;
extern PubSubClient client;
extern SSD1306 display;
extern int heartValue;

extern String ssid;
extern String password;
extern char*mqttServer;
extern int mqttPort;
extern char*mqttUser;
extern char*mqttPassword;
extern char* MQTT_view ;
extern int h;
extern int m;
extern int s;
extern int counter;
extern String h1;
extern String m1;
extern String s1;
extern String data;

extern DynamicJsonBuffer jsonBuffer; //开创堆内存的一个Json格式的缓冲区  解析数据包

extern char*service_topic;//服务端的主题
extern int service_speak_time;//从服务端得到消息后显示的时间
extern char service_speak_content[200]; //服务端的消息内容(原文Json未解析)
extern String service_message;  //Json解析完成的消息

extern String content_table[3];  //模拟服务器端Json格式的数据包
#endif

这里还有OLED显示的代码以及相应库的代码,包括PubSubClient的库,这需要到作者的代码仓库去下载,以及Json格式的一些库文件


功能展现:

Apache-Apollo服务器:
在这里插入图片描述
在这里插入图片描述
硬件:ESP32F硬件模块
串口监视器:
在这里插入图片描述

猜你喜欢

转载自blog.csdn.net/calculate23/article/details/84992583