alarmclock with 2 alarm times, 128x64 LCD with KS0108, displays time / time&date / a menu to change time & alarms, rotary encoder with push button, relay which switsches on a hi-fi system or something else, a 1F- Cap as a backup supply

Dependencies:   KS0108 QEI mbed

Alarmclock

features:

  • alarmclock with 2 alarm times
  • 128x64 LCD with KS0108
  • displays time / time&date / a menu to change time & alarms
  • sleeptimer, relay is switched of when timer runs out
  • rotary encoder with push button
  • relay which switsches on a hi-fi system or something else
  • a 1F- Cap as a backup supply

todo/ desired improvements/ known issues:

  • a more precise real time clock would be nice
  • a speaker or beeper directly connected to the mbed
  • there is a bug where the big font is not displayed correctly

Schematic:

/media/uploads/gaebu/alarmclock_mbed_128x64.pdf

Revision:
1:8a7f4f79f84d
Parent:
0:62a6f55722d9
Child:
2:fbf734bc04de
--- a/main.cpp	Tue Jan 21 12:35:29 2014 +0000
+++ b/main.cpp	Tue Aug 26 21:32:24 2014 +0000
@@ -20,12 +20,14 @@
 //  - alarmclock with 2 alarm times
 //  - 128x64 LCD with KS0108
 //  - displays time / time&date / a menu to change time & alarms
+//  - sleeptimer, relay is switched of when timer runs out
 //  - rottary encoder with push button
 //  - relay which switsches on a hi-fi system or something else
 //  - a 1F- Cap as a backup supply
+//  - the relay is manualy switched on/off by pressing the button
+//    longer than 2s
 //----------------------------------------------------------------
 // todo/ desired improvements:
-//  - the sleeptimer isn't integrated already
 //  - a real time clock would be nice
 //  - a speaker or beeper directly connected to the mbed
 //----------------------------------------------------------------
@@ -49,7 +51,7 @@
 //             _RST,_DI, _RW, _E, _CS2, _CS1,DB0, DB1, DB2, DB3, DB4, DB5, DB6, DB7)
 KS0108 display(p13, p12, p14, p11, p30, p29, p21, p22, p23, p24, p25, p26, p27, p28);
 
-QEI wheel (p17, p16, NC, 18);
+QEI wheel (p17, p16, NC, 18, QEI::X2_ENCODING);
 DigitalIn wheelpush(p18);
 DigitalOut led1(LED1), led2(LED2), relay(p15), enbackligth(p19);
 
@@ -60,7 +62,8 @@
     menuDisp=1;
     alarmon=0;
     alarmset2=0;
-    sleeptimer=30;
+    sleeptimer=0;
+    wheelpushchanged=1;
 
     alarm.tm_sec = 00;    // 0-59
     alarm.tm_min = 00;    // 0-59
@@ -81,21 +84,7 @@
     display.PrintString("by_gaebu!");
     wait(2);
     clearmenu();
-
-    /*
-    //print all chars
-    display.ClearScreen();
-    int x=0,y=0;
-    for (int i=0x20;i<0xff;i++){
-        display.Putchar(y,x,i);
-        x=x+8;
-        if (x>120){
-            x=0;
-            y++;
-        }
-    }
-    while(1){}
-    */                    
+    wheel.reset();            
 //mainloop
 //---------------------------------------------------------------
     while (1) {
@@ -140,16 +129,12 @@
             newtime = localtime(&seconds);
             if(alarm.tm_min==newtime->tm_min & alarm.tm_hour==newtime->tm_hour & alarm.tm_sec==newtime->tm_sec) {
                 alarmon=1;
-                //menuold=menu;
-                //blstateold=blstate;
             }
         }
         if(alarmset2 & !alarmon2) {
             newtime = localtime(&seconds);
             if(alarm2.tm_min==newtime->tm_min & alarm2.tm_hour==newtime->tm_hour & alarm2.tm_sec==newtime->tm_sec) {
                 alarmon2=1;
-                //menuold=menu;
-                //blstateold=blstate;
             }
         }
 
@@ -242,7 +227,10 @@
                 //--- Menu 8 --- sleep timer
             case 7:
                 if (wheelpushed) {
-                    setsleeptimer();
+                    if (sleeptimer>0)   //if sleeptimer already set then reset
+                        sleeptimer=0;
+                    else
+                        setsleeptimer();
                 }
                 printmenu(7);
                 break;        
@@ -297,6 +285,11 @@
     display.PutString(6,20,"set Time/ Date");
     //zeile7
     display.PutString(7,20,"sleep timer");
+//    if (sleeptimerstart) {
+    if (sleeptimer>0) {
+        display.PrintInteger(sleeptimer,7,85);
+//        display.PutString(7,40,sleeptime_set);
+    }        
     //select line
     for (i=2;i<8;i++)
         display.PutString(i,2,"  ");
@@ -306,6 +299,7 @@
 }
 //------------------------------------------
 void setsleeptimer(){
+    sleeptimer=30;
     clearmenu();
     wheel.reset();
     change_sleeptimer=true;
@@ -324,7 +318,7 @@
 
         checkbutton();       
         if (wheel.getPulses()>1){
-            if (sleeptimer<10080)
+            if (sleeptimer<1080)
                 sleeptimer+=5;
         }
         else if (wheel.getPulses()<1){
@@ -338,10 +332,23 @@
             change_sleeptimer=false;
             wheelpushed=false;
             wheel.reset();
+            //sleeptimerstart=true;
+            ticker.attach(&ticker_tick, 60);
+            relay=1;
         }
     }
 }
 //------------------------------------------
+void ticker_tick() //called every 60s when sleeptimer set
+{
+    sleeptimer--;
+    if (sleeptimer==0){
+        relay=0;
+        blstate=0;
+        ticker.detach();
+    }
+}    
+//------------------------------------------
 void setalarm(char alnb)
 {
     clearmenu();
@@ -561,15 +568,21 @@
 {
     wheelpushed=false;
     wheelpushedlong=false;
+        
     if (!wheelpush) {
-        temp=0;
-        while(!wheelpush) {
-            wait(0.01);
-            temp++;
-        }
-        if (temp>150)
-            wheelpushedlong=true;
-        else
-            wheelpushed=true;
+        if (wheelpushchanged) {
+            temp=0;
+            while(!wheelpush & temp<=200) { //if pressed longer than 2s..
+                wait(0.01);
+                temp++;
+            }
+            if (temp>200)
+                wheelpushedlong=true;
+            else
+                wheelpushed=true;
+            wheelpushchanged=0;
+        }    
     }
+    else
+        wheelpushchanged=1;
 }
\ No newline at end of file