Skip to content

Commit 6cd2257

Browse files
committed
first commit
0 parents  commit 6cd2257

6 files changed

+809
-0
lines changed

Config.h

+59
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,59 @@
1+
#ifndef CONFIG_H
2+
#define CONFIG_H
3+
4+
//=============================================================================
5+
// USER CONFIGURATION SECTION
6+
// Edit these settings according to your setup
7+
//=============================================================================
8+
9+
// WiFi Settings (Required)
10+
#define WIFI_SSID "Your_WiFi_Name" // Your WiFi network name
11+
#define WIFI_PASSWORD "Your_Password" // Your WiFi password
12+
13+
// HomeKit Settings
14+
#define HOMEKIT_SETUP_PIN "12345678" // 8-digit code for HomeKit pairing
15+
16+
// Operating Mode
17+
#define DEFAULT_MODE MODE_AUTO // System starts in this mode:
18+
// MODE_AUTO: Automatic grid monitoring
19+
// MODE_MANUAL: Manual control only
20+
// MODE_OFF: System disabled
21+
22+
// GPIO Pin Configuration
23+
#define GRID_MONITOR_PIN 32 // Pin to monitor grid power status
24+
#define GENERATOR_MONITOR_PIN 33 // Pin to monitor generator running status
25+
#define GENERATOR_POWER_PIN 25 // Pin to control generator power
26+
#define GENERATOR_CHOKE_PIN 26 // Pin to control generator choke
27+
#define GENERATOR_STARTER_PIN 27 // Pin to control generator starter motor
28+
#define TRANSFER_SWITCH_PIN 14 // Pin to control transfer switch
29+
30+
// Maximum start attempts
31+
#define MAX_START_ATTEMPTS 3
32+
33+
//=============================================================================
34+
// TIMING CONFIGURATIONS (all values in milliseconds) 1000ms = 1 second
35+
// Only modify these if you understand the implications
36+
//=============================================================================
37+
38+
// Grid Power Monitoring
39+
#define GRID_OUTAGE_CONFIRM_DELAY 10000 // How long to wait before confirming power outage
40+
#define GRID_RESTORE_CONFIRM_DELAY 10000 // How long to wait before confirming power restoration
41+
#define GRID_MONITOR_DEBOUNCE 10000 // Debounce time for grid status changes
42+
43+
// Generator Control Timings
44+
#define POWER_STABILIZE_DELAY 2000 // Time to wait after turning on generator power
45+
#define CHOKE_ENGAGE_DELAY 3000 // Time to wait after engaging choke
46+
#define STARTER_CRANK_DURATION 3000 // How long to run the starter motor
47+
#define START_MONITOR_DURATION 10000 // How long to wait for generator to start
48+
#define RETRY_ATTEMPT_DELAY 5000 // Time between start attempts
49+
50+
// Engine Management
51+
#define CHOKE_WARMUP_DELAY 3000 // Time before releasing choke
52+
#define POST_CHOKE_WARMUP_DELAY 5000 // Additional warm-up after choke release
53+
54+
// Safety Delays
55+
#define TRANSFER_SWITCH_DELAY 10000 // Time before switching power to generator
56+
#define MODE_CHANGE_CHECK_INTERVAL 50 // How often to check for mode changes
57+
#define MANUAL_START_PREP_DELAY 10000 // Delay before manual start
58+
59+
#endif

GeneratorControl.h

