A program for the BBC MicroBit that displays temperature and compass headings.

Dependencies:   microbit

Committer:
daw9000
Date:
Sun Aug 14 12:02:24 2016 +0000
Revision:
6:68e29cbd2696
Parent:
5:2314ad5e8997
#2

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 6:68e29cbd2696 94
daw9000 1:ee422ede0e10 95
daw9000 6:68e29cbd2696 96
daw9000 1:ee422ede0e10 97 void onButton(MicroBitEvent e)
daw9000 1:ee422ede0e10 98 {
daw9000 1:ee422ede0e10 99 if (e.source == MICROBIT_ID_BUTTON_A and e.value == MICROBIT_BUTTON_EVT_CLICK)
daw9000 1:ee422ede0e10 100 {
daw9000 1:ee422ede0e10 101 if (mode==0){
daw9000 1:ee422ede0e10 102 xx++;}
daw9000 1:ee422ede0e10 103 }
daw9000 1:ee422ede0e10 104
daw9000 1:ee422ede0e10 105 if (e.source == MICROBIT_ID_BUTTON_B and e.value == MICROBIT_BUTTON_EVT_CLICK)
daw9000 1:ee422ede0e10 106 {
daw9000 1:ee422ede0e10 107 if (mode==0){
daw9000 1:ee422ede0e10 108 xx--;}
daw9000 1:ee422ede0e10 109 }
daw9000 1:ee422ede0e10 110
daw9000 1:ee422ede0e10 111 if (e.source == MICROBIT_ID_BUTTON_A and e.value == MICROBIT_BUTTON_EVT_LONG_CLICK)
daw9000 1:ee422ede0e10 112 {
daw9000 1:ee422ede0e10 113
daw9000 1:ee422ede0e10 114 }
daw9000 1:ee422ede0e10 115
daw9000 1:ee422ede0e10 116 if (e.source == MICROBIT_ID_BUTTON_B and e.value == MICROBIT_BUTTON_EVT_LONG_CLICK)
daw9000 1:ee422ede0e10 117 {
daw9000 1:ee422ede0e10 118 }
daw9000 1:ee422ede0e10 119
daw9000 1:ee422ede0e10 120 if (e.source == MICROBIT_ID_BUTTON_AB and e.value == MICROBIT_BUTTON_EVT_CLICK)
daw9000 1:ee422ede0e10 121 {
daw9000 1:ee422ede0e10 122 mode++;
daw9000 1:ee422ede0e10 123 if (mode>2)
daw9000 1:ee422ede0e10 124 {
daw9000 1:ee422ede0e10 125 mode=0;
daw9000 1:ee422ede0e10 126 }
daw9000 1:ee422ede0e10 127 }
daw9000 1:ee422ede0e10 128
daw9000 1:ee422ede0e10 129 if (e.source == MICROBIT_ID_IO_P0)
daw9000 1:ee422ede0e10 130 {
daw9000 1:ee422ede0e10 131 if (uBit.io.P0.isTouched())
daw9000 1:ee422ede0e10 132 {
daw9000 1:ee422ede0e10 133 if (uBit.display.getBrightness() > 25)
daw9000 1:ee422ede0e10 134 {
daw9000 1:ee422ede0e10 135 uBit.display.setBrightness(uBit.display.getBrightness()-100);
daw9000 1:ee422ede0e10 136 }
daw9000 1:ee422ede0e10 137 else{
daw9000 1:ee422ede0e10 138 uBit.display.setBrightness(5);
daw9000 1:ee422ede0e10 139 }
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
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 4:9146469c80cd 166 if (uBit.io.P2.isTouched())
daw9000 4:9146469c80cd 167 {
daw9000 1:ee422ede0e10 168 uBit.display.scroll("DevTemp=");
daw9000 1:ee422ede0e10 169
daw9000 1:ee422ede0e10 170 uBit.display.scroll( uBit.thermometer.getTemperature());
daw9000 4:9146469c80cd 171
daw9000 4:9146469c80cd 172 }
daw9000 1:ee422ede0e10 173
daw9000 1:ee422ede0e10 174 }
daw9000 4:9146469c80cd 175 }
daw9000 3:4476ce40b910 176 compassRef compassPoints(short compassHeading)
daw9000 1:ee422ede0e10 177 {
daw9000 1:ee422ede0e10 178
daw9000 1:ee422ede0e10 179
daw9000 3:4476ce40b910 180 short 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 6:68e29cbd2696 206
daw9000 6:68e29cbd2696 207
daw9000 6:68e29cbd2696 208
daw9000 1:ee422ede0e10 209 int main(void)
daw9000 1:ee422ede0e10 210 {
daw9000 1:ee422ede0e10 211 // Initialise the micro:bit runtime.
daw9000 1:ee422ede0e10 212 uBit.init();
daw9000 1:ee422ede0e10 213 // Register to receive events when any buttons are clicked, including the A+B virtual button (both buttons at once).
daw9000 1:ee422ede0e10 214 uBit.messageBus.listen(MICROBIT_ID_BUTTON_A, MICROBIT_EVT_ANY, onButton);
daw9000 1:ee422ede0e10 215 uBit.messageBus.listen(MICROBIT_ID_BUTTON_B, MICROBIT_EVT_ANY, onButton);
daw9000 1:ee422ede0e10 216 uBit.messageBus.listen(MICROBIT_ID_BUTTON_AB, MICROBIT_EVT_ANY, onButton);
daw9000 1:ee422ede0e10 217 // Also register for touch events on P0, P1 and P2.
daw9000 1:ee422ede0e10 218 uBit.messageBus.listen(MICROBIT_ID_IO_P0, MICROBIT_EVT_ANY, onButton);
daw9000 1:ee422ede0e10 219 uBit.messageBus.listen(MICROBIT_ID_IO_P1, MICROBIT_EVT_ANY, onButton);
daw9000 1:ee422ede0e10 220 uBit.messageBus.listen(MICROBIT_ID_IO_P2, MICROBIT_EVT_ANY, onButton);
daw9000 1:ee422ede0e10 221
daw9000 1:ee422ede0e10 222 // Put the P0, P1 and P2 pins into touch sense mode.
daw9000 1:ee422ede0e10 223
daw9000 1:ee422ede0e10 224 uBit.io.P0.isTouched();
daw9000 1:ee422ede0e10 225 uBit.io.P1.isTouched();
daw9000 1:ee422ede0e10 226 uBit.io.P2.isTouched();
daw9000 5:2314ad5e8997 227 // initialise the thermometer
daw9000 5:2314ad5e8997 228 int iTemp = uBit.thermometer.getTemperature();
daw9000 5:2314ad5e8997 229 uBit.thermometer.setCalibration(iTemp);
daw9000 1:ee422ede0e10 230 while (true)
daw9000 1:ee422ede0e10 231 {
daw9000 1:ee422ede0e10 232 if ( (not(uBit.io.P0.isTouched())) and (not(uBit.io.P1.isTouched())) and (not (uBit.io.P2.isTouched())) )
daw9000 1:ee422ede0e10 233 {
daw9000 1:ee422ede0e10 234 if (mode==0)
daw9000 1:ee422ede0e10 235 {
daw9000 1:ee422ede0e10 236 uBit.display.scroll("Temp=");
daw9000 1:ee422ede0e10 237
daw9000 1:ee422ede0e10 238 uBit.display.scroll( uBit.thermometer.getTemperature() + xx);
daw9000 4:9146469c80cd 239 uBit.sleep(1000);
daw9000 1:ee422ede0e10 240 }
daw9000 1:ee422ede0e10 241 if (mode==1)
daw9000 1:ee422ede0e10 242 {
daw9000 1:ee422ede0e10 243 uBit.display.scroll("Hdg:");
daw9000 1:ee422ede0e10 244 uBit.display.scroll(uBit.compass.heading());
daw9000 4:9146469c80cd 245 uBit.sleep(1000);
daw9000 1:ee422ede0e10 246 }
daw9000 1:ee422ede0e10 247 if (mode==2)
daw9000 1:ee422ede0e10 248 {
daw9000 1:ee422ede0e10 249 uBit.display.clear();
daw9000 1:ee422ede0e10 250 compassRef myCompass;
daw9000 3:4476ce40b910 251 short hdg = uBit.compass.heading();
daw9000 1:ee422ede0e10 252 myCompass = compassPoints(hdg);
daw9000 1:ee422ede0e10 253 mImage = myCompass.xImage;
daw9000 3:4476ce40b910 254 short offsetX = myCompass.offsetX;
daw9000 3:4476ce40b910 255 short offsetY = myCompass.offsetY;
daw9000 1:ee422ede0e10 256 uBit.display.print(mImage,offsetX,offsetY);
daw9000 4:9146469c80cd 257 uBit.sleep(250);
daw9000 1:ee422ede0e10 258 }
daw9000 1:ee422ede0e10 259
daw9000 1:ee422ede0e10 260
daw9000 1:ee422ede0e10 261 }
daw9000 1:ee422ede0e10 262 }
daw9000 1:ee422ede0e10 263 // If main exits, there may still be other fibers running or registered event handlers etc.
daw9000 1:ee422ede0e10 264 // Simply release this fiber, which will mean we enter the scheduler. Worse case, we then
daw9000 1:ee422ede0e10 265 // sit in the idle task forever, in a power efficient sleep.
daw9000 4:9146469c80cd 266
daw9000 1:ee422ede0e10 267 release_fiber();
daw9000 1:ee422ede0e10 268
daw9000 1:ee422ede0e10 269 }