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:
...kevin
main.cpp@2:1f1157f04539, 2016-07-22 (annotated)
- 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?
User | Revision | Line number | New 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 |