Konstrukcijski rad iz kolegija Mikroupravljaci
Dependencies: mbed TextLCD ULN2003_StepperDriver
Diff: main.cpp
- Revision:
- 0:e1ee9ea8436b
- Child:
- 1:a49b3c29aeb2
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/main.cpp Thu Nov 14 16:39:38 2019 +0000 @@ -0,0 +1,342 @@ +#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 + + //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) + +PwmOut zvono1(PC_6); //pinovi za zvona +PwmOut zvono2(PC_8); + + //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) + +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(); + +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); + + lcd.cls(); //čišćenje displeja + lcd.printf("Kvar %i\nSmetnja %i", bkvar, bsmetnja); //prikaz broja kvara i smetnje na lcd + + //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;} + + + //uključenje: + + if((uklj1==1 || uklj2==1) && isklj==0){ + + + //mjerenja(); + if(U==0){ + + zvona(); + led1=1; + tcs.attach(&cs, 0.5); + //mjere.attach(&mjerenja, 1.5); + //start tickera za CS, treptanje dioda + Tukljucenje.attach(&T_iskljucenje, 20.0); + wait(6); //predzvonjenje + postav_dolje(); + pr_zv(); + U=1; + } + } + //Automatsko isključenje ako je proteklo vrijeme + if(aisk==1) { + + smetnja=1; + bsmetnja=bsmetnja+1; + postav_gore(); + wait(0.2); + Tukljucenje.detach(); + //mjere.detach(); + tcs.detach(); //isključenje signala + led1=0; + led2=0; + uklj1=0; + uklj2=0; + U=0; + aisk=0; + } + //Isključenje na isključnom kontaktu + + if((uklj1==1 || uklj2==1) && (isklj==1)) { //isključenje za stranu 1 + Tukljucenje.detach(); + if(p_gore==0) { + postav_gore(); + wait(0.1); + p_gore=1; + } + + tcs.detach(); //isključenje signala + led1=0; + led2=0; + + osnovno.start(); //pokretanje timera osnovno + } + //Dovođenje u osnovno stanje + + if(osnovno.read()>=20 || (uklj2==1 && uklj1==1)) { + if(osnovno.read()>=20) { + smetnja=1; + bsmetnja=bsmetnja+1; + osnovno_st(); + } + 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)) { //kvar kod isključnog kontakta bez uključenja + kvar=1; + } + 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) + kvar=0; + smetnja=0; + wait(0.2); + deaktiv_lcd=1; + } + + void postav_dolje() { + postavljac.moveForward(100,20); + pr_zv(); + } + + void postav_gore() { + postavljac.moveReverse(100,15); + } + +void cs(void) { + led1=!led1; + led2=!led2; + 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.8f || struja3<=0.2f || struja3>=0.8f) { + kvar=1; + ledk=1; + } + } + + if(led2==1) { + struja2=strujaCS2; + struja4=strujaCS4; + if(struja2<=0.2f || struja2>=0.8f || struja4<=0.2f || struja4>=0.8f) { + kvar=1; + ledk=1; + } + } + 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(); + } + + \ No newline at end of file