Konstrukcijski rad iz kolegija Mikroupravljaci

Dependencies:   mbed TextLCD ULN2003_StepperDriver

main.cpp

Committer:
dkrajacic
Date:
2019-11-16
Revision:
1:a49b3c29aeb2
Parent:
0:e1ee9ea8436b
Child:
2:a8c9d4c65e58

File content as of revision 1:a49b3c29aeb2:

#include "mbed.h"
#include "TextLCD.h"    //ovo je head za LCD
#include "ULN2003.h"    //ovo je head za motor

Serial pc(USBTX, USBRX); // tx, rx
ULN2003 postavljac(PB_10, PB_4, PB_5, PB_3, 4096); //definiranje izlaza za stepper

I2C i2c_lcd(I2C_SDA, I2C_SCL); // SDA, SCL, I2C komunikacija za LCD
TextLCD_I2C lcd(&i2c_lcd, 0x4e, TextLCD::LCD16x2);  // I2C bus, PCF8574 Slaveaddress, LCD Type; LCD na I2C komunikaciji:

//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)

//SPI spi_lcd(P_, P_NC, P_); // MOSI, MISO, SCLK; // SPI komunikacija (ako zatreba):
 
DigitalOut led1(PC_10); //LED c.s. 1-4
DigitalOut led2(PC_12); 
DigitalOut led3(PA_6);
DigitalOut led4(PA_7);
DigitalOut ledi(PC_2);  //LED stanja isključenja 
DigitalOut ledu(PC_3);  //LED stanja uključeno
DigitalOut ledk(PA_1);  //LED kvara
DigitalOut leds(PA_0);  //LED kvara
DigitalIn gp(PB_1);  //LED k
                            
                            //Analogni ulazi za mjerenje struje:
AnalogIn strujaCS1(PC_0);
AnalogIn strujaCS2(PC_1);
AnalogIn strujaCS3(PB_0);
AnalogIn strujaCS4(PA_4);
                               //Interrupt pinovi:
InterruptIn k_uklj1(PA_13);     //uklj. kontakt 1
InterruptIn k_uklj2(PA_14);     //uklj. kontakt 2
InterruptIn k_isklj(PA_15);     //isklj. kontakt
InterruptIn kv_isklj(PD_2);     //isključenje kvara (tipka)
InterruptIn lom(PA_8);

PwmOut zvono1(PC_6);              //pinovi za zvona
PwmOut zvono2(PC_8);
PwmOut alarm(PA_9);            

                        //Timeri:
Timer osnovno;          //za vraćanje u osnovno nakon isključenja
Ticker tcs;             //ticker za blink signala
Timeout Tukljucenje;    //time out za trajanje uključenja
Timer debounce;         //timer za debounce     
Ticker mjere;           //ticker za mjerenje struje LED
Timer osovine;           //timer za blokadu osnovnog stanja za više osovina
Ticker ispis_LCD;
                    //Varijable:
bool uklj1=0;       //uključenje po kontaktu 1
bool uklj2=0;       //uključenje po kontaktu 2
bool isklj=0;       //isključenje po isključnom kontaktu
bool kvar=0;        //kvar: stanje ima-nema
bool smetnja=0;     //smetnja: stanje ima-nema
int bkvar=0;        //brojač kvarova
int bsmetnja=0;     //brojač smetnji
bool upis_k=0;      //pomoćna varijabla za upis kvara na LCD samo kad se poajvi kvar)
bool upis_s=0;      //pomoćna varijabla za upis smetnje na LCD samo kad se poajvi)
char s_aktiv;       //varijabla za ispis aktivnog kvara na LCD
char k_aktiv;       //varijabla za ispis aktivnog kvara na LCD
bool deaktiv_lcd=0; //varijabla za ispis na LCD nakon poništenja kvara/smetnje
bool p_gore=0;      //pomoćna varijabla za dizanje postavljača kod isključenja
float struja1;      //varijable vrijednosti analognog ulaza za kontrolu LED CS
float struja2;
float struja3;
float struja4;
bool U=0;           //pomoćna varijabla za uključenje
bool aisk=0;        //pomoćna varijabla za automatsko isključenje (vremensko)
bool kvar_l=0;
bool alarm_i=0;

