前言
大创项目是做一个类似手环的部分功能的东西,其中包括传感器的监测,然后在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服务器:
硬件:
串口监视器: