Example program using the MLX90620 and KL25Z. Best viewed with wide-screen VT-100 color terminal. Tested with Tera Term. Easy i2c pin name change for mbed1768.

Dependencies:   MLX9062x PrintBuffer mbed

KL25Z_MLX90620 home page:

This program takes temperature data from the MLX90620 and displays the temperature data in the same format as the 16x4 pixel array. The display is updated once a second. Temperature can be displayed in degrees C or F and changed on the fly. Also, the data pixel format can be swapped. If the MLX90620 is pointing inward (toward you) or outward (away from you) you can change that on the fly as well. For each display output, the coolest pixel is displayed in BLUE and the warmest pixel in RED. The new data is painted over the old data.

NOTE: This program relys heavily on the mbed's USB Serial communication. ASCII ESCape codes are used. Use a terminal emulator like Tera Term. Be sure that the terminal has a wide screen (136 characters wide), with VT100 color emulation enabled and an even spaced character font like "Terminal".

The maximum USB serial communication you can use on the mbed1768 is 921600 baud. The KL25Z is limited to 115200 baud. Faster speeds cause characters drop out.

If you get bored, you can watch the RGB led on the KL25Z change color. Since the LED does not blend colors well, put a small piece of kleenex or a single layer from a napkin over the LED. You'll have a much better appreciation for the LED that way. Thanks to David Dicarlo's FRDM_RGBLED program for that idea.

Typical output from program:

/media/uploads/loopsva/mlx90620output.jpg

...kevin

Committer:
loopsva
Date:
Fri Jul 22 00:18:09 2016 +0000
Revision:
2:1f1157f04539
Parent:
1:9d7894633924
Updated to new MLX9062x library. Updated PrintBuffer and mbed libraries to most recent revisions as well.  Called v110 in program

Who changed what in which revision?

