/* STM32F103C8T6 智能路灯四合一仿真 */
#include <Arduino.h>
#define PIR_PIN PA2
#define LDR_PIN PA0
#define LED_PWM_PIN PA8
#define VOLT_PIN PA1
#define CURR_PIN PA3
const int LIGHT_DAY = 5000; // lux
const int LIGHT_NIGHT = 1000;
const float V_SCALE = 4.0f; // 12 V → 3.3 V
const float ACS_SENS = 0.066f;
const float ACS_ZERO = 2.5f;
int lux, pwmDuty;
bool human;
float voltage, current, power, energy;
unsigned long lastPrint, lastE;
void setup() {
Serial.begin(115200);
pinMode(PIR_PIN, INPUT_PULLDOWN);
pinMode(LED_PWM_PIN, OUTPUT);
analogWriteFrequency(1000); // ← 修正:只传 1 个参数
analogWrite(LED_PWM_PIN, 0);
energy = 0;
lastPrint = lastE = millis();
}
void loop() {
readSensors();
adaptiveDimming();
energyCompute();
if (millis() - lastPrint >= 2000) {
lastPrint = millis();
printStatus();
}
delay(100);
}
/*---------- 传感器采集 ----------*/
void readSensors() {
human = digitalRead(PIR_PIN);
int rawL = analogRead(LDR_PIN); // 0-4095
lux = map(rawL, 0, 4095, 100000, 0);
int rawV = analogRead(VOLT_PIN);
voltage = rawV * (3.3f / 4095.0f) * V_SCALE;
int rawC = analogRead(CURR_PIN);
float cV = rawC * (3.3f / 4095.0f);
current = (cV - ACS_ZERO) / ACS_SENS;
if (current < 0) current = 0;
}
/*---------- 自适应调光 ----------*/
void adaptiveDimming() {
int level;
if (lux > LIGHT_DAY) level = 0;
else if (lux > LIGHT_NIGHT) level = human ? 6 : 2;
else level = human ? 10 : 6;
pwmDuty = (level * 255) / 10;
if (pwmDuty > 255) pwmDuty = 255;
analogWrite(LED_PWM_PIN, pwmDuty);
}
/*---------- 能耗累计 ----------*/
void energyCompute() {
power = voltage * current;
unsigned long dt = millis() - lastE;
if (dt >= 1000) {
energy += (power * dt) / 3600000.0f; // Wh
lastE = millis();
}
}
/*---------- 串口输出 ----------*/
void printStatus() {
Serial.print("Lux="); Serial.print(lux);
Serial.print(" Human="); Serial.print(human ? "YES" : "NO");
Serial.print(" PWM="); Serial.print(pwmDuty);
Serial.print(" U="); Serial.print(voltage, 1); Serial.print("V");
Serial.print(" I="); Serial.print(current, 2); Serial.print("A");
Serial.print(" P="); Serial.print(power, 1); Serial.print("W");
Serial.print(" E="); Serial.print(energy, 3); Serial.println("Wh");
}