MicroBit clock based on DS3231

Dependencies:   ds3231 microbit

Committer:
daw9000
Date:
Mon Jul 25 10:35:51 2016 +0000
Revision:
2:2f72859d7247
Parent:
1:ee422ede0e10
Child:
3:4476ce40b910
Version 1.0.0

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