Quentin Scholler / Mbed 2 deprecated MicroteslameterImplemantationVersion

Dependencies:   C12832 mbed

Fork of MicroteslameterV2 by Olivier Dubrulle

Committer:
zbobze
Date:
Mon Aug 21 13:50:02 2017 +0000
Revision:
1:50fbbe10dea4
Parent:
0:d35d9bdef147
program designed to be implemented on the Mlx MBed for remote tesla meter.

Who changed what in which revision?

UserRevisionLine numberNew contents of line
odu 0:d35d9bdef147 1 #include "mbed.h"
odu 0:d35d9bdef147 2 #include "C12832.h"
odu 0:d35d9bdef147 3 #include "microteslameter.h"
odu 0:d35d9bdef147 4 #include "MLX90393.h"
odu 0:d35d9bdef147 5 #define FIELD_LIMIT 100
odu 0:d35d9bdef147 6
zbobze 1:50fbbe10dea4 7
zbobze 1:50fbbe10dea4 8
zbobze 1:50fbbe10dea4 9 //******************************************************************************************************************
zbobze 1:50fbbe10dea4 10 // Global variable:
zbobze 1:50fbbe10dea4 11 //******************************************************************************************************************
odu 0:d35d9bdef147 12
zbobze 1:50fbbe10dea4 13 DigitalOut LedRGR(p9);
zbobze 1:50fbbe10dea4 14 DigitalOut LedRGG(p10);
zbobze 1:50fbbe10dea4 15 DigitalOut LedG1(p17);
zbobze 1:50fbbe10dea4 16 DigitalOut LedG2(p18);
zbobze 1:50fbbe10dea4 17 DigitalOut LedG3(p19);
zbobze 1:50fbbe10dea4 18 DigitalOut LedG4(p20);
zbobze 1:50fbbe10dea4 19 DigitalOut LedG5(p21);
zbobze 1:50fbbe10dea4 20 DigitalOut LedG6(p22);
zbobze 1:50fbbe10dea4 21 DigitalOut LedG7(p23);
zbobze 1:50fbbe10dea4 22 DigitalOut LedR1(p24);
zbobze 1:50fbbe10dea4 23 DigitalOut LedR2(p25);
zbobze 1:50fbbe10dea4 24 DigitalOut LedR3(p26);
zbobze 1:50fbbe10dea4 25
zbobze 1:50fbbe10dea4 26 AnalogIn BatteryVolt(p15); // analog input on p15 for getting Battery level
odu 0:d35d9bdef147 27 C12832 lcd(p5, p7, p6, p8, p11); //define pin for LCD screen
zbobze 1:50fbbe10dea4 28
zbobze 1:50fbbe10dea4 29
odu 0:d35d9bdef147 30 InterruptIn button(p14); // button used for zeroing - joystick
zbobze 1:50fbbe10dea4 31 InterruptIn button2(p12); // button used for change Display on screen
zbobze 1:50fbbe10dea4 32 InterruptIn button3(p13);
odu 0:d35d9bdef147 33 I2C i2c(p28, p27);
odu 0:d35d9bdef147 34 Serial pc(USBTX, USBRX);
odu 0:d35d9bdef147 35 Timeout to1; // timeer...
odu 0:d35d9bdef147 36 MLX90393 sensor(MLX90393::i2c_address,&i2c);
odu 0:d35d9bdef147 37
odu 0:d35d9bdef147 38 float CorrX,CorrY,CorrZ;
zbobze 1:50fbbe10dea4 39 bool Led_on = false;
zbobze 1:50fbbe10dea4 40 bool Blink_started = false;
zbobze 1:50fbbe10dea4 41 bool CleanScreen = false;
zbobze 1:50fbbe10dea4 42 bool IsConnected = true;
zbobze 1:50fbbe10dea4 43 int ScreenDisplay = 1;
zbobze 1:50fbbe10dea4 44 int const NbValHist=5;
zbobze 1:50fbbe10dea4 45 float SaveData[NbValHist];
zbobze 1:50fbbe10dea4 46 int DataTable (0);
zbobze 1:50fbbe10dea4 47 float modulus;
odu 0:d35d9bdef147 48
odu 0:d35d9bdef147 49
odu 0:d35d9bdef147 50
zbobze 1:50fbbe10dea4 51 //******************************************************************************************************************
zbobze 1:50fbbe10dea4 52 //******************************************************************************************************************
zbobze 1:50fbbe10dea4 53 // Begining of the Main function
zbobze 1:50fbbe10dea4 54 //******************************************************************************************************************
zbobze 1:50fbbe10dea4 55 //******************************************************************************************************************
zbobze 1:50fbbe10dea4 56
zbobze 1:50fbbe10dea4 57
odu 0:d35d9bdef147 58 int main()
odu 0:d35d9bdef147 59 {
zbobze 1:50fbbe10dea4 60 float X,Y,Z,T,X2,Y2,Z2,BatLevel;
odu 0:d35d9bdef147 61 int content_buffer[63];
odu 0:d35d9bdef147 62 char read_buffer[11];
zbobze 1:50fbbe10dea4 63
odu 0:d35d9bdef147 64 init();
zbobze 1:50fbbe10dea4 65 // Wake up Messages
zbobze 1:50fbbe10dea4 66 //******************************************************************************************************************
zbobze 1:50fbbe10dea4 67
odu 0:d35d9bdef147 68 lcd.cls(); // clean screen
zbobze 1:50fbbe10dea4 69 lcd.locate(0,12);
zbobze 1:50fbbe10dea4 70 lcd.printf("Micro Tesla Meter");
zbobze 1:50fbbe10dea4 71 wait(1.5);
zbobze 1:50fbbe10dea4 72 lcd.cls();
zbobze 1:50fbbe10dea4 73 // interruption Button for zeroing and choice of display
zbobze 1:50fbbe10dea4 74 //******************************************************************************************************************
zbobze 1:50fbbe10dea4 75
zbobze 1:50fbbe10dea4 76
zbobze 1:50fbbe10dea4 77 button.rise(&startZeroing); //link button on the joystick with the start of zeroing
zbobze 1:50fbbe10dea4 78 button2.rise(&changeDisplay);
zbobze 1:50fbbe10dea4 79 button3.rise(&saveData);
zbobze 1:50fbbe10dea4 80
zbobze 1:50fbbe10dea4 81 lcd.cls();
zbobze 1:50fbbe10dea4 82 updateLCD_2(X,Y,Z,modulus); //Display the opperator mode ( default)
zbobze 1:50fbbe10dea4 83
zbobze 1:50fbbe10dea4 84
zbobze 1:50fbbe10dea4 85 // Get and display on led the level of the battery
zbobze 1:50fbbe10dea4 86 //******************************************************************************************************************
zbobze 1:50fbbe10dea4 87 BatLevel = BatteryVolt.read();
zbobze 1:50fbbe10dea4 88 if (BatLevel> 0.77)
zbobze 1:50fbbe10dea4 89 {
zbobze 1:50fbbe10dea4 90 LedRGR = 0;
zbobze 1:50fbbe10dea4 91 LedRGG = 1;
zbobze 1:50fbbe10dea4 92 }
zbobze 1:50fbbe10dea4 93 else
zbobze 1:50fbbe10dea4 94 {
zbobze 1:50fbbe10dea4 95 LedRGR = 1;
zbobze 1:50fbbe10dea4 96 LedRGG = 0;
zbobze 1:50fbbe10dea4 97 }
zbobze 1:50fbbe10dea4 98
zbobze 1:50fbbe10dea4 99
zbobze 1:50fbbe10dea4 100
zbobze 1:50fbbe10dea4 101
odu 0:d35d9bdef147 102 pc.printf("Microteslameter");
odu 0:d35d9bdef147 103 if(0)//activate deactivate memory dump
odu 0:d35d9bdef147 104 {
odu 0:d35d9bdef147 105 pc.printf("Memory dump at startup: \n");
odu 0:d35d9bdef147 106 for (int i = 0; i<63; i++) {
odu 0:d35d9bdef147 107 sensor.RR(read_buffer,i,0);
odu 0:d35d9bdef147 108 content_buffer[i] = (read_buffer[0]*65536)+(read_buffer[1]*256) + read_buffer[2];
odu 0:d35d9bdef147 109 }
odu 0:d35d9bdef147 110 for (int i = 0; i<63; i++) {
odu 0:d35d9bdef147 111 pc.printf("%i \n",content_buffer[i]);
odu 0:d35d9bdef147 112 }
odu 0:d35d9bdef147 113 }
odu 0:d35d9bdef147 114 //sensor.WR(read_buffer, 2, 2016, 0); //put DIF_FILT at max
zbobze 1:50fbbe10dea4 115
zbobze 1:50fbbe10dea4 116
zbobze 1:50fbbe10dea4 117
zbobze 1:50fbbe10dea4 118 //******************************************************************************************************************
zbobze 1:50fbbe10dea4 119 //******************************************************************************************************************
zbobze 1:50fbbe10dea4 120 // Begining of the infinite loop
zbobze 1:50fbbe10dea4 121 //******************************************************************************************************************
zbobze 1:50fbbe10dea4 122 //******************************************************************************************************************
zbobze 1:50fbbe10dea4 123
odu 0:d35d9bdef147 124 while(1)
odu 0:d35d9bdef147 125 {
odu 0:d35d9bdef147 126 //X=p1.read()*200; //use potentiometer for debug
odu 0:d35d9bdef147 127 //Y=0;
odu 0:d35d9bdef147 128 //Z=0;
zbobze 1:50fbbe10dea4 129
zbobze 1:50fbbe10dea4 130 // Get and display on led the level of the battery
zbobze 1:50fbbe10dea4 131 //******************************************************************************************************************
zbobze 1:50fbbe10dea4 132 BatLevel = BatteryVolt.read();
zbobze 1:50fbbe10dea4 133 if (BatLevel> 0.77)
zbobze 1:50fbbe10dea4 134 {
zbobze 1:50fbbe10dea4 135 LedRGR = 0;
zbobze 1:50fbbe10dea4 136 LedRGG = 1;
zbobze 1:50fbbe10dea4 137 }
zbobze 1:50fbbe10dea4 138 else
zbobze 1:50fbbe10dea4 139 {
zbobze 1:50fbbe10dea4 140 LedRGR = 1;
zbobze 1:50fbbe10dea4 141 LedRGG = 0;
zbobze 1:50fbbe10dea4 142 }
zbobze 1:50fbbe10dea4 143
zbobze 1:50fbbe10dea4 144 // Get measurement of the tesla sensor
zbobze 1:50fbbe10dea4 145 //******************************************************************************************************************
odu 0:d35d9bdef147 146 MeasureXYZT(&X,&Y,&Z,&T);
odu 0:d35d9bdef147 147 CorrectXYZ(&X,&Y,&Z); // correct for zeroing and convert LSB in uT
odu 0:d35d9bdef147 148 modulus=calculateModulus(X,Y,Z);
zbobze 1:50fbbe10dea4 149 IsConnected = isConnected(&X,&Y ,&Z, &X2,&Y2,&Z2); // verifie if the sensor is or insnt connected
odu 0:d35d9bdef147 150 //--------------- interface----------------
zbobze 1:50fbbe10dea4 151 setColor(normalize(modulus)); // display the correct Led value
zbobze 1:50fbbe10dea4 152 //lcd.printf("%f ",BatLevel); // debug purpose
zbobze 1:50fbbe10dea4 153 if (IsConnected)
zbobze 1:50fbbe10dea4 154 {
zbobze 1:50fbbe10dea4 155
zbobze 1:50fbbe10dea4 156 if ( ScreenDisplay == 0)
zbobze 1:50fbbe10dea4 157 {
zbobze 1:50fbbe10dea4 158 updateLCD_1(X,Y,Z,modulus);
zbobze 1:50fbbe10dea4 159 }
zbobze 1:50fbbe10dea4 160 else if (ScreenDisplay == 1)
zbobze 1:50fbbe10dea4 161 {
zbobze 1:50fbbe10dea4 162 updateLCD_2(X,Y,Z,modulus);
zbobze 1:50fbbe10dea4 163 }
zbobze 1:50fbbe10dea4 164 else if (ScreenDisplay == 2)
zbobze 1:50fbbe10dea4 165 {
zbobze 1:50fbbe10dea4 166 updateLCD_3(SaveData[0],SaveData[1],SaveData[2],modulus);
zbobze 1:50fbbe10dea4 167 //updateLCD_2(X,Y,Z,modulus);
zbobze 1:50fbbe10dea4 168 }
zbobze 1:50fbbe10dea4 169
zbobze 1:50fbbe10dea4 170 //lcd.printf("isConnected");
zbobze 1:50fbbe10dea4 171 }
zbobze 1:50fbbe10dea4 172 else
zbobze 1:50fbbe10dea4 173 {
zbobze 1:50fbbe10dea4 174 lcd.cls();
zbobze 1:50fbbe10dea4 175 lcd.locate(0,12);
zbobze 1:50fbbe10dea4 176 lcd.printf(" the sensor isn't well connected");
zbobze 1:50fbbe10dea4 177 lcd.cls();
zbobze 1:50fbbe10dea4 178 //lcd.printf("isntConnected");
zbobze 1:50fbbe10dea4 179
zbobze 1:50fbbe10dea4 180
zbobze 1:50fbbe10dea4 181 }
zbobze 1:50fbbe10dea4 182 pc.printf("T= %f,X= %f, Y= %f, Z= %f\n",T,X,Y,Z);
zbobze 1:50fbbe10dea4 183
odu 0:d35d9bdef147 184 }
odu 0:d35d9bdef147 185 }
odu 0:d35d9bdef147 186
odu 0:d35d9bdef147 187
zbobze 1:50fbbe10dea4 188
zbobze 1:50fbbe10dea4 189
zbobze 1:50fbbe10dea4 190
zbobze 1:50fbbe10dea4 191
zbobze 1:50fbbe10dea4 192
zbobze 1:50fbbe10dea4 193
zbobze 1:50fbbe10dea4 194
zbobze 1:50fbbe10dea4 195 //Function init the variable
zbobze 1:50fbbe10dea4 196 //******************************************************************************************************************
odu 0:d35d9bdef147 197 void init(void)
odu 0:d35d9bdef147 198 {
zbobze 1:50fbbe10dea4 199 LedG1 =0;
zbobze 1:50fbbe10dea4 200 LedG2 =0;
zbobze 1:50fbbe10dea4 201 LedG3 =0;
zbobze 1:50fbbe10dea4 202 LedG4 =0;
zbobze 1:50fbbe10dea4 203 LedG5 =0;
zbobze 1:50fbbe10dea4 204 LedG6 =0;
zbobze 1:50fbbe10dea4 205 LedG7 =0;
zbobze 1:50fbbe10dea4 206 LedR1 =0;
zbobze 1:50fbbe10dea4 207 LedR2 =0;
zbobze 1:50fbbe10dea4 208 LedR3 =0;
zbobze 1:50fbbe10dea4 209
zbobze 1:50fbbe10dea4 210
odu 0:d35d9bdef147 211 i2c.frequency(7000);
odu 0:d35d9bdef147 212 }
odu 0:d35d9bdef147 213
zbobze 1:50fbbe10dea4 214 //Function detecting if the sensor is or isnt connected
zbobze 1:50fbbe10dea4 215 //******************************************************************************************************************
zbobze 1:50fbbe10dea4 216
zbobze 1:50fbbe10dea4 217 bool isConnected (float *X, float *Y,float *Z,float *X2, float *Y2,float *Z2)
zbobze 1:50fbbe10dea4 218 {
zbobze 1:50fbbe10dea4 219 float DiffX,DiffY, DiffZ;
zbobze 1:50fbbe10dea4 220 bool isConnected;
zbobze 1:50fbbe10dea4 221
zbobze 1:50fbbe10dea4 222 DiffX = (*X)-(*X2);
zbobze 1:50fbbe10dea4 223 DiffY = (*Y)-(*Y2);
zbobze 1:50fbbe10dea4 224 DiffZ = (*Z)-(*Z2);
zbobze 1:50fbbe10dea4 225
zbobze 1:50fbbe10dea4 226 /*lcd.cls();
zbobze 1:50fbbe10dea4 227 lcd.locate(0,0);
zbobze 1:50fbbe10dea4 228 lcd.printf("X= %4.1fuT",DiffX);
zbobze 1:50fbbe10dea4 229 lcd.locate(0,10);
zbobze 1:50fbbe10dea4 230 lcd.printf("Y= %4.1fuT",DiffY);
zbobze 1:50fbbe10dea4 231 lcd.locate(0,20);
zbobze 1:50fbbe10dea4 232 lcd.printf("Z= %4.1fuT",DiffZ);
zbobze 1:50fbbe10dea4 233 */
zbobze 1:50fbbe10dea4 234 if (DiffX > 1000 || DiffY > 1000 || DiffZ > 1000)
zbobze 1:50fbbe10dea4 235 {
zbobze 1:50fbbe10dea4 236 isConnected = false;
zbobze 1:50fbbe10dea4 237 }
zbobze 1:50fbbe10dea4 238 else
zbobze 1:50fbbe10dea4 239 {
zbobze 1:50fbbe10dea4 240 isConnected = true;
zbobze 1:50fbbe10dea4 241 }
zbobze 1:50fbbe10dea4 242 *X2 = *X;
zbobze 1:50fbbe10dea4 243 *Y2 = *Y;
zbobze 1:50fbbe10dea4 244 *Z2 = *Z;
zbobze 1:50fbbe10dea4 245 return isConnected;
zbobze 1:50fbbe10dea4 246 }
zbobze 1:50fbbe10dea4 247
odu 0:d35d9bdef147 248
zbobze 1:50fbbe10dea4 249 void setColor(int intensity) // Display the corresponding Leds
odu 0:d35d9bdef147 250 {
zbobze 1:50fbbe10dea4 251 if (IsConnected)
odu 0:d35d9bdef147 252 {
zbobze 1:50fbbe10dea4 253 to1.detach();
zbobze 1:50fbbe10dea4 254 Blink_started=false;
zbobze 1:50fbbe10dea4 255 if(intensity<=10) //if intensity if greater than 100 blink the led in red
zbobze 1:50fbbe10dea4 256 {
zbobze 1:50fbbe10dea4 257 LedG1 =1;
zbobze 1:50fbbe10dea4 258 LedG2 =0;
zbobze 1:50fbbe10dea4 259 LedG3 =0;
zbobze 1:50fbbe10dea4 260 LedG4 =0;
zbobze 1:50fbbe10dea4 261 LedG5 =0;
zbobze 1:50fbbe10dea4 262 LedG6 =0;
zbobze 1:50fbbe10dea4 263 LedG7 =0;
zbobze 1:50fbbe10dea4 264 LedR1 =0;
zbobze 1:50fbbe10dea4 265 LedR2 =0;
zbobze 1:50fbbe10dea4 266 LedR3 =0;
zbobze 1:50fbbe10dea4 267 }
zbobze 1:50fbbe10dea4 268 else if (intensity<=20)
zbobze 1:50fbbe10dea4 269 {
zbobze 1:50fbbe10dea4 270 LedG1 =1;
zbobze 1:50fbbe10dea4 271 LedG2 =1;
zbobze 1:50fbbe10dea4 272 LedG3 =0;
zbobze 1:50fbbe10dea4 273 LedG4 =0;
zbobze 1:50fbbe10dea4 274 LedG5 =0;
zbobze 1:50fbbe10dea4 275 LedG6 =0;
zbobze 1:50fbbe10dea4 276 LedG7 =0;
zbobze 1:50fbbe10dea4 277 LedR1 =0;
zbobze 1:50fbbe10dea4 278 LedR2 =0;
zbobze 1:50fbbe10dea4 279 LedR3 =0;
zbobze 1:50fbbe10dea4 280 }
zbobze 1:50fbbe10dea4 281 else if (intensity<=30)
zbobze 1:50fbbe10dea4 282 {
zbobze 1:50fbbe10dea4 283 LedG1 =1;
zbobze 1:50fbbe10dea4 284 LedG2 =1;
zbobze 1:50fbbe10dea4 285 LedG3 =0;
zbobze 1:50fbbe10dea4 286 LedG4 =0;
zbobze 1:50fbbe10dea4 287 LedG5 =0;
zbobze 1:50fbbe10dea4 288 LedG6 =0;
zbobze 1:50fbbe10dea4 289 LedG7 =0;
zbobze 1:50fbbe10dea4 290 LedR1 =0;
zbobze 1:50fbbe10dea4 291 LedR2 =0;
zbobze 1:50fbbe10dea4 292 LedR3 =0;
zbobze 1:50fbbe10dea4 293 }
zbobze 1:50fbbe10dea4 294 else if (intensity<=40)
zbobze 1:50fbbe10dea4 295 {
zbobze 1:50fbbe10dea4 296 LedG1 =1;
zbobze 1:50fbbe10dea4 297 LedG2 =1;
zbobze 1:50fbbe10dea4 298 LedG3 =1;
zbobze 1:50fbbe10dea4 299 LedG4 =0;
zbobze 1:50fbbe10dea4 300 LedG5 =0;
zbobze 1:50fbbe10dea4 301 LedG6 =0;
zbobze 1:50fbbe10dea4 302 LedG7 =0;
zbobze 1:50fbbe10dea4 303 LedR1 =0;
zbobze 1:50fbbe10dea4 304 LedR2 =0;
zbobze 1:50fbbe10dea4 305 LedR3 =0;
zbobze 1:50fbbe10dea4 306 }
zbobze 1:50fbbe10dea4 307 else if (intensity<=50)
zbobze 1:50fbbe10dea4 308 {
zbobze 1:50fbbe10dea4 309 LedG1 =1;
zbobze 1:50fbbe10dea4 310 LedG2 =1;
zbobze 1:50fbbe10dea4 311 LedG3 =1;
zbobze 1:50fbbe10dea4 312 LedG4 =1;
zbobze 1:50fbbe10dea4 313 LedG5 =0;
zbobze 1:50fbbe10dea4 314 LedG6 =0;
zbobze 1:50fbbe10dea4 315 LedG7 =0;
zbobze 1:50fbbe10dea4 316 LedR1 =0;
zbobze 1:50fbbe10dea4 317 LedR2 =0;
zbobze 1:50fbbe10dea4 318 LedR3 =0;
zbobze 1:50fbbe10dea4 319 }
zbobze 1:50fbbe10dea4 320 else if (intensity<=60)
zbobze 1:50fbbe10dea4 321 {
zbobze 1:50fbbe10dea4 322 LedG1 =1;
zbobze 1:50fbbe10dea4 323 LedG2 =1;
zbobze 1:50fbbe10dea4 324 LedG3 =1;
zbobze 1:50fbbe10dea4 325 LedG4 =1;
zbobze 1:50fbbe10dea4 326 LedG5 =1;
zbobze 1:50fbbe10dea4 327 LedG6 =0;
zbobze 1:50fbbe10dea4 328 LedG7 =0;
zbobze 1:50fbbe10dea4 329 LedR1 =0;
zbobze 1:50fbbe10dea4 330 LedR2 =0;
zbobze 1:50fbbe10dea4 331 LedR3 =0;
zbobze 1:50fbbe10dea4 332 }
zbobze 1:50fbbe10dea4 333 else if (intensity<=70)
zbobze 1:50fbbe10dea4 334 {
zbobze 1:50fbbe10dea4 335 LedG1 =1;
zbobze 1:50fbbe10dea4 336 LedG2 =1;
zbobze 1:50fbbe10dea4 337 LedG3 =1;
zbobze 1:50fbbe10dea4 338 LedG4 =1;
zbobze 1:50fbbe10dea4 339 LedG5 =1;
zbobze 1:50fbbe10dea4 340 LedG6 =1;
zbobze 1:50fbbe10dea4 341 LedG7 =0;
zbobze 1:50fbbe10dea4 342 LedR1 =0;
zbobze 1:50fbbe10dea4 343 LedR2 =0;
zbobze 1:50fbbe10dea4 344 LedR3 =0;
zbobze 1:50fbbe10dea4 345 }
zbobze 1:50fbbe10dea4 346 else if (intensity<=80)
zbobze 1:50fbbe10dea4 347 {
zbobze 1:50fbbe10dea4 348 LedG1 =1;
zbobze 1:50fbbe10dea4 349 LedG2 =1;
zbobze 1:50fbbe10dea4 350 LedG3 =1;
zbobze 1:50fbbe10dea4 351 LedG4 =1;
zbobze 1:50fbbe10dea4 352 LedG5 =1;
zbobze 1:50fbbe10dea4 353 LedG6 =1;
zbobze 1:50fbbe10dea4 354 LedG7 =1;
zbobze 1:50fbbe10dea4 355 LedR1 =0;
zbobze 1:50fbbe10dea4 356 LedR2 =0;
zbobze 1:50fbbe10dea4 357 LedR3 =0;
zbobze 1:50fbbe10dea4 358 }
zbobze 1:50fbbe10dea4 359 else if (intensity<=90)
zbobze 1:50fbbe10dea4 360 {
zbobze 1:50fbbe10dea4 361 LedG1 =1;
zbobze 1:50fbbe10dea4 362 LedG2 =1;
zbobze 1:50fbbe10dea4 363 LedG3 =1;
zbobze 1:50fbbe10dea4 364 LedG4 =1;
zbobze 1:50fbbe10dea4 365 LedG5 =1;
zbobze 1:50fbbe10dea4 366 LedG6 =1;
zbobze 1:50fbbe10dea4 367 LedG7 =1;
zbobze 1:50fbbe10dea4 368 LedR1 =1;
zbobze 1:50fbbe10dea4 369 LedR2 =0;
zbobze 1:50fbbe10dea4 370 LedR3 =0;
zbobze 1:50fbbe10dea4 371 }
zbobze 1:50fbbe10dea4 372 else if (intensity<=100)
zbobze 1:50fbbe10dea4 373 {
zbobze 1:50fbbe10dea4 374 LedG1 =1;
zbobze 1:50fbbe10dea4 375 LedG2 =1;
zbobze 1:50fbbe10dea4 376 LedG2 =1;
zbobze 1:50fbbe10dea4 377 LedG3 =1;
zbobze 1:50fbbe10dea4 378 LedG4 =1;
zbobze 1:50fbbe10dea4 379 LedG5 =1;
zbobze 1:50fbbe10dea4 380 LedG6 =1;
zbobze 1:50fbbe10dea4 381 LedG7 =1;
zbobze 1:50fbbe10dea4 382 LedR1 =1;
zbobze 1:50fbbe10dea4 383 LedR2 =1;
zbobze 1:50fbbe10dea4 384 LedR3 =0;
zbobze 1:50fbbe10dea4 385 }
zbobze 1:50fbbe10dea4 386 else {
zbobze 1:50fbbe10dea4 387 LedG1 =1;
zbobze 1:50fbbe10dea4 388 LedG2 =1;
zbobze 1:50fbbe10dea4 389 LedG3 =1;
zbobze 1:50fbbe10dea4 390 LedG4 =1;
zbobze 1:50fbbe10dea4 391 LedG5 =1;
zbobze 1:50fbbe10dea4 392 LedG6 =1;
zbobze 1:50fbbe10dea4 393 LedG7 =1;
zbobze 1:50fbbe10dea4 394 LedR1 =1;
zbobze 1:50fbbe10dea4 395 LedR2 =1;
zbobze 1:50fbbe10dea4 396 LedR3 =1;
zbobze 1:50fbbe10dea4 397 }
odu 0:d35d9bdef147 398 }
odu 0:d35d9bdef147 399 else
odu 0:d35d9bdef147 400 {
zbobze 1:50fbbe10dea4 401 if(Blink_started==false) to1.attach(&blink, 0.2);
odu 0:d35d9bdef147 402 }
zbobze 1:50fbbe10dea4 403
zbobze 1:50fbbe10dea4 404
zbobze 1:50fbbe10dea4 405
odu 0:d35d9bdef147 406 }
odu 0:d35d9bdef147 407
zbobze 1:50fbbe10dea4 408 //LCD Display options
zbobze 1:50fbbe10dea4 409 //******************************************************************************************************************
zbobze 1:50fbbe10dea4 410 void changeDisplay()
odu 0:d35d9bdef147 411 {
zbobze 1:50fbbe10dea4 412 if ( ScreenDisplay == 0)
zbobze 1:50fbbe10dea4 413 {
zbobze 1:50fbbe10dea4 414 ScreenDisplay = 1 ;
zbobze 1:50fbbe10dea4 415 lcd.cls();
zbobze 1:50fbbe10dea4 416 lcd.locate(0,14);
zbobze 1:50fbbe10dea4 417 lcd.printf("Display opperator mode");
zbobze 1:50fbbe10dea4 418 wait(1.5);
zbobze 1:50fbbe10dea4 419 }
zbobze 1:50fbbe10dea4 420 else if ( ScreenDisplay == 1 )
zbobze 1:50fbbe10dea4 421 {
zbobze 1:50fbbe10dea4 422 ScreenDisplay = 2;
zbobze 1:50fbbe10dea4 423 lcd.cls();
zbobze 1:50fbbe10dea4 424 lcd.locate(0,14);
zbobze 1:50fbbe10dea4 425 lcd.printf("Display Historical mode");
zbobze 1:50fbbe10dea4 426 wait(1.5);
zbobze 1:50fbbe10dea4 427 }
zbobze 1:50fbbe10dea4 428 else if ( ScreenDisplay == 2 )
zbobze 1:50fbbe10dea4 429 {
zbobze 1:50fbbe10dea4 430 ScreenDisplay = 0;
zbobze 1:50fbbe10dea4 431 lcd.cls();
zbobze 1:50fbbe10dea4 432 lcd.locate(0,14);
zbobze 1:50fbbe10dea4 433 lcd.printf("Display debugger mode");
zbobze 1:50fbbe10dea4 434 wait(1.5);
zbobze 1:50fbbe10dea4 435 }
zbobze 1:50fbbe10dea4 436 CleanScreen = true;
zbobze 1:50fbbe10dea4 437 }
zbobze 1:50fbbe10dea4 438
zbobze 1:50fbbe10dea4 439 void saveData()
zbobze 1:50fbbe10dea4 440 {
zbobze 1:50fbbe10dea4 441 SaveData[DataTable] = modulus;
zbobze 1:50fbbe10dea4 442
zbobze 1:50fbbe10dea4 443 switch (DataTable){
zbobze 1:50fbbe10dea4 444
zbobze 1:50fbbe10dea4 445 case 0 : //or 3 or 4: change for bigger screen
zbobze 1:50fbbe10dea4 446 DataTable++;
zbobze 1:50fbbe10dea4 447 break;
zbobze 1:50fbbe10dea4 448
zbobze 1:50fbbe10dea4 449 case 1 : //or 3 or 4: change for bigger screen
zbobze 1:50fbbe10dea4 450 DataTable++;
zbobze 1:50fbbe10dea4 451 break;
zbobze 1:50fbbe10dea4 452
zbobze 1:50fbbe10dea4 453 case 2 : //or 3 or 4: change for bigger screen
zbobze 1:50fbbe10dea4 454 DataTable++;
zbobze 1:50fbbe10dea4 455 break;
zbobze 1:50fbbe10dea4 456
zbobze 1:50fbbe10dea4 457 case 3 :
zbobze 1:50fbbe10dea4 458 DataTable = 0;
zbobze 1:50fbbe10dea4 459 break;
zbobze 1:50fbbe10dea4 460 }
zbobze 1:50fbbe10dea4 461 }
zbobze 1:50fbbe10dea4 462
zbobze 1:50fbbe10dea4 463 void updateLCD_1(float X,float Y,float Z,float modulus) // display the dubugger screen!
zbobze 1:50fbbe10dea4 464 {
zbobze 1:50fbbe10dea4 465 if(CleanScreen==true) // clean screen in case the screen displayed something else
odu 0:d35d9bdef147 466 {
odu 0:d35d9bdef147 467 lcd.cls();
odu 0:d35d9bdef147 468 CleanScreen=false;
odu 0:d35d9bdef147 469 }
zbobze 1:50fbbe10dea4 470
odu 0:d35d9bdef147 471 //lcd.setmode(XOR);
odu 0:d35d9bdef147 472 lcd.line(lcd.width()/2, 0, lcd.width()/2, lcd.height(), 1); // vertical line to separate field to norm...
odu 0:d35d9bdef147 473 lcd.locate(0,0);
odu 0:d35d9bdef147 474 lcd.printf("X= %7.1fuT",X);
odu 0:d35d9bdef147 475 lcd.locate(0,10);
odu 0:d35d9bdef147 476 lcd.printf("Y= %7.1fuT",Y);
odu 0:d35d9bdef147 477 lcd.locate(0,20);
odu 0:d35d9bdef147 478 lcd.printf("Z= %7.1fuT",Z);
odu 0:d35d9bdef147 479 lcd.locate((lcd.width()/2)+5,0);
odu 0:d35d9bdef147 480 lcd.printf("n= %7.1fuT",modulus);
odu 0:d35d9bdef147 481 if(modulus>FIELD_LIMIT)
odu 0:d35d9bdef147 482 {
odu 0:d35d9bdef147 483 lcd.locate((lcd.width()/2)+20,15);
odu 0:d35d9bdef147 484 lcd.printf("ALERT");
odu 0:d35d9bdef147 485 lcd.print_bm(bitmWarning,(lcd.width()/2)+2,15); // print warning sign
odu 0:d35d9bdef147 486 lcd.copy_to_lcd(); // update lcd
odu 0:d35d9bdef147 487 }
odu 0:d35d9bdef147 488 else
odu 0:d35d9bdef147 489 {
odu 0:d35d9bdef147 490 lcd.locate((lcd.width()/2)+2,15);
odu 0:d35d9bdef147 491 lcd.printf(" "); // clean the warning sign
odu 0:d35d9bdef147 492 }
odu 0:d35d9bdef147 493 wait(0.010); // needed?
odu 0:d35d9bdef147 494
zbobze 1:50fbbe10dea4 495 }
zbobze 1:50fbbe10dea4 496
zbobze 1:50fbbe10dea4 497 void updateLCD_2(float X,float Y,float Z,float modulus) // Display the operator screen
zbobze 1:50fbbe10dea4 498 {
zbobze 1:50fbbe10dea4 499 if(CleanScreen==true) // clean screen in case the screen displayed something else
zbobze 1:50fbbe10dea4 500 {
zbobze 1:50fbbe10dea4 501 lcd.cls();
zbobze 1:50fbbe10dea4 502 CleanScreen=false;
zbobze 1:50fbbe10dea4 503 }
zbobze 1:50fbbe10dea4 504 //lcd.setmode(XOR);
zbobze 1:50fbbe10dea4 505
zbobze 1:50fbbe10dea4 506 lcd.locate( 0,(lcd.height()/2));
zbobze 1:50fbbe10dea4 507 lcd.printf("n= %7.1fuT",modulus);
zbobze 1:50fbbe10dea4 508 if(modulus>FIELD_LIMIT)
zbobze 1:50fbbe10dea4 509 {
zbobze 1:50fbbe10dea4 510 lcd.locate((lcd.width()/2)+20,15);
zbobze 1:50fbbe10dea4 511 lcd.printf("ALERT");
zbobze 1:50fbbe10dea4 512 lcd.print_bm(bitmWarning,(lcd.width()/2)+2,15); // print warning sign
zbobze 1:50fbbe10dea4 513 lcd.copy_to_lcd(); // update lcd
zbobze 1:50fbbe10dea4 514 }
zbobze 1:50fbbe10dea4 515 else
zbobze 1:50fbbe10dea4 516 {
zbobze 1:50fbbe10dea4 517 lcd.locate((lcd.width()/2)+2,15);
zbobze 1:50fbbe10dea4 518 lcd.printf(" "); // clean the warning sign
zbobze 1:50fbbe10dea4 519 }
zbobze 1:50fbbe10dea4 520 wait(0.010); // needed?
zbobze 1:50fbbe10dea4 521
zbobze 1:50fbbe10dea4 522 }
zbobze 1:50fbbe10dea4 523
zbobze 1:50fbbe10dea4 524 void updateLCD_3(float SaveData0, float SaveData1 ,float SaveData2 ,float modulus) // display the dubugger screen!
zbobze 1:50fbbe10dea4 525 {
zbobze 1:50fbbe10dea4 526 if(CleanScreen==true) // clean screen in case the screen displayed something else
zbobze 1:50fbbe10dea4 527 {
zbobze 1:50fbbe10dea4 528 lcd.cls();
zbobze 1:50fbbe10dea4 529 CleanScreen=false;
zbobze 1:50fbbe10dea4 530 }
zbobze 1:50fbbe10dea4 531
zbobze 1:50fbbe10dea4 532 //lcd.setmode(XOR);
zbobze 1:50fbbe10dea4 533 lcd.line(lcd.width()/2, 0, lcd.width()/2, lcd.height(), 1); // vertical line to separate field to norm...
zbobze 1:50fbbe10dea4 534 lcd.locate(0,0);
zbobze 1:50fbbe10dea4 535 lcd.printf("N1= %5.1fuT",SaveData0);
zbobze 1:50fbbe10dea4 536 lcd.locate(0,10);
zbobze 1:50fbbe10dea4 537 lcd.printf("N2= %5.1fuT",SaveData1);
zbobze 1:50fbbe10dea4 538 lcd.locate(0,20);
zbobze 1:50fbbe10dea4 539 lcd.printf("N3= %5.1fuT",SaveData2);
zbobze 1:50fbbe10dea4 540 lcd.locate((lcd.width()/2)+5,0);
zbobze 1:50fbbe10dea4 541 lcd.printf("n= %5.1fuT",modulus);
zbobze 1:50fbbe10dea4 542 if(modulus>FIELD_LIMIT)
zbobze 1:50fbbe10dea4 543 {
zbobze 1:50fbbe10dea4 544 lcd.locate((lcd.width()/2)+20,15);
zbobze 1:50fbbe10dea4 545 lcd.printf("ALERT");
zbobze 1:50fbbe10dea4 546 lcd.print_bm(bitmWarning,(lcd.width()/2)+2,15); // print warning sign
zbobze 1:50fbbe10dea4 547 lcd.copy_to_lcd(); // update lcd
zbobze 1:50fbbe10dea4 548 }
zbobze 1:50fbbe10dea4 549 else
zbobze 1:50fbbe10dea4 550 {
zbobze 1:50fbbe10dea4 551 lcd.locate((lcd.width()/2)+2,15);
zbobze 1:50fbbe10dea4 552 lcd.printf(" "); // clean the warning sign
zbobze 1:50fbbe10dea4 553 }
zbobze 1:50fbbe10dea4 554 wait(0.010); // needed?
zbobze 1:50fbbe10dea4 555
odu 0:d35d9bdef147 556 }
odu 0:d35d9bdef147 557
odu 0:d35d9bdef147 558
odu 0:d35d9bdef147 559 float calculateModulus(float X, float Y, float Z)
odu 0:d35d9bdef147 560 {
odu 0:d35d9bdef147 561 float norm;
odu 0:d35d9bdef147 562 norm=X*X;
odu 0:d35d9bdef147 563 norm+=Y*Y;
odu 0:d35d9bdef147 564 norm+=Z*Z;
odu 0:d35d9bdef147 565 norm=sqrt(norm);
odu 0:d35d9bdef147 566 return norm;
odu 0:d35d9bdef147 567
odu 0:d35d9bdef147 568 }
odu 0:d35d9bdef147 569
odu 0:d35d9bdef147 570 float normalize(float field) //normalize the field versus the field limit to have something in percent of field limit
odu 0:d35d9bdef147 571 {
odu 0:d35d9bdef147 572 return (field/FIELD_LIMIT )*100;
odu 0:d35d9bdef147 573 }
odu 0:d35d9bdef147 574
zbobze 1:50fbbe10dea4 575 //Make blink the leds
zbobze 1:50fbbe10dea4 576 //******************************************************************************************************************
odu 0:d35d9bdef147 577 void blink()
odu 0:d35d9bdef147 578 {
odu 0:d35d9bdef147 579 if(Led_on==false)
odu 0:d35d9bdef147 580 {
zbobze 1:50fbbe10dea4 581 LedG1 =0;
zbobze 1:50fbbe10dea4 582 LedG2 =0;
zbobze 1:50fbbe10dea4 583 LedG3 =0;
zbobze 1:50fbbe10dea4 584 LedG4 =0;
zbobze 1:50fbbe10dea4 585 LedG5 =0;
zbobze 1:50fbbe10dea4 586 LedG6 =0;
zbobze 1:50fbbe10dea4 587 LedG7 =0;
zbobze 1:50fbbe10dea4 588 LedR1 =0;
zbobze 1:50fbbe10dea4 589 LedR2 =0;
zbobze 1:50fbbe10dea4 590 LedR3 =0;//led on in red
odu 0:d35d9bdef147 591 Led_on=true;
odu 0:d35d9bdef147 592 }
odu 0:d35d9bdef147 593 else
odu 0:d35d9bdef147 594 {
zbobze 1:50fbbe10dea4 595 LedG1 =1;
zbobze 1:50fbbe10dea4 596 LedG2 =1;
zbobze 1:50fbbe10dea4 597 LedG3 =1;
zbobze 1:50fbbe10dea4 598 LedG4 =1;
zbobze 1:50fbbe10dea4 599 LedG5 =1;
zbobze 1:50fbbe10dea4 600 LedG6 =1;
zbobze 1:50fbbe10dea4 601 LedG7 =1;
zbobze 1:50fbbe10dea4 602 LedR1 =1;
zbobze 1:50fbbe10dea4 603 LedR2 =1;
zbobze 1:50fbbe10dea4 604 LedR3 =1; //led off
odu 0:d35d9bdef147 605 Led_on=false;
odu 0:d35d9bdef147 606 }
odu 0:d35d9bdef147 607 to1.attach(&blink, 0.2);
odu 0:d35d9bdef147 608 }
odu 0:d35d9bdef147 609
zbobze 1:50fbbe10dea4 610
zbobze 1:50fbbe10dea4 611 //Function Measuring the magnetic field
zbobze 1:50fbbe10dea4 612 //******************************************************************************************************************
odu 0:d35d9bdef147 613 void MeasureXYZT(float *X,float *Y,float *Z, float *T)
odu 0:d35d9bdef147 614 {
odu 0:d35d9bdef147 615 char read_buffer[11];
odu 0:d35d9bdef147 616 sensor.SM(read_buffer, 15, 0); //start measurement
odu 0:d35d9bdef147 617 wait(0.2);// needed? according the AN worse case (big filter and low conversion time) the measurment take 198.5 ms
odu 0:d35d9bdef147 618 sensor.RM(read_buffer, 15, 0);//read measurement
odu 0:d35d9bdef147 619
odu 0:d35d9bdef147 620 // concatenate the two bytes
odu 0:d35d9bdef147 621 *T=read_buffer[1]*256+read_buffer[2];
odu 0:d35d9bdef147 622 *X=read_buffer[3]*256+read_buffer[4];
odu 0:d35d9bdef147 623 *Y=read_buffer[5]*256+read_buffer[6];
odu 0:d35d9bdef147 624 *Z=read_buffer[7]*256+read_buffer[8];
odu 0:d35d9bdef147 625
odu 0:d35d9bdef147 626 //deal with sign
odu 0:d35d9bdef147 627 if(*X>32768) *X-=65536;
odu 0:d35d9bdef147 628 if(*Y>32768) *Y-=65536;
odu 0:d35d9bdef147 629 if(*Z>32768) *Z-=65536;
odu 0:d35d9bdef147 630 }
odu 0:d35d9bdef147 631
zbobze 1:50fbbe10dea4 632
zbobze 1:50fbbe10dea4 633 //Make the Zero
zbobze 1:50fbbe10dea4 634 //******************************************************************************************************************
zbobze 1:50fbbe10dea4 635 void startZeroing()
odu 0:d35d9bdef147 636 {
zbobze 1:50fbbe10dea4 637 to1.attach(&blink, 0.2);
odu 0:d35d9bdef147 638 float X,Y,Z,T;
odu 0:d35d9bdef147 639 int iteration=20;// to be defined
odu 0:d35d9bdef147 640 //char read_buffer[11];
odu 0:d35d9bdef147 641 CorrX=0;CorrY=0;CorrZ=0;
zbobze 1:50fbbe10dea4 642 SaveData[0]=SaveData[1]=SaveData[2]=SaveData[3]=SaveData[4]=0;
odu 0:d35d9bdef147 643 lcd.cls();
odu 0:d35d9bdef147 644
odu 0:d35d9bdef147 645 for(int i=0;i<iteration;i++)
odu 0:d35d9bdef147 646 {
odu 0:d35d9bdef147 647 MeasureXYZT(&X,&Y,&Z,&T);
odu 0:d35d9bdef147 648 CorrX+=X;
odu 0:d35d9bdef147 649 CorrY+=Y;
odu 0:d35d9bdef147 650 CorrZ+=Z;
odu 0:d35d9bdef147 651 lcd.locate(0,0);
odu 0:d35d9bdef147 652 lcd.printf("ZEROING progress: %i%%",i*100/iteration);
odu 0:d35d9bdef147 653 }
zbobze 1:50fbbe10dea4 654 to1.detach();
odu 0:d35d9bdef147 655 CorrX/=iteration;
odu 0:d35d9bdef147 656 CorrY/=iteration;
odu 0:d35d9bdef147 657 CorrZ/=iteration;
odu 0:d35d9bdef147 658 CleanScreen=true;
odu 0:d35d9bdef147 659 }
odu 0:d35d9bdef147 660
odu 0:d35d9bdef147 661
odu 0:d35d9bdef147 662
odu 0:d35d9bdef147 663 float getGainXY(int GAIN_SEL,int RES_XYZ)
odu 0:d35d9bdef147 664 {
odu 0:d35d9bdef147 665 return 2.576; //fix value for the moment... for RES_XYZ=3 and GAIN_SEL=4
odu 0:d35d9bdef147 666 }
odu 0:d35d9bdef147 667
odu 0:d35d9bdef147 668 float getGainZ(int GAIN_SEL,int RES_XYZ)
odu 0:d35d9bdef147 669 {
odu 0:d35d9bdef147 670 return 4.698; //fix value for the moment... for RES_XYZ=3 and GAIN_SEL=4
odu 0:d35d9bdef147 671 }
odu 0:d35d9bdef147 672
zbobze 1:50fbbe10dea4 673
zbobze 1:50fbbe10dea4 674 //Function Correct the magnetic field depending on the the zeroing and the corresponding gain
zbobze 1:50fbbe10dea4 675 //******************************************************************************************************************
odu 0:d35d9bdef147 676 void CorrectXYZ(float *X,float *Y,float *Z) // correct for zeroing and convert LSB in uT
odu 0:d35d9bdef147 677 {
odu 0:d35d9bdef147 678 *X-=CorrX;
odu 0:d35d9bdef147 679 *Y-=CorrY;
odu 0:d35d9bdef147 680 *Z-=CorrZ;
odu 0:d35d9bdef147 681
odu 0:d35d9bdef147 682 *X= *X*getGainXY(0,0);
odu 0:d35d9bdef147 683 *Y= *Y*getGainXY(0,0);
odu 0:d35d9bdef147 684 *Z= *Z*getGainZ(0,0);
odu 0:d35d9bdef147 685 }