void ukljucenje1();         //funkcija (potprogram) uključenja sa strane 1
void ukljucenje2();         //funkcija (potprogram) za uključenje sa strane 2
void iskljucenje();         //funkcija (potpogram) za isključenje
void kvar_lcd(void);        //funkcija za ispis na lcd
void kvar_isklj(void);      //funkcija za kvar kod aktivacije isklj. kontakta
void postav_gore(void);     //funkcija za dizanje motke
void postav_dolje(void);    //funkcija za spuštanje motke
void cs(void);              //funkcija za cestovni signal
void upis_kvara();          //funkcija ispisa na LCD
void zvona();               //funkcija za buzzer
void pr_zv();               //gašenje zvona
void mjerenja();            //funkcija za  struje LED 
void T_iskljucenje();       //funkcija za automatsko isključenje (vremensko)
void osnovno_st();
void lom_m();
void lom_m_k();
void alarm_u();
 
int main() {
     lcd.setBacklight(TextLCD::LightOn);    //uključenje pozadinskog svjetla na LCD
         
     k_uklj1.mode(PullDown);    //konfiguracija tastera na PullDown
     k_uklj2.mode(PullDown);
     k_isklj.mode(PullDown);
     kv_isklj.mode(PullDown);
    
     led1=0; led2=0;
    
    lcd.setCursor(TextLCD::CurOn_BlkOn); // Uključenje i blinkanje kursora na LCD 
 
    //debounce.start();
                                    //konfiguracija interrupt kontakata na uzlazni/silazni brid
       k_uklj1.rise(&ukljucenje1);
       k_uklj2.rise(&ukljucenje2);
       k_isklj.fall(&iskljucenje);
       kv_isklj.fall(&kvar_isklj);
       lom.fall(&lom_m);
       lom.rise(&lom_m_k);
   
        lcd.cls();   //čišćenje displeja
        lcd.printf("Kvar %i\nSmetnja %i", bkvar, bsmetnja); //prikaz broja kvara i smetnje na lcd 
         
         if(gp==0){
               postav_gore();
               wait(8);
               }
               
               //glavna petlja
   while(1) {
                            //uvjeti za LED uključenja, isključenja i kvara
       if(uklj1==1 || uklj2==1) {
       ledu=1;
       }
        else {
            ledu=0;
            }
        if(isklj==1) {
            ledi=1;
            }
        else {
            ledi=0;
            }
        if(kvar==1) {
            ledk=1;}
            else {
                    ledk=0;
                    alarm_i=0;}
        if(smetnja==1) {
            leds=1;}
            else {
                    leds=0;}
                    
                               
                                //uključenje:
                                
       if((uklj1==1 || uklj2==1) && isklj==0){
                        
            
            //mjerenja();
            if(U==0){
                
                zvona();
                led3=1;
                led1=1;
            tcs.attach(&cs, 0.5); 
             //mjere.attach(&mjerenja, 1.5); 
             //start tickera za CS, treptanje dioda
            Tukljucenje.attach(&T_iskljucenje, 40.0);
            wait(8); //predzvonjenje
            postav_dolje();
             pr_zv(); 
             U=1;
            }
          }
                        //Automatsko isključenje ako je proteklo vrijeme
          if(aisk==1) {
               
            smetnja=1;
            leds=1;
            bsmetnja=bsmetnja+1;
            postav_gore();  
            wait(0.2);        
            Tukljucenje.detach();
            //mjere.detach();
            tcs.detach();           //isključenje signala
            led1=0; 
            led2=0; 
            led3=0;
            led4=0; 
            uklj1=0;
            uklj2=0;
            U=0;
            aisk=0;
            alarm_u();
            if(gp==0){
                kvar=1;
                }
        }
                        //Isključenje na isključnom kontaktu
                        
       if((uklj1==1 || uklj2==1) && (isklj==1)) {   //isključenje za stranu 1
                
                wait(2);
                if(p_gore==0) {
                postav_gore();
                wait(0.1);
                p_gore=1;
                if(gp==0){
                   kvar=1;
                   }
                   }
                Tukljucenje.detach();
                 tcs.detach();         //isključenje signala
                   led1=0; 
                   led2=0;
                   led3=0;
                   led4=0;  
                    
                  osnovno.start();  //pokretanje timera osnovno
                }
                         //Dovođenje u osnovno stanje               
                
           if(osnovno.read()>=40 || (uklj2==1 && uklj1==1)) {
            if(osnovno.read()>=40) {
                smetnja=1;
                leds=1;
                bsmetnja=bsmetnja+1;
                osnovno_st();
                alarm_u();
                }
                else {
                    osovine.start();
                    if(osovine.read()>=2) {
                    osnovno_st(); 
                    }
                 }
                }
             
             wait(0.1);   
                            //Uključenje kvara kod aktivacije isklj. kontakta bez uključenja:
                              
        if(((uklj1==0 && uklj2==0) && (isklj==1)) || lom==0){      //kvar kod isključnog kontakta bez uključenja
              kvar=1;
              alarm_u();
              
              }
              
        kvar_lcd();
                  } //kraj while(1)
            }    //kraj int main()
   
   
     void ukljucenje1(void){
     uklj1=1; 
     osovine.reset();
     if(uklj2==0) {
     isklj=0;
     } 
     ledu=1;
         }
                      
    void ukljucenje2(void){
     uklj2=1; 
     osovine.reset();
     if(uklj1==0) {
     isklj=0; 
     }
     ledu=1;
     }
                      
    void iskljucenje(void){
       isklj=1;               
       ledi=1;
       }
                 
    void kvar_lcd(void) {
                if(kvar==1){
                k_aktiv=65;
                }
                else {
                    k_aktiv=73;
                    }          
            if(kvar==1 && upis_k==0) {
                bkvar=bkvar+1;
            lcd.cls();
            lcd.printf("Kvar %i %c\nSmetnja %i %c", bkvar, k_aktiv, bsmetnja, s_aktiv);
            upis_k=1;
            } 
            else if(kvar==0) {
            upis_k=0;
            }       
            
            if(smetnja==1){
                s_aktiv=65;
                }
                else {
                    s_aktiv=73;
                    }                         
            if(smetnja==1 && upis_s==0) {       //ispis smetnje
            //bsmetnja=bsmetnja+1;
            lcd.cls();
            lcd.printf("Kvar %i %c\nSmetnja %i %c", bkvar, k_aktiv, bsmetnja, s_aktiv);
            upis_s=1;
            } 
            else if(smetnja==0) {
                upis_s=0;
                }  
            if (deaktiv_lcd==1) {
            lcd.cls();
            lcd.printf("Kvar %i %c\nSmetnja %i %c", bkvar, k_aktiv, bsmetnja, s_aktiv);
            deaktiv_lcd=0;
            }
           }
           
                       
  void kvar_isklj(void) {
        
        if(uklj1==0 && uklj2==0) {
        if(kvar_l==0) {
            kvar=0;
            }
        smetnja=0;
        wait(0.2);
        deaktiv_lcd=1;
        //alarm=0;
        alarm_u();
        }
           }
 
 void postav_dolje() {
     postavljac.moveForward(100,20);
     pr_zv();
               }
     
 void postav_gore() {
     postavljac.moveReverse(100,15);
     }
     
