• 博客园logo
  • 会员
  • 众包
  • 新闻
  • 博问
  • 闪存
  • 赞助商
  • HarmonyOS
  • Chat2DB
    • 搜索
      所有博客
    • 搜索
      当前博客
  • 写随笔 我的博客 短消息 简洁模式
    用户头像
    我的博客 我的园子 账号设置 会员中心 简洁模式 ... 退出登录
    注册 登录
MKT-porter
博客园    首页    新随笔    联系   管理    订阅  订阅
stm32 软串口1接收json数据,软串口2转发,oled显示屏显示
 
 

 

 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);  // 返回控制成功的响应
}

  

posted on 2025-03-01 01:33  MKT-porter  阅读(154)  评论(0)    收藏  举报
刷新页面返回顶部
博客园  ©  2004-2025
浙公网安备 33010602011771号 浙ICP备2021040463号-3