UserRevisionLine numberNew contents of line
loopsva 0:6f472b9627c7 1 #include "mbed.h"
loopsva 0:6f472b9627c7 2 #include "PrintBuffer.h"
loopsva 0:6f472b9627c7 3 #include "MLX90620.h"
loopsva 0:6f472b9627c7 4
loopsva 2:1f1157f04539 5 int revision = 110;
loopsva 2:1f1157f04539 6
loopsva 0:6f472b9627c7 7 #define BS 0x08 //ascii backspace
loopsva 0:6f472b9627c7 8 #define CR 0x0d //ascii CR
loopsva 0:6f472b9627c7 9 #define LF 0x0a //ascii LF
loopsva 0:6f472b9627c7 10 #define SP 0x20 //ascii space
loopsva 0:6f472b9627c7 11 #define ESC 0x1b //ascii escape
loopsva 0:6f472b9627c7 12 #define DP 0x2e //ascii decimal point / period
loopsva 0:6f472b9627c7 13 #define ticC 0x03 //ascii control C
loopsva 0:6f472b9627c7 14 #define ticX 0x18 //ascii control X
loopsva 0:6f472b9627c7 15
loopsva 2:1f1157f04539 16 #define DOBLACK "\033[0;30;2m"
loopsva 2:1f1157f04539 17 #define DORED "\033[0;31;2m"
loopsva 2:1f1157f04539 18 #define DOGREEN "\033[0;32;2m"
loopsva 2:1f1157f04539 19 #define DOYELLOW "\033[0;33;2m"
loopsva 2:1f1157f04539 20 #define DOBLUE "\033[0;34;2m"
loopsva 2:1f1157f04539 21 #define DOMAGENTA "\033[0;35;2m"
loopsva 2:1f1157f04539 22 #define DOCYAN "\033[0;36;2m"
loopsva 2:1f1157f04539 23 #define DOWHITE "\033[0;37;2m"
loopsva 2:1f1157f04539 24 #define DODEFAULT "\033[0;39;2m"
loopsva 2:1f1157f04539 25 #define DONONE "\033[0m"
loopsva 2:1f1157f04539 26
loopsva 2:1f1157f04539 27 char *doBLACK = DOBLACK;
loopsva 2:1f1157f04539 28 char *doRED = DORED;
loopsva 2:1f1157f04539 29 char *doGREEN = DOGREEN;
loopsva 2:1f1157f04539 30 char *doYELLOW = DOYELLOW;
loopsva 2:1f1157f04539 31 char *doBLUE = DOBLUE;
loopsva 2:1f1157f04539 32 char *doMAGENTA = DOMAGENTA;
loopsva 2:1f1157f04539 33 char *doCYAN = DOCYAN;
loopsva 2:1f1157f04539 34 char *doWHITE = DOWHITE;
loopsva 2:1f1157f04539 35 char *doDEFAULT = DODEFAULT;
loopsva 2:1f1157f04539 36 char *doNONE = DONONE;
loopsva 2:1f1157f04539 37
loopsva 2:1f1157f04539 38
loopsva 2:1f1157f04539 39 #if defined(TARGET_KL25Z)
loopsva 2:1f1157f04539 40 extern "C" void NVIC_SystemReset(); //for KL25Z
loopsva 2:1f1157f04539 41 #else
loopsva 2:1f1157f04539 42 #include "FATFileSystem.h"
loopsva 2:1f1157f04539 43 extern "C" void mbed_reset(); //for mbed1768
loopsva 2:1f1157f04539 44 #endif
loopsva 2:1f1157f04539 45
loopsva 0:6f472b9627c7 46 int gDebug = 2;
loopsva 0:6f472b9627c7 47
loopsva 0:6f472b9627c7 48 Serial pc (USBTX, USBRX);
loopsva 2:1f1157f04539 49
loopsva 2:1f1157f04539 50 #if defined(TARGET_KL25Z)
loopsva 0:6f472b9627c7 51 I2C i2c1(PTE0, PTE1);
loopsva 2:1f1157f04539 52 I2C i2c2(PTE25, PTE24);
loopsva 2:1f1157f04539 53 //MLX90620 mlx(PTE0, PTE1, "mlx"); //MLX90620 register access
loopsva 2:1f1157f04539 54 MLX9062x mlx(PTE0, PTE1, MLX9062x::mlx90621, "mlx"); //MLX90620 or MLX90621 IR array
loopsva 2:1f1157f04539 55 MLX9062x::mlx_struct mlxSTR = {}; //data structure for MLX90260
loopsva 2:1f1157f04539 56 #else
loopsva 2:1f1157f04539 57 LocalFileSystem local("local"); //for access of files on mbed itself
loopsva 2:1f1157f04539 58 I2C i2c1(p9, p10);
loopsva 2:1f1157f04539 59 MLX90620 mlx(p9, p10, "mlx");
loopsva 2:1f1157f04539 60 #endif
loopsva 2:1f1157f04539 61
loopsva 0:6f472b9627c7 62 PrintBuffer pb("pb"); //new for 132. Moved PrintBuffer off to .cpp and .h files
loopsva 0:6f472b9627c7 63
loopsva 2:1f1157f04539 64 #if defined(TARGET_KL25Z)
loopsva 0:6f472b9627c7 65 PwmOut rled(LED_RED);
loopsva 0:6f472b9627c7 66 PwmOut gled(LED_GREEN);
loopsva 0:6f472b9627c7 67 PwmOut bled(LED_BLUE);
loopsva 0:6f472b9627c7 68
loopsva 0:6f472b9627c7 69 int rLedDelay = 0;
loopsva 0:6f472b9627c7 70 float rLedPwm = 0.01; //LED1 brightness
loopsva 0:6f472b9627c7 71 bool rLedUp = true; //LED1 auto up-down
loopsva 0:6f472b9627c7 72 int gLedDelay = 0;
loopsva 0:6f472b9627c7 73 float gLedPwm = 0.01; //LED1 brightness
loopsva 0:6f472b9627c7 74 bool gLedUp = true; //LED1 auto up-down
loopsva 0:6f472b9627c7 75 int bLedDelay = 0;
loopsva 0:6f472b9627c7 76 float bLedPwm = 0.01; //LED1 brightness
loopsva 0:6f472b9627c7 77 bool bLedUp = true; //LED1 auto up-down
loopsva 2:1f1157f04539 78 #endif
loopsva 0:6f472b9627c7 79
loopsva 0:6f472b9627c7 80 //MLX90620 buffers used by MLX90620.cpp
loopsva 0:6f472b9627c7 81 char* EEbuf = new char[256];
loopsva 0:6f472b9627c7 82 char* RamCmmd = new char[8]; //holds / sends MLX90620 RAM commands
loopsva 0:6f472b9627c7 83 char* RamBuf = new char[128]; //0x3f words, values are 'unsigned short'
loopsva 0:6f472b9627c7 84 int SaveEEP = 0; //***USED BY .INI FILE save EEPROM Contents to EEP.CSV
loopsva 0:6f472b9627c7 85
loopsva 0:6f472b9627c7 86 //For MLX90620
loopsva 0:6f472b9627c7 87 unsigned short ConfigReg = 0; //MLX90620 configuration register
loopsva 0:6f472b9627c7 88 float Ta = 0.0;
loopsva 0:6f472b9627c7 89 double TempPxl = 0;
loopsva 0:6f472b9627c7 90
loopsva 0:6f472b9627c7 91 //Used for display of temperature and extreme values
loopsva 0:6f472b9627c7 92 float HotPxl = -40.0; //hottest pixel in the array
loopsva 0:6f472b9627c7 93 float ColdPxl = 200.0; //coldest pixel in the array
loopsva 0:6f472b9627c7 94 unsigned short HotColor = 0xffff; //color of hottest pixel
loopsva 0:6f472b9627c7 95 unsigned short ColdColor = 0xffff; //color of coldest pixel
loopsva 0:6f472b9627c7 96 int AutoScale = 0; //***USED BY .INI FILE autoscale display 0 or 1
loopsva 0:6f472b9627c7 97 bool ReFrame = false; //do a reframe if asked
loopsva 0:6f472b9627c7 98 int HottestX = 0; //hottest pixel X
loopsva 0:6f472b9627c7 99 int HottestY = 0; //hottest pixel Y
loopsva 0:6f472b9627c7 100 int ColdestX = 0; //coldest pixel X
loopsva 0:6f472b9627c7 101 int ColdestY = 0; //coldest pixel Y
loopsva 0:6f472b9627c7 102 bool PickPix = false; //pick a pixel to dump all data on flag
loopsva 0:6f472b9627c7 103 int pixX = 0; //display pixel X (0-15)
loopsva 0:6f472b9627c7 104 int pixY = 0; //display pixel Y (0-3)
loopsva 0:6f472b9627c7 105
loopsva 0:6f472b9627c7 106 //Display Options
loopsva 0:6f472b9627c7 107 int TempC = 'C'; //***USED BY .INI FILE display temperatures in degrees C or F
loopsva 0:6f472b9627c7 108 int SensFacingAway = 0; //***USED BY .INI FILE sensor facing towards you or away from you
loopsva 0:6f472b9627c7 109 int xHatch = 1; //***USED BY .INI FILE display hatch pattern between pixels or allow pixels to blend together
loopsva 0:6f472b9627c7 110 float lowEnd = 20.0; //***USED BY .INI FILE low end of color temperature scale (blue end)
loopsva 0:6f472b9627c7 111 float hiEnd = 100.0; //***USED BY .INI FILE top end of color temperature scale (red end)
loopsva 0:6f472b9627c7 112 int PutOnPC = 1; //***USED BY .INI FILE display temperature array on PC 0 or 1. Requires VT100 terminal operation
loopsva 0:6f472b9627c7 113
loopsva 2:1f1157f04539 114 //USB Serial Port Support
loopsva 0:6f472b9627c7 115 const int PCRXBUFSIZE = 128; //pc RX buffer size
loopsva 0:6f472b9627c7 116 char pcRxBuffer[PCRXBUFSIZE]; //RX data buffer
loopsva 0:6f472b9627c7 117 volatile int pcRxQty = 0; //RX data counter/pointer
loopsva 0:6f472b9627c7 118 volatile char inchar = 0; //RX input character
loopsva 0:6f472b9627c7 119 volatile bool LocalEcho = false; //whether or not, to local echo input chars from pc
loopsva 0:6f472b9627c7 120 volatile bool pcRxLine = false; //CR or LF detected in RX buffer
loopsva 2:1f1157f04539 121 volatile bool pcRxTicC = false; //^C detected in RX buffer
loopsva 0:6f472b9627c7 122 volatile bool pcRxEOB = false; //RX buffer EOB (full)
loopsva 0:6f472b9627c7 123 volatile bool pcRxIsNumb = false; //whether or not string is a valid number (including dp)
loopsva 0:6f472b9627c7 124 volatile double pcRxNumb = 0.0; //RX buffer comversion
loopsva 0:6f472b9627c7 125 int pcRxCharCnt = 0; //total number of pc RX characters received since boot
loopsva 0:6f472b9627c7 126 int pcRxIRQCnt = 0; //total number of pc RX interrupts received since boot
loopsva 0:6f472b9627c7 127
loopsva 0:6f472b9627c7 128 //--------------------------------------------------------------------------------------------------------------------------------------//
loopsva 2:1f1157f04539 129 // Checks to see if a ^C happend. reboot if so...
loopsva 2:1f1157f04539 130
loopsva 2:1f1157f04539 131 void PcChekTicC() {
loopsva 2:1f1157f04539 132 if(pcRxTicC == true) {
loopsva 2:1f1157f04539 133 pc.printf("\n\n%s*** Control C detected, Resetting ***%s \n", doRED, doNONE);
loopsva 2:1f1157f04539 134 // i2c1.stop();
loopsva 2:1f1157f04539 135 wait_ms(200);
loopsva 2:1f1157f04539 136
loopsva 2:1f1157f04539 137 #if defined(TARGET_KL25Z)
loopsva 2:1f1157f04539 138 NVIC_SystemReset();
loopsva 2:1f1157f04539 139 #else
loopsva 2:1f1157f04539 140 mbed_reset();
loopsva 2:1f1157f04539 141 #endif
loopsva 2:1f1157f04539 142 }
loopsva 2:1f1157f04539 143 }
loopsva 2:1f1157f04539 144
loopsva 2:1f1157f04539 145 //--------------------------------------------------------------------------------------------------------------------------------------//
loopsva 0:6f472b9627c7 146 // This function is called when a character goes into the RX buffer.
loopsva 0:6f472b9627c7 147
loopsva 2:1f1157f04539 148 int TicC2 = 0;
loopsva 2:1f1157f04539 149
loopsva 0:6f472b9627c7 150 void PcRxChar() {
loopsva 0:6f472b9627c7 151 pcRxCharCnt++;
loopsva 0:6f472b9627c7 152 if(inchar == BS) {
loopsva 0:6f472b9627c7 153 if(pcRxQty == 0) {
loopsva 0:6f472b9627c7 154 pcRxBuffer[pcRxQty] = 0;
loopsva 0:6f472b9627c7 155 } else {
loopsva 0:6f472b9627c7 156 if(LocalEcho) pc.printf("%c %c", BS, BS);
loopsva 0:6f472b9627c7 157 pcRxQty--;
loopsva 0:6f472b9627c7 158 }
loopsva 0:6f472b9627c7 159 } else if((inchar == CR) || (inchar == LF)) {
loopsva 0:6f472b9627c7 160 pcRxLine = true;
loopsva 0:6f472b9627c7 161 if(LocalEcho) pc.printf("\n");
loopsva 2:1f1157f04539 162 } else if(inchar == ticC) {
loopsva 2:1f1157f04539 163 pcRxTicC = true;
loopsva 2:1f1157f04539 164 TicC2++;
loopsva 2:1f1157f04539 165 if(TicC2 > 2) {
loopsva 2:1f1157f04539 166 wait_ms(200);
loopsva 2:1f1157f04539 167 pc.printf("\n\n%s*** Control C detected, Resetting %sfrom IRQ!!!%s***%s \n", doRED, doGREEN, doRED, doNONE);
loopsva 2:1f1157f04539 168 wait_ms(200);
loopsva 2:1f1157f04539 169 i2c1.stop();
loopsva 1:9d7894633924 170
loopsva 2:1f1157f04539 171 #if defined(TARGET_KL25Z)
loopsva 2:1f1157f04539 172 NVIC_SystemReset();
loopsva 2:1f1157f04539 173 #else
loopsva 2:1f1157f04539 174 mbed_reset();
loopsva 2:1f1157f04539 175 #endif
loopsva 2:1f1157f04539 176
loopsva 2:1f1157f04539 177 }
loopsva 0:6f472b9627c7 178 } else if((inchar == 'C') || (inchar == 'c')) {
loopsva 0:6f472b9627c7 179 TempC = inchar;
loopsva 0:6f472b9627c7 180 } else if((inchar == 'F') || (inchar == 'f')) {
loopsva 0:6f472b9627c7 181 TempC = inchar;
loopsva 0:6f472b9627c7 182 } else if((inchar == 'I') || (inchar == 'i')) {
loopsva 0:6f472b9627c7 183 SensFacingAway = 0;
loopsva 0:6f472b9627c7 184 } else if((inchar == 'O') || (inchar == 'o')) {
loopsva 0:6f472b9627c7 185 SensFacingAway = 1;
loopsva 0:6f472b9627c7 186 } else {
loopsva 0:6f472b9627c7 187 if(pcRxQty < sizeof(pcRxBuffer)) {
loopsva 0:6f472b9627c7 188 pcRxBuffer[pcRxQty] = inchar;
loopsva 2:1f1157f04539 189 // pcRxQty++; //NOTE: no buffer needed for this code, don't inc char pointer
loopsva 2:1f1157f04539 190 pcRxBuffer[pcRxQty] = 0;
loopsva 0:6f472b9627c7 191 if(LocalEcho) pc.putc(inchar);
loopsva 0:6f472b9627c7 192 } else {
loopsva 0:6f472b9627c7 193 pc.printf ("\n*** pcRxBuffer is full!!\n");
loopsva 0:6f472b9627c7 194 pcRxEOB = true;
loopsva 1:9d7894633924 195 pcRxQty = 0;
loopsva 1:9d7894633924 196 pcRxBuffer[pcRxQty] = 0;
loopsva 0:6f472b9627c7 197 }
loopsva 0:6f472b9627c7 198 }
loopsva 0:6f472b9627c7 199
loopsva 0:6f472b9627c7 200 bool oneDot = false;
loopsva 0:6f472b9627c7 201 pcRxIsNumb = true;
loopsva 0:6f472b9627c7 202 for(int i = 0; i < pcRxQty; i++) {
loopsva 0:6f472b9627c7 203 if(pcRxBuffer[i] == '.') {
loopsva 0:6f472b9627c7 204 if(oneDot == true) {
loopsva 0:6f472b9627c7 205 pcRxIsNumb = false;
loopsva 0:6f472b9627c7 206 break;
loopsva 0:6f472b9627c7 207 } else {
loopsva 0:6f472b9627c7 208 oneDot = true;
loopsva 0:6f472b9627c7 209 }
loopsva 0:6f472b9627c7 210 }
loopsva 0:6f472b9627c7 211 else if((pcRxBuffer[i] < '0') || (pcRxBuffer[i] > '9')) {
loopsva 0:6f472b9627c7 212 if(!((i == 0) && (pcRxBuffer[i] == '-'))) {
loopsva 0:6f472b9627c7 213 pcRxIsNumb = false;
loopsva 0:6f472b9627c7 214 break;
loopsva 0:6f472b9627c7 215 }
loopsva 0:6f472b9627c7 216 }
loopsva 0:6f472b9627c7 217 }
loopsva 0:6f472b9627c7 218 }
loopsva 0:6f472b9627c7 219
loopsva 0:6f472b9627c7 220 //--------------------------------------------------------------------------------------------------------------------------------------//
loopsva 0:6f472b9627c7 221 // Read received chars from USB UART
loopsva 0:6f472b9627c7 222
loopsva 0:6f472b9627c7 223 void PcRxIRQ(void){
loopsva 0:6f472b9627c7 224 pcRxIRQCnt++;
loopsva 2:1f1157f04539 225 #if defined(TARGET_KL25Z)
loopsva 2:1f1157f04539 226 NVIC_DisableIRQ(UART0_IRQn); // n=0, 1 or 2 Disable Rx interrupt on kl25z
loopsva 2:1f1157f04539 227 #else
loopsva 2:1f1157f04539 228 LPC_UART0->IER = 0; //Disable Rx interrupt on mbed1768
loopsva 2:1f1157f04539 229 #endif
loopsva 0:6f472b9627c7 230 while (pc.readable()) {
loopsva 0:6f472b9627c7 231 inchar = pc.getc(); //read data from USB
loopsva 0:6f472b9627c7 232 PcRxChar(); //go process char
loopsva 0:6f472b9627c7 233 }
loopsva 2:1f1157f04539 234 #if defined(TARGET_KL25Z)
loopsva 2:1f1157f04539 235 NVIC_EnableIRQ(UART0_IRQn); //re-enable Rx interrupt on kl25z
loopsva 2:1f1157f04539 236 #else
loopsva 2:1f1157f04539 237 LPC_UART0->IER = 1; //re-enable Rx interrupt on mbed1768
loopsva 2:1f1157f04539 238 #endif
loopsva 2:1f1157f04539 239 }
loopsva 2:1f1157f04539 240
loopsva 2:1f1157f04539 241 //--------------------------------------------------------------------------------------------------------------------------------------//
loopsva 2:1f1157f04539 242 //fixing a screwup on the eeprom from an accidental write
loopsva 2:1f1157f04539 243
loopsva 2:1f1157f04539 244 void FixEEP() {
loopsva 2:1f1157f04539 245 EEbuf[0] = 0x10; //starting address of EEP to write to, pages 0 - 31 * 8
loopsva 2:1f1157f04539 246 EEbuf[1] = 0xed;
loopsva 2:1f1157f04539 247 EEbuf[2] = 0xee;
loopsva 2:1f1157f04539 248 EEbuf[3] = 0xee;
loopsva 2:1f1157f04539 249 EEbuf[4] = 0xec;
loopsva 2:1f1157f04539 250 EEbuf[5] = 0xee;
loopsva 2:1f1157f04539 251 EEbuf[6] = 0xef;
loopsva 2:1f1157f04539 252 EEbuf[7] = 0xef;
loopsva 2:1f1157f04539 253 EEbuf[8] = 0xed;
loopsva 2:1f1157f04539 254 i2c1.write(0xa0, EEbuf, 9, false);
loopsva 2:1f1157f04539 255 wait_ms(6); //datasheet says 5mS max
loopsva 2:1f1157f04539 256
loopsva 0:6f472b9627c7 257 }
loopsva 0:6f472b9627c7 258
loopsva 0:6f472b9627c7 259 //--------------------------------------------------------------------------------------------------------------------------------------//
loopsva 2:1f1157f04539 260 //Reload EEPROM image from file /local/EEP.CSV
loopsva 2:1f1157f04539 261
loopsva 2:1f1157f04539 262 #if defined(TARGET_KL25Z)
loopsva 2:1f1157f04539 263 #else
loopsva 2:1f1157f04539 264 char* FileBuf = new char[1024];
loopsva 2:1f1157f04539 265 char tbuf[256];
loopsva 2:1f1157f04539 266
loopsva 2:1f1157f04539 267 int ReloadEEP() {
loopsva 2:1f1157f04539 268 FILE *fps = fopen("/local/EEP.CSV", "r");
loopsva 2:1f1157f04539 269 if (fps == NULL) {
loopsva 2:1f1157f04539 270 return(0);
loopsva 2:1f1157f04539 271 } else {
loopsva 2:1f1157f04539 272 for(int i = 0; i < 256; i++) {
loopsva 2:1f1157f04539 273 int x = -1;
loopsva 2:1f1157f04539 274 do{
loopsva 2:1f1157f04539 275 x++;
loopsva 2:1f1157f04539 276 FileBuf[x] = fgetc(fps);
loopsva 2:1f1157f04539 277 if(FileBuf[x] == '\n') {
loopsva 2:1f1157f04539 278 x--;
loopsva 2:1f1157f04539 279 }
loopsva 2:1f1157f04539 280 } while((FileBuf[x] != ','));
loopsva 2:1f1157f04539 281 x--;
loopsva 2:1f1157f04539 282 tbuf[i] = char(strtod(FileBuf, &FileBuf));
loopsva 2:1f1157f04539 283 EEbuf[i] = tbuf[i];
loopsva 2:1f1157f04539 284 }
loopsva 2:1f1157f04539 285 fclose(fps);
loopsva 2:1f1157f04539 286 return(1);
loopsva 2:1f1157f04539 287 }
loopsva 2:1f1157f04539 288 }
loopsva 2:1f1157f04539 289
loopsva 2:1f1157f04539 290 //--------------------------------------------------------------------------------------------------------------------------------------//
loopsva 2:1f1157f04539 291 //re-write all of the MLX EEPROM from file EEP.CSV. Returns 0, no write error. 1 - 32 for failed page
loopsva 2:1f1157f04539 292 //tbuf contains the source data. ReloadEEP() must be run first!!!
loopsva 2:1f1157f04539 293
loopsva 2:1f1157f04539 294 int FixAllEEP() {
loopsva 2:1f1157f04539 295 for(int i = 0; i < 32; i++) { //32, 8 byte pages
loopsva 2:1f1157f04539 296 EEbuf[0] = i * 8; //EEPROM page #
loopsva 2:1f1157f04539 297 EEbuf[1] = tbuf[i * 8];
loopsva 2:1f1157f04539 298 EEbuf[2] = tbuf[i * 8 + 1];
loopsva 2:1f1157f04539 299 EEbuf[3] = tbuf[i * 8 + 2];
loopsva 2:1f1157f04539 300 EEbuf[4] = tbuf[i * 8 + 3];
loopsva 2:1f1157f04539 301 EEbuf[5] = tbuf[i * 8 + 4];
loopsva 2:1f1157f04539 302 EEbuf[6] = tbuf[i * 8 + 5];
loopsva 2:1f1157f04539 303 EEbuf[7] = tbuf[i * 8 + 6];
loopsva 2:1f1157f04539 304 EEbuf[8] = tbuf[i * 8 + 7];
loopsva 2:1f1157f04539 305 if(!(i2c1.write(0xa0, EEbuf, 9, false))) { //store 8 byte page
loopsva 2:1f1157f04539 306 i2c1.stop();
loopsva 2:1f1157f04539 307 }
loopsva 2:1f1157f04539 308 wait_ms(10); //datasheet says 5mS max
loopsva 2:1f1157f04539 309 }
loopsva 2:1f1157f04539 310 return(0);
loopsva 2:1f1157f04539 311 }
loopsva 2:1f1157f04539 312 #endif
loopsva 2:1f1157f04539 313
loopsva 2:1f1157f04539 314 //--------------------------------------------------------------------------------------------------------------------------------------//
loopsva 0:6f472b9627c7 315 //Detect I2C device chain
loopsva 0:6f472b9627c7 316
loopsva 0:6f472b9627c7 317 int i2cQty = 16; //number of bytes to get
loopsva 0:6f472b9627c7 318 char i2cData[32]; //i2c buffer data
loopsva 0:6f472b9627c7 319
loopsva 0:6f472b9627c7 320 void find_i2c1() {
loopsva 0:6f472b9627c7 321 if(gDebug > 1) pc.printf("Searching for I2C devices on bus 1...\n");
loopsva 0:6f472b9627c7 322
loopsva 0:6f472b9627c7 323 int count = 0;
loopsva 0:6f472b9627c7 324 for (int address = 2; address < 256; address +=2) {
loopsva 0:6f472b9627c7 325 if (!i2c1.write(address, NULL, 0)) { // 0 returned is ok
loopsva 0:6f472b9627c7 326 wait_ms(5);
loopsva 0:6f472b9627c7 327 if(gDebug > 1) pc.printf(" - I2C device found at address 0x%02X\n", address);
loopsva 0:6f472b9627c7 328 for (int clrb = 0; clrb < i2cQty; clrb +=1) { //clear out i2c buffer before reading in data
loopsva 0:6f472b9627c7 329 i2cData[clrb] = 0;
loopsva 0:6f472b9627c7 330 }
loopsva 0:6f472b9627c7 331 count++;
loopsva 0:6f472b9627c7 332 }
loopsva 0:6f472b9627c7 333 }
loopsva 0:6f472b9627c7 334 if(gDebug > 1) pc.printf(" - I2seeU! %d devices found\n", count);
loopsva 0:6f472b9627c7 335 }
loopsva 0:6f472b9627c7 336
loopsva 0:6f472b9627c7 337 //---------
loopsva 2:1f1157f04539 338 #if defined(TARGET_KL25Z)
loopsva 0:6f472b9627c7 339 void find_i2c2() {
loopsva 0:6f472b9627c7 340 if(gDebug > 1) pc.printf("Searching for I2C devices on bus 2...\n");
loopsva 0:6f472b9627c7 341
loopsva 0:6f472b9627c7 342 int count = 0;
loopsva 0:6f472b9627c7 343 for (int address = 2; address < 256; address +=2) {
loopsva 0:6f472b9627c7 344 if (!i2c2.write(address, NULL, 0)) { // 0 returned is ok
loopsva 0:6f472b9627c7 345 wait_ms(5);
loopsva 0:6f472b9627c7 346 if(gDebug > 1) pc.printf(" - I2C device found at address 0x%02X\n", address);
loopsva 0:6f472b9627c7 347 for (int clrb = 0; clrb < i2cQty; clrb +=1) { //clear out i2c buffer before reading in data
loopsva 0:6f472b9627c7 348 i2cData[clrb] = 0;
loopsva 0:6f472b9627c7 349 }
loopsva 0:6f472b9627c7 350 count++;
loopsva 0:6f472b9627c7 351 }
loopsva 0:6f472b9627c7 352 }
loopsva 0:6f472b9627c7 353 if(gDebug > 1) pc.printf(" - I2seeU! %d devices found\n", count);
loopsva 0:6f472b9627c7 354 }
loopsva 0:6f472b9627c7 355
loopsva 0:6f472b9627c7 356 //--------------------------------------------------------------------------------------------------------------------------------------//
loopsva 0:6f472b9627c7 357 // moving RGB LED display. Hacked from: david dicarlo / FRDM_RGBLED
loopsva 0:6f472b9627c7 358
loopsva 0:6f472b9627c7 359 const float pi = 3.1415927;
loopsva 0:6f472b9627c7 360 float iLeds = 0.0;
loopsva 0:6f472b9627c7 361
loopsva 0:6f472b9627c7 362 void sinLEDs() {
loopsva 0:6f472b9627c7 363 iLeds += 0.02; // was 0.001 in original code
loopsva 0:6f472b9627c7 364 if(iLeds > (60.0 * pi)) iLeds = 0.0;
loopsva 0:6f472b9627c7 365 rLedPwm = (1 + sin(2 * iLeds)) / 2; // calculate values for RGB based on different
loopsva 0:6f472b9627c7 366 gLedPwm = (1 + sin(3 * iLeds)) / 2; // frequency sin waves. This should give a nice
loopsva 0:6f472b9627c7 367 bLedPwm = (1 + sin(5 * iLeds)) / 2; // smooth transistion between colors and a
loopsva 0:6f472b9627c7 368 rled = rLedPwm; // send RGB values to LED PWMs
loopsva 0:6f472b9627c7 369 gled = gLedPwm;
loopsva 0:6f472b9627c7 370 bled = bLedPwm;
loopsva 0:6f472b9627c7 371 }
loopsva 0:6f472b9627c7 372
loopsva 2:1f1157f04539 373 #endif
loopsva 0:6f472b9627c7 374 //--------------------------------------------------------------------------------------------------------------------------------------//
loopsva 0:6f472b9627c7 375 // See if new temperature in array is higher then the current hottest or colder then the current coldest
loopsva 0:6f472b9627c7 376
loopsva 0:6f472b9627c7 377 void CheckNewExtreme() {
loopsva 0:6f472b9627c7 378 if(TempPxl > HotPxl) {
loopsva 0:6f472b9627c7 379 HotPxl = TempPxl;
loopsva 0:6f472b9627c7 380 HottestX = pixX / 4;
loopsva 0:6f472b9627c7 381 HottestY = pixY;
loopsva 0:6f472b9627c7 382 }
loopsva 0:6f472b9627c7 383 if(TempPxl < ColdPxl) {
loopsva 0:6f472b9627c7 384 ColdPxl = TempPxl;
loopsva 0:6f472b9627c7 385 ColdestX = pixX / 4;
loopsva 0:6f472b9627c7 386 ColdestY = pixY;
loopsva 0:6f472b9627c7 387 }
loopsva 0:6f472b9627c7 388 }
loopsva 0:6f472b9627c7 389
loopsva 0:6f472b9627c7 390 //--------------------------------------------------------------------------------------------------------------------------------------//
loopsva 0:6f472b9627c7 391 // Change color of extreme tempeature values on PC using VT100 escape sequences
loopsva 0:6f472b9627c7 392
loopsva 0:6f472b9627c7 393 bool PCdeftFlag = true;
loopsva 0:6f472b9627c7 394
loopsva 0:6f472b9627c7 395 void PCExtreme() {
loopsva 0:6f472b9627c7 396 if((HottestX == (pixX / 4)) && (HottestY == pixY)) {
loopsva 0:6f472b9627c7 397 PCdeftFlag = false;
loopsva 0:6f472b9627c7 398 pc.printf("%c[8;31;2m", ESC);
loopsva 0:6f472b9627c7 399 return;
loopsva 0:6f472b9627c7 400 } else
loopsva 0:6f472b9627c7 401 if((ColdestX == (pixX / 4)) && (ColdestY == pixY)) {
loopsva 0:6f472b9627c7 402 PCdeftFlag = false;
loopsva 0:6f472b9627c7 403 pc.printf("%c[8;34;2m", ESC);
loopsva 0:6f472b9627c7 404 return;
loopsva 0:6f472b9627c7 405 } else
loopsva 0:6f472b9627c7 406 if(PCdeftFlag == false) {
loopsva 0:6f472b9627c7 407 PCdeftFlag = true;
loopsva 0:6f472b9627c7 408 pc.printf("%c[8;30m", ESC);
loopsva 0:6f472b9627c7 409 }
loopsva 0:6f472b9627c7 410 }
loopsva 0:6f472b9627c7 411
loopsva 0:6f472b9627c7 412 //--------------------------------------------------------------------------------------------------------------------------------------//
loopsva 0:6f472b9627c7 413 // Pick a pixel to print out temperature. X = column 0 - 15, Y = row 0 - 3
loopsva 0:6f472b9627c7 414
loopsva 0:6f472b9627c7 415 void PickaPixel(int pX, int pY) {
loopsva 2:1f1157f04539 416 TempPxl = mlx.CalcPixel(mlxSTR, pX + pY);
loopsva 0:6f472b9627c7 417 if ((TempC == 'c') || (TempC == 'C')) {
loopsva 0:6f472b9627c7 418 pc.printf("Pixel X:%d Y:%d Temp: %.2f degC\n", pX / 4, pY, TempPxl);
loopsva 0:6f472b9627c7 419 } else {
loopsva 0:6f472b9627c7 420 pc.printf("Pixel X:%d Y:%d Temp: %.2f degF\n", pX / 4, pY, TempPxl * 9.0 / 5.0 + 32.0);
loopsva 0:6f472b9627c7 421 }
loopsva 0:6f472b9627c7 422 }
loopsva 0:6f472b9627c7 423
loopsva 0:6f472b9627c7 424 //--------------------------------------------------------------------------------------------------------------------------------------//
loopsva 0:6f472b9627c7 425 // Display on PC using VT100 escape codes
loopsva 0:6f472b9627c7 426
loopsva 0:6f472b9627c7 427 const int TTX = 45;
loopsva 0:6f472b9627c7 428 const int TTY = 120;
loopsva 0:6f472b9627c7 429 int tX = TTX;
loopsva 0:6f472b9627c7 430 int tY = TTY;;
loopsva 0:6f472b9627c7 431
loopsva 0:6f472b9627c7 432 int AllowVT100 = 0;
loopsva 0:6f472b9627c7 433
loopsva 0:6f472b9627c7 434 void ShowTempsVT100() {
loopsva 0:6f472b9627c7 435 if(AllowVT100 <= 3) { //update PC display every 4th TFT pixel update
loopsva 0:6f472b9627c7 436 return;
loopsva 0:6f472b9627c7 437 }
loopsva 0:6f472b9627c7 438 AllowVT100 = 0;
loopsva 0:6f472b9627c7 439 double HoldTemp = TempPxl;
loopsva 0:6f472b9627c7 440 if(SensFacingAway == 1) {
loopsva 0:6f472b9627c7 441 pc.printf("%c[8;30m%c[6AArray Temperature deg%c \\\\ ^ // \n F E D C B A 9 8 7 6 5 4 3 2 1 0 \n", ESC, ESC, (TempC & 0x5f));
loopsva 0:6f472b9627c7 442 for(pixY = 0; pixY <= 3; pixY++) {
loopsva 0:6f472b9627c7 443 for(pixX = 60; pixX >= 0; pixX = pixX - 4) {
loopsva 2:1f1157f04539 444 TempPxl = mlx.CalcPixel(mlxSTR, pixX + pixY);
loopsva 0:6f472b9627c7 445 if ((TempC == 'c') || (TempC == 'C')) {
loopsva 0:6f472b9627c7 446 HoldTemp = TempPxl;
loopsva 0:6f472b9627c7 447 } else {
loopsva 0:6f472b9627c7 448 HoldTemp = TempPxl * 9.0 / 5.0 + 32.0;
loopsva 0:6f472b9627c7 449 }
loopsva 0:6f472b9627c7 450 PCExtreme();
loopsva 0:6f472b9627c7 451 if(HoldTemp >= 100.0) {
loopsva 0:6f472b9627c7 452 pc.printf(" %.1f ", HoldTemp);
loopsva 0:6f472b9627c7 453 } else
loopsva 0:6f472b9627c7 454 if((HoldTemp <= 10.0) && (HoldTemp >= 0.0)) {
loopsva 0:6f472b9627c7 455 pc.printf(" %.2f ", HoldTemp);
loopsva 0:6f472b9627c7 456 } else
loopsva 0:6f472b9627c7 457 if((HoldTemp >= -10.0) && (HoldTemp < 0.0)) {
loopsva 0:6f472b9627c7 458 pc.printf(" %.2f ", HoldTemp);
loopsva 0:6f472b9627c7 459 } else
loopsva 0:6f472b9627c7 460 if(HoldTemp < -10.0) {
loopsva 0:6f472b9627c7 461 pc.printf("%.2f ", HoldTemp);
loopsva 0:6f472b9627c7 462 } else {
loopsva 0:6f472b9627c7 463 pc.printf(" %.2f ", HoldTemp);
loopsva 0:6f472b9627c7 464 }
loopsva 0:6f472b9627c7 465 }
loopsva 0:6f472b9627c7 466 PCdeftFlag = true;
loopsva 0:6f472b9627c7 467 pc.printf("%c[8;30m%2d \n", ESC, pixY);
loopsva 0:6f472b9627c7 468 // pc.printf("%2d \n", pixY);
loopsva 0:6f472b9627c7 469 }
loopsva 0:6f472b9627c7 470 } else {
loopsva 0:6f472b9627c7 471 pc.printf("%c[8;30m%c[6AArray Temperature deg%c // v \\\\ \n 0 1 2 3 4 5 6 7 8 9 A B C D E F \n", ESC, ESC, (TempC & 0x5f));
loopsva 0:6f472b9627c7 472 for(pixY = 0; pixY <= 3; pixY++) {
loopsva 0:6f472b9627c7 473 for(pixX = 0; pixX < 64; pixX = pixX + 4) {
loopsva 2:1f1157f04539 474 TempPxl = mlx.CalcPixel(mlxSTR, pixX + pixY);
loopsva 0:6f472b9627c7 475 if ((TempC == 'c') || (TempC == 'C')) {
loopsva 0:6f472b9627c7 476 HoldTemp = TempPxl;
loopsva 0:6f472b9627c7 477 } else {
loopsva 0:6f472b9627c7 478 HoldTemp = TempPxl * 9.0 / 5.0 + 32.0;
loopsva 0:6f472b9627c7 479 }
loopsva 0:6f472b9627c7 480 PCExtreme();
loopsva 0:6f472b9627c7 481 if(HoldTemp >= 100.0) {
loopsva 0:6f472b9627c7 482 pc.printf(" %.1f ", HoldTemp);
loopsva 0:6f472b9627c7 483 } else
loopsva 0:6f472b9627c7 484 if((HoldTemp <= 10.0) && (HoldTemp >= 0.0)) {
loopsva 0:6f472b9627c7 485 pc.printf(" %.2f ", HoldTemp);
loopsva 0:6f472b9627c7 486 } else
loopsva 0:6f472b9627c7 487 if((HoldTemp >= -10.0) && (HoldTemp < 0.0)) {
loopsva 0:6f472b9627c7 488 pc.printf(" %.2f ", HoldTemp);
loopsva 0:6f472b9627c7 489 } else
loopsva 0:6f472b9627c7 490 if(HoldTemp < -10.0) {
loopsva 0:6f472b9627c7 491 pc.printf("%.2f ", HoldTemp);
loopsva 0:6f472b9627c7 492 } else {
loopsva 0:6f472b9627c7 493 pc.printf(" %.2f ", HoldTemp);
loopsva 0:6f472b9627c7 494 }
loopsva 0:6f472b9627c7 495 }
loopsva 0:6f472b9627c7 496 pc.printf("%c[8;30m%2d \n", ESC, pixY);
loopsva 0:6f472b9627c7 497 }
loopsva 0:6f472b9627c7 498 }
loopsva 0:6f472b9627c7 499 }
loopsva 0:6f472b9627c7 500
loopsva 0:6f472b9627c7 501 //--------------------------------------------------------------------------------------------------------------------------------------//
loopsva 0:6f472b9627c7 502 // Display Pixels in color
loopsva 0:6f472b9627c7 503
loopsva 0:6f472b9627c7 504 int loop = 0;
loopsva 0:6f472b9627c7 505 bool GotAmbient = false;
loopsva 0:6f472b9627c7 506 bool FirstRamDump = true;
loopsva 0:6f472b9627c7 507
loopsva 0:6f472b9627c7 508 int ShowTempsColor() {
loopsva 2:1f1157f04539 509 // ConfigReg = mlx.GetConfigReg();
loopsva 2:1f1157f04539 510
loopsva 2:1f1157f04539 511 //because of change to normal mode...
loopsva 2:1f1157f04539 512 ConfigReg = 0;
loopsva 2:1f1157f04539 513 wait_ms(185); //balance out to display is about once per second
loopsva 2:1f1157f04539 514 //end of because of change
loopsva 2:1f1157f04539 515
loopsva 2:1f1157f04539 516 /*
loopsva 2:1f1157f04539 517 #ifdef MLX_KL25Z
loopsva 2:1f1157f04539 518 NVIC_DisableIRQ(UART0_IRQn); // n=0, 1 or 2 Disable Rx interrupt on kl25z
loopsva 2:1f1157f04539 519 #else
loopsva 2:1f1157f04539 520 LPC_UART0->IER = 0; //Disable Rx interrupt on mbed1768
loopsva 2:1f1157f04539 521 #endif
loopsva 2:1f1157f04539 522 */
loopsva 0:6f472b9627c7 523 if(GotAmbient == false) {
loopsva 2:1f1157f04539 524 if((ConfigReg & MLX_TAMEASFLAG) == 0) {
loopsva 2:1f1157f04539 525 mlx.CalcTa_To(mlxSTR);
loopsva 2:1f1157f04539 526 Ta = mlx.GetDieTemp(mlxSTR);
loopsva 0:6f472b9627c7 527 // pc.printf("Ta = %f\n\n\n\n\n\n\n", Ta);
loopsva 0:6f472b9627c7 528 GotAmbient = true;
loopsva 0:6f472b9627c7 529 } else {
loopsva 2:1f1157f04539 530 return(ConfigReg & MLX_TAMEASFLAG);
loopsva 0:6f472b9627c7 531 }
loopsva 0:6f472b9627c7 532 }
loopsva 2:1f1157f04539 533 if((ConfigReg & MLX_IRMEASFLAG) == 0) {
loopsva 0:6f472b9627c7 534 loop++;
loopsva 0:6f472b9627c7 535 GotAmbient = false;
loopsva 0:6f472b9627c7 536 if(ReFrame == true) {
loopsva 0:6f472b9627c7 537 if(gDebug > 2) pc.printf("AutoScale Update, lowEnd: %4.0fC hiEnd: %4.0fC\n", lowEnd, hiEnd);
loopsva 0:6f472b9627c7 538 ReFrame = false;
loopsva 0:6f472b9627c7 539 }
loopsva 0:6f472b9627c7 540 AllowVT100++;
loopsva 0:6f472b9627c7 541 HotPxl = -40.0;
loopsva 0:6f472b9627c7 542 ColdPxl = 200.0;
loopsva 2:1f1157f04539 543 mlx.LoadMLXRam(mlxSTR);
loopsva 0:6f472b9627c7 544 if((gDebug > 1) && (FirstRamDump == true)) {
loopsva 0:6f472b9627c7 545 FirstRamDump = false;
loopsva 0:6f472b9627c7 546 pc.printf("First RAM dump");
loopsva 0:6f472b9627c7 547 pb.dump("Ram Buffer:", 8, 0, RamBuf);
loopsva 0:6f472b9627c7 548 if(PutOnPC == 1) {
loopsva 0:6f472b9627c7 549 //pc.printf("\n\n\n\n\n\n\n");
loopsva 0:6f472b9627c7 550 }
loopsva 0:6f472b9627c7 551 } else
loopsva 0:6f472b9627c7 552 if((PutOnPC == 1) && (FirstRamDump == true)) {
loopsva 0:6f472b9627c7 553 FirstRamDump = false;
loopsva 0:6f472b9627c7 554 pc.printf("\n\n\n\n\n\n\n");
loopsva 0:6f472b9627c7 555 }
loopsva 0:6f472b9627c7 556
loopsva 0:6f472b9627c7 557 tX = TTX;
loopsva 0:6f472b9627c7 558 tY = TTY;
loopsva 2:1f1157f04539 559 mlx.StartMeasurement(mlxSTR);
loopsva 2:1f1157f04539 560 /*
loopsva 2:1f1157f04539 561 #ifdef MLX_KL25Z
loopsva 2:1f1157f04539 562 NVIC_EnableIRQ(UART0_IRQn); //re-enable Rx interrupt on kl25z
loopsva 2:1f1157f04539 563 #else
loopsva 2:1f1157f04539 564 LPC_UART0->IER = 1; //re-enable Rx interrupt on mbed1768
loopsva 2:1f1157f04539 565 #endif
loopsva 2:1f1157f04539 566 */
loopsva 0:6f472b9627c7 567 if(gDebug > 3) pc.printf("Array Temperature degC\n 3 2 1 0\n");
loopsva 0:6f472b9627c7 568 if(SensFacingAway == 1) {
loopsva 0:6f472b9627c7 569 for(pixX = 60; pixX >= 0; pixX = pixX - 4) {
loopsva 0:6f472b9627c7 570 for(pixY = 3; pixY >= 0; pixY--) {
loopsva 0:6f472b9627c7 571 if((pixX == 16 * 4) && (pixY == 2)) {
loopsva 0:6f472b9627c7 572 PickaPixel(pixX, pixY);
loopsva 0:6f472b9627c7 573 PickPix = true;
loopsva 0:6f472b9627c7 574 } else {
loopsva 0:6f472b9627c7 575 PickPix = false;
loopsva 0:6f472b9627c7 576 }
loopsva 2:1f1157f04539 577 TempPxl = mlx.CalcPixel(mlxSTR, pixX + pixY);
loopsva 0:6f472b9627c7 578 CheckNewExtreme();
loopsva 0:6f472b9627c7 579 if(gDebug > 3) pc.printf("%4.2f ", TempPxl);
loopsva 0:6f472b9627c7 580 }
loopsva 0:6f472b9627c7 581 if(gDebug > 3) pc.printf("%2d\n", (pixX / 4));
loopsva 0:6f472b9627c7 582 }
loopsva 0:6f472b9627c7 583 } else {
loopsva 0:6f472b9627c7 584 for(pixX = 0; pixX < 64; pixX = pixX + 4) {
loopsva 0:6f472b9627c7 585 for(pixY = 3; pixY >= 0; pixY--) {
loopsva 0:6f472b9627c7 586 if((pixX == 16 * 4) && (pixY == 1)) { //0-15 and 0-3
loopsva 0:6f472b9627c7 587 PickaPixel(pixX, pixY);
loopsva 0:6f472b9627c7 588 PickPix = true;
loopsva 0:6f472b9627c7 589 } else {
loopsva 0:6f472b9627c7 590 PickPix = false;
loopsva 0:6f472b9627c7 591 }
loopsva 2:1f1157f04539 592 TempPxl = mlx.CalcPixel(mlxSTR, pixX + pixY);
loopsva 0:6f472b9627c7 593 CheckNewExtreme();
loopsva 0:6f472b9627c7 594 if(gDebug > 3) pc.printf("%4.2f ", TempPxl);
loopsva 0:6f472b9627c7 595 }
loopsva 0:6f472b9627c7 596 if(gDebug > 3) pc.printf("%2d\n", (pixX / 4));
loopsva 0:6f472b9627c7 597 }
loopsva 0:6f472b9627c7 598 }
loopsva 0:6f472b9627c7 599 if(gDebug > 3) pc.printf("\nloop: %d\n", loop);
loopsva 0:6f472b9627c7 600 }
loopsva 0:6f472b9627c7 601 return(0);
loopsva 0:6f472b9627c7 602 }
loopsva 0:6f472b9627c7 603
loopsva 0:6f472b9627c7 604 //--------------------------------------------------------------------------------------------------------------------------------------//
loopsva 0:6f472b9627c7 605 //--------------------------------------------------------------------------------------------------------------------------------------//
loopsva 0:6f472b9627c7 606
loopsva 0:6f472b9627c7 607 int main(void) {
loopsva 2:1f1157f04539 608 GotAmbient = false;
loopsva 2:1f1157f04539 609 i2c1.frequency(400000); //set up i2c speed
loopsva 2:1f1157f04539 610 i2c1.stop();
loopsva 2:1f1157f04539 611
loopsva 2:1f1157f04539 612 #if defined(TARGET_KL25Z)
loopsva 2:1f1157f04539 613 i2c2.frequency(400000); //set up i2c speed
loopsva 2:1f1157f04539 614 i2c2.stop();
loopsva 0:6f472b9627c7 615 rled.period_us(1000);
loopsva 0:6f472b9627c7 616 gled.period_us(1000);
loopsva 0:6f472b9627c7 617 bled.period_us(1000);
loopsva 0:6f472b9627c7 618 gLedUp = false;
loopsva 0:6f472b9627c7 619 rLedPwm = 0.001;
loopsva 2:1f1157f04539 620 gLedPwm = 0.700;
loopsva 2:1f1157f04539 621 bLedPwm = 0.300;
loopsva 0:6f472b9627c7 622 rled = 1.0 - rLedPwm;
loopsva 0:6f472b9627c7 623 gled = 1.0 - gLedPwm;
loopsva 0:6f472b9627c7 624 bled = 1.0 - bLedPwm;
loopsva 0:6f472b9627c7 625 pc.baud(115200);
loopsva 2:1f1157f04539 626 #else
loopsva 2:1f1157f04539 627 pc.baud(921600);
loopsva 2:1f1157f04539 628 #endif
loopsva 2:1f1157f04539 629
loopsva 0:6f472b9627c7 630 pc.printf("\n\n--------------------------------------------\n");
loopsva 2:1f1157f04539 631 pc.printf("mbed1768 / FRDM-KL25Z MLX90620 Tests %sv%d%s\n", doBLUE, revision, doNONE);
loopsva 0:6f472b9627c7 632
loopsva 0:6f472b9627c7 633 //initialize the USB serial port interrupt
loopsva 0:6f472b9627c7 634 pc.printf("Initializing Serial Port Rx Interrupt... \n");
loopsva 0:6f472b9627c7 635 pc.attach(&PcRxIRQ, pc.RxIrq);
loopsva 0:6f472b9627c7 636
loopsva 2:1f1157f04539 637 //look for devices on i2c buses
loopsva 0:6f472b9627c7 638 find_i2c1();
loopsva 2:1f1157f04539 639
loopsva 2:1f1157f04539 640 #if defined(TARGET_KL25Z)
loopsva 0:6f472b9627c7 641 find_i2c2();
loopsva 2:1f1157f04539 642 #else
loopsva 2:1f1157f04539 643 //mbed1768 only, see if MLX90620 eeprom contents file saved. If so, dump on display
loopsva 0:6f472b9627c7 644 if (ReloadEEP()) {
loopsva 0:6f472b9627c7 645 if(gDebug > 1) {
loopsva 2:1f1157f04539 646 pb.dump("\nEEP.CVS file dump", 16, 0,tbuf);
loopsva 0:6f472b9627c7 647 }
loopsva 2:1f1157f04539 648 } else {
loopsva 2:1f1157f04539 649 pc.printf("*** file /local/EEP.CSV does not exist\n");
loopsva 0:6f472b9627c7 650 }
loopsva 2:1f1157f04539 651 #endif
loopsva 2:1f1157f04539 652
loopsva 2:1f1157f04539 653 //DANGEROUS!!! FixEEP is for fixing small portions of the EEPROM on the MLX90620.
loopsva 2:1f1157f04539 654 //Fixes 8 bytes in EEPROM at a time. This is a manual operation, requiring a recompile each
loopsva 2:1f1157f04539 655 //time. You have to set up the starting EEP address and 8 bytes of data to be written
loopsva 2:1f1157f04539 656 //in routine FixEEP
loopsva 2:1f1157f04539 657
loopsva 2:1f1157f04539 658 //FixEEP();
loopsva 2:1f1157f04539 659
loopsva 0:6f472b9627c7 660 int initFail = 0;
loopsva 0:6f472b9627c7 661 //load up eeprom into buffer
loopsva 2:1f1157f04539 662 if((mlx.LoadEEPROM(mlxSTR))) {
loopsva 0:6f472b9627c7 663 pc.printf("*** MLX90620 dump failed!!!\n");
loopsva 0:6f472b9627c7 664 initFail++;
loopsva 0:6f472b9627c7 665 } else {
loopsva 0:6f472b9627c7 666 if(gDebug > 1) {
loopsva 0:6f472b9627c7 667 //pc.printf("\nEEPROM array");
loopsva 0:6f472b9627c7 668 pb.dump("EEPROM Array:", 16, 0, EEbuf);
loopsva 0:6f472b9627c7 669 }
loopsva 0:6f472b9627c7 670 }
loopsva 0:6f472b9627c7 671
loopsva 0:6f472b9627c7 672 //Init MLX90620
loopsva 0:6f472b9627c7 673 unsigned short x = 0;
loopsva 2:1f1157f04539 674 if((mlx.SetOscTrimReg(mlxSTR))) {
loopsva 0:6f472b9627c7 675 pc.printf("*** set osc trim failed!!!\n");
loopsva 0:6f472b9627c7 676 initFail++;
loopsva 0:6f472b9627c7 677 } else {
loopsva 2:1f1157f04539 678 x = mlx.GetOscTrimReg(mlxSTR);
loopsva 0:6f472b9627c7 679 pc.printf("Osc Trim Value: 0x%04x\n", x);
loopsva 0:6f472b9627c7 680 }
loopsva 0:6f472b9627c7 681
loopsva 2:1f1157f04539 682 if((mlx.SetConfigReg(mlxSTR))) {
loopsva 0:6f472b9627c7 683 pc.printf("*** set MLX config failed!!!\n");
loopsva 0:6f472b9627c7 684 initFail++;
loopsva 0:6f472b9627c7 685 } else {
loopsva 2:1f1157f04539 686 x = mlx.GetConfigReg(mlxSTR);
loopsva 0:6f472b9627c7 687 pc.printf("Config Register: 0x%04x\n", x);
loopsva 2:1f1157f04539 688 x = mlx.GetPTATReg(mlxSTR);
loopsva 0:6f472b9627c7 689 pc.printf("PTAT Register: 0x%04x\n", x);
loopsva 0:6f472b9627c7 690 }
loopsva 0:6f472b9627c7 691
loopsva 2:1f1157f04539 692 if((mlx.StartMeasurement(mlxSTR))) {
loopsva 0:6f472b9627c7 693 pc.printf("*** Start Measurement failed!!!\n");
loopsva 0:6f472b9627c7 694 initFail++;
loopsva 0:6f472b9627c7 695 }
loopsva 0:6f472b9627c7 696 wait_ms(300);
loopsva 0:6f472b9627c7 697
loopsva 0:6f472b9627c7 698 if(initFail == 0) {
loopsva 0:6f472b9627c7 699 pc.printf("Calculating Ta...\n");
loopsva 2:1f1157f04539 700 mlx.CalcTa_To(mlxSTR);
loopsva 0:6f472b9627c7 701 pc.printf("Getting die temperature...\n");
loopsva 2:1f1157f04539 702 Ta = mlx.GetDieTemp(mlxSTR);
loopsva 0:6f472b9627c7 703 pc.printf("Ta = %f\n\n", Ta);
loopsva 0:6f472b9627c7 704 } else {
loopsva 0:6f472b9627c7 705 pc.printf("*** MLX90620 non operational!!!\n");
loopsva 0:6f472b9627c7 706 }
loopsva 0:6f472b9627c7 707 ShowTempsColor();
loopsva 2:1f1157f04539 708
loopsva 2:1f1157f04539 709 pc.printf("At any time, type:\n %sO%s = Pointing Outward\n %sI%s = Pointing Inward\n %sC%s = Temp Degrees C\n %sF%s = Temp Degrees F\n%s^C%s = reboot\n\n",
loopsva 2:1f1157f04539 710 doGREEN, doNONE, doGREEN, doNONE, doGREEN, doNONE, doGREEN, doNONE, doRED, doNONE);
loopsva 0:6f472b9627c7 711 pc.printf("Ready...\n");
loopsva 0:6f472b9627c7 712 pc.printf("\n\n\n\n\n\n\n");
loopsva 0:6f472b9627c7 713
loopsva 0:6f472b9627c7 714 while (true) {
loopsva 2:1f1157f04539 715 PcChekTicC();
loopsva 0:6f472b9627c7 716 int lc = 0;
loopsva 0:6f472b9627c7 717 if(!(ShowTempsColor())) {
loopsva 0:6f472b9627c7 718 do {
loopsva 0:6f472b9627c7 719 lc++;
loopsva 0:6f472b9627c7 720 //pc.printf("waiting... %d\n", lc);
loopsva 0:6f472b9627c7 721 wait_ms(1);
loopsva 0:6f472b9627c7 722 } while(ShowTempsColor() != 0);
loopsva 2:1f1157f04539 723
loopsva 2:1f1157f04539 724 #if defined(TARGET_KL25Z)
loopsva 0:6f472b9627c7 725 sinLEDs();
loopsva 2:1f1157f04539 726 #endif
loopsva 2:1f1157f04539 727
loopsva 0:6f472b9627c7 728 }
loopsva 0:6f472b9627c7 729 if(PutOnPC == 1) {
loopsva 0:6f472b9627c7 730 ShowTempsVT100();
loopsva 0:6f472b9627c7 731 }
loopsva 0:6f472b9627c7 732 }
loopsva 0:6f472b9627c7 733 }
loopsva 2:1f1157f04539 734
loopsva 2:1f1157f04539 735