35 lines
1.0 KiB
C++
35 lines
1.0 KiB
C++
|
|
// LightControl.cpp
|
||
|
|
|
||
|
|
#include "LightControl.h"
|
||
|
|
#include "Arduino.h"
|
||
|
|
|
||
|
|
LightControl::LightControl(BH1750& sensor, DS3502& pot)
|
||
|
|
: lightSensor(sensor), digitalPot(pot) {}
|
||
|
|
|
||
|
|
void LightControl::setTargetLight(float target) {
|
||
|
|
targetLightLevel = target;
|
||
|
|
}
|
||
|
|
|
||
|
|
float LightControl::getCurrentLight() {
|
||
|
|
return lightSensor.readLightLevel();
|
||
|
|
}
|
||
|
|
|
||
|
|
void LightControl::adjustWiper() {
|
||
|
|
float currentLight = getCurrentLight();
|
||
|
|
float error = targetLightLevel - currentLight;
|
||
|
|
|
||
|
|
// 计算输出变化量(比例控制)
|
||
|
|
int delta = (int)(abs(error) * Kp);
|
||
|
|
if (delta < 1) delta = 1; // 最小调节步长
|
||
|
|
|
||
|
|
if (error > 0) {
|
||
|
|
// 需要增加亮度 -> 减小电位器阻值
|
||
|
|
lastWiperValue = max(0, lastWiperValue - delta);
|
||
|
|
} else if (error < 0) {
|
||
|
|
// 需要减少亮度 -> 增大电位器阻值
|
||
|
|
lastWiperValue = min(127, lastWiperValue + delta);
|
||
|
|
}
|
||
|
|
|
||
|
|
digitalPot.setWiper(lastWiperValue);
|
||
|
|
Serial.printf("Current Light: %.0f lux | Wiper Value: %d\n", currentLight, lastWiperValue);
|
||
|
|
}
|