Kontroler nadzire beznaponski kontakt i prema njemu aktivira izlaze.

Committer:
dsiljeg
Date:
Wed Feb 23 22:37:57 2022 +0000
Revision:
0:981012b786c0
alarmni_kontroler

Who changed what in which revision?

UserRevisionLine numberNew contents of line
dsiljeg 0:981012b786c0 1 #include "mbed.h"
dsiljeg 0:981012b786c0 2
dsiljeg 0:981012b786c0 3 Serial pc(USBTX, USBRX);
dsiljeg 0:981012b786c0 4
dsiljeg 0:981012b786c0 5 InterruptIn izolacija(USER_BUTTON); // interrupt za aktiviranje izolacije
dsiljeg 0:981012b786c0 6
dsiljeg 0:981012b786c0 7 AnalogIn nadzor(PC_1); // nadzor tipkala
dsiljeg 0:981012b786c0 8
dsiljeg 0:981012b786c0 9 DigitalIn potvrda(PA_7); // digital input za potvrdu D11
dsiljeg 0:981012b786c0 10 DigitalIn reset(PB_10); // digital input za reset D6
dsiljeg 0:981012b786c0 11 DigitalOut ledAL(PA_9); // digital output za crvenu ledicu D8
dsiljeg 0:981012b786c0 12 DigitalOut ledGR(PA_8); // digital output za zutu ledicu D7
dsiljeg 0:981012b786c0 13 DigitalOut ledRS(PA_10); // digital output za zelenu ledicu D2
dsiljeg 0:981012b786c0 14
dsiljeg 0:981012b786c0 15 void alarm(void);
dsiljeg 0:981012b786c0 16 void greska(void);
dsiljeg 0:981012b786c0 17 void izolacijaF(void);
dsiljeg 0:981012b786c0 18
dsiljeg 0:981012b786c0 19 Timer t_al;
dsiljeg 0:981012b786c0 20 Timer t_gr;
dsiljeg 0:981012b786c0 21 Timer t_ndz;
dsiljeg 0:981012b786c0 22
dsiljeg 0:981012b786c0 23
dsiljeg 0:981012b786c0 24 float f_al = 0.6; // minimalna vrijednost za aktivaciju alarma
dsiljeg 0:981012b786c0 25 float f_gr1 = 0.1; // donja granica za gresku
dsiljeg 0:981012b786c0 26 float f_gr2 = 0.9; // max vrijednost za aktivaciju alarma i gornja vrijednost za gresku
dsiljeg 0:981012b786c0 27
dsiljeg 0:981012b786c0 28 bool IZ = 0; // za aktiviranje izolacije
dsiljeg 0:981012b786c0 29 bool AL = 0; // za stanje alarma
dsiljeg 0:981012b786c0 30 bool GR = 0; // za stanje greske
dsiljeg 0:981012b786c0 31
dsiljeg 0:981012b786c0 32
dsiljeg 0:981012b786c0 33 int main()
dsiljeg 0:981012b786c0 34 {
dsiljeg 0:981012b786c0 35 izolacija.rise(&izolacijaF); // interruptIn za aktiviranje izolacije
dsiljeg 0:981012b786c0 36
dsiljeg 0:981012b786c0 37 potvrda.mode(PullDown); // input za povrdu postavljen u PullDown mod
dsiljeg 0:981012b786c0 38 reset.mode(PullDown); // input za reset postavljen u PullDown mod
dsiljeg 0:981012b786c0 39
dsiljeg 0:981012b786c0 40 while(1) {
dsiljeg 0:981012b786c0 41
dsiljeg 0:981012b786c0 42 if(IZ == 1) { // uvjet za izolaciju koji se aktivira preko interrupta
dsiljeg 0:981012b786c0 43 pc.printf("IZOLACIJA! \n\r");
dsiljeg 0:981012b786c0 44 Timer t_pt;
dsiljeg 0:981012b786c0 45 AL = 0;
dsiljeg 0:981012b786c0 46 GR = 0;
dsiljeg 0:981012b786c0 47
dsiljeg 0:981012b786c0 48 ledAL = 0;
dsiljeg 0:981012b786c0 49 ledGR = 0;
dsiljeg 0:981012b786c0 50 ledRS = 1;
dsiljeg 0:981012b786c0 51
dsiljeg 0:981012b786c0 52 t_pt.start();
dsiljeg 0:981012b786c0 53
dsiljeg 0:981012b786c0 54 while(IZ == 1) {
dsiljeg 0:981012b786c0 55
dsiljeg 0:981012b786c0 56 if(AL == 1) {
dsiljeg 0:981012b786c0 57 if(t_pt.read_ms() == 500) { // aktivira blinkanje crvene ledica ako se pokusa resetirati izolacija, a alarm je aktivan
dsiljeg 0:981012b786c0 58 ledAL =! ledAL;
dsiljeg 0:981012b786c0 59 }
dsiljeg 0:981012b786c0 60 }
dsiljeg 0:981012b786c0 61
dsiljeg 0:981012b786c0 62 if(t_pt.read_ms() >= 1000) {
dsiljeg 0:981012b786c0 63 ledGR =! ledGR;
dsiljeg 0:981012b786c0 64 ledRS =! ledRS;
dsiljeg 0:981012b786c0 65 t_pt.reset();
dsiljeg 0:981012b786c0 66 }
dsiljeg 0:981012b786c0 67
dsiljeg 0:981012b786c0 68 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
dsiljeg 0:981012b786c0 69 AL = 1;
dsiljeg 0:981012b786c0 70 }
dsiljeg 0:981012b786c0 71
dsiljeg 0:981012b786c0 72 if(reset && f_gr1 < nadzor.read() && nadzor.read() < f_al) { // resetiranje izolacije nema greske niti alarma
dsiljeg 0:981012b786c0 73 ledAL = 0;
dsiljeg 0:981012b786c0 74 ledGR = 0;
dsiljeg 0:981012b786c0 75 ledRS = 0;
dsiljeg 0:981012b786c0 76 t_pt.stop();
dsiljeg 0:981012b786c0 77 t_pt.reset();
dsiljeg 0:981012b786c0 78 AL = 0;
dsiljeg 0:981012b786c0 79 GR = 0;
dsiljeg 0:981012b786c0 80 IZ = 0;
dsiljeg 0:981012b786c0 81 }
dsiljeg 0:981012b786c0 82 }
dsiljeg 0:981012b786c0 83 }
dsiljeg 0:981012b786c0 84
dsiljeg 0:981012b786c0 85 t_ndz.start();
dsiljeg 0:981012b786c0 86
dsiljeg 0:981012b786c0 87 if(t_ndz.read_ms() > 200) {
dsiljeg 0:981012b786c0 88 pc.printf("percentage: %3.3f%%\n\r", nadzor.read()); // ispis vrijednosti nadzornog signala
dsiljeg 0:981012b786c0 89 t_ndz.reset();
dsiljeg 0:981012b786c0 90 }
dsiljeg 0:981012b786c0 91
dsiljeg 0:981012b786c0 92 while(f_gr2 > nadzor.read() && nadzor.read() > f_al && IZ == 0) { // uvjet za ALARM
dsiljeg 0:981012b786c0 93 pc.printf("tipkalo stisnuto \n\r");
dsiljeg 0:981012b786c0 94 t_al.start();
dsiljeg 0:981012b786c0 95 if(t_al.read_ms() > 3000) { // ako je stanje alarma aktivno duze od 3 sekundi poziva se funkcija "alarm()"
dsiljeg 0:981012b786c0 96 AL = 1;
dsiljeg 0:981012b786c0 97 alarm();
dsiljeg 0:981012b786c0 98 }
dsiljeg 0:981012b786c0 99 }
dsiljeg 0:981012b786c0 100
dsiljeg 0:981012b786c0 101 ledAL = 0;
dsiljeg 0:981012b786c0 102 t_al.stop();
dsiljeg 0:981012b786c0 103 t_al.reset();
dsiljeg 0:981012b786c0 104
dsiljeg 0:981012b786c0 105 while(f_gr2 < nadzor.read() && IZ == 0 || nadzor.read() < f_gr1 && IZ == 0) { // uvjet za GRESKU
dsiljeg 0:981012b786c0 106 t_gr.start();
dsiljeg 0:981012b786c0 107
dsiljeg 0:981012b786c0 108 if(t_ndz.read_ms() > 200) { // ispis za nadzor vrijednosti signala
dsiljeg 0:981012b786c0 109 pc.printf("greska aktivna: %3.3f%%\n\r", nadzor.read());
dsiljeg 0:981012b786c0 110 ledGR = !ledGR;
dsiljeg 0:981012b786c0 111 t_ndz.reset();
dsiljeg 0:981012b786c0 112 }
dsiljeg 0:981012b786c0 113
dsiljeg 0:981012b786c0 114 if(t_gr.read_ms() > 5000) { // ako je stanje greske aktivno duze od 5 sekundi poziva se funkcija "greska()"
dsiljeg 0:981012b786c0 115 GR = 1;
dsiljeg 0:981012b786c0 116 greska();
dsiljeg 0:981012b786c0 117 }
dsiljeg 0:981012b786c0 118 }
dsiljeg 0:981012b786c0 119
dsiljeg 0:981012b786c0 120 ledGR = 0;
dsiljeg 0:981012b786c0 121 t_gr.stop();
dsiljeg 0:981012b786c0 122 t_gr.reset();
dsiljeg 0:981012b786c0 123
dsiljeg 0:981012b786c0 124 }
dsiljeg 0:981012b786c0 125 }
dsiljeg 0:981012b786c0 126
dsiljeg 0:981012b786c0 127 void izolacijaF() // interrupt funkcija za aktiviranje izolacije
dsiljeg 0:981012b786c0 128 {
dsiljeg 0:981012b786c0 129 IZ = 1;
dsiljeg 0:981012b786c0 130 }
dsiljeg 0:981012b786c0 131
dsiljeg 0:981012b786c0 132 void alarm(void) // funkcija za stanje alarma
dsiljeg 0:981012b786c0 133 {
dsiljeg 0:981012b786c0 134 Timer t_pt; // timer potvrde
dsiljeg 0:981012b786c0 135 Timer t_AVC; // izviđanja prije paljenja izvršnih funkcija
dsiljeg 0:981012b786c0 136 int x = 0;
dsiljeg 0:981012b786c0 137 bool potvrdeno = 0;
dsiljeg 0:981012b786c0 138
dsiljeg 0:981012b786c0 139 ledAL = 1;
dsiljeg 0:981012b786c0 140 pc.printf("ALARM!!! \n\r");
dsiljeg 0:981012b786c0 141 while(AL == 1 && IZ == 0) {
dsiljeg 0:981012b786c0 142 t_pt.start();
dsiljeg 0:981012b786c0 143
dsiljeg 0:981012b786c0 144 if(t_pt.read_ms() >= 1000) { // odbrojavanje 10 sekundi do potvrde ili paljenja izvršnih funkcija
dsiljeg 0:981012b786c0 145 ledAL =! ledAL;
dsiljeg 0:981012b786c0 146 x = x + 1;
dsiljeg 0:981012b786c0 147 t_pt.reset();
dsiljeg 0:981012b786c0 148 }
dsiljeg 0:981012b786c0 149
dsiljeg 0:981012b786c0 150 if(x == 10 && potvrdeno == 0) { // ako je proslo 10 sekundi bez potvrde pale se izvrsne funkcije
dsiljeg 0:981012b786c0 151 pc.printf("x == 10 \n\r Palim signalizaciju! \n\r");
dsiljeg 0:981012b786c0 152 x = 0;
dsiljeg 0:981012b786c0 153 }
dsiljeg 0:981012b786c0 154
dsiljeg 0:981012b786c0 155 if (potvrda == 1) { // prihvacanje potvrde
dsiljeg 0:981012b786c0 156 potvrdeno = 1;
dsiljeg 0:981012b786c0 157 }
dsiljeg 0:981012b786c0 158
dsiljeg 0:981012b786c0 159 if(potvrdeno == 1) { // ako je potvrda prihvacena unutar 10 sekundi
dsiljeg 0:981012b786c0 160 t_AVC.start();
dsiljeg 0:981012b786c0 161 ledAL = 1;
dsiljeg 0:981012b786c0 162
dsiljeg 0:981012b786c0 163 if(t_AVC.read_ms() >= 20000) { // ako nakon potvrde prode 20 sekundi bez reseta pale se izvršne funkcije
dsiljeg 0:981012b786c0 164 pc.printf("AVC!!! \n\r Palim signalizaciju! \n\r");
dsiljeg 0:981012b786c0 165 }
dsiljeg 0:981012b786c0 166
dsiljeg 0:981012b786c0 167 if(reset && nadzor.read() < f_al) { // resetiranje alarma ako je tipkalo nije u alarmnom stanju
dsiljeg 0:981012b786c0 168 potvrdeno = 0;
dsiljeg 0:981012b786c0 169 ledAL =0;
dsiljeg 0:981012b786c0 170 AL = 0;
dsiljeg 0:981012b786c0 171 }
dsiljeg 0:981012b786c0 172 }
dsiljeg 0:981012b786c0 173 }
dsiljeg 0:981012b786c0 174 }
dsiljeg 0:981012b786c0 175
dsiljeg 0:981012b786c0 176 void greska(void) // funckija za stanje greške
dsiljeg 0:981012b786c0 177 {
dsiljeg 0:981012b786c0 178 Timer t_pt;
dsiljeg 0:981012b786c0 179
dsiljeg 0:981012b786c0 180 ledAL = 0;
dsiljeg 0:981012b786c0 181 ledRS = 0;
dsiljeg 0:981012b786c0 182 ledGR = 1;
dsiljeg 0:981012b786c0 183
dsiljeg 0:981012b786c0 184 pc.printf("GRESKA!!! \n\r");
dsiljeg 0:981012b786c0 185 while(!potvrda && IZ == 0) { // ceka se potvrda greske
dsiljeg 0:981012b786c0 186 t_pt.start();
dsiljeg 0:981012b786c0 187
dsiljeg 0:981012b786c0 188 if(t_pt.read_ms() >= 1000) {
dsiljeg 0:981012b786c0 189 ledGR =! ledGR;
dsiljeg 0:981012b786c0 190 t_pt.reset();
dsiljeg 0:981012b786c0 191 }
dsiljeg 0:981012b786c0 192 }
dsiljeg 0:981012b786c0 193
dsiljeg 0:981012b786c0 194 while(f_gr2 > nadzor.read() && nadzor.read() > f_gr1 && IZ == 0 && GR == 1) { // signaliziranje da se moze resetirati potvrdena greska
dsiljeg 0:981012b786c0 195 t_pt.start();
dsiljeg 0:981012b786c0 196
dsiljeg 0:981012b786c0 197 ledGR = 1;
dsiljeg 0:981012b786c0 198
dsiljeg 0:981012b786c0 199 if(t_pt.read_ms() >= 1000) {
dsiljeg 0:981012b786c0 200 ledRS =! ledRS;
dsiljeg 0:981012b786c0 201 t_pt.reset();
dsiljeg 0:981012b786c0 202 }
dsiljeg 0:981012b786c0 203
dsiljeg 0:981012b786c0 204 if(reset == 1 && f_gr2 > nadzor.read() && nadzor.read() > f_gr1) { // nakon potvrde se moze resetirati ako tipkalo nije u gresci niti alarm
dsiljeg 0:981012b786c0 205 ledGR = 0;
dsiljeg 0:981012b786c0 206 ledRS = 0;
dsiljeg 0:981012b786c0 207 GR = 0;
dsiljeg 0:981012b786c0 208 t_pt.stop();
dsiljeg 0:981012b786c0 209 t_pt.reset();
dsiljeg 0:981012b786c0 210 }
dsiljeg 0:981012b786c0 211 }
dsiljeg 0:981012b786c0 212 }