Skip to content

Commit 50f896e

Browse files
committed
reworking pid and ssr libs
add 3 level safety control handle invert duty and logic with esp32 analogwrite shim lib
1 parent d2e8766 commit 50f896e

File tree

2 files changed

+80
-40
lines changed

2 files changed

+80
-40
lines changed

pid.h

Lines changed: 3 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -24,7 +24,7 @@
2424
// da fuq?
2525

2626
uint16_t fullPowerPeriod = 8000; // full power startup pulse period
27-
bool fullPowerStartup = true; // enable full power period
27+
bool fullPowerStartup = true; // enable full power period if startup wanted temp is greater than 5 degrees(arb)
2828

2929
bool pidEnabled = false;
3030
int long pidTimerStart = 0;
@@ -191,7 +191,7 @@ void init_PID(){
191191

192192
void pidStart(){
193193
pidTimerStart = millis();
194-
if((currentTemp<currentTempAvg) && fullPowerStartup){
194+
if((currentTemp-currentTempAvg>5) && fullPowerStartup){
195195
myPID.SetMode(MANUAL);
196196
Output = 250; // output never returns to normal !!!!
197197
}
@@ -225,6 +225,7 @@ void run_PID(){
225225
// Logger.print(Output);
226226
if(fullPowerStartup){
227227
if(millis()-pidTimerStart < fullPowerPeriod){
228+
// handled on startup atm
228229
}
229230
else if(myPID.GetMode() == MANUAL){
230231
Output = 0;

ssr.h

Lines changed: 77 additions & 38 deletions
Original file line numberDiff line numberDiff line change
@@ -13,39 +13,29 @@ bool DEBUG_ssr = true;
1313
#else
1414
bool DEBUG_ssr = false;
1515
#endif
16-
16+
1717
bool ssrDisabled = true; // safety ON
1818
float currentDuty = 0; // ssrpower
19-
bool invertDuty = true; // invert duty logic vcc range
20-
bool invertLOW = false; // Drive SSR with VCC
19+
bool invertDuty = true; // invert duty logic vcc range, true for low side sinking, pwm is high pulse
20+
bool invertLOW = !invertDuty; // Drive SSR with VCC // invert logic for 2 state relay, this is usually opposite of invertDuty
2121

2222
int _ssrRelayPin = -1;
2323

24-
void ssr_off(){
25-
if(_ssrRelayPin >= 0){
26-
Logger.println("[SSR] off");
27-
digitalWrite(_ssrRelayPin, invertLOW ? LOW : HIGH); // @todo esp32 issue? must do analogwrite first
28-
// analogWrite( _ssrRelayPin, 255);
29-
}
30-
}
31-
32-
void ssr_on(){
33-
Logger.println("[SSR] on");
34-
if(_ssrRelayPin > 0) digitalWrite(_ssrRelayPin, invertLOW ? HIGH : LOW);
35-
}
36-
3724
void ssr_init(uint16_t pin){
38-
Logger.println("[SSR] ready on pin " + (String)_ssrRelayPin);
39-
_ssrRelayPin = pin;
40-
pinMode( _ssrRelayPin, OUTPUT );
41-
delay(600);
42-
ssr_off();
43-
4425
#ifdef ESP8266
4526
analogWriteRange(255); // esp8266
4627
// analogWriteFreq(120); // min 100hz
4728
#elif defined(ESP32)
48-
#endif
29+
// analogWriteResolution(_ssrRelayPin, 8);
30+
#endif
31+
32+
//ssr enable
33+
34+
Serial.println("[SSR] READY on pin " + (String)_ssrRelayPin);
35+
_ssrRelayPin = pin;
36+
// ssr_off();
37+
digitalWrite(_ssrRelayPin, invertLOW ? LOW : HIGH);
38+
pinMode( _ssrRelayPin, OUTPUT );
4939
}
5040

5141
void ssr_init(){
@@ -55,6 +45,7 @@ void ssr_init(){
5545
// This is where the SSR is controlled via PWM
5646
void SetSSRFrequency( int duty,int power =1)
5747
{
48+
if(duty!=currentDuty){
5849
// calculate the wanted duty based on settings power override
5950
duty = ((float)duty * power ); // power adjust
6051
duty = constrain( round_f( duty ), 0, 255); // round and clamp
@@ -69,25 +60,43 @@ void SetSSRFrequency( int duty,int power =1)
6960
#ifdef ESP8266
7061
analogWrite( _ssrRelayPin, out);
7162
#elif defined(ESP32)
63+
Serial.println("[DAC] - " + (String)out);
7264
analogWrite( _ssrRelayPin, out);
7365
// dacWrite(_ssrRelayPin,out);
7466
#endif
7567
// if(duty == 0)ssr_off();
7668
// if(duty == 255)ssr_on();
7769
}
78-
else ssr_off(); // ENFORCE SAFETY
70+
// else ssr_off(); // ENFORCE SAFETY
7971

80-
if(duty!=currentDuty){
8172
// if(DEBUG_ssr) Logger.println("[SSR] " + (String)duty);
82-
if(duty<1 && DEBUG_ssr) Logger.println("[SSR]: duty OFF - " + (String)out);
73+
if(duty<1 && DEBUG_ssr) Logger.println("[SSR]: Duty OFF - " + (String)out);
8374
else{
84-
if(DEBUG_ssr) Logger.print("[SSR] ON");
75+
if(DEBUG_ssr) Logger.print("[SSR] Duty ON");
8576
if(DEBUG_ssr) Logger.println( " - duty: " + (String)duty + " " + String( ( duty / 256.0 ) * 100) + "%" +" pow:" + String( round_f( power * 100 )) + "%" );
8677
}
8778
}
8879
currentDuty = duty;
8980
}
9081

82+
void ssr_off(){
83+
if(_ssrRelayPin >= 0){
84+
Logger.println("[SSR] OFF");
85+
SetSSRFrequency(0); //working
86+
analogWrite( _ssrRelayPin, invertDuty ? 255 : 0 ); // MUST use analogwrite if using shim lib
87+
// digitalWrite(_ssrRelayPin, invertLOW ? LOW : HIGH); // @todo esp32 issue? must do analogwrite first
88+
}
89+
}
90+
91+
void ssr_on(){
92+
if(_ssrRelayPin > 0) {
93+
Logger.println("[SSR] ON");
94+
SetSSRFrequency(255); // working
95+
analogWrite( _ssrRelayPin, invertDuty ? 0: 255);
96+
// digitalWrite(_ssrRelayPin, invertLOW ? HIGH : LOW);
97+
}
98+
}
99+
91100
void setSSR(int duty){
92101
SetSSRFrequency(duty);
93102
}
@@ -107,11 +116,27 @@ float getSSRPower(){
107116
}
108117

109118
void ssr_resume(){
110-
if(_ssrRelayPin > 0) setSSR(currentDuty);
119+
Serial.println("[SSR] ssr_resume");
120+
if(_ssrRelayPin >= 0) setSSR(currentDuty);
111121
}
112122

113123
void disableSSR(bool disabled = true){
124+
Serial.println("[SSR] disable ssr - " + (String)disabled);
125+
setSSR(0);
126+
ssr_off();
114127
ssrDisabled = disabled;
128+
// init safe state, lockdown
129+
pinMode(_ssrRelayPin,INPUT_PULLUP);
130+
}
131+
132+
void enableSSR(bool disabled = true){
133+
Serial.println("[SSR] disable ssr - " + (String)disabled);
134+
setSSR(0);
135+
ssr_off();
136+
ssrDisabled = disabled;
137+
// init safe state
138+
pinMode(_ssrRelayPin,OUTPUT);
139+
ssr_off();
115140
}
116141

117142
void toggleSSR(){
@@ -154,21 +179,35 @@ void ssrTest(int speed){
154179
}
155180

156181
void ssrPing(int speed){
157-
182+
Serial.println("[SSR] PING");
183+
184+
ssrDisabled = false;
185+
ssr_off();
186+
ssr_off();
187+
188+
delay(500);
158189
ssr_on();
159-
delay(1000);
190+
delay(speed*3);
160191
ssr_off();
192+
delay(speed*3);
193+
ssr_on();
194+
delay(speed*2);
195+
ssr_off();
196+
delay(speed*2);
197+
ssr_on();
198+
delay(speed);
161199

162-
for(int i=0;i<255;i+20){
163-
SetSSRFrequency( i );
164-
delay(100);
165-
}
200+
// for(int i=0;i<255;i+20){
201+
// SetSSRFrequency( i );
202+
// delay(100);
203+
// }
166204

167-
for(int i=0;i<255;i+20){
168-
SetSSRFrequency( 255-i );
169-
delay(100);
170-
}
205+
// for(int i=0;i<255;i+20){
206+
// SetSSRFrequency( 255-i );
207+
// delay(100);
208+
// }
171209

172210
ssr_off();
211+
ssrDisabled = true;
173212
}
174213
#endif

0 commit comments

Comments
 (0)