Konstrukcijski rad, simulator rada uređaja za osiguranje željezničko-cestovnog prijelaza

Dependencies:   mbed TextLCD ULN2003_StepperDriver

Embed: (wiki syntax)

« Back to documentation index

Show/hide line numbers main.cpp Source File

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