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 Jan 05 11:17:59 2016 +0000
Revision:
2:fbf734bc04de
Parent:
1:8a7f4f79f84d
- backligt gets on if input is made and switches off after 5s; - sleeptimer is now working correctly; - new Fonts

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