Konstrukcijski rad, simulator rada uređaja za osiguranje željezničko-cestovnog prijelaza
Dependencies: mbed TextLCD ULN2003_StepperDriver
main.cpp
00001 #include "mbed.h" 00002 #include "TextLCD.h" //ovo je head za LCD 00003 #include "ULN2003.h" //ovo je head za motor 00004 00005 Serial pc(USBTX, USBRX); // tx, rx 00006 ULN2003 postavljac(PB_10, PB_4, PB_5, PB_3, 4096); //definiranje izlaza za stepper 00007 00008 I2C i2c_lcd(I2C_SDA, I2C_SCL); // SDA, SCL, I2C komunikacija za LCD 00009 TextLCD_I2C lcd(&i2c_lcd, 0x4e, TextLCD::LCD16x2); // I2C bus, PCF8574 Slaveaddress, LCD Type; LCD na I2C komunikaciji: 00010 00011 //TextLCD lcd(PA_0, PA_1, PA_4, PB_0, PC_1, PC_0); // RS, E, D4-D7, LCDType=LCD16x2, BL=NC, E2=NC, LCDTCtrl=HD44780; spajanje lcd-a na pinove (ako zatreba) 00012 00013 //SPI spi_lcd(P_, P_NC, P_); // MOSI, MISO, SCLK; // SPI komunikacija (ako zatreba): 00014 00015 DigitalOut led1(PC_10); //LED c.s. 1-4 00016 DigitalOut led2(PC_12); 00017 DigitalOut led3(PA_6); 00018 DigitalOut led4(PA_7); 00019 DigitalOut ledi(PC_2); //LED stanja isključenja 00020 DigitalOut ledu(PC_3); //LED stanja uključeno 00021 DigitalOut ledk(PA_1); //LED kvara 00022 DigitalOut leds(PA_0); //LED kvara 00023 DigitalIn gp(PB_1); //LED k 00024 00025 //Analogni ulazi za mjerenje struje: 00026 AnalogIn strujaCS1(PC_0); 00027 AnalogIn strujaCS2(PC_1); 00028 AnalogIn strujaCS3(PB_0); 00029 AnalogIn strujaCS4(PA_4); 00030 //Interrupt pinovi: 00031 InterruptIn k_uklj1(PA_13); //uklj. kontakt 1 00032 InterruptIn k_uklj2(PA_14); //uklj. kontakt 2 00033 InterruptIn k_isklj(PA_15); //isklj. kontakt 00034 InterruptIn kv_isklj(PD_2); //isključenje kvara (tipka) 00035 InterruptIn lom(PA_8); 00036 00037 PwmOut zvono1(PC_6); //pinovi za zvona 00038 PwmOut zvono2(PC_8); 00039 PwmOut alarm(PA_9); 00040 00041 //Timeri: 00042 Timer osnovno; //za vraćanje u osnovno nakon isključenja 00043 Ticker tcs; //ticker za blink signala 00044 Timeout Tukljucenje; //time out za trajanje uključenja 00045 Timer debounce; //timer za debounce 00046 Ticker mjere; //ticker za mjerenje struje LED 00047 Timer osovine; //timer za blokadu osnovnog stanja za više osovina 00048 Ticker ispis_LCD; 00049 //Varijable: 00050 bool uklj1=0; //uključenje po kontaktu 1 00051 bool uklj2=0; //uključenje po kontaktu 2 00052 bool isklj=0; //isključenje po isključnom kontaktu 00053 bool kvar=0; //kvar: stanje ima-nema 00054 bool smetnja=0; //smetnja: stanje ima-nema 00055 int bkvar=0; //brojač kvarova 00056 int bsmetnja=0; //brojač smetnji 00057 bool upis_k=0; //pomoćna varijabla za upis kvara na LCD samo kad se poajvi kvar) 00058 bool upis_s=0; //pomoćna varijabla za upis smetnje na LCD samo kad se poajvi) 00059 char s_aktiv; //varijabla za ispis aktivnog kvara na LCD 00060 char k_aktiv; //varijabla za ispis aktivnog kvara na LCD 00061 bool deaktiv_lcd=0; //varijabla za ispis na LCD nakon poništenja kvara/smetnje 00062 bool p_gore=0; //pomoćna varijabla za dizanje postavljača kod isključenja 00063 float struja1; //varijable vrijednosti analognog ulaza za kontrolu LED CS 00064 float struja2; 00065 float struja3; 00066 float struja4; 00067 bool U=0; //pomoćna varijabla za uključenje 00068 bool aisk=0; //pomoćna varijabla za automatsko isključenje (vremensko) 00069 bool kvar_l=0; 00070 bool alarm_i=0; 00071 00072 void ukljucenje1(); //funkcija (potprogram) uključenja sa strane 1 00073 void ukljucenje2(); //funkcija (potprogram) za uključenje sa strane 2 00074 void iskljucenje(); //funkcija (potpogram) za isključenje 00075 void kvar_lcd(void); //funkcija za ispis na lcd 00076 void kvar_isklj(void); //funkcija za kvar kod aktivacije isklj. kontakta 00077 void postav_gore(void); //funkcija za dizanje motke 00078 void postav_dolje(void); //funkcija za spuštanje motke 00079 void cs(void); //funkcija za cestovni signal 00080 void upis_kvara(); //funkcija ispisa na LCD 00081 void zvona(); //funkcija za buzzer 00082 void pr_zv(); //gašenje zvona 00083 void mjerenja(); //funkcija za struje LED 00084 void T_iskljucenje(); //funkcija za automatsko isključenje (vremensko) 00085 void osnovno_st(); 00086 void lom_m(); 00087 void lom_m_k(); 00088 void alarm_u(); 00089 00090 int main() { 00091 lcd.setBacklight(TextLCD::LightOn); //uključenje pozadinskog svjetla na LCD 00092 00093 k_uklj1.mode(PullDown); //konfiguracija tastera na PullDown 00094 k_uklj2.mode(PullDown); 00095 k_isklj.mode(PullDown); 00096 kv_isklj.mode(PullDown); 00097 00098 led1=0; led2=0; 00099 00100 lcd.setCursor(TextLCD::CurOn_BlkOn); // Uključenje i blinkanje kursora na LCD 00101 00102 //debounce.start(); 00103 //konfiguracija interrupt kontakata na uzlazni/silazni brid 00104 k_uklj1.rise(&ukljucenje1); 00105 k_uklj2.rise(&ukljucenje2); 00106 k_isklj.fall(&iskljucenje); 00107 kv_isklj.fall(&kvar_isklj); 00108 lom.fall(&lom_m); 00109 lom.rise(&lom_m_k); 00110 00111 lcd.cls(); //čišćenje displeja 00112 lcd.printf("Kvar %i\nSmetnja %i", bkvar, bsmetnja); //prikaz broja kvara i smetnje na lcd 00113 00114 if(gp==0){ 00115 postav_gore(); 00116 wait(8); 00117 } 00118 00119 //glavna petlja 00120 while(1) { 00121 //uvjeti za LED uključenja, isključenja i kvara 00122 if(uklj1==1 || uklj2==1) { 00123 ledu=1; 00124 } 00125 else { 00126 ledu=0; 00127 } 00128 if(isklj==1) { 00129 ledi=1; 00130 } 00131 else { 00132 ledi=0; 00133 } 00134 if(kvar==1) { 00135 ledk=1;} 00136 else { 00137 ledk=0; 00138 alarm_i=0;} 00139 if(smetnja==1) { 00140 leds=1;} 00141 else { 00142 leds=0;} 00143 00144 00145 //uključenje: 00146 00147 if((uklj1==1 || uklj2==1) && isklj==0){ 00148 00149 00150 //mjerenja(); 00151 if(U==0){ 00152 00153 zvona(); 00154 led3=1; 00155 led1=1; 00156 tcs.attach(&cs, 0.5); 00157 //mjere.attach(&mjerenja, 1.5); 00158 //start tickera za CS, treptanje dioda 00159 Tukljucenje.attach(&T_iskljucenje, 40.0); 00160 wait(8); //predzvonjenje 00161 postav_dolje(); 00162 pr_zv(); 00163 U=1; 00164 } 00165 } 00166 //Automatsko isključenje ako je proteklo vrijeme 00167 if(aisk==1) { 00168 00169 smetnja=1; 00170 leds=1; 00171 bsmetnja=bsmetnja+1; 00172 postav_gore(); 00173 wait(0.2); 00174 Tukljucenje.detach(); 00175 //mjere.detach(); 00176 tcs.detach(); //isključenje signala 00177 led1=0; 00178 led2=0; 00179 led3=0; 00180 led4=0; 00181 uklj1=0; 00182 uklj2=0; 00183 U=0; 00184 aisk=0; 00185 alarm_u(); 00186 if(gp==0){ 00187 kvar=1; 00188 } 00189 } 00190 //Isključenje na isključnom kontaktu 00191 00192 if((uklj1==1 || uklj2==1) && (isklj==1)) { //isključenje za stranu 1 00193 00194 wait(2); 00195 if(p_gore==0) { 00196 postav_gore(); 00197 wait(0.1); 00198 p_gore=1; 00199 if(gp==0){ 00200 kvar=1; 00201 } 00202 } 00203 Tukljucenje.detach(); 00204 tcs.detach(); //isključenje signala 00205 led1=0; 00206 led2=0; 00207 led3=0; 00208 led4=0; 00209 00210 osnovno.start(); //pokretanje timera osnovno 00211 } 00212 //Dovođenje u osnovno stanje 00213 00214 if(osnovno.read()>=40 || (uklj2==1 && uklj1==1)) { 00215 if(osnovno.read()>=40) { 00216 smetnja=1; 00217 leds=1; 00218 bsmetnja=bsmetnja+1; 00219 osnovno_st(); 00220 alarm_u(); 00221 } 00222 else { 00223 osovine.start(); 00224 if(osovine.read()>=2) { 00225 osnovno_st(); 00226 } 00227 } 00228 } 00229 00230 wait(0.1); 00231 //Uključenje kvara kod aktivacije isklj. kontakta bez uključenja: 00232 00233 if(((uklj1==0 && uklj2==0) && (isklj==1)) || lom==0){ //kvar kod isključnog kontakta bez uključenja 00234 kvar=1; 00235 alarm_u(); 00236 00237 } 00238 00239 kvar_lcd(); 00240 } //kraj while(1) 00241 } //kraj int main() 00242 00243 00244 void ukljucenje1(void){ 00245 uklj1=1; 00246 osovine.reset(); 00247 if(uklj2==0) { 00248 isklj=0; 00249 } 00250 ledu=1; 00251 } 00252 00253 void ukljucenje2(void){ 00254 uklj2=1; 00255 osovine.reset(); 00256 if(uklj1==0) { 00257 isklj=0; 00258 } 00259 ledu=1; 00260 } 00261 00262 void iskljucenje(void){ 00263 isklj=1; 00264 ledi=1; 00265 } 00266 00267 void kvar_lcd(void) { 00268 if(kvar==1){ 00269 k_aktiv=65; 00270 } 00271 else { 00272 k_aktiv=73; 00273 } 00274 if(kvar==1 && upis_k==0) { 00275 bkvar=bkvar+1; 00276 lcd.cls(); 00277 lcd.printf("Kvar %i %c\nSmetnja %i %c", bkvar, k_aktiv, bsmetnja, s_aktiv); 00278 upis_k=1; 00279 } 00280 else if(kvar==0) { 00281 upis_k=0; 00282 } 00283 00284 if(smetnja==1){ 00285 s_aktiv=65; 00286 } 00287 else { 00288 s_aktiv=73; 00289 } 00290 if(smetnja==1 && upis_s==0) { //ispis smetnje 00291 //bsmetnja=bsmetnja+1; 00292 lcd.cls(); 00293 lcd.printf("Kvar %i %c\nSmetnja %i %c", bkvar, k_aktiv, bsmetnja, s_aktiv); 00294 upis_s=1; 00295 } 00296 else if(smetnja==0) { 00297 upis_s=0; 00298 } 00299 if (deaktiv_lcd==1) { 00300 lcd.cls(); 00301 lcd.printf("Kvar %i %c\nSmetnja %i %c", bkvar, k_aktiv, bsmetnja, s_aktiv); 00302 deaktiv_lcd=0; 00303 } 00304 } 00305 00306 00307 void kvar_isklj(void) { 00308 00309 if(uklj1==0 && uklj2==0) { 00310 if(kvar_l==0) { 00311 kvar=0; 00312 } 00313 smetnja=0; 00314 wait(0.2); 00315 deaktiv_lcd=1; 00316 //alarm=0; 00317 alarm_u(); 00318 } 00319 } 00320 00321 void postav_dolje() { 00322 postavljac.moveForward(100,20); 00323 pr_zv(); 00324 } 00325 00326 void postav_gore() { 00327 postavljac.moveReverse(100,15); 00328 } 00329 00330 void cs(void) { 00331 led1=!led1; 00332 led2=!led2; 00333 led3=!led3; 00334 led4=!led4; 00335 mjerenja(); 00336 } 00337 00338 void zvona() { 00339 zvono1.period(1); // set PWM period to 10 ms 00340 zvono1=0.5; // set duty cycle to 80% 00341 zvono2.period(1); // set PWM period to 10 ms 00342 zvono2=0.5; // set duty cycle to 80% 00343 } 00344 00345 void pr_zv() { 00346 zvono1=0; 00347 zvono2=0; 00348 } 00349 00350 void mjerenja() { 00351 00352 if(led1==1) { 00353 struja1=strujaCS1; 00354 struja3=strujaCS3; 00355 if(struja1<=0.2f || struja1>=0.55f || struja3<=0.2f || struja3>=0.55f) { 00356 kvar=1; 00357 ledk=1; 00358 alarm_u(); 00359 } 00360 } 00361 00362 if(led2==1) { 00363 struja2=strujaCS2; 00364 struja4=strujaCS4; 00365 if(struja2<=0.2f || struja2>=0.55f || struja4<=0.2f || struja4>=0.55f) { 00366 kvar=1; 00367 ledk=1; 00368 alarm_i=1; 00369 alarm_u(); 00370 } 00371 } 00372 if(uklj1==0 && uklj2==0){ 00373 mjere.detach();} 00374 } 00375 00376 void T_iskljucenje() { 00377 aisk=1; 00378 } 00379 00380 void osnovno_st() { 00381 00382 uklj1=0; 00383 uklj2=0; 00384 isklj=0; 00385 wait(0.05); 00386 U=0; 00387 osnovno.stop(); 00388 osnovno.reset(); 00389 p_gore=0; 00390 osovine.stop(); 00391 } 00392 00393 void lom_m() { 00394 kvar=1; 00395 kvar_l=1; 00396 alarm_u(); 00397 } 00398 00399 void lom_m_k() { 00400 kvar_l=0; 00401 } 00402 00403 void alarm_u() { 00404 00405 if(kvar==1 && alarm_i==0) { 00406 alarm.period(2); // set PWM period to 10 ms 00407 alarm=0.9; 00408 wait(0.1); 00409 } 00410 00411 else { 00412 alarm=0;} 00413 00414 } 00415 00416 00417
Generated on Sat Jul 30 2022 10:11:59 by
1.7.2