ESP32F--基于MQTT的数据发布

前言

大创项目是做一个类似手环的部分功能的东西,其中包括传感器的监测,然后在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硬件模块
串口监视器:
在这里插入图片描述

  • 1
    点赞
  • 15
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

小胡同的诗

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值