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

Committer:
gaebu
Date:
Tue Aug 26 21:32:24 2014 +0000
Revision:
1:8a7f4f79f84d
Parent:
0:62a6f55722d9
Child:
2:fbf734bc04de
changes:; - added sleeptimer; - improvements in 'checkbutton()', detecting press and long press

Who changed what in which revision?

UserRevisionLine numberNew contents of line
gaebu 0:62a6f55722d9 1 /*
gaebu 0:62a6f55722d9 2 * @author gaebu
gaebu 0:62a6f55722d9 3 *
gaebu 0:62a6f55722d9 4 * @section LICENSE
gaebu 0:62a6f55722d9 5 *
gaebu 0:62a6f55722d9 6 * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
gaebu 0:62a6f55722d9 7 * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
gaebu 0:62a6f55722d9 8 * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
gaebu 0:62a6f55722d9 9 * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
gaebu 0:62a6f55722d9 10 * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
gaebu 0:62a6f55722d9 11 * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
gaebu 0:62a6f55722d9 12 * THE SOFTWARE.
gaebu 0:62a6f55722d9 13 *
gaebu 0:62a6f55722d9 14 * @section DESCRIPTION
gaebu 0:62a6f55722d9 15
gaebu 0:62a6f55722d9 16 //----------------------------------------------------------------
gaebu 0:62a6f55722d9 17 // Alarmclock
gaebu 0:62a6f55722d9 18 // -----------
gaebu 0:62a6f55722d9 19 // features:
gaebu 0:62a6f55722d9 20 // - alarmclock with 2 alarm times
gaebu 0:62a6f55722d9 21 // - 128x64 LCD with KS0108
gaebu 0:62a6f55722d9 22 // - displays time / time&date / a menu to change time & alarms
gaebu 1:8a7f4f79f84d 23 // - sleeptimer, relay is switched of when timer runs out
gaebu 0:62a6f55722d9 24 // - rottary encoder with push button
gaebu 0:62a6f55722d9 25 // - relay which switsches on a hi-fi system or something else
gaebu 0:62a6f55722d9 26 // - a 1F- Cap as a backup supply
gaebu 1:8a7f4f79f84d 27 // - the relay is manualy switched on/off by pressing the button
gaebu 1:8a7f4f79f84d 28 // longer than 2s
gaebu 0:62a6f55722d9 29 //----------------------------------------------------------------
gaebu 0:62a6f55722d9 30 // todo/ desired improvements:
gaebu 0:62a6f55722d9 31 // - a real time clock would be nice
gaebu 0:62a6f55722d9 32 // - a speaker or beeper directly connected to the mbed
gaebu 0:62a6f55722d9 33 //----------------------------------------------------------------
gaebu 0:62a6f55722d9 34 */
gaebu 0:62a6f55722d9 35
gaebu 0:62a6f55722d9 36 #include "mbed.h"
gaebu 0:62a6f55722d9 37 #include "KS0108.h"
gaebu 0:62a6f55722d9 38 #include "QEI.h"
gaebu 0:62a6f55722d9 39 //#include "math.h"
gaebu 0:62a6f55722d9 40 //#include "Arial12.h"
gaebu 0:62a6f55722d9 41 //#include "Arial14.h"
gaebu 0:62a6f55722d9 42 //#include "arial_bold_14.h"
gaebu 0:62a6f55722d9 43 #include "Comic24.h"
gaebu 0:62a6f55722d9 44 //#include "SystemFont5x7.h"
gaebu 0:62a6f55722d9 45 //#include "vivaldi16.h"
gaebu 0:62a6f55722d9 46 //#include "MyPhone_20.h"
gaebu 0:62a6f55722d9 47 #include "MyPhone_40.h"
gaebu 0:62a6f55722d9 48 #include "alarmclock.h"
gaebu 0:62a6f55722d9 49 //#include <string>
gaebu 0:62a6f55722d9 50
gaebu 0:62a6f55722d9 51 // _RST,_DI, _RW, _E, _CS2, _CS1,DB0, DB1, DB2, DB3, DB4, DB5, DB6, DB7)
gaebu 0:62a6f55722d9 52 KS0108 display(p13, p12, p14, p11, p30, p29, p21, p22, p23, p24, p25, p26, p27, p28);
gaebu 0:62a6f55722d9 53
gaebu 1:8a7f4f79f84d 54 QEI wheel (p17, p16, NC, 18, QEI::X2_ENCODING);
gaebu 0:62a6f55722d9 55 DigitalIn wheelpush(p18);
gaebu 0:62a6f55722d9 56 DigitalOut led1(LED1), led2(LED2), relay(p15), enbackligth(p19);
gaebu 0:62a6f55722d9 57
gaebu 0:62a6f55722d9 58 int main()
gaebu 0:62a6f55722d9 59 {
gaebu 0:62a6f55722d9 60 //general init
gaebu 0:62a6f55722d9 61 menu=1;
gaebu 0:62a6f55722d9 62 menuDisp=1;
gaebu 0:62a6f55722d9 63 alarmon=0;
gaebu 0:62a6f55722d9 64 alarmset2=0;
gaebu 1:8a7f4f79f84d 65 sleeptimer=0;
gaebu 1:8a7f4f79f84d 66 wheelpushchanged=1;
gaebu 0:62a6f55722d9 67
gaebu 0:62a6f55722d9 68 alarm.tm_sec = 00; // 0-59
gaebu 0:62a6f55722d9 69 alarm.tm_min = 00; // 0-59
gaebu 0:62a6f55722d9 70 alarm.tm_hour = 6; // 0-23
gaebu 0:62a6f55722d9 71 alarm2.tm_sec = 00; // 0-59
gaebu 0:62a6f55722d9 72 alarm2.tm_min = 00; // 0-59
gaebu 0:62a6f55722d9 73 alarm2.tm_hour = 5; // 0-23
gaebu 0:62a6f55722d9 74
gaebu 0:62a6f55722d9 75 //display title & frame
gaebu 0:62a6f55722d9 76 display.ClearScreen();
gaebu 0:62a6f55722d9 77 display.PutString(0,30,"alarmclock");
gaebu 0:62a6f55722d9 78 display.EmptyRectangle(0,0,127,63,BLACK);
gaebu 0:62a6f55722d9 79 display.HLine(0,127,7,BLACK);
gaebu 0:62a6f55722d9 80
gaebu 0:62a6f55722d9 81
gaebu 0:62a6f55722d9 82 display.GotoXY(10,16);
gaebu 0:62a6f55722d9 83 display.SelectFont(Comic24,BLACK,ReadData);
gaebu 0:62a6f55722d9 84 display.PrintString("by_gaebu!");
gaebu 0:62a6f55722d9 85 wait(2);
gaebu 0:62a6f55722d9 86 clearmenu();
gaebu 1:8a7f4f79f84d 87 wheel.reset();
gaebu 0:62a6f55722d9 88 //mainloop
gaebu 0:62a6f55722d9 89 //---------------------------------------------------------------
gaebu 0:62a6f55722d9 90 while (1) {
gaebu 0:62a6f55722d9 91 //read time
gaebu 0:62a6f55722d9 92 seconds = time(NULL);
gaebu 0:62a6f55722d9 93
gaebu 0:62a6f55722d9 94 led1=relay;
gaebu 0:62a6f55722d9 95
gaebu 0:62a6f55722d9 96 //ckeck if button pressed or wheel turned
gaebu 0:62a6f55722d9 97 checkbutton();
gaebu 0:62a6f55722d9 98 //menu=wheel.getPulses();
gaebu 0:62a6f55722d9 99 if (wheel.getPulses()>1){
gaebu 0:62a6f55722d9 100 wheel.reset();
gaebu 0:62a6f55722d9 101 menu++;
gaebu 0:62a6f55722d9 102 if (menu>7)
gaebu 0:62a6f55722d9 103 menu=0;
gaebu 0:62a6f55722d9 104 }
gaebu 0:62a6f55722d9 105 if (wheel.getPulses()<1){
gaebu 0:62a6f55722d9 106 wheel.reset();
gaebu 0:62a6f55722d9 107 if (menu==0)
gaebu 0:62a6f55722d9 108 menu=7;
gaebu 0:62a6f55722d9 109 else
gaebu 0:62a6f55722d9 110 menu--;
gaebu 0:62a6f55722d9 111 }
gaebu 0:62a6f55722d9 112 display.PrintInteger(menu,0,100);
gaebu 0:62a6f55722d9 113
gaebu 0:62a6f55722d9 114 //ring the alarm?
gaebu 0:62a6f55722d9 115 if(alarmon | alarmon2) {
gaebu 0:62a6f55722d9 116 relay=1;
gaebu 0:62a6f55722d9 117 //blstate=!blstate;
gaebu 0:62a6f55722d9 118 backlight(1);//blstate);
gaebu 0:62a6f55722d9 119 if(menuold!=menu) { //ring until any button pressed
gaebu 0:62a6f55722d9 120 alarmon=0;
gaebu 0:62a6f55722d9 121 alarmon2=0;
gaebu 0:62a6f55722d9 122 relay=0;
gaebu 0:62a6f55722d9 123 backlight(blstate);//old);
gaebu 0:62a6f55722d9 124 }
gaebu 0:62a6f55722d9 125 }
gaebu 0:62a6f55722d9 126
gaebu 0:62a6f55722d9 127 //check alarm
gaebu 0:62a6f55722d9 128 if(alarmset & !alarmon) {
gaebu 0:62a6f55722d9 129 newtime = localtime(&seconds);
gaebu 0:62a6f55722d9 130 if(alarm.tm_min==newtime->tm_min & alarm.tm_hour==newtime->tm_hour & alarm.tm_sec==newtime->tm_sec) {
gaebu 0:62a6f55722d9 131 alarmon=1;
gaebu 0:62a6f55722d9 132 }
gaebu 0:62a6f55722d9 133 }
gaebu 0:62a6f55722d9 134 if(alarmset2 & !alarmon2) {
gaebu 0:62a6f55722d9 135 newtime = localtime(&seconds);
gaebu 0:62a6f55722d9 136 if(alarm2.tm_min==newtime->tm_min & alarm2.tm_hour==newtime->tm_hour & alarm2.tm_sec==newtime->tm_sec) {
gaebu 0:62a6f55722d9 137 alarmon2=1;
gaebu 0:62a6f55722d9 138 }
gaebu 0:62a6f55722d9 139 }
gaebu 0:62a6f55722d9 140
gaebu 0:62a6f55722d9 141 //display menu
gaebu 0:62a6f55722d9 142 //---------------------------------------------------------------
gaebu 0:62a6f55722d9 143 if (menu!=menuold) {
gaebu 0:62a6f55722d9 144 menuDisp=menu;
gaebu 0:62a6f55722d9 145 if (menu<2 | (menu==2&menuold==1) | (menu==7&menuold==0)){
gaebu 0:62a6f55722d9 146 clearmenu();
gaebu 0:62a6f55722d9 147 }
gaebu 0:62a6f55722d9 148 menuold=menu;
gaebu 0:62a6f55722d9 149 }
gaebu 0:62a6f55722d9 150 else if (menu>1 & !(wheelpushed|wheelpushedlong)) //don't redraw menu if no time is diplayed or no input made
gaebu 0:62a6f55722d9 151 menuDisp=99;
gaebu 0:62a6f55722d9 152 else
gaebu 0:62a6f55722d9 153 menuDisp=menu;
gaebu 0:62a6f55722d9 154
gaebu 0:62a6f55722d9 155 switch (menuDisp) {
gaebu 0:62a6f55722d9 156 //--- Menu 1 --- date&time
gaebu 0:62a6f55722d9 157 case 0:
gaebu 0:62a6f55722d9 158 strftime(x_day, 20, "%a, %d %b %Y\n", localtime(&seconds));
gaebu 0:62a6f55722d9 159 display.PutString(3,20,x_day);
gaebu 0:62a6f55722d9 160
gaebu 0:62a6f55722d9 161 strftime(x_time, 16, "%X\n", localtime(&seconds));
gaebu 0:62a6f55722d9 162 display.PutString(4,30,x_time);
gaebu 0:62a6f55722d9 163
gaebu 0:62a6f55722d9 164 if (wheelpushed) { //switch backlight if button pressed
gaebu 0:62a6f55722d9 165 blstate=!blstate;
gaebu 0:62a6f55722d9 166 backlight(blstate);
gaebu 0:62a6f55722d9 167 }
gaebu 0:62a6f55722d9 168 if (wheelpushedlong) { //switch relay if button pressed long
gaebu 0:62a6f55722d9 169 relay=!relay;
gaebu 0:62a6f55722d9 170 }
gaebu 0:62a6f55722d9 171 break;
gaebu 0:62a6f55722d9 172
gaebu 0:62a6f55722d9 173 //--- Menu 2 --- time big
gaebu 0:62a6f55722d9 174 case 1:
gaebu 0:62a6f55722d9 175 strftime(x_time, 16, "%H:%M", localtime(&seconds));
gaebu 0:62a6f55722d9 176 display.GotoXY(32,24);
gaebu 0:62a6f55722d9 177 //display.SelectFont(MyPhone_40,BLACK,ReadData);
gaebu 0:62a6f55722d9 178 display.SelectFont(Comic24,BLACK,ReadData);
gaebu 0:62a6f55722d9 179 display.PrintString(x_time);
gaebu 0:62a6f55722d9 180
gaebu 0:62a6f55722d9 181 if (wheelpushed) { //switch backlight if button pressed
gaebu 0:62a6f55722d9 182 blstate=!blstate;
gaebu 0:62a6f55722d9 183 backlight(blstate);
gaebu 0:62a6f55722d9 184 }
gaebu 0:62a6f55722d9 185 if (wheelpushedlong) { //switch relay if button pressed long
gaebu 0:62a6f55722d9 186 relay=!relay;
gaebu 0:62a6f55722d9 187 }
gaebu 0:62a6f55722d9 188 break;
gaebu 0:62a6f55722d9 189
gaebu 0:62a6f55722d9 190 //--- Menu 3 --- display menu, alarm1 on/off
gaebu 0:62a6f55722d9 191 case 2:
gaebu 0:62a6f55722d9 192 if (wheelpushed) {
gaebu 0:62a6f55722d9 193 alarmset=!alarmset;
gaebu 0:62a6f55722d9 194 }
gaebu 0:62a6f55722d9 195 printmenu(2);
gaebu 0:62a6f55722d9 196 break;
gaebu 0:62a6f55722d9 197 //--- Menu 4 --- display menu, alarm2 on/off
gaebu 0:62a6f55722d9 198 case 3:
gaebu 0:62a6f55722d9 199 if (wheelpushed) {
gaebu 0:62a6f55722d9 200 alarmset2=!alarmset2;
gaebu 0:62a6f55722d9 201 // readchar=0;
gaebu 0:62a6f55722d9 202 }
gaebu 0:62a6f55722d9 203 printmenu(3);
gaebu 0:62a6f55722d9 204 break;
gaebu 0:62a6f55722d9 205 //--- Menu 5 --- set alarm 1
gaebu 0:62a6f55722d9 206 case 4:
gaebu 0:62a6f55722d9 207 if (wheelpushed) {
gaebu 0:62a6f55722d9 208 setalarm(1);
gaebu 0:62a6f55722d9 209 }
gaebu 0:62a6f55722d9 210 printmenu(4);
gaebu 0:62a6f55722d9 211 break;
gaebu 0:62a6f55722d9 212 //--- Menu 6 --- set alarm 2
gaebu 0:62a6f55722d9 213 case 5:
gaebu 0:62a6f55722d9 214 if (wheelpushed) {
gaebu 0:62a6f55722d9 215 setalarm(2);
gaebu 0:62a6f55722d9 216 }
gaebu 0:62a6f55722d9 217 printmenu(5);
gaebu 0:62a6f55722d9 218 break;
gaebu 0:62a6f55722d9 219 //--- Menu 7 --- set time&date
gaebu 0:62a6f55722d9 220 case 6:
gaebu 0:62a6f55722d9 221 if (wheelpushed) {
gaebu 0:62a6f55722d9 222 settimedate();
gaebu 0:62a6f55722d9 223 }
gaebu 0:62a6f55722d9 224 printmenu(6);
gaebu 0:62a6f55722d9 225 break;
gaebu 0:62a6f55722d9 226
gaebu 0:62a6f55722d9 227 //--- Menu 8 --- sleep timer
gaebu 0:62a6f55722d9 228 case 7:
gaebu 0:62a6f55722d9 229 if (wheelpushed) {
gaebu 1:8a7f4f79f84d 230 if (sleeptimer>0) //if sleeptimer already set then reset
gaebu 1:8a7f4f79f84d 231 sleeptimer=0;
gaebu 1:8a7f4f79f84d 232 else
gaebu 1:8a7f4f79f84d 233 setsleeptimer();
gaebu 0:62a6f55722d9 234 }
gaebu 0:62a6f55722d9 235 printmenu(7);
gaebu 0:62a6f55722d9 236 break;
gaebu 0:62a6f55722d9 237 case 99:
gaebu 0:62a6f55722d9 238 //do nothing
gaebu 0:62a6f55722d9 239 break;
gaebu 0:62a6f55722d9 240 default:
gaebu 0:62a6f55722d9 241 display.PutString(0,100,"error");
gaebu 0:62a6f55722d9 242 exit(1);
gaebu 0:62a6f55722d9 243 }
gaebu 0:62a6f55722d9 244 }
gaebu 0:62a6f55722d9 245 }
gaebu 0:62a6f55722d9 246 //functions
gaebu 0:62a6f55722d9 247 //------------------------------------------
gaebu 0:62a6f55722d9 248 void clearmenu()
gaebu 0:62a6f55722d9 249 {
gaebu 0:62a6f55722d9 250 //display.FullRectangle(1,9,126,62,WHITE);
gaebu 0:62a6f55722d9 251
gaebu 0:62a6f55722d9 252 //display title & frame
gaebu 0:62a6f55722d9 253 display.ClearScreen();
gaebu 0:62a6f55722d9 254 display.PutString(0,30,"alarmclock");
gaebu 0:62a6f55722d9 255 display.EmptyRectangle(0,0,127,63,BLACK);
gaebu 0:62a6f55722d9 256 display.HLine(0,127,7,BLACK);
gaebu 0:62a6f55722d9 257 }
gaebu 0:62a6f55722d9 258 //------------------------------------------
gaebu 0:62a6f55722d9 259 void printmenu(int selectedline)
gaebu 0:62a6f55722d9 260 {
gaebu 0:62a6f55722d9 261
gaebu 0:62a6f55722d9 262 //zeile1
gaebu 0:62a6f55722d9 263
gaebu 0:62a6f55722d9 264 //zeile2
gaebu 0:62a6f55722d9 265 display.PutString(2,20,"Alarm 1:");
gaebu 0:62a6f55722d9 266 if (alarmset)
gaebu 0:62a6f55722d9 267 display.PutString(2,80,"on ");
gaebu 0:62a6f55722d9 268 else
gaebu 0:62a6f55722d9 269 display.PutString(2,80,"off ");
gaebu 0:62a6f55722d9 270 //zeile3
gaebu 0:62a6f55722d9 271 display.PutString(3,20,"Alarm 2:");
gaebu 0:62a6f55722d9 272 if (alarmset2)
gaebu 0:62a6f55722d9 273 display.PutString(3,80,"on ");
gaebu 0:62a6f55722d9 274 else
gaebu 0:62a6f55722d9 275 display.PutString(3,80,"off ");
gaebu 0:62a6f55722d9 276 //zeile4
gaebu 0:62a6f55722d9 277 display.PutString(4,20,"set Alarm 1");
gaebu 0:62a6f55722d9 278 strftime(alarmtime, 6, "%H:%M\n", &alarm);
gaebu 0:62a6f55722d9 279 display.PutString(4,85,alarmtime);
gaebu 0:62a6f55722d9 280 //zeile5
gaebu 0:62a6f55722d9 281 display.PutString(5,20,"set Alarm 2");
gaebu 0:62a6f55722d9 282 strftime(alarmtime, 6, "%H:%M\n", &alarm2);
gaebu 0:62a6f55722d9 283 display.PutString(5,85,alarmtime);
gaebu 0:62a6f55722d9 284 //zeile6
gaebu 0:62a6f55722d9 285 display.PutString(6,20,"set Time/ Date");
gaebu 0:62a6f55722d9 286 //zeile7
gaebu 0:62a6f55722d9 287 display.PutString(7,20,"sleep timer");
gaebu 1:8a7f4f79f84d 288 // if (sleeptimerstart) {
gaebu 1:8a7f4f79f84d 289 if (sleeptimer>0) {
gaebu 1:8a7f4f79f84d 290 display.PrintInteger(sleeptimer,7,85);
gaebu 1:8a7f4f79f84d 291 // display.PutString(7,40,sleeptime_set);
gaebu 1:8a7f4f79f84d 292 }
gaebu 0:62a6f55722d9 293 //select line
gaebu 0:62a6f55722d9 294 for (i=2;i<8;i++)
gaebu 0:62a6f55722d9 295 display.PutString(i,2," ");
gaebu 0:62a6f55722d9 296 display.PutString(selectedline,2,"~~");
gaebu 0:62a6f55722d9 297 //frame
gaebu 0:62a6f55722d9 298 display.EmptyRectangle(0,0,127,63,BLACK);
gaebu 0:62a6f55722d9 299 }
gaebu 0:62a6f55722d9 300 //------------------------------------------
gaebu 0:62a6f55722d9 301 void setsleeptimer(){
gaebu 1:8a7f4f79f84d 302 sleeptimer=30;
gaebu 0:62a6f55722d9 303 clearmenu();
gaebu 0:62a6f55722d9 304 wheel.reset();
gaebu 0:62a6f55722d9 305 change_sleeptimer=true;
gaebu 0:62a6f55722d9 306 display.PutString(3,30,"set sleeptimer");
gaebu 0:62a6f55722d9 307 display.PutString(5,30,"min:");
gaebu 0:62a6f55722d9 308 while(change_sleeptimer){
gaebu 0:62a6f55722d9 309 if (sleeptimer<10)
gaebu 0:62a6f55722d9 310 display.PutString(5,65," ");
gaebu 0:62a6f55722d9 311 if (sleeptimer<100)
gaebu 0:62a6f55722d9 312 display.PutString(5,70," ");
gaebu 0:62a6f55722d9 313 if (sleeptimer<1000)
gaebu 0:62a6f55722d9 314 display.PutString(5,75," ");
gaebu 0:62a6f55722d9 315 if (sleeptimer<10000)
gaebu 0:62a6f55722d9 316 display.PutString(5,80," ");
gaebu 0:62a6f55722d9 317 display.PrintInteger(sleeptimer,5,60);
gaebu 0:62a6f55722d9 318
gaebu 0:62a6f55722d9 319 checkbutton();
gaebu 0:62a6f55722d9 320 if (wheel.getPulses()>1){
gaebu 1:8a7f4f79f84d 321 if (sleeptimer<1080)
gaebu 0:62a6f55722d9 322 sleeptimer+=5;
gaebu 0:62a6f55722d9 323 }
gaebu 0:62a6f55722d9 324 else if (wheel.getPulses()<1){
gaebu 0:62a6f55722d9 325 if (sleeptimer>5)
gaebu 0:62a6f55722d9 326 sleeptimer-=5;
gaebu 0:62a6f55722d9 327 }
gaebu 0:62a6f55722d9 328 if (wheel.getPulses()!=1)
gaebu 0:62a6f55722d9 329 wheel.reset();
gaebu 0:62a6f55722d9 330
gaebu 0:62a6f55722d9 331 if (wheelpushed) {
gaebu 0:62a6f55722d9 332 change_sleeptimer=false;
gaebu 0:62a6f55722d9 333 wheelpushed=false;
gaebu 0:62a6f55722d9 334 wheel.reset();
gaebu 1:8a7f4f79f84d 335 //sleeptimerstart=true;
gaebu 1:8a7f4f79f84d 336 ticker.attach(&ticker_tick, 60);
gaebu 1:8a7f4f79f84d 337 relay=1;
gaebu 0:62a6f55722d9 338 }
gaebu 0:62a6f55722d9 339 }
gaebu 0:62a6f55722d9 340 }
gaebu 0:62a6f55722d9 341 //------------------------------------------
gaebu 1:8a7f4f79f84d 342 void ticker_tick() //called every 60s when sleeptimer set
gaebu 1:8a7f4f79f84d 343 {
gaebu 1:8a7f4f79f84d 344 sleeptimer--;
gaebu 1:8a7f4f79f84d 345 if (sleeptimer==0){
gaebu 1:8a7f4f79f84d 346 relay=0;
gaebu 1:8a7f4f79f84d 347 blstate=0;
gaebu 1:8a7f4f79f84d 348 ticker.detach();
gaebu 1:8a7f4f79f84d 349 }
gaebu 1:8a7f4f79f84d 350 }
gaebu 1:8a7f4f79f84d 351 //------------------------------------------
gaebu 0:62a6f55722d9 352 void setalarm(char alnb)
gaebu 0:62a6f55722d9 353 {
gaebu 0:62a6f55722d9 354 clearmenu();
gaebu 0:62a6f55722d9 355 wheel.reset();
gaebu 0:62a6f55722d9 356 change_alarm_hour=1;
gaebu 0:62a6f55722d9 357 display.PutString(4,30,"-- ");
gaebu 0:62a6f55722d9 358 if (alnb == 1)
gaebu 0:62a6f55722d9 359 al_to_change=alarm;
gaebu 0:62a6f55722d9 360 else
gaebu 0:62a6f55722d9 361 al_to_change=alarm2;
gaebu 0:62a6f55722d9 362 while (change_alarm_hour) {
gaebu 0:62a6f55722d9 363 strftime(alarmtime, 6, "%H:%M\n", &al_to_change);
gaebu 0:62a6f55722d9 364 display.PutString(3,30,alarmtime);
gaebu 0:62a6f55722d9 365 checkbutton();
gaebu 0:62a6f55722d9 366 if (wheel.getPulses()>1)
gaebu 0:62a6f55722d9 367 wheelturned='r';
gaebu 0:62a6f55722d9 368 else if (wheel.getPulses()<1)
gaebu 0:62a6f55722d9 369 wheelturned='l';
gaebu 0:62a6f55722d9 370 if (wheel.getPulses()==1)
gaebu 0:62a6f55722d9 371 wheelturned=0;
gaebu 0:62a6f55722d9 372 else
gaebu 0:62a6f55722d9 373 wheel.reset();
gaebu 0:62a6f55722d9 374
gaebu 0:62a6f55722d9 375 if (wheelturned=='r') {
gaebu 0:62a6f55722d9 376 al_to_change.tm_hour++;
gaebu 0:62a6f55722d9 377 if (al_to_change.tm_hour>23)
gaebu 0:62a6f55722d9 378 al_to_change.tm_hour=0;
gaebu 0:62a6f55722d9 379 }
gaebu 0:62a6f55722d9 380 if (wheelturned=='l') {
gaebu 0:62a6f55722d9 381 al_to_change.tm_hour--;
gaebu 0:62a6f55722d9 382 if (al_to_change.tm_hour<0)
gaebu 0:62a6f55722d9 383 al_to_change.tm_hour=23;
gaebu 0:62a6f55722d9 384 }
gaebu 0:62a6f55722d9 385 if (wheelpushed) {
gaebu 0:62a6f55722d9 386 change_alarm_hour=0;
gaebu 0:62a6f55722d9 387 change_alarm_min=1;
gaebu 0:62a6f55722d9 388 display.PutString(4,30," --");
gaebu 0:62a6f55722d9 389 }
gaebu 0:62a6f55722d9 390 }
gaebu 0:62a6f55722d9 391 while (change_alarm_min) {
gaebu 0:62a6f55722d9 392 strftime(alarmtime, 6, "%H:%M\n", &al_to_change);
gaebu 0:62a6f55722d9 393 display.PutString(3,30,alarmtime);
gaebu 0:62a6f55722d9 394
gaebu 0:62a6f55722d9 395 checkbutton();
gaebu 0:62a6f55722d9 396 if (wheel.getPulses()>1)
gaebu 0:62a6f55722d9 397 wheelturned='r';
gaebu 0:62a6f55722d9 398 else if (wheel.getPulses()<1)
gaebu 0:62a6f55722d9 399 wheelturned='l';
gaebu 0:62a6f55722d9 400 if (wheel.getPulses()==1)
gaebu 0:62a6f55722d9 401 wheelturned=0;
gaebu 0:62a6f55722d9 402 else
gaebu 0:62a6f55722d9 403 wheel.reset();
gaebu 0:62a6f55722d9 404 if (wheelturned=='r') {
gaebu 0:62a6f55722d9 405 al_to_change.tm_min++;
gaebu 0:62a6f55722d9 406 if (al_to_change.tm_min>59)
gaebu 0:62a6f55722d9 407 al_to_change.tm_min=0;
gaebu 0:62a6f55722d9 408 }
gaebu 0:62a6f55722d9 409 if (wheelturned=='l') {
gaebu 0:62a6f55722d9 410 al_to_change.tm_min--;
gaebu 0:62a6f55722d9 411 if (al_to_change.tm_min<0)
gaebu 0:62a6f55722d9 412 al_to_change.tm_min=59;
gaebu 0:62a6f55722d9 413 }
gaebu 0:62a6f55722d9 414 if (wheelpushed) {
gaebu 0:62a6f55722d9 415 change_alarm_min=0;
gaebu 0:62a6f55722d9 416 if (alnb == 1)
gaebu 0:62a6f55722d9 417 alarm=al_to_change;
gaebu 0:62a6f55722d9 418 else
gaebu 0:62a6f55722d9 419 alarm2=al_to_change;
gaebu 0:62a6f55722d9 420 wheelturned=0;
gaebu 0:62a6f55722d9 421 wheelpushed=false;
gaebu 0:62a6f55722d9 422 wheel.reset();
gaebu 0:62a6f55722d9 423 }
gaebu 0:62a6f55722d9 424 }
gaebu 0:62a6f55722d9 425 }
gaebu 0:62a6f55722d9 426 //------------------------------------------
gaebu 0:62a6f55722d9 427 void settimedate()
gaebu 0:62a6f55722d9 428 {
gaebu 0:62a6f55722d9 429 clearmenu();
gaebu 0:62a6f55722d9 430 wheel.reset();
gaebu 0:62a6f55722d9 431 seconds = time(NULL);
gaebu 0:62a6f55722d9 432 newtime = localtime(&seconds);
gaebu 0:62a6f55722d9 433 set_td_menu=1;
gaebu 0:62a6f55722d9 434 wheelturned=1;
gaebu 0:62a6f55722d9 435 //menuold=0;
gaebu 0:62a6f55722d9 436 display.PutString(4,30,"-- ");
gaebu 0:62a6f55722d9 437 if (newtime->tm_year==70)
gaebu 0:62a6f55722d9 438 newtime->tm_year=113;
gaebu 0:62a6f55722d9 439
gaebu 0:62a6f55722d9 440 while(set_td_menu>0) {
gaebu 0:62a6f55722d9 441 if(wheelturned>0) { //update display if changed
gaebu 0:62a6f55722d9 442 strftime(x_day, 20, "%d.%m.%Y\n", newtime);
gaebu 0:62a6f55722d9 443 display.PutString(5,30,x_day);
gaebu 0:62a6f55722d9 444
gaebu 0:62a6f55722d9 445 char x_time[16];
gaebu 0:62a6f55722d9 446 strftime(x_time, 16, "%H:%M\n", newtime);
gaebu 0:62a6f55722d9 447 display.PutString(3,30,x_time);
gaebu 0:62a6f55722d9 448 }
gaebu 0:62a6f55722d9 449 checkbutton();
gaebu 0:62a6f55722d9 450 //menu=wheel.getPulses();
gaebu 0:62a6f55722d9 451 //display.PrintInteger(menu,0,100);
gaebu 0:62a6f55722d9 452 //if (menu>menuold)
gaebu 0:62a6f55722d9 453 if (wheel.getPulses()>1)
gaebu 0:62a6f55722d9 454 wheelturned='r';
gaebu 0:62a6f55722d9 455 else if (wheel.getPulses()<1)
gaebu 0:62a6f55722d9 456 wheelturned='l';
gaebu 0:62a6f55722d9 457 if (wheel.getPulses()==1)
gaebu 0:62a6f55722d9 458 wheelturned=0;
gaebu 0:62a6f55722d9 459 else
gaebu 0:62a6f55722d9 460 wheel.reset();
gaebu 0:62a6f55722d9 461 //menuold=menu;
gaebu 0:62a6f55722d9 462
gaebu 0:62a6f55722d9 463 switch(set_td_menu) {
gaebu 0:62a6f55722d9 464 case 0:
gaebu 0:62a6f55722d9 465 break; // Invalid entry
gaebu 0:62a6f55722d9 466 case 1: //set hour
gaebu 0:62a6f55722d9 467 if (wheelturned=='r') {
gaebu 0:62a6f55722d9 468 newtime->tm_hour++;
gaebu 0:62a6f55722d9 469 if (newtime->tm_hour>23)
gaebu 0:62a6f55722d9 470 newtime->tm_hour=0;
gaebu 0:62a6f55722d9 471 }
gaebu 0:62a6f55722d9 472 if (wheelturned=='l') {
gaebu 0:62a6f55722d9 473 newtime->tm_hour--;
gaebu 0:62a6f55722d9 474 if (newtime->tm_hour<0)
gaebu 0:62a6f55722d9 475 newtime->tm_hour=23;
gaebu 0:62a6f55722d9 476 }
gaebu 0:62a6f55722d9 477 if (wheelpushed) {
gaebu 0:62a6f55722d9 478 set_td_menu++;
gaebu 0:62a6f55722d9 479 display.PutString(4,30," --");
gaebu 0:62a6f55722d9 480 }
gaebu 0:62a6f55722d9 481 break;
gaebu 0:62a6f55722d9 482 case 2: //set min
gaebu 0:62a6f55722d9 483 if (wheelturned=='r') {
gaebu 0:62a6f55722d9 484 newtime->tm_min++;
gaebu 0:62a6f55722d9 485 if (newtime->tm_min>59)
gaebu 0:62a6f55722d9 486 newtime->tm_min=0;
gaebu 0:62a6f55722d9 487 }
gaebu 0:62a6f55722d9 488 if (wheelturned=='l') {
gaebu 0:62a6f55722d9 489 newtime->tm_min--;
gaebu 0:62a6f55722d9 490 if (newtime->tm_min<0)
gaebu 0:62a6f55722d9 491 newtime->tm_min=59;
gaebu 0:62a6f55722d9 492 }
gaebu 0:62a6f55722d9 493 if (wheelpushed) {
gaebu 0:62a6f55722d9 494 set_td_menu++;
gaebu 0:62a6f55722d9 495 display.PutString(4,30," ");
gaebu 0:62a6f55722d9 496 display.PutString(6,30,"-- ");
gaebu 0:62a6f55722d9 497 }
gaebu 0:62a6f55722d9 498 break;
gaebu 0:62a6f55722d9 499 case 3: //set day
gaebu 0:62a6f55722d9 500 if (wheelturned=='r') {
gaebu 0:62a6f55722d9 501 newtime->tm_mday++;
gaebu 0:62a6f55722d9 502 if (newtime->tm_mday>31)
gaebu 0:62a6f55722d9 503 newtime->tm_mday=1;
gaebu 0:62a6f55722d9 504 }
gaebu 0:62a6f55722d9 505 if (wheelturned=='l') {
gaebu 0:62a6f55722d9 506 newtime->tm_mday--;
gaebu 0:62a6f55722d9 507 if (newtime->tm_mday<1)
gaebu 0:62a6f55722d9 508 newtime->tm_mday=31;
gaebu 0:62a6f55722d9 509 }
gaebu 0:62a6f55722d9 510 if (wheelpushed) {
gaebu 0:62a6f55722d9 511 set_td_menu++;
gaebu 0:62a6f55722d9 512 display.PutString(6,30," -- ");
gaebu 0:62a6f55722d9 513 }
gaebu 0:62a6f55722d9 514 break;
gaebu 0:62a6f55722d9 515 case 4: //set month
gaebu 0:62a6f55722d9 516 if (wheelturned=='r') {
gaebu 0:62a6f55722d9 517 newtime->tm_mon++;
gaebu 0:62a6f55722d9 518 if (newtime->tm_mon>11)
gaebu 0:62a6f55722d9 519 newtime->tm_mon=0;
gaebu 0:62a6f55722d9 520 }
gaebu 0:62a6f55722d9 521 if (wheelturned=='l') {
gaebu 0:62a6f55722d9 522 newtime->tm_mon--;
gaebu 0:62a6f55722d9 523 if (newtime->tm_mon<0)
gaebu 0:62a6f55722d9 524 newtime->tm_mon=11;
gaebu 0:62a6f55722d9 525 }
gaebu 0:62a6f55722d9 526 if (wheelpushed) {
gaebu 0:62a6f55722d9 527 set_td_menu++;
gaebu 0:62a6f55722d9 528 display.PutString(6,30," ----");
gaebu 0:62a6f55722d9 529 }
gaebu 0:62a6f55722d9 530 break;
gaebu 0:62a6f55722d9 531 case 5: //set month
gaebu 0:62a6f55722d9 532 if (wheelturned=='r') {
gaebu 0:62a6f55722d9 533 newtime->tm_year++;
gaebu 0:62a6f55722d9 534 if (newtime->tm_year>200)
gaebu 0:62a6f55722d9 535 newtime->tm_year=100;
gaebu 0:62a6f55722d9 536 }
gaebu 0:62a6f55722d9 537 if (wheelturned=='l') {
gaebu 0:62a6f55722d9 538 newtime->tm_year--;
gaebu 0:62a6f55722d9 539 if (newtime->tm_year<100)
gaebu 0:62a6f55722d9 540 newtime->tm_year=200;
gaebu 0:62a6f55722d9 541 }
gaebu 0:62a6f55722d9 542 if (wheelpushed) {
gaebu 0:62a6f55722d9 543 set_td_menu=0;
gaebu 0:62a6f55722d9 544 display.PutString(6,30," ");
gaebu 0:62a6f55722d9 545 // convert to timestamp and set
gaebu 0:62a6f55722d9 546 set_time(mktime(newtime));
gaebu 0:62a6f55722d9 547 wheelturned=0;
gaebu 0:62a6f55722d9 548 wheelpushed=false;
gaebu 0:62a6f55722d9 549 //menuDisp=0;
gaebu 0:62a6f55722d9 550 //menuold=0;
gaebu 0:62a6f55722d9 551 wheel.reset();
gaebu 0:62a6f55722d9 552 }
gaebu 0:62a6f55722d9 553 break;
gaebu 0:62a6f55722d9 554 default:
gaebu 0:62a6f55722d9 555 display.PutString(0,100,"error");
gaebu 0:62a6f55722d9 556 exit(1);
gaebu 0:62a6f55722d9 557 }
gaebu 0:62a6f55722d9 558 }
gaebu 0:62a6f55722d9 559 }
gaebu 0:62a6f55722d9 560 //------------------------------------------
gaebu 0:62a6f55722d9 561 void backlight (bool onoff)
gaebu 0:62a6f55722d9 562 {
gaebu 0:62a6f55722d9 563 led2=onoff;
gaebu 0:62a6f55722d9 564 enbackligth=onoff;
gaebu 0:62a6f55722d9 565 }
gaebu 0:62a6f55722d9 566 //------------------------------------------
gaebu 0:62a6f55722d9 567 void checkbutton()
gaebu 0:62a6f55722d9 568 {
gaebu 0:62a6f55722d9 569 wheelpushed=false;
gaebu 0:62a6f55722d9 570 wheelpushedlong=false;
gaebu 1:8a7f4f79f84d 571
gaebu 0:62a6f55722d9 572 if (!wheelpush) {
gaebu 1:8a7f4f79f84d 573 if (wheelpushchanged) {
gaebu 1:8a7f4f79f84d 574 temp=0;
gaebu 1:8a7f4f79f84d 575 while(!wheelpush & temp<=200) { //if pressed longer than 2s..
gaebu 1:8a7f4f79f84d 576 wait(0.01);
gaebu 1:8a7f4f79f84d 577 temp++;
gaebu 1:8a7f4f79f84d 578 }
gaebu 1:8a7f4f79f84d 579 if (temp>200)
gaebu 1:8a7f4f79f84d 580 wheelpushedlong=true;
gaebu 1:8a7f4f79f84d 581 else
gaebu 1:8a7f4f79f84d 582 wheelpushed=true;
gaebu 1:8a7f4f79f84d 583 wheelpushchanged=0;
gaebu 1:8a7f4f79f84d 584 }
gaebu 0:62a6f55722d9 585 }
gaebu 1:8a7f4f79f84d 586 else
gaebu 1:8a7f4f79f84d 587 wheelpushchanged=1;
gaebu 0:62a6f55722d9 588 }