#include "DS18B20.h" #include "BH1750.h" #include "Wire.h" #include #include //#include "TCJ_Show.h" //#include "ESP32_WebServer.h" #include #include "MCP45HVX1.h" #include "INA226.h" #include #include // 用于存储非易失性数据 #include "TJC_Show.h" #include "RunTime.h" // Ticker 用于定时检查电流状态 Ticker currentCheckTicker; // MCP45HVX1 数字电位器 MCP45HVX1 digiPot(0x3E); // INA226 电流监控器 INA226 INA(0x40); AsyncWebServer server(80); const char* ssid = "SERVIRST-CT"; const char* password = "servirst8888"; // DS18B20 温度传感器 #define ONE_WIRE_BUS 8 OneWire oneWire(ONE_WIRE_BUS); DS18B20 ds18b20(&oneWire); BH1750 bh1750_a; BH1750 bh1750_b; // 风扇控制引脚 #define FAN_PIN1 15 #define FAN_PIN2 16 // 蜂鸣器引脚 #define BUZZER_PIN 17 extern RunTime runtime; int activeDuration; Preferences prefs; // HTML 页面内容 const char index_html[] PROGMEM = R"rawliteral( ESP32 Data Display

实时数据显示

累计使用时长: 加载中...

温度: 加载中... °C

光照强度(A): 加载中... lx

光照强度(B): 加载中... lx

电位器Wiper值: 加载中...

总线电压: 加载中... V

分流电压: 加载中... mV

电流: 加载中... mA

功率: 加载中... mW

设置Wiper值

)rawliteral"; // 初始化Web void WebServer_Init(const char* ssid, const char* password) { WiFi.begin(ssid, password); // WiFi while (WiFi.status() != WL_CONNECTED) { delay(1000); Serial.println("Connecting to WiFi..."); } Serial.print("Address: "); Serial.println(WiFi.localIP()); // 根路径的页面 server.on("/", HTTP_GET, [](AsyncWebServerRequest *request) { request->send_P(200, "text/html", index_html); }); // 温度接口 server.on("/temperature", HTTP_GET, [](AsyncWebServerRequest *request) { String temp = String(ds18b20.getTempC()); request->send(200, "text/plain", temp); }); // 光照强度(传感器A) server.on("/lightA", HTTP_GET, [](AsyncWebServerRequest *request) { String lightA = String(bh1750_a.readLightLevel()); request->send(200, "text/plain", lightA); }); // 光照(传感器B) server.on("/lightB", HTTP_GET, [](AsyncWebServerRequest *request) { String lightB = String(bh1750_b.readLightLevel()); request->send(200, "text/plain", lightB); }); // 配置Wiper接口 server.on("/wiper", HTTP_GET, [](AsyncWebServerRequest *request) { String wiper = String(digiPot.readWiper()); request->send(200, "text/plain", wiper); }); server.on("/busVoltage", HTTP_GET, [](AsyncWebServerRequest *request) { String busVoltage = String(INA.getBusVoltage(), 3); request->send(200, "text/plain", busVoltage); }); server.on("/shuntVoltage", HTTP_GET, [](AsyncWebServerRequest *request) { String shuntVoltage = String(INA.getShuntVoltage_mV(), 3); request->send(200, "text/plain", shuntVoltage); }); server.on("/current", HTTP_GET, [](AsyncWebServerRequest *request) { String current = String(INA.getCurrent_mA(), 3); request->send(200, "text/plain", current); }); server.on("/power", HTTP_GET, [](AsyncWebServerRequest *request) { String power = String(INA.getPower_mW(), 3); request->send(200, "text/plain", power); }); // 获取累计时长接口 server.on("/duration", HTTP_GET, [](AsyncWebServerRequest *request) { request->send(200, "text/plain", runtime.formatDuration(runtime.getActiveDuration())); }); // 清空累计时长接口 server.on("/resetDuration", HTTP_POST, [](AsyncWebServerRequest *request) { runtime.resetActiveDuration(); request->send(200, "text/plain", "Duration reset"); }); // 接收设置Wiper的请求 server.on("/setWiper", HTTP_POST, [](AsyncWebServerRequest *request) { if (request->hasParam("value", true)) { int wiperValue = request->getParam("value", true)->value().toInt(); digiPot.writeWiper(wiperValue); request->send(200, "text/plain", "Wiper value set"); } else { request->send(400, "text/plain", "Missing value parameter"); } }); server.begin(); //Serial.println("Web server started"); } // 风扇控制 void FansControl(void) { if (ds18b20.getTempC() > 25) { digitalWrite(FAN_PIN1, HIGH); digitalWrite(FAN_PIN2, HIGH); } else { digitalWrite(FAN_PIN1, LOW); digitalWrite(FAN_PIN2, LOW); } } // 蜂鸣器 void Buzzer(void) { if (ds18b20.getTempC() > 20) { digitalWrite(BUZZER_PIN, HIGH); //tone(BUZZER_PIN, 1000, 1000); } else { digitalWrite(BUZZER_PIN, LOW); //noTone(BUZZER_PIN); } } TJC_Show tjcShow(TJC, ds18b20, bh1750_a, bh1750_b, digiPot, INA); void setup(void) { Serial.begin(115200); // 初始化 I2C 总线 Wire.begin(5, 4); // SDA SCL // INA226 初始化 INA.setMaxCurrentShunt(10.0, 0.005); // 设置最大电流和分流电阻 // MCP45HVX1 初始化 digiPot.begin(5, 4); // 启动定时器,每秒检查电流状态 //currentCheckTicker.attach(1, checkCurrent); currentCheckTicker.attach(1, []() { runtime.checkCurrent(); }); //sensor.begin(); // BH1750 初始化 //bh1750_init(bh1750_a, bh1750_b, 36, 35, 21, 20); //1750初始化。sda, scl //Wire.begin(36,35); Wire1.begin(36, 35); bh1750_a.begin(BH1750::CONTINUOUS_HIGH_RES_MODE, 0x23, &Wire); bh1750_b.begin(BH1750::CONTINUOUS_HIGH_RES_MODE, 0x23, &Wire1); //WebServer 初始化 WebServer_Init(ssid, password); // 初始化 runtime NVS runtime.begin(); // 串口屏初始化 tjcShow.TJC_Show_Init(); tjcShow.showQR(); } void loop(void) {// put your main code here, to run repeatedly: ds18b20.printTemperature(); //ds18b20温度 //printLightLevels(bh1750_a, bh1750_b); //bh1750照度 Serial.printf("A: %.0f lux :: B: %.0f lux \n", bh1750_a.readLightLevel(), bh1750_b.readLightLevel()); // MCP45HVX1 操作 //digiPot.writeWiper(127); // 随机设置 Wiper 值,random(0, 256) Serial.print("Current Wiper Value: "); Serial.println(digiPot.readWiper()); // INA226 数据读取 Serial.println("\nBUS\tSHUNT\tCURRENT\tPOWER"); Serial.print(INA.getBusVoltage(), 3); //总线电压 MAX 36V Serial.print("\t"); Serial.print(INA.getShuntVoltage_mV(), 3); //分流电压 Serial.print("\t"); Serial.print(INA.getCurrent_mA(), 3); //通过分流器的电流 Serial.print("\t"); Serial.print(INA.getPower_mW(), 3); //Current x BusVoltage Serial.println(); tjcShow.showINFO(activeDuration); //串口屏 FansControl(); Buzzer(); delay(1000); }