void cs(void) {
    led1=!led1;
    led2=!led2;
    led3=!led3;
    led4=!led4;
    mjerenja();
       }
    
void zvona() {
zvono1.period(1); // set PWM period to 10 ms
zvono1=0.5;      // set duty cycle to 80%
zvono2.period(1); // set PWM period to 10 ms
zvono2=0.5;      // set duty cycle to 80%
}

void pr_zv() {
    zvono1=0;
    zvono2=0;
    }

void mjerenja() {

if(led1==1) {
    struja1=strujaCS1;
    struja3=strujaCS3;
   if(struja1<=0.2f || struja1>=0.55f || struja3<=0.2f || struja3>=0.55f) {
    kvar=1;
    ledk=1;
    alarm_u();
      }
       }
       
    if(led2==1) {
    struja2=strujaCS2;
    struja4=strujaCS4;
        if(struja2<=0.2f || struja2>=0.55f || struja4<=0.2f || struja4>=0.55f) {
    kvar=1;
    ledk=1;
    alarm_i=1;
    alarm_u();
     }
       }
       if(uklj1==0 && uklj2==0){
           mjere.detach();}
}

void T_iskljucenje() {
    aisk=1;
       }      
       
void osnovno_st() {
        
            uklj1=0;
            uklj2=0;
            isklj=0;
            wait(0.05);
            U=0;
            osnovno.stop();
            osnovno.reset();
            p_gore=0;
            osovine.stop();
                 }   
                 
void lom_m() {
    kvar=1;
    kvar_l=1;
    alarm_u();
    }   
    
void lom_m_k() {
    kvar_l=0;
    }
    
void alarm_u() {
        
        if(kvar==1 && alarm_i==0) {
            alarm.period(2); // set PWM period to 10 ms
            alarm=0.9;
            wait(0.1);
             }
                
            else {
                alarm=0;}
            
            }