MicroBit clock based on DS3231

Dependencies:   ds3231 microbit

Committer:
daw9000
Date:
Mon Jul 25 11:32:40 2016 +0000
Revision:
3:4476ce40b910
Parent:
2:2f72859d7247
Child:
4:9146469c80cd
changed int to short and removed redundant array for memory conservation.

Who changed what in which revision?

UserRevisionLine numberNew contents of line
daw9000 1:ee422ede0e10 1 /*
daw9000 1:ee422ede0e10 2 The MIT License (MIT)
daw9000 1:ee422ede0e10 3
daw9000 1:ee422ede0e10 4 Copyright (c) 2016 British Broadcasting Corporation.
daw9000 1:ee422ede0e10 5 This software is provided by Lancaster University by arrangement with the BBC.
daw9000 1:ee422ede0e10 6
daw9000 1:ee422ede0e10 7 Permission is hereby granted, free of charge, to any person obtaining a
daw9000 1:ee422ede0e10 8 copy of this software and associated documentation files (the "Software"),
daw9000 1:ee422ede0e10 9 to deal in the Software without restriction, including without limitation
daw9000 1:ee422ede0e10 10 the rights to use, copy, modify, merge, publish, distribute, sublicense,
daw9000 1:ee422ede0e10 11 and/or sell copies of the Software, and to permit persons to whom the
daw9000 1:ee422ede0e10 12 Software is furnished to do so, subject to the following conditions:
daw9000 1:ee422ede0e10 13
daw9000 2:2f72859d7247 14 The above copyright notice and this permission notice shall be included in
daw9000 1:ee422ede0e10 15 all copies or substantial portions of the Software.
daw9000 1:ee422ede0e10 16
daw9000 1:ee422ede0e10 17 THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
daw9000 1:ee422ede0e10 18 IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
daw9000 1:ee422ede0e10 19 FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL
daw9000 1:ee422ede0e10 20 THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
daw9000 1:ee422ede0e10 21 LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING
daw9000 1:ee422ede0e10 22 FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER
daw9000 1:ee422ede0e10 23 DEALINGS IN THE SOFTWARE.
daw9000 2:2f72859d7247 24
daw9000 2:2f72859d7247 25
daw9000 2:2f72859d7247 26 Using the BBC MicroBit.
daw9000 2:2f72859d7247 27 This program shows the Temperature which can be adjusted up or down to reflect true ambient temperature using B (down) and A (up).
daw9000 2:2f72859d7247 28 Pressing A+B together changes mode from temperature to compass text heading display to compass heading graphic. Pressing A+B will circle around the three
daw9000 2:2f72859d7247 29 modes.
daw9000 2:2f72859d7247 30 Touching pins GND and P0 dims display, GND and P1 brightens display. GND and P2 shows actual device temperature.
daw9000 2:2f72859d7247 31
daw9000 2:2f72859d7247 32 developed by daw9000. no copywrite, free for whatever...
daw9000 1:ee422ede0e10 33 */
daw9000 1:ee422ede0e10 34 #include "MicroBit.h"
daw9000 1:ee422ede0e10 35
daw9000 1:ee422ede0e10 36
daw9000 1:ee422ede0e10 37 MicroBit uBit;
daw9000 3:4476ce40b910 38 short xx;
daw9000 3:4476ce40b910 39 short mode = 0;
daw9000 1:ee422ede0e10 40 // array of compass headings upper and lower for each point displayed
daw9000 3:4476ce40b910 41 short compassH[16][2]={
daw9000 1:ee422ede0e10 42 {351,12},{13,33},{34,55},{56,78},{79,100},{101,123},{124,146},{147,169},{170,192},
daw9000 1:ee422ede0e10 43 {193,215},{216,237},{238,259},{260,282},{283,305},{306,328},{329,350}
daw9000 1:ee422ede0e10 44 };
daw9000 1:ee422ede0e10 45 // array of compass points display led coordinates
daw9000 3:4476ce40b910 46 /* unused for now short compassLed[16][3][2]={
daw9000 1:ee422ede0e10 47 {{2,2},{2,1},{2,0}},
daw9000 1:ee422ede0e10 48 {{2,2},{3,1},{3,0}},
daw9000 1:ee422ede0e10 49 {{2,2},{3,1},{4,0}},
daw9000 1:ee422ede0e10 50 {{2,2},{3,2},{4,1}},
daw9000 1:ee422ede0e10 51 {{2,2},{3,2},{4,2}},
daw9000 1:ee422ede0e10 52 {{2,2},{3,2},{4,3}},
daw9000 1:ee422ede0e10 53 {{2,2},{3,3},{4,4}},
daw9000 1:ee422ede0e10 54 {{2,2},{3,3},{3,4}},
daw9000 1:ee422ede0e10 55 {{2,2},{2,3},{2,4}},
daw9000 1:ee422ede0e10 56 {{2,2},{1,3},{1,4}},
daw9000 1:ee422ede0e10 57 {{2,2},{1,3},{0,4}},
daw9000 1:ee422ede0e10 58 {{2,2},{1,3},{0,3}},
daw9000 1:ee422ede0e10 59 {{2,2},{1,2},{0,2}},
daw9000 1:ee422ede0e10 60 {{2,2},{1,3},{0,1}},
daw9000 1:ee422ede0e10 61 {{2,2},{1,1},{0,0}},
daw9000 1:ee422ede0e10 62 {{2,2},{1,1},{1,0}},
daw9000 3:4476ce40b910 63 }; */
daw9000 3:4476ce40b910 64
daw9000 1:ee422ede0e10 65 struct compassRef
daw9000 1:ee422ede0e10 66 {
daw9000 1:ee422ede0e10 67 MicroBitImage xImage;
daw9000 3:4476ce40b910 68 short offsetX;
daw9000 3:4476ce40b910 69 short offsetY;
daw9000 1:ee422ede0e10 70 };
daw9000 1:ee422ede0e10 71
daw9000 1:ee422ede0e10 72 MicroBitImage mImage;
daw9000 1:ee422ede0e10 73 //offsetX=2; offsetY=0;
daw9000 1:ee422ede0e10 74 MicroBitImage N("255,0,0\n,255,0,0\n,255,0,0\n");
daw9000 1:ee422ede0e10 75 MicroBitImage NNE("0,255,0\n,0,255,0\n,255,0,0\n");
daw9000 1:ee422ede0e10 76 MicroBitImage NE("0,0,255\n,0,255,0\n,255,0,0\n");
daw9000 1:ee422ede0e10 77 MicroBitImage ENE("0,0,0\n,0,255,255\n,255,0,0\n");
daw9000 1:ee422ede0e10 78 MicroBitImage E("0,0,0\n0,0,0\n,255,255,255\n");
daw9000 1:ee422ede0e10 79 //offsetX=2; offsetY=2;
daw9000 1:ee422ede0e10 80 MicroBitImage ESE("255,0,0\n,0,255,255\n,0,0,0\n");
daw9000 1:ee422ede0e10 81 MicroBitImage SE("255,0,0\n,0,255,0\n,0,0,255\n");
daw9000 1:ee422ede0e10 82 MicroBitImage SSE("255,0,0\n,0,255,255\n,0,0,0\n");
daw9000 1:ee422ede0e10 83 MicroBitImage S("255,0,0\n,255,0,0\n,255,0,0\n");
daw9000 1:ee422ede0e10 84 //offsetX=0; offsetY=2;
daw9000 1:ee422ede0e10 85 MicroBitImage SSW("0,0,255\n,0,255,0\n,0,255,0\n");
daw9000 1:ee422ede0e10 86 MicroBitImage SW("0,0,255\n,0,255,0\n,255,0,0\n");
daw9000 1:ee422ede0e10 87 MicroBitImage WSW("0,0,255\n,255,255,0\n,0,0,0\n");
daw9000 1:ee422ede0e10 88 MicroBitImage W("255,255,255\n,0,0,0\n,0,0,0\n");
daw9000 1:ee422ede0e10 89 //offsetX=0; offsetY=0;
daw9000 1:ee422ede0e10 90 MicroBitImage WNW("0,0,0\n,255,255,0\n,0,0,255\n");
daw9000 1:ee422ede0e10 91 MicroBitImage NW("255,0,0\n,0,255,0\n,0,0,255\n");
daw9000 1:ee422ede0e10 92 MicroBitImage NWN("0,255,0\n,0,255,0\n,0,0,255\n");
daw9000 1:ee422ede0e10 93
daw9000 1:ee422ede0e10 94
daw9000 1:ee422ede0e10 95 void onButton(MicroBitEvent e)
daw9000 1:ee422ede0e10 96 {
daw9000 1:ee422ede0e10 97 if (e.source == MICROBIT_ID_BUTTON_A and e.value == MICROBIT_BUTTON_EVT_CLICK)
daw9000 1:ee422ede0e10 98 {
daw9000 1:ee422ede0e10 99 if (mode==0){
daw9000 1:ee422ede0e10 100 xx++;}
daw9000 1:ee422ede0e10 101 }
daw9000 1:ee422ede0e10 102
daw9000 1:ee422ede0e10 103 if (e.source == MICROBIT_ID_BUTTON_B and e.value == MICROBIT_BUTTON_EVT_CLICK)
daw9000 1:ee422ede0e10 104 {
daw9000 1:ee422ede0e10 105 if (mode==0){
daw9000 1:ee422ede0e10 106 xx--;}
daw9000 1:ee422ede0e10 107 }
daw9000 1:ee422ede0e10 108
daw9000 1:ee422ede0e10 109 if (e.source == MICROBIT_ID_BUTTON_A and e.value == MICROBIT_BUTTON_EVT_LONG_CLICK)
daw9000 1:ee422ede0e10 110 {
daw9000 1:ee422ede0e10 111
daw9000 1:ee422ede0e10 112 }
daw9000 1:ee422ede0e10 113
daw9000 1:ee422ede0e10 114 if (e.source == MICROBIT_ID_BUTTON_B and e.value == MICROBIT_BUTTON_EVT_LONG_CLICK)
daw9000 1:ee422ede0e10 115 {
daw9000 1:ee422ede0e10 116 }
daw9000 1:ee422ede0e10 117
daw9000 1:ee422ede0e10 118 if (e.source == MICROBIT_ID_BUTTON_AB and e.value == MICROBIT_BUTTON_EVT_CLICK)
daw9000 1:ee422ede0e10 119 {
daw9000 1:ee422ede0e10 120 mode++;
daw9000 1:ee422ede0e10 121 if (mode>2)
daw9000 1:ee422ede0e10 122 {
daw9000 1:ee422ede0e10 123 mode=0;
daw9000 1:ee422ede0e10 124 uBit.sleep(100);
daw9000 1:ee422ede0e10 125 }
daw9000 1:ee422ede0e10 126 }
daw9000 1:ee422ede0e10 127
daw9000 1:ee422ede0e10 128 if (e.source == MICROBIT_ID_IO_P0)
daw9000 1:ee422ede0e10 129 {
daw9000 1:ee422ede0e10 130 if (uBit.io.P0.isTouched())
daw9000 1:ee422ede0e10 131 {
daw9000 1:ee422ede0e10 132 if (uBit.display.getBrightness() > 25)
daw9000 1:ee422ede0e10 133 {
daw9000 1:ee422ede0e10 134 uBit.display.setBrightness(uBit.display.getBrightness()-100);
daw9000 1:ee422ede0e10 135 }
daw9000 1:ee422ede0e10 136 else{
daw9000 1:ee422ede0e10 137 uBit.display.setBrightness(5);
daw9000 1:ee422ede0e10 138 }
daw9000 1:ee422ede0e10 139 uBit.sleep(100);
daw9000 1:ee422ede0e10 140
daw9000 1:ee422ede0e10 141 }
daw9000 1:ee422ede0e10 142
daw9000 1:ee422ede0e10 143 }
daw9000 1:ee422ede0e10 144
daw9000 1:ee422ede0e10 145 if (e.source == MICROBIT_ID_IO_P1)
daw9000 1:ee422ede0e10 146 {
daw9000 1:ee422ede0e10 147
daw9000 1:ee422ede0e10 148 if (uBit.io.P1.isTouched())
daw9000 1:ee422ede0e10 149 {
daw9000 1:ee422ede0e10 150 if (uBit.display.getBrightness()<225)
daw9000 1:ee422ede0e10 151 {
daw9000 1:ee422ede0e10 152 uBit.display.setBrightness(uBit.display.getBrightness()+100);
daw9000 1:ee422ede0e10 153 }
daw9000 1:ee422ede0e10 154 else
daw9000 1:ee422ede0e10 155 {
daw9000 1:ee422ede0e10 156 uBit.display.setBrightness(255);
daw9000 1:ee422ede0e10 157 }
daw9000 1:ee422ede0e10 158 uBit.sleep(100);
daw9000 1:ee422ede0e10 159
daw9000 1:ee422ede0e10 160 }
daw9000 1:ee422ede0e10 161 }
daw9000 1:ee422ede0e10 162
daw9000 1:ee422ede0e10 163
daw9000 1:ee422ede0e10 164 if (e.source == MICROBIT_ID_IO_P2)
daw9000 1:ee422ede0e10 165 {
daw9000 1:ee422ede0e10 166
daw9000 1:ee422ede0e10 167 if (uBit.io.P2.isTouched())
daw9000 1:ee422ede0e10 168 {
daw9000 1:ee422ede0e10 169 uBit.display.scroll("DevTemp=");
daw9000 1:ee422ede0e10 170
daw9000 1:ee422ede0e10 171 uBit.display.scroll( uBit.thermometer.getTemperature());
daw9000 1:ee422ede0e10 172 uBit.sleep(100);
daw9000 1:ee422ede0e10 173 }
daw9000 1:ee422ede0e10 174
daw9000 1:ee422ede0e10 175 }
daw9000 1:ee422ede0e10 176 }
daw9000 3:4476ce40b910 177 compassRef compassPoints(short compassHeading)
daw9000 1:ee422ede0e10 178 {
daw9000 1:ee422ede0e10 179
daw9000 1:ee422ede0e10 180
daw9000 3:4476ce40b910 181 short h;
daw9000 1:ee422ede0e10 182 compassRef mcompassRef;
daw9000 1:ee422ede0e10 183
daw9000 1:ee422ede0e10 184 h=compassHeading;
daw9000 1:ee422ede0e10 185 // special case for 351 -> 12 deg N
daw9000 1:ee422ede0e10 186 if (h <= 12){mcompassRef.xImage=N; mcompassRef.offsetX = 2; mcompassRef.offsetY=0;}
daw9000 1:ee422ede0e10 187 if (h >=351 and h<=360){mcompassRef.xImage=N;mcompassRef.offsetX = 2; mcompassRef.offsetY=0;}
daw9000 1:ee422ede0e10 188 if (h >=compassH[1][0] and h<=compassH[1][1]) {mcompassRef.xImage=NNE; mcompassRef.offsetX = 2; mcompassRef.offsetY=0;}
daw9000 1:ee422ede0e10 189 if (h >= compassH[2][0] and h<=compassH[2][1]) {mcompassRef.xImage=NE; mcompassRef.offsetX = 2; mcompassRef.offsetY=0;}
daw9000 1:ee422ede0e10 190 if (h >= compassH[3][0] and h<=compassH[3][1]) {mcompassRef.xImage=ENE;mcompassRef.offsetX=2; mcompassRef.offsetY=0;}
daw9000 1:ee422ede0e10 191 if (h>=compassH[4][0] and h<=compassH[4][1]) {mcompassRef.xImage=E;mcompassRef.offsetX=2; mcompassRef.offsetY=0;}
daw9000 1:ee422ede0e10 192 if (h>=compassH[5][0] and h<=compassH[5][1]) {mcompassRef.xImage=ESE;mcompassRef.offsetX=2; mcompassRef.offsetY=2;}
daw9000 1:ee422ede0e10 193 if (h>=compassH[6][0] and h<=compassH[6][1]) {mcompassRef.xImage=SE;mcompassRef.offsetX=2; mcompassRef.offsetY=2;}
daw9000 1:ee422ede0e10 194 if (h>=compassH[7][0] and h<=compassH[7][1]) {mcompassRef.xImage=SSE;mcompassRef.offsetX=2; mcompassRef.offsetY=2;}
daw9000 1:ee422ede0e10 195 if (h>=compassH[8][0] and h<=compassH[8][1]) {mcompassRef.xImage=S;mcompassRef.offsetX=2; mcompassRef.offsetY=2;}
daw9000 1:ee422ede0e10 196 if (h>=compassH[9][0] and h<=compassH[9][1]) {mcompassRef.xImage=SSW;mcompassRef.offsetX=0; mcompassRef.offsetY=2;}
daw9000 1:ee422ede0e10 197 if (h>=compassH[10][0] and h<=compassH[10][1]) {mcompassRef.xImage=SW;mcompassRef.offsetX=0; mcompassRef.offsetY=2;}
daw9000 1:ee422ede0e10 198 if (h>=compassH[11][0] and h<=compassH[11][1]) {mcompassRef.xImage=WSW;mcompassRef.offsetX=0; mcompassRef.offsetY=2;}
daw9000 1:ee422ede0e10 199 if (h>=compassH[12][0] and h<=compassH[12][1]) {mcompassRef.xImage=W;mcompassRef.offsetX=0; mcompassRef.offsetY=2;}
daw9000 1:ee422ede0e10 200 if (h>=compassH[13][0] and h<=compassH[13][1]) {mcompassRef.xImage=WNW;mcompassRef.offsetX=0; mcompassRef.offsetY=0;}
daw9000 1:ee422ede0e10 201 if (h>=compassH[14][0] and h<=compassH[14][1]) {mcompassRef.xImage=NW;mcompassRef.offsetX=0; mcompassRef.offsetY=0;}
daw9000 1:ee422ede0e10 202 if (h>=compassH[15][0] and h<=compassH[15][1]) {mcompassRef.xImage=NWN;mcompassRef.offsetX=0; mcompassRef.offsetY=0;}
daw9000 1:ee422ede0e10 203
daw9000 1:ee422ede0e10 204 return mcompassRef;
daw9000 1:ee422ede0e10 205 }
daw9000 1:ee422ede0e10 206
daw9000 1:ee422ede0e10 207 int main(void)
daw9000 1:ee422ede0e10 208 {
daw9000 1:ee422ede0e10 209 // Initialise the micro:bit runtime.
daw9000 1:ee422ede0e10 210 uBit.init();
daw9000 1:ee422ede0e10 211 // Register to receive events when any buttons are clicked, including the A+B virtual button (both buttons at once).
daw9000 1:ee422ede0e10 212 uBit.messageBus.listen(MICROBIT_ID_BUTTON_A, MICROBIT_EVT_ANY, onButton);
daw9000 1:ee422ede0e10 213 uBit.messageBus.listen(MICROBIT_ID_BUTTON_B, MICROBIT_EVT_ANY, onButton);
daw9000 1:ee422ede0e10 214 uBit.messageBus.listen(MICROBIT_ID_BUTTON_AB, MICROBIT_EVT_ANY, onButton);
daw9000 1:ee422ede0e10 215 // Also register for touch events on P0, P1 and P2.
daw9000 1:ee422ede0e10 216 uBit.messageBus.listen(MICROBIT_ID_IO_P0, MICROBIT_EVT_ANY, onButton);
daw9000 1:ee422ede0e10 217 uBit.messageBus.listen(MICROBIT_ID_IO_P1, MICROBIT_EVT_ANY, onButton);
daw9000 1:ee422ede0e10 218 uBit.messageBus.listen(MICROBIT_ID_IO_P2, MICROBIT_EVT_ANY, onButton);
daw9000 1:ee422ede0e10 219
daw9000 1:ee422ede0e10 220 // Put the P0, P1 and P2 pins into touch sense mode.
daw9000 1:ee422ede0e10 221
daw9000 1:ee422ede0e10 222 uBit.io.P0.isTouched();
daw9000 1:ee422ede0e10 223 uBit.io.P1.isTouched();
daw9000 1:ee422ede0e10 224 uBit.io.P2.isTouched();
daw9000 1:ee422ede0e10 225
daw9000 1:ee422ede0e10 226 while (true)
daw9000 1:ee422ede0e10 227 {
daw9000 1:ee422ede0e10 228 if ( (not(uBit.io.P0.isTouched())) and (not(uBit.io.P1.isTouched())) and (not (uBit.io.P2.isTouched())) )
daw9000 1:ee422ede0e10 229 {
daw9000 1:ee422ede0e10 230 if (mode==0)
daw9000 1:ee422ede0e10 231 {
daw9000 1:ee422ede0e10 232 uBit.display.scroll("Temp=");
daw9000 1:ee422ede0e10 233
daw9000 1:ee422ede0e10 234 uBit.display.scroll( uBit.thermometer.getTemperature() + xx);
daw9000 1:ee422ede0e10 235 uBit.sleep(100);
daw9000 1:ee422ede0e10 236 }
daw9000 1:ee422ede0e10 237 if (mode==1)
daw9000 1:ee422ede0e10 238 {
daw9000 1:ee422ede0e10 239 uBit.display.scroll("Hdg:");
daw9000 1:ee422ede0e10 240 uBit.display.scroll(uBit.compass.heading());
daw9000 1:ee422ede0e10 241 uBit.sleep(100);
daw9000 1:ee422ede0e10 242 }
daw9000 1:ee422ede0e10 243 if (mode==2)
daw9000 1:ee422ede0e10 244 {
daw9000 1:ee422ede0e10 245 uBit.display.clear();
daw9000 1:ee422ede0e10 246 compassRef myCompass;
daw9000 3:4476ce40b910 247 short hdg = uBit.compass.heading();
daw9000 1:ee422ede0e10 248 myCompass = compassPoints(hdg);
daw9000 1:ee422ede0e10 249 mImage = myCompass.xImage;
daw9000 3:4476ce40b910 250 short offsetX = myCompass.offsetX;
daw9000 3:4476ce40b910 251 short offsetY = myCompass.offsetY;
daw9000 1:ee422ede0e10 252 uBit.display.print(mImage,offsetX,offsetY);
daw9000 1:ee422ede0e10 253 uBit.sleep(100);
daw9000 1:ee422ede0e10 254
daw9000 1:ee422ede0e10 255
daw9000 1:ee422ede0e10 256 }
daw9000 1:ee422ede0e10 257
daw9000 1:ee422ede0e10 258
daw9000 1:ee422ede0e10 259 }
daw9000 1:ee422ede0e10 260 }
daw9000 1:ee422ede0e10 261 // If main exits, there may still be other fibers running or registered event handlers etc.
daw9000 1:ee422ede0e10 262 // Simply release this fiber, which will mean we enter the scheduler. Worse case, we then
daw9000 1:ee422ede0e10 263 // sit in the idle task forever, in a power efficient sleep.
daw9000 1:ee422ede0e10 264 release_fiber();
daw9000 1:ee422ede0e10 265
daw9000 1:ee422ede0e10 266 }