+216
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,216 @@
1+
#ifndef GENERATOR_CONTROL_H
2+
#define GENERATOR_CONTROL_H
3+
4+
#include "config.h"
5+
#include "modes.h"
6+
#include <Arduino.h>
7+
8+
class GeneratorControl {
9+
private:
10+
GeneratorState state;
11+
uint8_t startAttempts;
12+
unsigned long startTime;
13+
bool transferSwitchState;
14+
bool shouldAbort; // Add abort flag
15+
SystemMode *currentModePtr; // Add pointer to current mode
16+
SystemMode startingMode; // Add mode tracking
17+
SystemMode currentOpMode; // Current operation mode
18+
19+
void resetStartAttempts() { startAttempts = 0; }
20+
bool isGeneratorRunning() {
21+
return digitalRead(GENERATOR_MONITOR_PIN) == HIGH; // Changed to HIGH for pullup
22+
}
23+
24+
// Add interruptible delay method
25+
bool delayWithModeCheck(unsigned long ms) {
26+
unsigned long start = millis();
27+
while(millis() - start < ms) {
28+
if (shouldAbort || *currentModePtr != startingMode) {
29+
Serial.println("Mode changed during delay - aborting");
30+
return false;
31+
}
32+
delay(50);
33+
}
34+
return true;
35+
}
36+
37+
bool isModeChanged() {
38+
return currentOpMode != *currentModePtr;
39+
}
40+
41+
void updateOpMode() {
42+
currentOpMode = *currentModePtr;
43+
}
44+
45+
bool executeStartSequence() {
46+
shouldAbort = false;
47+
updateOpMode(); // Set initial operation mode
48+
49+
// Initial power and choke sequence
50+
Serial.println("Initializing power and choke");
51+
digitalWrite(GENERATOR_POWER_PIN, LOW);
52+
if (isModeChanged()) {
53+
Serial.println("Mode changed during power-up - stopping");
54+
stopGenerator();
55+
return false;
56+
}
57+
delay(POWER_STABILIZE_DELAY);
58+
59+
digitalWrite(GENERATOR_CHOKE_PIN, LOW);
60+
if (isModeChanged()) {
61+
Serial.println("Mode changed during choke - stopping");
62+
stopGenerator();
63+
return false;
64+
}
65+
delay(CHOKE_ENGAGE_DELAY);
66+
67+
// Check if generator is already running
68+
if (isGeneratorRunning()) {
69+
if (isModeChanged()) {
70+
stopGenerator();
71+
return false;
72+
}
73+
Serial.println("Generator already running - releasing choke");
74+
delay(CHOKE_WARMUP_DELAY);
75+
digitalWrite(GENERATOR_CHOKE_PIN, HIGH);
76+
delay(POST_CHOKE_WARMUP_DELAY);
77+
if (isModeChanged()) {
78+
stopGenerator();
79+
return false;
80+
}
81+
return true;
82+
}
83+
84+
// Try up to 3 times
85+
for (int attempt = 1; attempt <= 3; attempt++) {
86+
updateOpMode(); // Update mode flag at start of each attempt
87+
88+
if (isModeChanged()) {
89+
stopGenerator();
90+
return false;
91+
}
92+
93+
// Start sequence
94+
Serial.printf("Start attempt #%d\n", attempt);
95+
digitalWrite(GENERATOR_STARTER_PIN, LOW);
96+
delay(STARTER_CRANK_DURATION);
97+
digitalWrite(GENERATOR_STARTER_PIN, HIGH);
98+
99+
// Monitor for start
100+
unsigned long startTime = millis();
101+
while (millis() - startTime < START_MONITOR_DURATION) {
102+
if (isModeChanged()) {
103+
stopGenerator();
104+
return false;
105+
}
106+
107+
if (isGeneratorRunning()) {
108+
updateOpMode();
109+
Serial.println("Generator running - waiting before choke release");
110+
delay(CHOKE_WARMUP_DELAY);
111+
112+
if (isModeChanged()) {
113+
stopGenerator();
114+
return false;
115+
}
116+
117+
digitalWrite(GENERATOR_CHOKE_PIN, HIGH);
118+
delay(POST_CHOKE_WARMUP_DELAY);
119+
120+
if (isModeChanged()) {
121+
stopGenerator();
122+
return false;
123+
}
124+
return true;
125+
}
126+
delay(MODE_CHANGE_CHECK_INTERVAL);
127+
}
128+
129+
if (attempt < 3 && !isModeChanged()) {
130+
delay(RETRY_ATTEMPT_DELAY);
131+
}
132+
}
133+
134+
// If we get here, all attempts failed
135+
Serial.println("All start attempts failed - resetting system");
136+
stopGenerator(); // This will reset everything to OFF state
137+
return false;
138+
}
139+
140+
public:
141+
GeneratorControl() : state(GEN_OFF), startAttempts(0), transferSwitchState(false),
142+
currentModePtr(nullptr), currentOpMode(MODE_OFF) {
143+
Serial.println("Generator Control System Initialized");
144+
}
145+
146+
bool startGenerator() {
147+
updateOpMode(); // Update operation mode at start
148+
if (startAttempts >= MAX_START_ATTEMPTS) {
149+
Serial.println("ERROR: Maximum start attempts reached");
150+
stopGenerator(); // Ensure everything is reset
151+
return false;
152+
}
153+
154+
state = GEN_STARTING;
155+
startAttempts++;
156+
Serial.print("Starting generator - Attempt #");
157+
Serial.println(startAttempts);
158+
159+
// Check if already running
160+
if (isGeneratorRunning()) {
161+
Serial.println("Generator already running - skipping start sequence");
162+
state = GEN_RUNNING;
163+
return true;
164+
}
165+
166+
// Execute start sequence
167+
if(executeStartSequence()) {
168+
Serial.println("Generator started successfully");
169+
state = GEN_RUNNING;
170+
return true;
171+
}
172+
173+
Serial.println("Generator failed to start");
174+
if (startAttempts >= MAX_START_ATTEMPTS) {
175+
Serial.println("No more attempts remaining - shutting down");
176+
stopGenerator();
177+
} else {
178+
Serial.println("Preparing for next attempt");
179+
}
180+
return false;
181+
}
182+
183+
void stopGenerator() {
184+
Serial.println("Stopping generator");
185+
digitalWrite(GENERATOR_POWER_PIN, HIGH); // Deactivate
186+
digitalWrite(GENERATOR_CHOKE_PIN, HIGH); // Deactivate
187+
digitalWrite(GENERATOR_STARTER_PIN, HIGH); // Deactivate
188+
digitalWrite(TRANSFER_SWITCH_PIN, HIGH); // Deactivate
189+
state = GEN_OFF;
190+
startAttempts = 0;
191+
Serial.println("Generator stopped - all systems reset");
192+
updateOpMode(); // Update operation mode after stop
193+
}
194+
195+
void setTransferSwitch(bool enable) {
196+
digitalWrite(TRANSFER_SWITCH_PIN, enable ? LOW : HIGH); // Inverted logic
197+
transferSwitchState = enable;
198+
Serial.print("Transfer switch ");
199+
Serial.println(enable ? "ENABLED" : "DISABLED");
200+
}
201+
202+
void abortStartup() {
203+
shouldAbort = true;
204+
Serial.println("Aborting generator startup sequence");
205+
}
206+
207+
void setModePtr(SystemMode *modePtr) {
208+
currentModePtr = modePtr;
209+
updateOpMode(); // Update operation mode when mode pointer changes
210+
}
211+
212+
GeneratorState getState() { return state; }
213+
bool isTransferSwitchEnabled() { return transferSwitchState; }
214+
};
215+
216+
#endif

0 commit comments

Comments
 (0)