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

Dependencies:   DS1307 LcdWindow TextLCD mbed

Files at this revision

API Documentation at this revision

Comitter:
tombracer
Date:
Thu Oct 25 16:19:55 2012 +0000
Commit message:
First "finished" version

Changed in this revision

DS1307.lib Show annotated file Show diff for this revision Revisions of this file
LcdWindow.lib Show annotated file Show diff for this revision Revisions of this file
TextLCD.lib Show annotated file Show diff for this revision Revisions of this file
main.cpp Show annotated file Show diff for this revision Revisions of this file
mbed.bld Show annotated file Show diff for this revision Revisions of this file
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/DS1307.lib	Thu Oct 25 16:19:55 2012 +0000
@@ -0,0 +1,1 @@
+http://mbed.org/users/harrypowers/code/DS1307/#c3e4da8feb10
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/LcdWindow.lib	Thu Oct 25 16:19:55 2012 +0000
@@ -0,0 +1,1 @@
+http://mbed.org/users/hlipka/code/LcdWindow/#2fe93daa2106
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/TextLCD.lib	Thu Oct 25 16:19:55 2012 +0000
@@ -0,0 +1,1 @@
+http://mbed.org/users/simon/code/TextLCD/#44f34c09bd37
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/main.cpp	Thu Oct 25 16:19:55 2012 +0000
@@ -0,0 +1,629 @@
+#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
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/mbed.bld	Thu Oct 25 16:19:55 2012 +0000
@@ -0,0 +1,1 @@
+http://mbed.org/users/mbed_official/code/mbed/builds/10b9abbe79a6
\ No newline at end of file