前言

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


流程


模块拼接:

硬件

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服务器:


硬件:
串口监视器: