US 2016 Projektni zadatak: Analogni sat Radili: Kemal Halilbegović, Benjamin Hrustemović

Dependencies:   DS1307 N5110 debug mbed

main.cpp

Committer:
2016US_KemalHalilbeg
Date:
2016-06-06
Revision:
0:5e307f0c3230

File content as of revision 0:5e307f0c3230:

#include "mbed.h"
#include "N5110.h"
#include "ds1307.h"//iskreno se nadam da je ovaj
#include <stdio.h>
#define dp23 P0_0
#define PI 3.14
//N5110 lcd(VCC,SCE,RST,DC,MOSI,SCLK,LED));
N5110 lcd(dp4,dp24,dp23,dp28,dp2,dp6,dp18);
DS1307 sat(dp5,dp27);
BusIn ulazi(dp9,dp10,dp11,dp13);
BusOut izlazi(dp25,dp26,dp17,dp15);

DigitalOut enable(dp14);

int h(0),m(0),s(0);
int dan, mjesec, godina,usedmici;
char buffer[4];
char taster;
Ticker tastatura;

//broj dana u mjesecu
int brojdana[12]= {31,29,31,30,31,30,31,31,30,31,30,31};
//provjerava prijestupne
bool DaLiJePrijestupna(int god)
{
    if (god%4==0) {
        if(god%100) {
            if(god%400) return true;
            return false;
        }
        return true;
    }
    return false;
}
//-----------------------------------------------
//varijable za alarm
int alarmH(0),alarmM(0);
bool alarmUkljucen(false);
Timer t;
//------------------------------------------------

int duzinaK1(5),duzinaK2(12),duzinaK3(15);//duzina kazaljki

//--------------------------------------------------------------------
//TACKE NA SATU (1-12) (pokusavam izbjeci staljno racunanje ovih
//varijabli, pa cu ih jednostavno ostaviti ovdje kao globalne)
float x[12]= {(42+18*cos(PI/2)),(42+18*cos(PI/3)),(42+18*cos(PI/6)),(42+18),(42+18*cos(11*PI/6)),
              (42+18*cos(5*PI/3)),(42+18*cos(3*PI/2)),(42+18*cos(4*PI/3)),(42+18*cos(7*PI/6)),(42+18*cos(PI)),(42+18*cos(5*PI/6)),(42+18*cos(2*PI/3))
             };
float y[12]= {(24+18*sin(PI/2)),(24+18*sin(PI/3)),(24+18*sin(PI/6)),(24),(24+18*sin(11*PI/6)),
              (24+18*sin(5*PI/3)),(24+18*sin(3*PI/2)),(24+18*sin(4*PI/3)),(24+18*sin(7*PI/6)),(24+18*sin(PI)),(24+18*sin(5*PI/6)),(24+18*sin(2*PI/3))
             };

