Domagoj Šiljeg
/
alarmni_kontroler
Kontroler nadzire beznaponski kontakt i prema njemu aktivira izlaze.
main.cpp
- Committer:
- dsiljeg
- Date:
- 2022-02-23
- Revision:
- 0:981012b786c0
File content as of revision 0:981012b786c0:
#include "mbed.h" Serial pc(USBTX, USBRX); InterruptIn izolacija(USER_BUTTON); // interrupt za aktiviranje izolacije AnalogIn nadzor(PC_1); // nadzor tipkala DigitalIn potvrda(PA_7); // digital input za potvrdu D11 DigitalIn reset(PB_10); // digital input za reset D6 DigitalOut ledAL(PA_9); // digital output za crvenu ledicu D8 DigitalOut ledGR(PA_8); // digital output za zutu ledicu D7 DigitalOut ledRS(PA_10); // digital output za zelenu ledicu D2 void alarm(void); void greska(void); void izolacijaF(void); Timer t_al; Timer t_gr; Timer t_ndz; float f_al = 0.6; // minimalna vrijednost za aktivaciju alarma float f_gr1 = 0.1; // donja granica za gresku float f_gr2 = 0.9; // max vrijednost za aktivaciju alarma i gornja vrijednost za gresku bool IZ = 0; // za aktiviranje izolacije bool AL = 0; // za stanje alarma bool GR = 0; // za stanje greske int main() { izolacija.rise(&izolacijaF); // interruptIn za aktiviranje izolacije potvrda.mode(PullDown); // input za povrdu postavljen u PullDown mod reset.mode(PullDown); // input za reset postavljen u PullDown mod while(1) { if(IZ == 1) { // uvjet za izolaciju koji se aktivira preko interrupta pc.printf("IZOLACIJA! \n\r"); Timer t_pt; AL = 0; GR = 0; ledAL = 0; ledGR = 0; ledRS = 1; t_pt.start(); while(IZ == 1) { if(AL == 1) { if(t_pt.read_ms() == 500) { // aktivira blinkanje crvene ledica ako se pokusa resetirati izolacija, a alarm je aktivan ledAL =! ledAL; } } if(t_pt.read_ms() >= 1000) { ledGR =! ledGR; ledRS =! ledRS; t_pt.reset(); } if(reset && f_gr2 > nadzor.read() && nadzor.read() > f_al) { // signalizira da je alarm aktivan ako se pokusa izaci iz izolacije a tipkalo je stisnuto AL = 1; } if(reset && f_gr1 < nadzor.read() && nadzor.read() < f_al) { // resetiranje izolacije nema greske niti alarma ledAL = 0; ledGR = 0; ledRS = 0; t_pt.stop(); t_pt.reset(); AL = 0; GR = 0; IZ = 0; } } } t_ndz.start(); if(t_ndz.read_ms() > 200) { pc.printf("percentage: %3.3f%%\n\r", nadzor.read()); // ispis vrijednosti nadzornog signala t_ndz.reset(); } while(f_gr2 > nadzor.read() && nadzor.read() > f_al && IZ == 0) { // uvjet za ALARM pc.printf("tipkalo stisnuto \n\r"); t_al.start(); if(t_al.read_ms() > 3000) { // ako je stanje alarma aktivno duze od 3 sekundi poziva se funkcija "alarm()" AL = 1; alarm(); } } ledAL = 0; t_al.stop(); t_al.reset(); while(f_gr2 < nadzor.read() && IZ == 0 || nadzor.read() < f_gr1 && IZ == 0) { // uvjet za GRESKU t_gr.start(); if(t_ndz.read_ms() > 200) { // ispis za nadzor vrijednosti signala pc.printf("greska aktivna: %3.3f%%\n\r", nadzor.read()); ledGR = !ledGR; t_ndz.reset(); } if(t_gr.read_ms() > 5000) { // ako je stanje greske aktivno duze od 5 sekundi poziva se funkcija "greska()" GR = 1; greska(); } } ledGR = 0; t_gr.stop(); t_gr.reset(); } } void izolacijaF() // interrupt funkcija za aktiviranje izolacije { IZ = 1; } void alarm(void) // funkcija za stanje alarma { Timer t_pt; // timer potvrde Timer t_AVC; // izviđanja prije paljenja izvršnih funkcija int x = 0; bool potvrdeno = 0; ledAL = 1; pc.printf("ALARM!!! \n\r"); while(AL == 1 && IZ == 0) { t_pt.start(); if(t_pt.read_ms() >= 1000) { // odbrojavanje 10 sekundi do potvrde ili paljenja izvršnih funkcija ledAL =! ledAL; x = x + 1; t_pt.reset(); } if(x == 10 && potvrdeno == 0) { // ako je proslo 10 sekundi bez potvrde pale se izvrsne funkcije pc.printf("x == 10 \n\r Palim signalizaciju! \n\r"); x = 0; } if (potvrda == 1) { // prihvacanje potvrde potvrdeno = 1; } if(potvrdeno == 1) { // ako je potvrda prihvacena unutar 10 sekundi t_AVC.start(); ledAL = 1; if(t_AVC.read_ms() >= 20000) { // ako nakon potvrde prode 20 sekundi bez reseta pale se izvršne funkcije pc.printf("AVC!!! \n\r Palim signalizaciju! \n\r"); } if(reset && nadzor.read() < f_al) { // resetiranje alarma ako je tipkalo nije u alarmnom stanju potvrdeno = 0; ledAL =0; AL = 0; } } } } void greska(void) // funckija za stanje greške { Timer t_pt; ledAL = 0; ledRS = 0; ledGR = 1; pc.printf("GRESKA!!! \n\r"); while(!potvrda && IZ == 0) { // ceka se potvrda greske t_pt.start(); if(t_pt.read_ms() >= 1000) { ledGR =! ledGR; t_pt.reset(); } } while(f_gr2 > nadzor.read() && nadzor.read() > f_gr1 && IZ == 0 && GR == 1) { // signaliziranje da se moze resetirati potvrdena greska t_pt.start(); ledGR = 1; if(t_pt.read_ms() >= 1000) { ledRS =! ledRS; t_pt.reset(); } if(reset == 1 && f_gr2 > nadzor.read() && nadzor.read() > f_gr1) { // nakon potvrde se moze resetirati ako tipkalo nije u gresci niti alarm ledGR = 0; ledRS = 0; GR = 0; t_pt.stop(); t_pt.reset(); } } }