MicroBit clock based on DS3231

Dependencies:   ds3231 microbit

Committer:
daw9000
Date:
Mon Jul 25 10:27:10 2016 +0000
Revision:
1:ee422ede0e10
Child:
2:2f72859d7247
Version 1.

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 1:ee422ede0e10 14 The aboe 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 1:ee422ede0e10 24 */
daw9000 1:ee422ede0e10 25 /* program to display compass and temperature. screen brightness adjustable and temperature
daw9000 1:ee422ede0e10 26 is adjustable for setting offset with known temperature. */
daw9000 1:ee422ede0e10 27 #include "MicroBit.h"
daw9000 1:ee422ede0e10 28
daw9000 1:ee422ede0e10 29
daw9000 1:ee422ede0e10 30 MicroBit uBit;
daw9000 1:ee422ede0e10 31 int xx;
daw9000 1:ee422ede0e10 32 int mode=0;
daw9000 1:ee422ede0e10 33 // array of compass headings upper and lower for each point displayed
daw9000 1:ee422ede0e10 34 int compassH[16][2]={
daw9000 1:ee422ede0e10 35 {351,12},{13,33},{34,55},{56,78},{79,100},{101,123},{124,146},{147,169},{170,192},
daw9000 1:ee422ede0e10 36 {193,215},{216,237},{238,259},{260,282},{283,305},{306,328},{329,350}
daw9000 1:ee422ede0e10 37 };
daw9000 1:ee422ede0e10 38 // array of compass points display led coordinates
daw9000 1:ee422ede0e10 39 int compassLed[16][3][2]={
daw9000 1:ee422ede0e10 40 {{2,2},{2,1},{2,0}},
daw9000 1:ee422ede0e10 41 {{2,2},{3,1},{3,0}},
daw9000 1:ee422ede0e10 42 {{2,2},{3,1},{4,0}},
daw9000 1:ee422ede0e10 43 {{2,2},{3,2},{4,1}},
daw9000 1:ee422ede0e10 44 {{2,2},{3,2},{4,2}},
daw9000 1:ee422ede0e10 45 {{2,2},{3,2},{4,3}},
daw9000 1:ee422ede0e10 46 {{2,2},{3,3},{4,4}},
daw9000 1:ee422ede0e10 47 {{2,2},{3,3},{3,4}},
daw9000 1:ee422ede0e10 48 {{2,2},{2,3},{2,4}},
daw9000 1:ee422ede0e10 49 {{2,2},{1,3},{1,4}},
daw9000 1:ee422ede0e10 50 {{2,2},{1,3},{0,4}},
daw9000 1:ee422ede0e10 51 {{2,2},{1,3},{0,3}},
daw9000 1:ee422ede0e10 52 {{2,2},{1,2},{0,2}},
daw9000 1:ee422ede0e10 53 {{2,2},{1,3},{0,1}},
daw9000 1:ee422ede0e10 54 {{2,2},{1,1},{0,0}},
daw9000 1:ee422ede0e10 55 {{2,2},{1,1},{1,0}},
daw9000 1:ee422ede0e10 56 };
daw9000 1:ee422ede0e10 57 struct compassRef
daw9000 1:ee422ede0e10 58 {
daw9000 1:ee422ede0e10 59 MicroBitImage xImage;
daw9000 1:ee422ede0e10 60 int offsetX;
daw9000 1:ee422ede0e10 61 int offsetY;
daw9000 1:ee422ede0e10 62 };
daw9000 1:ee422ede0e10 63
daw9000 1:ee422ede0e10 64 MicroBitImage mImage;
daw9000 1:ee422ede0e10 65 //offsetX=2; offsetY=0;
daw9000 1:ee422ede0e10 66 MicroBitImage N("255,0,0\n,255,0,0\n,255,0,0\n");
daw9000 1:ee422ede0e10 67 MicroBitImage NNE("0,255,0\n,0,255,0\n,255,0,0\n");
daw9000 1:ee422ede0e10 68 MicroBitImage NE("0,0,255\n,0,255,0\n,255,0,0\n");
daw9000 1:ee422ede0e10 69 MicroBitImage ENE("0,0,0\n,0,255,255\n,255,0,0\n");
daw9000 1:ee422ede0e10 70 MicroBitImage E("0,0,0\n0,0,0\n,255,255,255\n");
daw9000 1:ee422ede0e10 71 //offsetX=2; offsetY=2;
daw9000 1:ee422ede0e10 72 MicroBitImage ESE("255,0,0\n,0,255,255\n,0,0,0\n");
daw9000 1:ee422ede0e10 73 MicroBitImage SE("255,0,0\n,0,255,0\n,0,0,255\n");
daw9000 1:ee422ede0e10 74 MicroBitImage SSE("255,0,0\n,0,255,255\n,0,0,0\n");
daw9000 1:ee422ede0e10 75 MicroBitImage S("255,0,0\n,255,0,0\n,255,0,0\n");
daw9000 1:ee422ede0e10 76 //offsetX=0; offsetY=2;
daw9000 1:ee422ede0e10 77 MicroBitImage SSW("0,0,255\n,0,255,0\n,0,255,0\n");
daw9000 1:ee422ede0e10 78 MicroBitImage SW("0,0,255\n,0,255,0\n,255,0,0\n");
daw9000 1:ee422ede0e10 79 MicroBitImage WSW("0,0,255\n,255,255,0\n,0,0,0\n");
daw9000 1:ee422ede0e10 80 MicroBitImage W("255,255,255\n,0,0,0\n,0,0,0\n");
daw9000 1:ee422ede0e10 81 //offsetX=0; offsetY=0;
daw9000 1:ee422ede0e10 82 MicroBitImage WNW("0,0,0\n,255,255,0\n,0,0,255\n");
daw9000 1:ee422ede0e10 83 MicroBitImage NW("255,0,0\n,0,255,0\n,0,0,255\n");
daw9000 1:ee422ede0e10 84 MicroBitImage NWN("0,255,0\n,0,255,0\n,0,0,255\n");
daw9000 1:ee422ede0e10 85
daw9000 1:ee422ede0e10 86
daw9000 1:ee422ede0e10 87 void onButton(MicroBitEvent e)
daw9000 1:ee422ede0e10 88 {
daw9000 1:ee422ede0e10 89 if (e.source == MICROBIT_ID_BUTTON_A and e.value == MICROBIT_BUTTON_EVT_CLICK)
daw9000 1:ee422ede0e10 90 {
daw9000 1:ee422ede0e10 91 if (mode==0){
daw9000 1:ee422ede0e10 92 xx++;}
daw9000 1:ee422ede0e10 93 }
daw9000 1:ee422ede0e10 94
daw9000 1:ee422ede0e10 95 if (e.source == MICROBIT_ID_BUTTON_B and e.value == MICROBIT_BUTTON_EVT_CLICK)
daw9000 1:ee422ede0e10 96 {
daw9000 1:ee422ede0e10 97 if (mode==0){
daw9000 1:ee422ede0e10 98 xx--;}
daw9000 1:ee422ede0e10 99 }
daw9000 1:ee422ede0e10 100
daw9000 1:ee422ede0e10 101 if (e.source == MICROBIT_ID_BUTTON_A and e.value == MICROBIT_BUTTON_EVT_LONG_CLICK)
daw9000 1:ee422ede0e10 102 {
daw9000 1:ee422ede0e10 103
daw9000 1:ee422ede0e10 104 }
daw9000 1:ee422ede0e10 105
daw9000 1:ee422ede0e10 106 if (e.source == MICROBIT_ID_BUTTON_B and e.value == MICROBIT_BUTTON_EVT_LONG_CLICK)
daw9000 1:ee422ede0e10 107 {
daw9000 1:ee422ede0e10 108 }
daw9000 1:ee422ede0e10 109
daw9000 1:ee422ede0e10 110 if (e.source == MICROBIT_ID_BUTTON_AB and e.value == MICROBIT_BUTTON_EVT_CLICK)
daw9000 1:ee422ede0e10 111 {
daw9000 1:ee422ede0e10 112 mode++;
daw9000 1:ee422ede0e10 113 if (mode>2)
daw9000 1:ee422ede0e10 114 {
daw9000 1:ee422ede0e10 115 mode=0;
daw9000 1:ee422ede0e10 116 uBit.sleep(100);
daw9000 1:ee422ede0e10 117 }
daw9000 1:ee422ede0e10 118 }
daw9000 1:ee422ede0e10 119
daw9000 1:ee422ede0e10 120 if (e.source == MICROBIT_ID_IO_P0)
daw9000 1:ee422ede0e10 121 {
daw9000 1:ee422ede0e10 122 if (uBit.io.P0.isTouched())
daw9000 1:ee422ede0e10 123 {
daw9000 1:ee422ede0e10 124 if (uBit.display.getBrightness() > 25)
daw9000 1:ee422ede0e10 125 {
daw9000 1:ee422ede0e10 126 uBit.display.setBrightness(uBit.display.getBrightness()-100);
daw9000 1:ee422ede0e10 127 }
daw9000 1:ee422ede0e10 128 else{
daw9000 1:ee422ede0e10 129 uBit.display.setBrightness(5);
daw9000 1:ee422ede0e10 130 }
daw9000 1:ee422ede0e10 131 uBit.sleep(100);
daw9000 1:ee422ede0e10 132
daw9000 1:ee422ede0e10 133 }
daw9000 1:ee422ede0e10 134
daw9000 1:ee422ede0e10 135 }
daw9000 1:ee422ede0e10 136
daw9000 1:ee422ede0e10 137 if (e.source == MICROBIT_ID_IO_P1)
daw9000 1:ee422ede0e10 138 {
daw9000 1:ee422ede0e10 139
daw9000 1:ee422ede0e10 140 if (uBit.io.P1.isTouched())
daw9000 1:ee422ede0e10 141 {
daw9000 1:ee422ede0e10 142 if (uBit.display.getBrightness()<225)
daw9000 1:ee422ede0e10 143 {
daw9000 1:ee422ede0e10 144 uBit.display.setBrightness(uBit.display.getBrightness()+100);
daw9000 1:ee422ede0e10 145 }
daw9000 1:ee422ede0e10 146 else
daw9000 1:ee422ede0e10 147 {
daw9000 1:ee422ede0e10 148 uBit.display.setBrightness(255);
daw9000 1:ee422ede0e10 149 }
daw9000 1:ee422ede0e10 150 uBit.sleep(100);
daw9000 1:ee422ede0e10 151
daw9000 1:ee422ede0e10 152 }
daw9000 1:ee422ede0e10 153 }
daw9000 1:ee422ede0e10 154
daw9000 1:ee422ede0e10 155
daw9000 1:ee422ede0e10 156 if (e.source == MICROBIT_ID_IO_P2)
daw9000 1:ee422ede0e10 157 {
daw9000 1:ee422ede0e10 158
daw9000 1:ee422ede0e10 159 if (uBit.io.P2.isTouched())
daw9000 1:ee422ede0e10 160 {
daw9000 1:ee422ede0e10 161 uBit.display.scroll("DevTemp=");
daw9000 1:ee422ede0e10 162
daw9000 1:ee422ede0e10 163 uBit.display.scroll( uBit.thermometer.getTemperature());
daw9000 1:ee422ede0e10 164 uBit.sleep(100);
daw9000 1:ee422ede0e10 165 }
daw9000 1:ee422ede0e10 166
daw9000 1:ee422ede0e10 167 }
daw9000 1:ee422ede0e10 168 }
daw9000 1:ee422ede0e10 169 compassRef compassPoints(int compassHeading)
daw9000 1:ee422ede0e10 170 {
daw9000 1:ee422ede0e10 171
daw9000 1:ee422ede0e10 172
daw9000 1:ee422ede0e10 173 int h;
daw9000 1:ee422ede0e10 174 compassRef mcompassRef;
daw9000 1:ee422ede0e10 175
daw9000 1:ee422ede0e10 176 h=compassHeading;
daw9000 1:ee422ede0e10 177 // special case for 351 -> 12 deg N
daw9000 1:ee422ede0e10 178 if (h <= 12){mcompassRef.xImage=N; mcompassRef.offsetX = 2; mcompassRef.offsetY=0;}
daw9000 1:ee422ede0e10 179 if (h >=351 and h<=360){mcompassRef.xImage=N;mcompassRef.offsetX = 2; mcompassRef.offsetY=0;}
daw9000 1:ee422ede0e10 180 if (h >=compassH[1][0] and h<=compassH[1][1]) {mcompassRef.xImage=NNE; mcompassRef.offsetX = 2; mcompassRef.offsetY=0;}
daw9000 1:ee422ede0e10 181 if (h >= compassH[2][0] and h<=compassH[2][1]) {mcompassRef.xImage=NE; mcompassRef.offsetX = 2; mcompassRef.offsetY=0;}
daw9000 1:ee422ede0e10 182 if (h >= compassH[3][0] and h<=compassH[3][1]) {mcompassRef.xImage=ENE;mcompassRef.offsetX=2; mcompassRef.offsetY=0;}
daw9000 1:ee422ede0e10 183 if (h>=compassH[4][0] and h<=compassH[4][1]) {mcompassRef.xImage=E;mcompassRef.offsetX=2; mcompassRef.offsetY=0;}
daw9000 1:ee422ede0e10 184 if (h>=compassH[5][0] and h<=compassH[5][1]) {mcompassRef.xImage=ESE;mcompassRef.offsetX=2; mcompassRef.offsetY=2;}
daw9000 1:ee422ede0e10 185 if (h>=compassH[6][0] and h<=compassH[6][1]) {mcompassRef.xImage=SE;mcompassRef.offsetX=2; mcompassRef.offsetY=2;}
daw9000 1:ee422ede0e10 186 if (h>=compassH[7][0] and h<=compassH[7][1]) {mcompassRef.xImage=SSE;mcompassRef.offsetX=2; mcompassRef.offsetY=2;}
daw9000 1:ee422ede0e10 187 if (h>=compassH[8][0] and h<=compassH[8][1]) {mcompassRef.xImage=S;mcompassRef.offsetX=2; mcompassRef.offsetY=2;}
daw9000 1:ee422ede0e10 188 if (h>=compassH[9][0] and h<=compassH[9][1]) {mcompassRef.xImage=SSW;mcompassRef.offsetX=0; mcompassRef.offsetY=2;}
daw9000 1:ee422ede0e10 189 if (h>=compassH[10][0] and h<=compassH[10][1]) {mcompassRef.xImage=SW;mcompassRef.offsetX=0; mcompassRef.offsetY=2;}
daw9000 1:ee422ede0e10 190 if (h>=compassH[11][0] and h<=compassH[11][1]) {mcompassRef.xImage=WSW;mcompassRef.offsetX=0; mcompassRef.offsetY=2;}
daw9000 1:ee422ede0e10 191 if (h>=compassH[12][0] and h<=compassH[12][1]) {mcompassRef.xImage=W;mcompassRef.offsetX=0; mcompassRef.offsetY=2;}
daw9000 1:ee422ede0e10 192 if (h>=compassH[13][0] and h<=compassH[13][1]) {mcompassRef.xImage=WNW;mcompassRef.offsetX=0; mcompassRef.offsetY=0;}
daw9000 1:ee422ede0e10 193 if (h>=compassH[14][0] and h<=compassH[14][1]) {mcompassRef.xImage=NW;mcompassRef.offsetX=0; mcompassRef.offsetY=0;}
daw9000 1:ee422ede0e10 194 if (h>=compassH[15][0] and h<=compassH[15][1]) {mcompassRef.xImage=NWN;mcompassRef.offsetX=0; mcompassRef.offsetY=0;}
daw9000 1:ee422ede0e10 195
daw9000 1:ee422ede0e10 196 return mcompassRef;
daw9000 1:ee422ede0e10 197 }
daw9000 1:ee422ede0e10 198
daw9000 1:ee422ede0e10 199 int main(void)
daw9000 1:ee422ede0e10 200 {
daw9000 1:ee422ede0e10 201 // Initialise the micro:bit runtime.
daw9000 1:ee422ede0e10 202 uBit.init();
daw9000 1:ee422ede0e10 203 // Register to receive events when any buttons are clicked, including the A+B virtual button (both buttons at once).
daw9000 1:ee422ede0e10 204 uBit.messageBus.listen(MICROBIT_ID_BUTTON_A, MICROBIT_EVT_ANY, onButton);
daw9000 1:ee422ede0e10 205 uBit.messageBus.listen(MICROBIT_ID_BUTTON_B, MICROBIT_EVT_ANY, onButton);
daw9000 1:ee422ede0e10 206 uBit.messageBus.listen(MICROBIT_ID_BUTTON_AB, MICROBIT_EVT_ANY, onButton);
daw9000 1:ee422ede0e10 207 // Also register for touch events on P0, P1 and P2.
daw9000 1:ee422ede0e10 208 uBit.messageBus.listen(MICROBIT_ID_IO_P0, MICROBIT_EVT_ANY, onButton);
daw9000 1:ee422ede0e10 209 uBit.messageBus.listen(MICROBIT_ID_IO_P1, MICROBIT_EVT_ANY, onButton);
daw9000 1:ee422ede0e10 210 uBit.messageBus.listen(MICROBIT_ID_IO_P2, MICROBIT_EVT_ANY, onButton);
daw9000 1:ee422ede0e10 211
daw9000 1:ee422ede0e10 212 // Put the P0, P1 and P2 pins into touch sense mode.
daw9000 1:ee422ede0e10 213
daw9000 1:ee422ede0e10 214 uBit.io.P0.isTouched();
daw9000 1:ee422ede0e10 215 uBit.io.P1.isTouched();
daw9000 1:ee422ede0e10 216 uBit.io.P2.isTouched();
daw9000 1:ee422ede0e10 217
daw9000 1:ee422ede0e10 218 while (true)
daw9000 1:ee422ede0e10 219 {
daw9000 1:ee422ede0e10 220 if ( (not(uBit.io.P0.isTouched())) and (not(uBit.io.P1.isTouched())) and (not (uBit.io.P2.isTouched())) )
daw9000 1:ee422ede0e10 221 {
daw9000 1:ee422ede0e10 222 if (mode==0)
daw9000 1:ee422ede0e10 223 {
daw9000 1:ee422ede0e10 224 uBit.display.scroll("Temp=");
daw9000 1:ee422ede0e10 225
daw9000 1:ee422ede0e10 226 uBit.display.scroll( uBit.thermometer.getTemperature() + xx);
daw9000 1:ee422ede0e10 227 uBit.sleep(100);
daw9000 1:ee422ede0e10 228 }
daw9000 1:ee422ede0e10 229 if (mode==1)
daw9000 1:ee422ede0e10 230 {
daw9000 1:ee422ede0e10 231 uBit.display.scroll("Hdg:");
daw9000 1:ee422ede0e10 232 uBit.display.scroll(uBit.compass.heading());
daw9000 1:ee422ede0e10 233 uBit.sleep(100);
daw9000 1:ee422ede0e10 234 }
daw9000 1:ee422ede0e10 235 if (mode==2)
daw9000 1:ee422ede0e10 236 {
daw9000 1:ee422ede0e10 237 uBit.display.clear();
daw9000 1:ee422ede0e10 238 compassRef myCompass;
daw9000 1:ee422ede0e10 239 int hdg = uBit.compass.heading();
daw9000 1:ee422ede0e10 240 myCompass = compassPoints(hdg);
daw9000 1:ee422ede0e10 241 mImage = myCompass.xImage;
daw9000 1:ee422ede0e10 242 int offsetX = myCompass.offsetX;
daw9000 1:ee422ede0e10 243 int offsetY = myCompass.offsetY;
daw9000 1:ee422ede0e10 244 uBit.display.print(mImage,offsetX,offsetY);
daw9000 1:ee422ede0e10 245 uBit.sleep(100);
daw9000 1:ee422ede0e10 246
daw9000 1:ee422ede0e10 247
daw9000 1:ee422ede0e10 248 }
daw9000 1:ee422ede0e10 249
daw9000 1:ee422ede0e10 250
daw9000 1:ee422ede0e10 251 }
daw9000 1:ee422ede0e10 252 }
daw9000 1:ee422ede0e10 253 // If main exits, there may still be other fibers running or registered event handlers etc.
daw9000 1:ee422ede0e10 254 // Simply release this fiber, which will mean we enter the scheduler. Worse case, we then
daw9000 1:ee422ede0e10 255 // sit in the idle task forever, in a power efficient sleep.
daw9000 1:ee422ede0e10 256 release_fiber();
daw9000 1:ee422ede0e10 257
daw9000 1:ee422ede0e10 258 }