stm32
/*
OLED 屏幕通常使用 I2C 接口,默认的 SCL 和 SDA 引脚分别为 PB6 和 PB7。
硬串口的引脚分配为:
Serial1:PA9(TX),PA10(RX)
Serial2:PA2(TX),PA3(RX)
Serial3:PB10(TX),PB11(RX)
*/
#include <U8g2lib.h>
#include <ArduinoJson.h>
#define BEEPER_PIN PA11 // 假设蜂鸣器连接在引脚3
#ifdef U8X8_HAVE_HW_SPI
#include <SPI.h>
#endif
#ifdef U8X8_HAVE_HW_I2C
#include <Wire.h>
#endif
U8G2_SSD1306_128X64_NONAME_F_SW_I2C u8g2(U8G2_R0, /* clock=*/ PB6, /* data=*/ PB7, /* reset=*/ U8X8_PIN_NONE);
void setup() {
// 初始化串口
Serial.begin(9600); // 串口1用于调试
Serial2.begin(9600); // 硬串口2接收数据
Serial3.begin(9600); // 硬串口3发送数据
// 初始化OLED显示
u8g2.begin();
// 清屏并显示A0数据
u8g2.clearBuffer(); // 清空显示缓冲区
u8g2.setFont(u8g2_font_ncenB08_tr); // 设置字体
u8g2.drawStr(0, 10, "Pressure: wait..."); // 在屏幕上打印文本
u8g2.drawStr(0, 20, "ALARM: wait...");
// 显示更新
u8g2.sendBuffer(); // 将数据发送到显示屏
// 设置蜂鸣器引脚为输出
pinMode(BEEPER_PIN, OUTPUT);
Serial.println(F("开始运行"));
}
int pressure =0;
void loop() {
// 检查硬串口2 (Serial2) 是否有数据可供读取
if (Serial2.available() > 0) {
// 读取数据直到遇到换行符
String inputString = Serial2.readStringUntil('\n'); // 使用 readStringUntil 读取直到换行符
if (inputString.length() > 0) {
parseAndDisplayData(inputString);
}
}
// 清屏并显示A0数据
u8g2.clearBuffer(); // 清空显示缓冲区
u8g2.setFont(u8g2_font_ncenB08_tr); // 设置字体
u8g2.drawStr(0, 10, "pressure: "); // 在屏幕上打印文本
u8g2.setCursor(43, 10);
u8g2.print(pressure); // 显示 A0 数据
// 检查A0值是否超过300
if (pressure > 240) {
// 超过300,触发报警
u8g2.drawStr(0, 20, "ALARM: 1");
digitalWrite(BEEPER_PIN, HIGH); // 启动蜂鸣器
} else {
// 未超过300,正常显示
u8g2.drawStr(0, 20, "ALARM: 0");
digitalWrite(BEEPER_PIN, LOW); // 关闭蜂鸣器
}
// 显示更新
u8g2.sendBuffer(); // 将数据发送到显示屏
}
void parseAndDisplayData(String data) {
// 创建一个用于解析的JSON文档
StaticJsonDocument<200> doc;
// 解析接收到的JSON数据
DeserializationError error = deserializeJson(doc, data);
if (error) {
// JSON解析失败,打印错误
Serial.print(F("解析失败: "));
Serial.println(error.c_str());
return;
}
// 获取A0数据
pressure= doc["A0"];
String msg= "{\"pressure\":"+ String(pressure)+","+"\"alarm\":"+"\"关闭\""+"}";
Serial3.println(msg);
Serial.println("STM32--"+msg);
// 输出数据到硬串口3 (Serial3)
// Serial3.print("{\"pressure\":");
// Serial3.print(A0_data);
// Serial3.println("}");
}
esp发送
esp接受
#include <ESP8266WiFi.h>
#include <ESP8266WebServer.h>
#include <FS.h> // 文件系统库
#include <ArduinoJson.h>
#include <SoftwareSerial.h> // 软串口库
const char *ssid = "ESP8266_Hotspot"; // 热点名称
const char *password = "love123456"; // 热点密码
ESP8266WebServer server(80); // 创建 HTTP 服务器,监听端口 80
bool alarmState = false; // 默认报警器关闭
float pressure = 100.0; // 假设压力值为 1013 hPa
#define BEEPER_PIN D4 // 假设蜂鸣器连接在引脚3
// 创建软串口,使用 D1 和 D2 引脚
SoftwareSerial softSerial(D1, D2);//D1 为 RX, D2 为 TX
void setup() {
Serial.begin(9600); // 启动串口调试
softSerial.begin(9600); // 启动软串口,波特率为 9600
// 初始化文件系统
if (!SPIFFS.begin()) {
Serial.println("SPIFFS 初始化失败!");
return;
}
// 设置为热点模式
WiFi.softAP(ssid, password);
Serial.println("Hotspot created");
Serial.print("IP Address: ");
Serial.println(WiFi.softAPIP()); // 打印热点 IP 地址
// 设置蜂鸣器引脚为输出
pinMode(BEEPER_PIN, OUTPUT);
digitalWrite(BEEPER_PIN, HIGH); // 关闭蜂鸣器
// 设置根目录的请求处理函数,返回 HTML 文件
server.on("/", HTTP_GET, handleRoot);
server.on("/data", HTTP_GET, handleData); // 用于动态数据访问
server.on("/chart.js", HTTP_GET, handleChartJS); // 修改为 /chart.js 路由
server.on("/control-alarm", HTTP_GET, handleControlAlarm); // 控制报警器
server.begin();
Serial.println("esp3-交互网页模块开启 ");
}
void loop() {
server.handleClient(); // 处理网页请求
// 检查软串口是否有数据
if (softSerial.available()) {
String jsonData = softSerial.readStringUntil('\n'); // 读取一行数据
// 解析 JSON 数据
StaticJsonDocument<200> doc;
DeserializationError error = deserializeJson(doc, jsonData);
if (!error) {
// 提取压力和报警状态
pressure = doc["pressure"];
alarmState = doc["alarm"];
Serial.print("esp3交互网页模块- 压力: ");
Serial.println(pressure);
Serial.print("报警状态: ");
if(pressure>240){
alarmState="开启";
digitalWrite(BEEPER_PIN, LOW); // 启动蜂鸣器
}
else{
alarmState="关闭"; // alarmState="开启";
digitalWrite(BEEPER_PIN, HIGH); // 启动蜂鸣器
}
Serial.println(alarmState );
} else {
Serial.println("JSON 解析失败!");
}
}
}
void handleRoot() {
// 从 SPIFFS 中读取 HTML 文件
File file = SPIFFS.open("/index.html", "r");
if (!file) {
server.send(404, "text/plain", "File not found");
return;
}
server.streamFile(file, "text/html"); // 返回 HTML 文件
file.close();
}
void handleChartJS() {
// 从 SPIFFS 中读取 Chart.js 文件
File file = SPIFFS.open("/chart.js", "r"); // 这里读取 /chart.js 文件
if (!file) {
server.send(404, "text/plain", "File not found");
return;
}
server.streamFile(file, "application/javascript"); // 返回 Chart.js 文件
file.close();
}
void handleData() {
// 构造 JSON 响应
String jsonResponse = "{\"pressure\": " + String(pressure) + ", \"alarm\": " + (alarmState ? "true" : "false") + "}";
server.send(200, "application/json", jsonResponse); // 返回 JSON 数据
}
void handleControlAlarm() {
String state = server.arg("state"); // 获取控制参数
if (state == "on") {
alarmState = true;
// 通过软串口将控制命令发送出去
Serial.println("ALARM_ON");
Serial.println("报警器已开启");
alarmState="开启";
digitalWrite(BEEPER_PIN, LOW); // 启动蜂鸣器
} else if (state == "off") {
alarmState = false;
// 通过软串口将控制命令发送出去
Serial.println("ALARM_OFF");
Serial.println("报警器已关闭");
alarmState="关闭";
digitalWrite(BEEPER_PIN, HIGH); // 关闭蜂鸣器
}
// 返回 JSON 响应
String jsonResponse =String() + "{\"success\": \""+ alarmState +"\"}";
server.send(200, "application/json", jsonResponse); // 返回控制成功的响应
}
浙公网安备 33010602011771号