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

main.cpp

Committer:
djurcevic
Date:
2020-09-17
Revision:
0:b2d4fe3dccf6

File content as of revision 0:b2d4fe3dccf6:

#include "mbed.h"
#include "TextLCD.h"

TextLCD lcd(p19,p20,p21,p22,p23,p24);
DigitalOut Q_M1_pumpa(p5);
DigitalOut Q_M2_pumpa(p6);
DigitalIn kruska1(p7); //zastita od rada na suho
DigitalIn kruska2(p8); //razina uklopa prve pumpe
DigitalIn kruska3(p9); //razina uklopa druge pumpe
DigitalIn kruska4(p10); //razina alarm
DigitalOut Q_Alarm (p11);
InterruptIn Alarm_reset (p12);
DigitalIn reset_sati(p13);
Ticker Alarm_Led;
Timer titranje;

bool Alarm_full;
bool prva_radna (0);
bool druga_radna (0);
bool M1_prva_radna(0);
bool M1_druga_radna(0);
bool M2_prva_radna(0);
bool M2_druga_radna(0);


int M1_h (0);
int M2_h (0);

void upravljanje()
{
    kruska1.mode(PullUp);
    kruska2.mode(PullUp);
    kruska3.mode(PullUp);
    kruska4.mode(PullUp);
    {
        if (kruska2==1 or kruska3==1) {
            prva_radna = 1;
        }
        if (kruska3==1) {
            druga_radna = 1;
        }
        if (kruska2==0) {
            wait (1.0);
            prva_radna = 0;
            druga_radna = 0;
        }
        if (kruska1==0) {
            prva_radna = 0;
            druga_radna = 0;
        }
        if (kruska4==1) {
            Alarm_full = 1;
            wait(0.5);
        }
    }
    Q_M1_pumpa = ((prva_radna and M1_prva_radna) or (druga_radna and M1_druga_radna));
    Q_M2_pumpa = ((prva_radna and M2_prva_radna) or (druga_radna and M2_druga_radna));
}

void sati_rada ()
{
    if (Q_M1_pumpa==1) {
        M1_h = M1_h + 1;
        wait (2.0);
    }
    if (Q_M2_pumpa==1) {
        M2_h = M2_h + 1;
        wait (2.0);
    }
    if (reset_sati==1) {
        M1_h = 0;
        M2_h = 0;
    }
}

void izmjena_pumpi ()
{
    {
        if (M2_prva_radna==0 and (M1_h < (M2_h + 5))) {
            M1_prva_radna = 1;
            M2_druga_radna = 1;
        } else {
            M1_prva_radna = 0;
            M2_druga_radna = 0;
        }
    }
    {
        if (M1_prva_radna==0 and (M2_h < M1_h)) {
            M2_prva_radna = 1;
            M1_druga_radna = 1;
        } else {
            M2_prva_radna = 0;
            M1_druga_radna = 0;
        }
    }
}


void LCD_text ()
{
    if (kruska1==0&&kruska2==0&&kruska3==0&&kruska4==0) {
        lcd.cls();
        lcd.locate(0,0);
        lcd.printf("Nivo suho");
        lcd.locate(0,1);
        lcd.printf("M1-%ih", M1_h);
        lcd.locate(8,1);
        lcd.printf("M2-%ih", M2_h);
        wait(0.5);
    }
    if (kruska1==1&&kruska2==0&&kruska3==0&&kruska4==0) {
        lcd.cls();
        lcd.locate(0,0);
        lcd.printf("Nizak nivo");
        lcd.locate(0,1);
        lcd.printf("M1-%ih", M1_h);
        lcd.locate(8,1);
        lcd.printf("M2-%ih", M2_h);
        wait(0.5);
    }
    if (kruska1==1&&kruska2==1&&kruska3==0&&kruska4==0) {
        lcd.cls();
        lcd.locate(0,0);
        lcd.printf("Srednji nivo");
        lcd.locate(0,1);
        lcd.printf("M1-%ih", M1_h);
        lcd.locate(8,1);
        lcd.printf("M2-%ih", M2_h);
        wait(0.5);
    }
    if (kruska1==1&&kruska2==1&&kruska3==1&&kruska4==0) {
        lcd.cls();
        lcd.locate(0,0);
        lcd.printf("Visok nivo");
        lcd.locate(0,1);
        lcd.printf("M1-%ih", M1_h);
        lcd.locate(8,1);
        lcd.printf("M2-%ih", M2_h);
        wait(0.5);
    }
    if (kruska1==1&&kruska2==1&&kruska3==1&&kruska4==1) {
        lcd.cls();
        lcd.locate(0,0);
        lcd.printf("Alarm-preljev");
        lcd.locate(0,1);
        lcd.printf("M1-%ih", M1_h);
        lcd.locate(8,1);
        lcd.printf("M2-%ih", M2_h);
        wait(0.5);
    }
}


void alarm_prepunjenost ()
{
    if (Alarm_full==1) {
        Q_Alarm = !Q_Alarm;
    }
    if (Alarm_full==0) {
        Q_Alarm = 0;
    }
}

void alarm_led_reset ()
{
    if (titranje.read_ms()>200)
        Alarm_full = 0;
    titranje.reset();
}

int main()
{
    while(1) {
        upravljanje();
        sati_rada ();
        izmjena_pumpi ();
        LCD_text ();

        Alarm_Led.attach(&alarm_prepunjenost, 0.5);

        titranje.start();
        Alarm_reset.rise(&alarm_led_reset);
    }
}