//--------------------------------------------------------------------
//FUNKCIJA ZA KAZALJKE
void Crtajkazaljke ()
{
    //Kazaljka za sate
    float ugao1= (h%12 * 360/12 + m*30/60-90)*PI/180;
    float xK1=42+duzinaK1*cos(ugao1);
    float yK1=24+duzinaK1*sin(ugao1);
    //Kazaljka za minute
    float ugao2= (m%60*360/60-90)*PI/180;
    float xK2=42+duzinaK2*cos(ugao2);
    float yK2=24+duzinaK2*sin(ugao2);
    //Kazaljka za sekunde
    float ugao3= (s%60*360/60-90)*PI/180;
    float xK3=42+duzinaK3*cos(ugao3);
    float yK3=24+duzinaK3*sin(ugao3);

    //iscrtavanje kazaljki
    lcd.drawLine(42,24,xK1,yK1,1);
    lcd.drawLine(42,24,xK2,yK2,1);
    lcd.drawLine(42,24,xK3,yK3,1);

}
//-----------------------------------------------------------------------
//FUNKCIJA ZA CRTANJE SATA
void NacrtajSat()
{
    //krug
    lcd.clear();
    lcd.drawCircle(42,24,20,0);
    //tacke koje oznacavaju sate, izbjegavam for petlju zbog efikasnosti
    lcd.setPixel(x[0],y[0]);
    lcd.setPixel(x[1],y[1]);
    lcd.setPixel(x[2],y[2]);
    lcd.setPixel(x[3],y[3]);
    lcd.setPixel(x[4],y[4]);
    lcd.setPixel(x[5],y[5]);
    lcd.setPixel(x[6],y[6]);
    lcd.setPixel(x[7],y[7]);
    lcd.setPixel(x[8],y[8]);
    lcd.setPixel(x[9],y[9]);
    lcd.setPixel(x[10],y[10]);
    lcd.setPixel(x[11],y[11]);
    sprintf(buffer,"%d",dan);//treba namjestiti da se u ugao upise datum i alarm isto
    lcd.printString(buffer,71,3);
    sprintf(buffer,"%d",mjesec);
    lcd.printString(buffer,71,4);
    sprintf(buffer,"%d",godina);
    lcd.printString(buffer,71,5);
   
    if(alarmUkljucen)
    { 
    sprintf(buffer,"%d  ",alarmH);
    lcd.printString(buffer,0,0);
    sprintf(buffer,"%d  ",alarmM);
    lcd.printString(buffer,0,1);
    }
    Crtajkazaljke();
    lcd.refresh();

}
//------------------------------------------------------------------------
void Tastatura()
{
    izlazi[0] = 0;
    izlazi[1]= 0;
    izlazi[2]= 0;
    izlazi[3]= 0;

    izlazi[0] = 1;
    if(ulazi[0] == 1) {
        taster= '1';
        return;
    } else if(ulazi[1] == 1) {
        taster= '2';
        return;
    } else if(ulazi[2] == 1) {
        taster= '3';
        return;
    } else if(ulazi[3] == 1) {
        taster= 'A';
        return;
    }
    izlazi[0] = 0;

    izlazi[1] = 1;
    if(ulazi[0] == 1) {
        taster= '4';
        return;
    } else if(ulazi[1] == 1) {
        taster= '5';
        return;
    } else if(ulazi[2] == 1) {
        taster= '6';
        return;
    } else if(ulazi[3] == 1) {
        taster= 'B';
        return;
    }
    izlazi[1] = 0;

    izlazi[2] = 1;
    if(ulazi[0] == 1) {
        taster= '7';
        return;
    } else if(ulazi[1] == 1) {
        taster= '8';
        return;
    } else if(ulazi[2] == 1) {
        taster= '9';
        return;
    } else if(ulazi[3] == 1) {
        taster= 'C';
        return;
    }
    izlazi[2] = 1;

    izlazi[3] = 1;
    if(ulazi[0] == 1) {
        taster='*';
        return;
    } else if(ulazi[1] == 1) {
        taster= '0';
        return;
    } else if(ulazi[2] == 1) {
        taster= '#';
        return;
    } else if(ulazi[3] == 1) {
        taster='D';
        return;
    }
    izlazi[3] = 1;

    taster= ' ';
    return;
}
//---------------------------------------------------------------------------
void AlarmPodesavanje()
{
    int alarmUnosBrojac(0),alarmH1(0),alarmH2(0),alarmM1(0),alarmM2(0);
    char alarmstring [10];
    alarmH1=alarmH/10;
    alarmH%=10;
    alarmH2=alarmH;
    alarmM1=alarmM/10;
    alarmM%=10;
    alarmM2=alarmM;
    while (1) {
        lcd.clear();
        lcd.printString("Set alarm:",0,0);
        sprintf(alarmstring,"%d%d:%d%d",alarmH1,alarmH2,alarmM1,alarmM2);
        lcd.printString(alarmstring,0,1);
        lcd.refresh();
        if(taster=='C') {
            lcd.printString("Alarm is off",0,2);
            wait(0.3);
            alarmH1=0;
            alarmH2=0;
            alarmM1=0;
            alarmM2=0;
            alarmUnosBrojac=0;
            alarmUkljucen=false;
        } else if(taster=='D') {
            alarmH=10*alarmH1+alarmH2;
            alarmM=10*alarmM1+alarmM2;
            alarmUkljucen=true;
            return;
        } else if(taster>=0+'0' && taster<=9+'0') {
            switch (alarmUnosBrojac) {
                case 0:
                    if(taster<=2+'0') {
                        alarmH1=taster-'0';
                        alarmUnosBrojac++;
                    }
                    wait(0.2);
                    break;
                case 1:
                    if((alarmH1==2 && taster<=3+'0' )|| (alarmH1<2)) {
                        alarmH2=taster-'0';
                        alarmUnosBrojac++;
                    }
                    wait(0.2);
                    break;
                case 2:
                    if(taster<=5+'0') {
                        alarmM1=taster-'0';
                        alarmUnosBrojac++;
                    }
                    wait(0.2);
                    break;
                case 3:
                    alarmM2=taster-'0';
                    alarmUnosBrojac++;
                    wait(0.2);
                    break;
            }

        }


    }


}
//-----------------------------------------------------------------------------------------------------------------------------------
void PostavljanjeVremenaIDatuma()
{
    int UnosBrojac(0),H1(0),H2(0),M1(0),M2(0),D1(0),D2(0),MO1(0),MO2(0),Y1(0),Y2(0);
    char buffstring [22];
    H1=h/10;
    H2=h%10;
    M1=m/10;
    M2=m%10;
    D1=dan/10;
    D2=dan%10;
    MO1=mjesec/10;
    MO2=mjesec%10;
    Y1=godina/10;
    Y2=godina%10;
    usedmici=1;
    while (1) {
        lcd.printString("Set date and time:",0,0);
        sprintf(buffstring,"%d%d:%d%d",H1,H2,M1,M2);
        lcd.printString(buffstring,0,1);
                sprintf(buffstring,"%d%d/%d%d/%d%d",D1,D2,MO1,MO2,Y1,Y2);
        lcd.printString(buffstring,0,2);
        lcd.refresh();
        if(taster=='C') {
                H1=h/10;
    H2=h%10;
    M1=m/10;
    M2=m%10;
    D1=dan/10;
    D2=dan%10;
    MO1=mjesec/10;
    MO2=mjesec%10;
    Y1=godina/10;
    Y2=godina%10;
            UnosBrojac=0;
        } else if(taster=='D') {
            
            sat.settime(s, M1*10+M2, H1*10+H2, usedmici, D1*10+D2,M1*10+M2,Y1*10+Y2);
            return;
        } else if(taster-'0'>=0 && taster-'0'<=9) {
            switch (UnosBrojac) {
                case 0:
                    if(taster<=2+'0') {
                        H1=taster-'0';
                        UnosBrojac++;
                    }
                    wait(0.2);
                    break;
                case 1:
                    if((H1==2 && taster<=3+'0' )|| (H1<2)) {
                        H2=taster-'0';
                        UnosBrojac++;
                    }
                    wait(0.2);
                    break;
                case 2:
                    if(taster<=5+'0') {
                        M1=taster-'0';
                        UnosBrojac++;
                    }
                    wait(0.2);
                    break;
                case 3:
                    M2=taster-'0';
                    UnosBrojac++;
                    wait(0.2);
                    break;
                case 4:
                    if(taster<=3+'0') {
                        D1=taster-'0';
                        UnosBrojac++;
                    }
                    wait(0.2);
                    break;
                case 5:
                    if((D1==3 && taster<=1+'0' )|| (D1<3)) {
                        D2=taster-'0';
                        UnosBrojac++;
                    }
                    wait(0.2);
                    break;
                case 6:
                    if(taster<=1+'0') {
                        MO1=taster-'0';
                        UnosBrojac++;
                    }
                    wait(0.2);
                    break;
                case 7:
                    if((MO1==1 && taster<=2+'0' )|| (MO1<1)) {
                        if(10*D1+D2<=brojdana[10*MO1+taster-'0']) {
                            MO2=taster-'0';
                            UnosBrojac++;
                        } else {
                            lcd.printString("Bad date",0,3);
                            wait(0.3);
                            D1=dan/10;
                            D2=dan%10;
                            MO1=mjesec/10;
                            UnosBrojac=4;
                        }
                    }
                    wait (0.2);
                    break;
                case 8:
                    Y1=taster-'0';
                    UnosBrojac++;
                    wait(0.2);
                    break;
                case 9:
                    Y2=taster-'0';
                    UnosBrojac++;
                    wait(0.2);
                    break;
               

            }

        }


    }

}
//----------------------------------------------------------------------------------------
void Alarm()
{
    lcd.printString("TANK TIME",0,0);
    lcd.refresh();
    t.start();
    while (1) {
        if (t.read()==120 || taster =='D') {
            alarmUkljucen=false;
            lcd.clear();
            return;
        }
    }
    }
//--------------------------------------------------------------------------------------
    int main() {
        //deaktivacija led dioda
        enable=1;
        sat.start_clock();

        //inicijalizacija displeja
        lcd.init();
        tastatura.attach(&Tastatura,0.2);
                    

        while(1) {
            sat.gettime(&s,&m,&h, &usedmici, &dan, &mjesec, &godina);
            NacrtajSat();
            if (taster=='*') {
                lcd.clear();
                AlarmPodesavanje();
            }
            if (taster=='#') {
                lcd.clear();
                PostavljanjeVremenaIDatuma();
            }
                        if (h==alarmH && m==alarmM && alarmUkljucen) {
                lcd.clear();
                Alarm();
            }

            wait(0.2);
            lcd.clear();
        }
    }