Simulacija crpne stanice s dvije crpke. Razina vode se prati pomocu četiri kruške (nivo suho, nivo nisko, srednji nivo i nivo visoko). Crpke se izmjenjuju prema satima rada. Postoji prva radna i druga radna. Prva radna se uključuje na srednjem nivou, a druga radna na visokom nivou. Ukoliko nivo i dalje raste, na razini visoko se uključuje alarm. Kada se razina spusti, alarm je moguće resetirati. Kada nivo padne na razinu nisko, crpke se isključuju s kratkom zadrškom.

Dependencies:   mbed TextLCD

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"
00003 
00004 TextLCD lcd(p19,p20,p21,p22,p23,p24);
00005 DigitalOut Q_M1_pumpa(p5);
00006 DigitalOut Q_M2_pumpa(p6);
00007 DigitalIn kruska1(p7); //zastita od rada na suho
00008 DigitalIn kruska2(p8); //razina uklopa prve pumpe
00009 DigitalIn kruska3(p9); //razina uklopa druge pumpe
00010 DigitalIn kruska4(p10); //razina alarm
00011 DigitalOut Q_Alarm (p11);
00012 InterruptIn Alarm_reset (p12);
00013 DigitalIn reset_sati(p13);
00014 Ticker Alarm_Led;
00015 Timer titranje;
00016 
00017 bool Alarm_full;
00018 bool prva_radna (0);
00019 bool druga_radna (0);
00020 bool M1_prva_radna(0);
00021 bool M1_druga_radna(0);
00022 bool M2_prva_radna(0);
00023 bool M2_druga_radna(0);
00024 
00025 
00026 int M1_h (0);
00027 int M2_h (0);
00028 
00029 void upravljanje()
00030 {
00031     kruska1.mode(PullUp);
00032     kruska2.mode(PullUp);
00033     kruska3.mode(PullUp);
00034     kruska4.mode(PullUp);
00035     {
00036         if (kruska2==1 or kruska3==1) {
00037             prva_radna = 1;
00038         }
00039         if (kruska3==1) {
00040             druga_radna = 1;
00041         }
00042         if (kruska2==0) {
00043             wait (1.0);
00044             prva_radna = 0;
00045             druga_radna = 0;
00046         }
00047         if (kruska1==0) {
00048             prva_radna = 0;
00049             druga_radna = 0;
00050         }
00051         if (kruska4==1) {
00052             Alarm_full = 1;
00053             wait(0.5);
00054         }
00055     }
00056     Q_M1_pumpa = ((prva_radna and M1_prva_radna) or (druga_radna and M1_druga_radna));
00057     Q_M2_pumpa = ((prva_radna and M2_prva_radna) or (druga_radna and M2_druga_radna));
00058 }
00059 
00060 void sati_rada ()
00061 {
00062     if (Q_M1_pumpa==1) {
00063         M1_h = M1_h + 1;
00064         wait (2.0);
00065     }
00066     if (Q_M2_pumpa==1) {
00067         M2_h = M2_h + 1;
00068         wait (2.0);
00069     }
00070     if (reset_sati==1) {
00071         M1_h = 0;
00072         M2_h = 0;
00073     }
00074 }
00075 
00076 void izmjena_pumpi ()
00077 {
00078     {
00079         if (M2_prva_radna==0 and (M1_h < (M2_h + 5))) {
00080             M1_prva_radna = 1;
00081             M2_druga_radna = 1;
00082         } else {
00083             M1_prva_radna = 0;
00084             M2_druga_radna = 0;
00085         }
00086     }
00087     {
00088         if (M1_prva_radna==0 and (M2_h < M1_h)) {
00089             M2_prva_radna = 1;
00090             M1_druga_radna = 1;
00091         } else {
00092             M2_prva_radna = 0;
00093             M1_druga_radna = 0;
00094         }
00095     }
00096 }
00097 
00098 
00099 void LCD_text ()
00100 {
00101     if (kruska1==0&&kruska2==0&&kruska3==0&&kruska4==0) {
00102         lcd.cls();
00103         lcd.locate(0,0);
00104         lcd.printf("Nivo suho");
00105         lcd.locate(0,1);
00106         lcd.printf("M1-%ih", M1_h);
00107         lcd.locate(8,1);
00108         lcd.printf("M2-%ih", M2_h);
00109         wait(0.5);
00110     }
00111     if (kruska1==1&&kruska2==0&&kruska3==0&&kruska4==0) {
00112         lcd.cls();
00113         lcd.locate(0,0);
00114         lcd.printf("Nizak nivo");
00115         lcd.locate(0,1);
00116         lcd.printf("M1-%ih", M1_h);
00117         lcd.locate(8,1);
00118         lcd.printf("M2-%ih", M2_h);
00119         wait(0.5);
00120     }
00121     if (kruska1==1&&kruska2==1&&kruska3==0&&kruska4==0) {
00122         lcd.cls();
00123         lcd.locate(0,0);
00124         lcd.printf("Srednji nivo");
00125         lcd.locate(0,1);
00126         lcd.printf("M1-%ih", M1_h);
00127         lcd.locate(8,1);
00128         lcd.printf("M2-%ih", M2_h);
00129         wait(0.5);
00130     }
00131     if (kruska1==1&&kruska2==1&&kruska3==1&&kruska4==0) {
00132         lcd.cls();
00133         lcd.locate(0,0);
00134         lcd.printf("Visok nivo");
00135         lcd.locate(0,1);
00136         lcd.printf("M1-%ih", M1_h);
00137         lcd.locate(8,1);
00138         lcd.printf("M2-%ih", M2_h);
00139         wait(0.5);
00140     }
00141     if (kruska1==1&&kruska2==1&&kruska3==1&&kruska4==1) {
00142         lcd.cls();
00143         lcd.locate(0,0);
00144         lcd.printf("Alarm-preljev");
00145         lcd.locate(0,1);
00146         lcd.printf("M1-%ih", M1_h);
00147         lcd.locate(8,1);
00148         lcd.printf("M2-%ih", M2_h);
00149         wait(0.5);
00150     }
00151 }
00152 
00153 
00154 void alarm_prepunjenost ()
00155 {
00156     if (Alarm_full==1) {
00157         Q_Alarm = !Q_Alarm;
00158     }
00159     if (Alarm_full==0) {
00160         Q_Alarm = 0;
00161     }
00162 }
00163 
00164 void alarm_led_reset ()
00165 {
00166     if (titranje.read_ms()>200)
00167         Alarm_full = 0;
00168     titranje.reset();
00169 }
00170 
00171 int main()
00172 {
00173     while(1) {
00174         upravljanje();
00175         sati_rada ();
00176         izmjena_pumpi ();
00177         LCD_text ();
00178 
00179         Alarm_Led.attach(&alarm_prepunjenost, 0.5);
00180 
00181         titranje.start();
00182         Alarm_reset.rise(&alarm_led_reset);
00183     }
00184 }