#include "DS18B20.h" #include "BH1750.h" #include "Wire.h" #include #include #include #include "MCP45HVX1.h" #include "INA226.h" #include #include // 用于存储非易失性数据 #include "TJC_Show.h" #include "RunTime.h" #include "WebServer.h" #include "WiFiControl.h" #include "DigitalPot.h" // Ticker 用于定时检查电流状态 Ticker currentCheckTicker; // MCP45HVX1 数字电位器 MCP45HVX1 mcp45hvx1(0x3C); //TPL0401A 数字电位器 TPL0401A digiPot(0x2E); // INA226 电流监控器 INA226 INA(0x40); AsyncWebServer server(80); // DS18B20 温度传感器 #define DS18B20_PIN 8 OneWire oneWire(DS18B20_PIN); DS18B20 ds18b20(&oneWire); BH1750 bh1750_a; BH1750 bh1750_b; // 风扇控制引脚 #define FAN_PIN1 15 #define FAN_PIN2 16 // 蜂鸣器引脚 #define BUZZER_PIN 17 extern RunTime runtime; Preferences prefs; void WebServer_Init(void) { // 根路径的页面 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.readWiperValue()); 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(); } // 风扇控制 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(ds18b20, bh1750_a, bh1750_b, digiPot, INA); void setup(void) { Serial.begin(115200); // 初始化 I2C 总线 Wire.begin(5, 4); // SDA SCL mcp45hvx1.begin(5, 4); // INA226 初始化 INA.setMaxCurrentShunt(10.0, 0.005); // 设置最大电流和分流电阻 // MCP45HVX1 初始化 //digiPot.begin(5, 4); // 启动定时器,每秒检查电流状态 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); //WiFi 初始化 WiFi_Init(); //WebServer 初始化 WebServer_Init(); // 初始化 runtime NVS runtime.begin(); // 串口屏初始化 tjcShow.init(); tjcShow.showQR(); digiPot.writeWiper(30); } void loop(void) { 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) mcp45hvx1.writeWiper(random(0, 127)); Serial.print("Current Wiper Value: "); Serial.println(mcp45hvx1.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(); //串口屏 FansControl(); Buzzer(); delay(1000); }