/*
Nesa agregat
uredjaji:
Kontakt on/off - za agregat
gornji ventil za gorivo on off
donji ventil za gorivo on off
servo motor sauh
kontaktor izlazni kad ima 220 sa agregata
start za anlaser
ulazi:
start prekidac
nivo gornjeg rezervoara on off
nivo donjeg rezervoara on off
napon akumulatora
napon agregata 220 detekcija
temperatura motora
temperatura ambijenta
*/
/*
KAD DOBIJE JEDINICU NA START ULAZ POKRECE RAD AGREGATA
KAD IZGUBI JEDINICU NA START ULAZU POKRECE TAJMER ZA GASENJE AGREGATA (10min)
AKO U MEDJUVREMENU DOBIJE JEDINICU NA START ULAZ RESETUJE TAJMER ZA GASENJE I RADI DALJE
POSTUPAK PALENJA:
1.-PROVERAVA STANJE GORIVA U OBA REZERVOARA
AKO IMA GORIVA IDE NA TACKU 2
AKO NEMA GORIVA AKTIVIRA UPOZORENJE I ZAUSTAVLJA PROCEDURU PALENJA
2.-PROVERAVA NAPON AKUMULATORA
AKO JE NAPON AKUMULATORA VECI OD 11.5V IDE NA TACKU 3
AKO JE NAPON AKUMULATORA MANJI OD 11.5V AKTIVIRA UPOZORENJE I ZAUSTAVLJA PROCEDURU PALENJA
3.-UKLJUCUJE KONTAKT
4.-PROVERAVA TEMPERATURU MOTORA
5.-PROVERAVA TEMPERATURU AMBIJENTA
6.-PODESAVA COK PREMA TEMPERATURAMA (RAZRADITI PROCEDURU)
7.-OTVARA DONJI VENTIL
8.-POSTAVLJA VREME STARTOVANJA (t-START) NA 2 SEKUNDE
9.-STARTUJE ANLASER U TRAJANJU (t-START)
10.-PAUZIRA 2 SEKUNDE (OKVIRNO)
11.-PROVERAVA NAPON 220V
AKO IMA 220V:
UKLJUCUJE SKLOPKU POSLE 10 SEKUNDI
REGULISE COK PO ALGORITMU
PRATI STANJE U DONJEM REZERVOARU I PO POTREBI GA DOPUNJUJE (OTVARA GORNJI VENTIL)
AKO U RADU AGREGATA NESTANE GORIVO U GORNJEM REZERVOARU:
PALI UPOZORENJE (GORIVO NA REZERVI)
STARTUJE TAJMER REZERVE GORIVA (2 SATA)
AKO SE DOPUNI GORIVO:
GASI UPOZORENJE (GORIVO NA REZERVI)
RESETUJE TAJMER REZERVE GORIVA
AKO SE NE DOPUNI GORIVO U TOM ROKU:
ZATVARA OBA VENTILA
GASI KONTAKT
GASI UPOZORENJE (GORIVO NA REZERVI)
PALI UPOZORENJE (NEMA GORIVA)
AKO NEMA 220V:
UVECAVA VREME STARTOVANJA (t-START) ZA 1 SEKUNDU
AKO JE t-START MANJE OD 6 IDE NA TACKU 9
AKO JE t-START VECE OD 5:
ZATVARA OBA VENTILA
GASI KONTAKT
PALI UPOZORENJE (NEUSPELO PALENJE)
POSTUPAK GASENJA:
ZATVARA OBA VENTILA
GASI KONTAKT
*/
//Varijabla za izbor koraka u case meniju
//ULAZI:
const int ISTART = 2;
const int INGR = 3;
const int INDR = 4;
const int INA = 5;
const int I220V = 6;
const float ITMOTOR = A0;
const float ITAMBIJENT = A1;
bool START;
bool NGR;
bool NDR;
bool NA;
bool V220;
float TMOTOR;
float TAMBIJENT;
//IZLAZI:
const int KONTAKT = 7;
const int GVG = 8;
const int DVG = 9;
const int SAUH = 10;
const int O220V = 11;
const int ANLASER = 12;
//Varijabla za case
byte state;
class Timer {
private:
unsigned long startTime;
unsigned long duration;
bool running;
bool completed;
public:
Timer(unsigned long durationInSeconds) {
duration = durationInSeconds * 1000; // Konverzija u milisekunde
running = false;
completed = false;
}
void start() {
startTime = millis(); // Pocinje brojanje vremena
running = true;
completed = false;
}
void stop() {
running = false; // Zaustavlja brojac
completed = false;
}
void reset() {
start(); // Ponovo pocinje brojanje
}
bool isRunning() {
return running; // Vraca da li je brojac u radu
}
bool isCompleted() {
if (running && (millis() - startTime >= duration)) {
running = false; // Zavrsava brojanje ako je vreme isteklo
completed = true;
}
return completed; // Vraca da li je brojanje zavrseno
}
unsigned long getRemainingTime() {
if (running) {
unsigned long elapsedTime = millis() - startTime;
if (elapsedTime >= duration) {
return 0; // Brojanje zavrseno
} else {
return (duration - elapsedTime) / 1000; // Vraca preostalo vreme u sekundama
}
} else {
return duration / 1000; // Ako nije pokrenut, vraca celu dužinu trajanja
}
}
};
// Kreiranje razlicitih instanci timer-a sa razlicitim trajanjem
Timer timer1(20); // 20 sekundi
Timer timer2(30); // 30 sekundi
Timer timer3(20); // 20 sekundi
Timer timer4(30); // 30 sekundi
Timer timer5(20); // 20 sekundi
Timer timer6(30); // 30 sekundi
void setup() {
Serial.begin(9600);
Serial.println("1");
//SETOVANJE ULAZA SA INTEGRISANIM PULLUP OTPORINKOM
pinMode(ISTART, INPUT_PULLUP);
pinMode(INGR, INPUT_PULLUP);
pinMode(INDR, INPUT_PULLUP);
pinMode(INA, INPUT_PULLUP);
pinMode(I220V, INPUT_PULLUP);
//SETOVANJE IZLAZA
pinMode(KONTAKT, OUTPUT);
pinMode(GVG, OUTPUT);
pinMode(DVG, OUTPUT);
pinMode(SAUH, OUTPUT);
pinMode(O220V, OUTPUT);
pinMode(ANLASER, OUTPUT);
}
void loop() {
// Povezivanje ulaza sa varijablama u programu
START = digitalRead(ISTART);
NGR = digitalRead(INGR);
NDR = digitalRead(INDR);
NA = digitalRead(INA);
V220 = digitalRead(I220V);
TMOTOR = digitalRead(ITMOTOR);
TAMBIJENT = digitalRead(ITAMBIJENT);
/*
if (START){
state = 1;
timer1.stop();
}
else{
timer1.start();
}
*/
switch (state){
case 1:
break;
case 2:
break;
case 3:
break;
case 4:
break;
case 5:
break;
case 6:
break;
case 7:
break;
case 8:
break;
case 9:
break;
case 10:
break;
case 11:
break;
}
if (Serial.available()) {
char input = Serial.read();
switch (input) {
case 'a':
timer1.start(); // Startuje timer1
break;
case 'b':
timer2.start(); // Startuje timer2
break;
case 'x':
timer1.stop(); // Zaustavlja timer1
break;
case 'y':
timer2.stop(); // Zaustavlja timer2
break;
case 'r':
timer1.reset(); // Resetuje timer1
break;
case 's':
timer2.reset(); // Resetuje timer2
break;
}
}
if (timer1.isCompleted()) {
Serial.println("Timer 1 is completed.");
}
if (timer2.isCompleted()) {
Serial.println("Timer 2 is completed.");
}
// Ispisuje preostalo vreme na serijskom monitoru
if (timer1.isRunning()) {
Serial.print("Preostalo vreme za Timer 1: ");
Serial.println(timer1.getRemainingTime());
}
Serial.println(timer1.getRemainingTime());
delay(1000);
}