Στο έφτιαξα λίγο γρήγορα, οπότε το βλέπεις και κάνεις τις τροποποιήσεις σου. Στις οδηγίες σου δεν κλείνεις τον inverter μετά από την αλλαγή σε GRID. Στο έβαλα. Θα πρέπει να σκεφτείς τι θα γίνει αν ο inverter δε ξεκινήσει. Επίσης να ξέρεις ότι για να ανιχνεύσει τάση μετά τον inverter θα πρέπει να υπάρχει κάποια κατανάλωση, ώστε να ξεκινάει ο inverter. Δε σου δίνει τάση, αν δεν υπάρχει κλειστό κύκλωμα. Επίσης στον κώδικα που σου παραθέτω, χρησιμοποιώ μεταβλητές για να μην οπλίζουν συνέχεια τα ρελέ. Σε κάθε όπλιση διαδοχικών ρελέ να υπάρχει delay (τουλάχιστον 100ms) γιατί δημιουργούνται περίεργα ρεύματα, το ξέρω από πείρα. Οι χρόνοι σου, 5sec και 1min, κατά την προσωπική μου άποψη είναι υπερβολικοί. Από 100ms και πάνω θα είσαι κομπλέ, αλλά ας παραθέσουν την άποψή τους και οι υπόλοιποι.
Κώδικας:
//Relay
int relay1 = 6; //Grid Power
int relay2 = 5; //Inverter Power
int relay3 = 4; //Inverter SW
int r1, r1t, r2, r2t, r3, r3t;
//Voltage Detectors
int VDA, VDB;
//Loop Conditions-Timers
unsigned long timer, start1, start2, currenttime;
void setup() {
//Serials
Serial.begin(115200);
//Relay
pinMode(relay1, OUTPUT);
digitalWrite(relay1, HIGH);
pinMode(relay2, OUTPUT);
digitalWrite(relay2, HIGH);
pinMode(relay3, OUTPUT);
digitalWrite(relay3, HIGH);
r1 = r1t = r2 = r2t = r3 = r3t = 0;
//Timers
start1 = start2 = 0;
}
void loop() {
currenttime = millis();
// Loop Every 1 sec
if(currenttime - timer >= 1000 ){
//Voltage Detectors
VDA = analogRead(A5);
VDB = analogRead(A6);
//Conditions
if(VDA > 512 && start1 == 0){ //No voltage-No timer
start1 = millis();
}
if(VDA > 512 && currenttime - start1 > 5000){ //No voltage-Phase1-Timer 5000
r3t=1;
}
if(VDA > 512 && currenttime - start1 > 10000){ //No voltage-Phase 2-timer 10000
r1t = 1;
}
if(VDA > 512 && currenttime - start1 > 15000){ //No voltage-Phase 3-timer 15000
if(VDB < 512){ //What happened if inverter doesn't start?
start2 = 0;
}
}
if(VDA < 512){ //Voltage on grid
start2 = millis();
}
if(VDA < 512 && currenttime-start2 > 60000){ //Voltage on grid-Phase 1-timer 1m
r2t = 0;
}
if(VDA < 512 && currenttime-start2 > 65000){ //Voltage on grid-Phase 2-timer 1m + 5000
r1t = 0;
r3t = 0;
start1 = 0;
}
relays();
//Timer
timer = millis();
} //END of Loop 1 sec
}
void relays(){
if(r3t == 1 && r3 == 0){
digitalWrite (relay3, LOW);
delay(100);
r3 = 1;
}
if(r1t == 1 && r1 == 0){
digitalWrite (relay1, LOW);
delay(100);
r1 = 1;
}
if(r2t == 1 && r2 == 0){
digitalWrite (relay2, LOW);
delay(100);
r2 = 1;
}
if(r2t == 0 && r2 == 1){
digitalWrite (relay2, HIGH);
delay(100);
r2 = 0;
}
if(r1t == 0 && r1 == 1){
digitalWrite (relay1, HIGH);
delay(100);
r1 = 0;
}
if(r3t == 0 && r3 == 1){
digitalWrite (relay3, HIGH);
delay(100);
r3 = 0;
}
}