@@ -96,6 +96,34 @@ class led_controller {
96
96
bool charging{false };
97
97
};
98
98
99
+
100
+ class fan_controller {
101
+ public:
102
+ void init () const {
103
+ pinMode (PIN_FAN, OUTPUT);
104
+ analogWrite (PIN_FAN, 0 );
105
+ }
106
+ void poll () {
107
+ if (charging != prev)
108
+ {
109
+ if (charging) {
110
+ analogWrite (PIN_FAN, 255 );
111
+ } else {
112
+ analogWrite (PIN_FAN, 0 );
113
+ }
114
+ }
115
+ prev = charging;
116
+ }
117
+ void set_charging (bool enable) {
118
+ this ->charging = enable;
119
+ }
120
+
121
+ private:
122
+ bool charging{false };
123
+ static constexpr uint8_t PIN_FAN{4 };
124
+ bool prev{false };
125
+ };
126
+
99
127
class manual_switch {
100
128
public:
101
129
enum class STATE {
@@ -224,11 +252,13 @@ class power_controller {
224
252
void init () {
225
253
led.init ();
226
254
relay.init ();
255
+ fan.init ();
227
256
heartbeat_timer.start ();
228
257
}
229
258
void poll () {
230
259
led.poll ();
231
260
terminal.poll ();
261
+ fan.poll ();
232
262
if (relay.is_auto_mode ()) {
233
263
auto elapsed_ms{heartbeat_timer.read_ms ()};
234
264
if (elapsed_ms > 10000 ) {
@@ -256,15 +286,18 @@ class power_controller {
256
286
if (enable && !terminal.is_overheat ()) {
257
287
relay.set_enable (true , CHARGING_MODE::AUTO);
258
288
led.set_charging (true , level);
289
+ fan.set_charging (true );
259
290
} else {
260
291
relay.set_enable (false );
261
292
led.set_charging (false );
293
+ fan.set_charging (false );
262
294
}
263
295
}
264
296
}
265
297
void set_manual_enable (bool enable) {
266
298
relay.set_enable (enable);
267
299
led.set_charging (enable);
300
+ fan.set_charging (enable);
268
301
if (enable) {
269
302
manual_charging_timer.reset ();
270
303
manual_charging_timer.start ();
@@ -282,6 +315,7 @@ class power_controller {
282
315
private:
283
316
led_controller led;
284
317
relay_controller relay;
318
+ fan_controller fan;
285
319
power_terminal terminal;
286
320
simpletimer heartbeat_timer, manual_charging_timer;
287
321
};
0 commit comments