This is the program that runs on the Mbell (https://sites.google.com/site/projectmbell)

Dependencies:   DS1307 LcdWindow TextLCD mbed

main.cpp

Committer:
tombracer
Date:
2012-10-25
Revision:
0:870ce81eb888

File content as of revision 0:870ce81eb888:

#include "mbed.h"
#include "hd44780_8bit.h" 
#include "ds1307.h"

Serial pc(USBTX, USBRX);
Serial toWifly(p13, p14);  // tx, rx
DS1307 my1307(p28,p27); // start DS1307 class and give it pins for connections of the DS1307 device
LocalFileSystem local("local"); // Create the local filesystem

 int sec = 0;
 int min = 0;
 int hours = 0;
 int day = 1; //sunday
 int date = 1;
 int month = 1;
 int year = 12; //2012
 
DigitalOut led1(LED1);
DigitalOut led2(LED2);
DigitalOut led3(LED3);
DigitalOut led4(LED4);

DigitalIn top(p20);
DigitalIn aup(p18);
DigitalIn bdw(p17);
DigitalIn bot(p19);

InterruptIn dbtrig(p24);
int trigState = 0;

//pushbuttons
InterruptIn menuButton(p25);
int menuState = 0;

DigitalIn menuUp(p26);
DigitalIn menuDown(p29);

//motor control pins
DigitalOut mena(p21);
DigitalOut mdown(p22);
DigitalOut mup(p23);

 void test_rw(int test) {
     if (test == 0) pc.printf("Last R/W operaion passed!\n\r");
     else pc.printf("Last R/W operation failed!\n\r");
 }
 
void up(void){
    mup=1;
    mdown=0;
}

void down(void) {
    mup=0;
    mdown=1;
}

void stop(void) {
    mup=0;
    mdown=0;
}

void gotoTop(void) {
    if(top) up();
    while(top) {
        led1=1;
    }
    stop();
    led1=0;
}

void gotoAup(void) {
    if(aup) up();
    while(aup) {
        led2=1;
    }
    stop();
    led2=0;
}

void gotoBot(void) {
    if(bot) down();
    while(bot) {
        led3=1;
    }
    stop();
    
    //give the ball time to enter lift
    wait(0.5); 
    led3=0;
}

//doorbell trigger interrupt routine
void doorbell() {
    //a little debouncing
    wait(0.01);
    if(dbtrig) trigState = 1;
}//doorbell

//menu setup trigger interrupt routine
void menuSetup() {
    wait(0.06);
    if(menuButton) menuState = 1;
}//menuSetup

int main() {        
    //LCD init
    BusOut *data=new BusOut(p7,p8,p9,p10,p11,p12,p15,p16);
    HD44780LCD8bit* lcd=new HD44780LCD8bit(16,2,data, p6, p5);
    lcd->init();
    lcd->writeText(0,0,"Alustetaan..");
    
    // set some default time to these values on the ds1307 connected device
    // test_rw(my1307.settime( sec, min, hours, day, date, month, year));
    
    wait(1);
        
    //sensor switches pull down the mbed pins when triggered   
    top.mode(PullUp);
    aup.mode(PullUp);
    bdw.mode(PullUp);
    bot.mode(PullUp);
    
    //pushbuttons also pull down the mbed pins
    menuButton.mode(PullUp);
    menuUp.mode(PullUp);
    menuDown.mode(PullUp);
    
    mena = 1;  //enable the L293D
    mdown = 0;
    mup = 0;
    
    //do a test run at start to find out where lift is now
    lcd->writeText(0,0,"Menossa alas");
    gotoBot();
    
    lcd->clear();
    wait(0.1);
    lcd->writeText(0,0,"Menossa");
    wait(0.1);
    lcd->writeText(0,1,"valmiustilaan"); 
    gotoAup();
    
    //setup doorbell interrupt and menu button interrupt
    dbtrig.rise(&doorbell);
    menuButton.fall(&menuSetup);
    
    //main loop
    while(1) {
    
      // DISPLAY CURRENT TIME AND DATE /////////////////////
    
      if(trigState==0 && menuState==0){
        lcd->clear();
        wait(0.1);
        
        //read time from ds1307
        test_rw(my1307.gettime( &sec, &min, &hours, &day, &date, &month, &year));
        lcd->locate(0,0);
        if (day == 1)
            lcd->printf("Su");
        if (day == 2)
            lcd->printf("Ma");   
        if (day == 3)
            lcd->printf("Ti");
        if (day == 4)
            lcd->printf("Ke");
        if (day == 5)
            lcd->printf("To");
        if (day == 6)
            lcd->printf("Pe");
        if (day == 7)
            lcd->printf("La");
            
        lcd->printf("  %.2D",date);
        lcd->printf(".%.2D",month);
        lcd->printf(".20%.2D",year);
        
        lcd->locate(0,1);    
        lcd->printf("Klo %.2D",hours);
        lcd->printf(":%.2D",min);
        //lcd->printf(":%.2D",sec);
        
        //'nonblocking' wait 5 sec
        for(int i=0;i<50;i++) {
            if(trigState==0 && menuState==0) {
                wait(0.1);
            }//if
            else {
                //break out of loop is doorbell
                //is triggered
                break;
            }//else
        }//for
      }//if trigState=0
      
      // DISPLAY LAST DOORBELL PRESS FROM LOG FILE /////////////////
      
      if(trigState==0 && menuState==0) {
       
        //read locally stored log file
        led1=led2=1;
        
        char buf[16]; //read 16 chars
        
        FILE *fp = fopen( "/local/doorbell.txt", "r");
        
        if(fp!=NULL) {           
            fgets(buf, sizeof(buf)+1, fp);
            fclose(fp);
        }//if not fp
        
        led1=led2=0;
      
        //print last doorbell ring on lcd
        lcd->clear();
        wait(0.1);
        lcd->locate(0,0);
        lcd->printf("Edellinen soitto");
        lcd->locate(0,1);
        lcd->printf("%s", buf);
        
        //'nonblocking' wait 5 sec
        for(int i=0;i<50;i++) {
            if(trigState==0 && menuState==0) {
                wait(0.1);
            }//if
            else {
                //break out of loop is doorbell
                //is triggered
                break;
            }//else
        }//for
      }//if trigState=0
      
      //DOORBELL IS PRESSED////////////////////////////
      if(trigState==1) {
        lcd->clear();
        wait(0.1);
        lcd->writeText(0,0,"Ovikello soi!");
        
        //log last doorbell press to local filesystem
        test_rw(my1307.gettime( &sec, &min, &hours, &day, &date, &month, &year));
        
        led1=led2=1;
        FILE *fp = fopen("/local/doorbell.txt", "w");
        
        //16 chars example
        //1234567890123456
        //Edellinen soitto
        //Ma 10.10.  10:10
        if (day == 1)
            fprintf(fp, "Su");
        if (day == 2)
            fprintf(fp, "Ma");   
        if (day == 3)
            fprintf(fp, "Ti");
        if (day == 4)
            fprintf(fp, "Ke");
        if (day == 5)
            fprintf(fp, "To");
        if (day == 6)
            fprintf(fp, "Pe");
        if (day == 7)
            fprintf(fp, "La");
            
        fprintf(fp, " %.2D",date);
        fprintf(fp, ".%.2D",month);
        fprintf(fp, ".  %.2D",hours);
        fprintf(fp, ":%.2D",min);
        fclose(fp); 
        led1=led2=0;
        
        //Write doorbell message to wifly serial.
        //t-codes:
        //1: critical
        //2: error/warning
        //3: info
        toWifly.printf("Ovikello&t=3");
        
        //run the lift
        gotoTop(); //launch ball
        
        //wait maximum 20 seconds 
        //(in case bdw sensor fails)
        int i=0;
        
        //wait for ball to get down
        while(bdw) {
            i++;
            led4 = !led4;
            wait(0.05);
            //100x 0.05 sec = 5 sec
            //need to count to 400 before break
            
            //break out of while after 20 seconds
            if(i>400) {
                lcd->clear();     //1234567890123456
                lcd->writeText(0,0,"Palloa ei kuulu,");
                wait(0.1);
                lcd->writeText(0,1,"haetaan se silti");
                wait(3);
                break;
            }//if
        }//while bdw
        led4=0;
        
        lcd->clear();
        lcd->writeText(0,0,"Menossa alas");
        gotoBot();
    
        lcd->clear();
        wait(0.1);
        lcd->writeText(0,0,"Menossa");
        wait(0.1);
        lcd->writeText(0,1,"valmiustilaan"); 
        gotoAup();
       
        //reset interrupt state        
        trigState=0;       
      }//if doorbell
      
      //if menu button is pressed
      if(menuState==1) {
        //reset menu state
        menuState = 0;
      
        //read time from ds1307
        test_rw(my1307.gettime( &sec, &min, &hours, &day, &date, &month, &year));
        
        //SET HOURS///////////////////////////////////
      
        lcd->clear();
        wait(0.1);
        lcd->writeText(0,0,"Aseta tunti");
        wait(0.1);
        
        //print current hour on second row
        lcd->locate(0,1);
        lcd->printf("%.2D",hours);
        
        //loop until menu state button is pressed again
        while(menuButton) {
            //if menu up button is pressed
            if(!menuUp) {
                wait(0.07); //debounce
                    if(!menuUp) {
                        hours++;
                        if(hours>23) hours=0;
                        lcd->locate(0,1);
                        lcd->printf("%.2D",hours);
                    }//inner if
            }//if menuup
            
            //if menu down button is pressed
            if(!menuDown) {
                wait(0.07); //debounce
                    if(!menuDown) {
                        hours--;
                        if(hours<0) hours=23;
                        lcd->locate(0,1);
                        lcd->printf("%.2D",hours);
                    }//inner if
            }//if menuup
          }//while not menustate hours
            
        //SET MINUTES/////////////////////////////////////
        
        lcd->clear();
        wait(0.1);
        lcd->writeText(0,0,"Aseta minuutti");
        wait(0.1);
        
        //print current min on second row
        lcd->locate(0,1);
        lcd->printf("%.2D",min);
        
        //loop until menu state button is pressed again
        while(menuButton) {
            //if menu up button is pressed
            if(!menuUp) {
                wait(0.07); //debounce
                    if(!menuUp) {
                        min++;
                        if(min>59) min=0;
                        lcd->locate(0,1);
                        lcd->printf("%.2D",min);
                    }//inner if
            }//if menuup
            
            //if menu down button is pressed
            if(!menuDown) {
                wait(0.07); //debounce
                    if(!menuDown) {
                        min--;
                        if(min<0) min=59;
                        lcd->locate(0,1);
                        lcd->printf("%.2D",min);
                    }//inner if
            }//if menuup
        }//while not menustate min
            
        //SET SECONDS/////////////////////////////////
         
        lcd->clear();
        wait(0.1);
        lcd->writeText(0,0,"Aseta sekunti");
        wait(0.1);
        
        //print current sec on second row
        lcd->locate(0,1);
        lcd->printf("%.2D",sec);
        
        //loop until menu state button is pressed again
        while(menuButton) {
            //if menu up button is pressed
            if(!menuUp) {
                wait(0.07); //debounce
                    if(!menuUp) {
                        sec++;
                        if(sec>59) sec=0;
                        lcd->locate(0,1);
                        lcd->printf("%.2D",sec);
                    }//inner if
            }//if menuup
            
            //if menu down button is pressed
            if(!menuDown) {
                wait(0.07); //debounce
                    if(!menuDown) {
                        sec--;
                        if(sec<0) sec=59;
                        lcd->locate(0,1);
                        lcd->printf("%.2D",sec);
                    }//inner if
            }//if menuup
        }//while not menustate sec 
        
        //SET WEEKDAY/////////////////////////////////
         
        lcd->clear();
        wait(0.1);
        lcd->writeText(0,0,"Aseta viikonpv");
        wait(0.1);
        
        //print current weekday on second row
        lcd->locate(0,1);

        if (day == 1)
            lcd->printf("Su");
        if (day == 2)
            lcd->printf("Ma");   
        if (day == 3)
            lcd->printf("Ti");
        if (day == 4)
            lcd->printf("Ke");
        if (day == 5)
            lcd->printf("To");
        if (day == 6)
            lcd->printf("Pe");
        if (day == 7)
            lcd->printf("La");
        
        //loop until menu state button is pressed again
        while(menuButton) {
            //if menu up button is pressed
            if(!menuUp) {
                wait(0.07); //debounce
                    if(!menuUp) {
                        day++;
                        if(day>7) day=1;
                        lcd->locate(0,1);
                        if (day == 1)
                            lcd->printf("Su");
                        if (day == 2)
                            lcd->printf("Ma");   
                        if (day == 3)
                            lcd->printf("Ti");
                        if (day == 4)
                            lcd->printf("Ke");
                        if (day == 5)
                            lcd->printf("To");
                        if (day == 6)
                            lcd->printf("Pe");
                        if (day == 7)
                            lcd->printf("La");
                    }//inner if
            }//if menuup
            
            //if menu down button is pressed
            if(!menuDown) {
                wait(0.07); //debounce
                    if(!menuDown) {
                        day--;
                        if(day<1) day=7;
                        lcd->locate(0,1);
                        if (day == 1)
                            lcd->printf("Su");
                        if (day == 2)
                            lcd->printf("Ma");   
                        if (day == 3)
                            lcd->printf("Ti");
                        if (day == 4)
                            lcd->printf("Ke");
                        if (day == 5)
                            lcd->printf("To");
                        if (day == 6)
                            lcd->printf("Pe");
                        if (day == 7)
                            lcd->printf("La");
                    }//inner if
            }//if menuup
        }//while not menustate weekday
        
        //SET DATE/////////////////////////////////
         
        lcd->clear();
        wait(0.1);
        lcd->writeText(0,0,"Aseta pvm");
        wait(0.1);
        
        //print current date on second row
        lcd->locate(0,1);
        lcd->printf("%.2D",date);
        
        //loop until menu state button is pressed again
        while(menuButton) {
            //if menu up button is pressed
            if(!menuUp) {
                wait(0.07); //debounce
                    if(!menuUp) {
                        date++;
                        if(date>31) date=1;
                        lcd->locate(0,1);
                        lcd->printf("%.2D",date);
                    }//inner if
            }//if menuup
            
            //if menu down button is pressed
            if(!menuDown) {
                wait(0.07); //debounce
                    if(!menuDown) {
                        date--;
                        if(date<1) date=31;
                        lcd->locate(0,1);
                        lcd->printf("%.2D",date);
                    }//inner if
            }//if menuup
        }//while not menustate date
        
        //SET MONTH/////////////////////////////////
         
        lcd->clear();
        wait(0.1);
        lcd->writeText(0,0,"Aseta kuukausi");
        wait(0.1);
        
        //print current sec on second row
        lcd->locate(0,1);
        lcd->printf("%.2D",month);
        
        //loop until menu state button is pressed again
        while(menuButton) {
            //if menu up button is pressed
            if(!menuUp) {
                wait(0.07); //debounce
                    if(!menuUp) {
                        month++;
                        if(month>12) month=1;
                        lcd->locate(0,1);
                        lcd->printf("%.2D",month);
                    }//inner if
            }//if menuup
            
            //if menu down button is pressed
            if(!menuDown) {
                wait(0.07); //debounce
                    if(!menuDown) {
                        month--;
                        if(month<1) month=12;
                        lcd->locate(0,1);
                        lcd->printf("%.2D",month);
                    }//inner if
            }//if menuup
        }//while not menustate month
        
        //SET YEAR/////////////////////////////////
         
        lcd->clear();
        wait(0.1);
        lcd->writeText(0,0,"Aseta vuosi");
        wait(0.1);
        
        //print current year on second row
        lcd->locate(0,1);
        lcd->printf("%.2D",year);
        
        //loop until menu state button is pressed again
        while(menuButton) {
            //if menu up button is pressed
            if(!menuUp) {
                wait(0.07); //debounce
                    if(!menuUp) {
                        year++;
                        if(sec>2100) year=2000;
                        lcd->locate(0,1);
                        lcd->printf("%.2D",year);
                    }//inner if
            }//if menuup
            
            //if menu down button is pressed
            if(!menuDown) {
                wait(0.07); //debounce
                    if(!menuDown) {
                        year--;
                        if(year<2000) year=2100;
                        lcd->locate(0,1);
                        lcd->printf("%.2D",year);
                    }//inner if
            }//if menuup
        }//while not menustate year
        
        //store new values in ds1307
        test_rw(my1307.settime( sec, min, hours, day, date, month, year));
        menuState = 0;
      }//if menustate
      
    }//while 1
}//main