Initial commit
Dependencies: MODSERIAL Terminal TextLCD mbed
thermal.cpp@1:a6b0e0ce3e7a, 2014-12-05 (annotated)
- Committer:
- anmar
- Date:
- Fri Dec 05 10:27:17 2014 +0000
- Revision:
- 1:a6b0e0ce3e7a
- Parent:
- 0:0903545c0460
Initial commit
Who changed what in which revision?
User | Revision | Line number | New contents of line |
---|---|---|---|
anmar | 0:0903545c0460 | 1 | #include "thermal.h" |
anmar | 0:0903545c0460 | 2 | |
anmar | 0:0903545c0460 | 3 | #include "defines.h" |
anmar | 0:0903545c0460 | 4 | |
anmar | 0:0903545c0460 | 5 | |
anmar | 0:0903545c0460 | 6 | extern DigitalOut led2; |
anmar | 0:0903545c0460 | 7 | extern DigitalOut led3; |
anmar | 0:0903545c0460 | 8 | extern DigitalOut led4; |
anmar | 0:0903545c0460 | 9 | |
anmar | 0:0903545c0460 | 10 | |
anmar | 0:0903545c0460 | 11 | |
anmar | 0:0903545c0460 | 12 | Thermal::Thermal(Terminal *t, I2C *i) |
anmar | 0:0903545c0460 | 13 | { |
anmar | 0:0903545c0460 | 14 | term = t; |
anmar | 0:0903545c0460 | 15 | //i2c = i; |
anmar | 0:0903545c0460 | 16 | |
anmar | 0:0903545c0460 | 17 | |
anmar | 0:0903545c0460 | 18 | i2c = new I2C(p28, p27); |
anmar | 0:0903545c0460 | 19 | |
anmar | 0:0903545c0460 | 20 | i2c->frequency(100000); |
anmar | 0:0903545c0460 | 21 | |
anmar | 0:0903545c0460 | 22 | |
anmar | 0:0903545c0460 | 23 | } |
anmar | 0:0903545c0460 | 24 | |
anmar | 0:0903545c0460 | 25 | |
anmar | 0:0903545c0460 | 26 | |
anmar | 0:0903545c0460 | 27 | int Thermal::D6T_getvalue() |
anmar | 0:0903545c0460 | 28 | { |
anmar | 0:0903545c0460 | 29 | //const char cmd[] = { 0x4C }; |
anmar | 0:0903545c0460 | 30 | char I2C_rd[64]; |
anmar | 0:0903545c0460 | 31 | |
anmar | 0:0903545c0460 | 32 | short PTAT; |
anmar | 0:0903545c0460 | 33 | int i,j; |
anmar | 0:0903545c0460 | 34 | int itemp; |
anmar | 0:0903545c0460 | 35 | |
anmar | 0:0903545c0460 | 36 | i2c->start(); |
anmar | 0:0903545c0460 | 37 | i2c->write(D6T_addr); |
anmar | 0:0903545c0460 | 38 | i2c->write(D6T_cmd); |
anmar | 0:0903545c0460 | 39 | // Repeated Start condition |
anmar | 0:0903545c0460 | 40 | i2c->read(D6T_addr,I2C_rd,35); |
anmar | 0:0903545c0460 | 41 | // if(check_PEC(I2C_rd) == -1) continue; // error |
anmar | 0:0903545c0460 | 42 | for(i=0,j=0;i<17;i++) |
anmar | 0:0903545c0460 | 43 | { |
anmar | 0:0903545c0460 | 44 | itemp = (I2C_rd[j++] & 0xff); |
anmar | 0:0903545c0460 | 45 | itemp += I2C_rd[j++] * 256; |
anmar | 0:0903545c0460 | 46 | if(i == 0) PTAT = itemp; |
anmar | 0:0903545c0460 | 47 | else temp[i-1] = itemp; |
anmar | 0:0903545c0460 | 48 | } |
anmar | 0:0903545c0460 | 49 | for(i=0;i<16;i++){ |
anmar | 0:0903545c0460 | 50 | dt[i] = 0.1 * temp[i]; |
anmar | 0:0903545c0460 | 51 | } |
anmar | 0:0903545c0460 | 52 | d_PTAT = 0.1 * PTAT; |
anmar | 0:0903545c0460 | 53 | |
anmar | 0:0903545c0460 | 54 | tPEC = readbuff[34]; |
anmar | 0:0903545c0460 | 55 | return 1; |
anmar | 0:0903545c0460 | 56 | } |
anmar | 0:0903545c0460 | 57 | |
anmar | 0:0903545c0460 | 58 | |
anmar | 0:0903545c0460 | 59 | |
anmar | 0:0903545c0460 | 60 | |
anmar | 0:0903545c0460 | 61 | void Thermal::measure() |
anmar | 0:0903545c0460 | 62 | { |
anmar | 0:0903545c0460 | 63 | int n; |
anmar | 0:0903545c0460 | 64 | int status; |
anmar | 0:0903545c0460 | 65 | |
anmar | 0:0903545c0460 | 66 | n = 0; |
anmar | 0:0903545c0460 | 67 | do{ |
anmar | 0:0903545c0460 | 68 | status = D6T_getvalue(); |
anmar | 0:0903545c0460 | 69 | n++; |
anmar | 0:0903545c0460 | 70 | } while(!status && n < LOOPLIMIT); |
anmar | 0:0903545c0460 | 71 | |
anmar | 0:0903545c0460 | 72 | if ( !status ) |
anmar | 0:0903545c0460 | 73 | { |
anmar | 0:0903545c0460 | 74 | // error operation. |
anmar | 0:0903545c0460 | 75 | } |
anmar | 0:0903545c0460 | 76 | |
anmar | 0:0903545c0460 | 77 | |
anmar | 0:0903545c0460 | 78 | l = 40.0; |
anmar | 0:0903545c0460 | 79 | h = 0.0; |
anmar | 0:0903545c0460 | 80 | m = 0.0; |
anmar | 0:0903545c0460 | 81 | |
anmar | 0:0903545c0460 | 82 | for (int x = 0; x < 16; x++ ) |
anmar | 0:0903545c0460 | 83 | { |
anmar | 0:0903545c0460 | 84 | if ( dt[x] > h ) |
anmar | 0:0903545c0460 | 85 | h = dt[x]; |
anmar | 0:0903545c0460 | 86 | if ( dt[x] < l ) |
anmar | 0:0903545c0460 | 87 | l = dt[x]; |
anmar | 0:0903545c0460 | 88 | m += dt[x]; |
anmar | 0:0903545c0460 | 89 | |
anmar | 0:0903545c0460 | 90 | |
anmar | 0:0903545c0460 | 91 | } |
anmar | 0:0903545c0460 | 92 | |
anmar | 0:0903545c0460 | 93 | m /= 16; |
anmar | 0:0903545c0460 | 94 | |
anmar | 0:0903545c0460 | 95 | mean = m; |
anmar | 0:0903545c0460 | 96 | low = l; |
anmar | 0:0903545c0460 | 97 | high = h; |
anmar | 0:0903545c0460 | 98 | |
anmar | 0:0903545c0460 | 99 | |
anmar | 0:0903545c0460 | 100 | char color[20]; |
anmar | 0:0903545c0460 | 101 | uint8_t detected; |
anmar | 0:0903545c0460 | 102 | |
anmar | 0:0903545c0460 | 103 | term->printf(" %2.1f, ", d_PTAT); |
anmar | 0:0903545c0460 | 104 | |
anmar | 0:0903545c0460 | 105 | detected = 0; |
anmar | 0:0903545c0460 | 106 | for ( int x = 0; x < 16; x++ ) |
anmar | 0:0903545c0460 | 107 | { |
anmar | 0:0903545c0460 | 108 | if ( dt[x] > mean + 0.5 ) |
anmar | 0:0903545c0460 | 109 | { |
anmar | 0:0903545c0460 | 110 | strcpy(color, "\033[31m"); |
anmar | 0:0903545c0460 | 111 | detected = 1; |
anmar | 0:0903545c0460 | 112 | } |
anmar | 0:0903545c0460 | 113 | else |
anmar | 0:0903545c0460 | 114 | strcpy(color, ""); |
anmar | 0:0903545c0460 | 115 | term->printf("%s%2.1f\033[37m,", color, dt[x]); |
anmar | 0:0903545c0460 | 116 | } |
anmar | 0:0903545c0460 | 117 | |
anmar | 0:0903545c0460 | 118 | term->printf(",%d" ,tPEC); |
anmar | 0:0903545c0460 | 119 | term->printf(", %2.1f - %2.1f [%2.1f]\r\n", low, high, mean); |
anmar | 0:0903545c0460 | 120 | |
anmar | 0:0903545c0460 | 121 | if ( detected ) |
anmar | 0:0903545c0460 | 122 | { |
anmar | 0:0903545c0460 | 123 | led2 = 1; |
anmar | 0:0903545c0460 | 124 | led3 = 1; |
anmar | 0:0903545c0460 | 125 | led4 = 1; |
anmar | 0:0903545c0460 | 126 | } |
anmar | 0:0903545c0460 | 127 | else |
anmar | 0:0903545c0460 | 128 | { |
anmar | 0:0903545c0460 | 129 | led2 = 0; |
anmar | 0:0903545c0460 | 130 | led3 = 0; |
anmar | 0:0903545c0460 | 131 | led4 = 0; |
anmar | 0:0903545c0460 | 132 | } |
anmar | 0:0903545c0460 | 133 | |
anmar | 0:0903545c0460 | 134 | |
anmar | 0:0903545c0460 | 135 | |
anmar | 0:0903545c0460 | 136 | /*term->printf(" %d, %d,%d,%d,%d,%d,%d,%d,%d ,%d,%d,%d,%d,%d,%d,%d,%d ,%d\n" , |
anmar | 0:0903545c0460 | 137 | tPTAT,tP[0],tP[1],tP[2],tP[3],tP[4],tP[5],tP[6],tP[7] |
anmar | 0:0903545c0460 | 138 | ,tP[8],tP[9],tP[10],tP[11],tP[12],tP[13],tP[14],tP[15],tPEC); */ |
anmar | 0:0903545c0460 | 139 | |
anmar | 0:0903545c0460 | 140 | } |
anmar | 0:0903545c0460 | 141 | |
anmar | 0:0903545c0460 | 142 | |
anmar | 0:0903545c0460 | 143 | uint8_t Thermal::calc_crc( uint8_t data ) |
anmar | 0:0903545c0460 | 144 | { |
anmar | 0:0903545c0460 | 145 | int index; |
anmar | 0:0903545c0460 | 146 | unsigned char temp; |
anmar | 0:0903545c0460 | 147 | |
anmar | 0:0903545c0460 | 148 | for( index = 0; index < 8; index++ ) |
anmar | 0:0903545c0460 | 149 | { |
anmar | 0:0903545c0460 | 150 | temp = data; |
anmar | 0:0903545c0460 | 151 | data <<= 1; |
anmar | 0:0903545c0460 | 152 | if ( temp & 0x80 ) |
anmar | 0:0903545c0460 | 153 | data ^= 0x07; |
anmar | 0:0903545c0460 | 154 | } |
anmar | 0:0903545c0460 | 155 | return data; |
anmar | 0:0903545c0460 | 156 | } |
anmar | 0:0903545c0460 | 157 | |
anmar | 0:0903545c0460 | 158 | int Thermal::D6T_checkPEC( uint8_t readbuff[] , int pPEC ) |
anmar | 0:0903545c0460 | 159 | { |
anmar | 0:0903545c0460 | 160 | uint8_t crc; |
anmar | 0:0903545c0460 | 161 | int i; |
anmar | 0:0903545c0460 | 162 | |
anmar | 0:0903545c0460 | 163 | crc = calc_crc( 0x14 ); |
anmar | 0:0903545c0460 | 164 | crc = calc_crc( 0x4C ^ crc ); |
anmar | 0:0903545c0460 | 165 | crc = calc_crc( 0x15 ^ crc ); |
anmar | 0:0903545c0460 | 166 | for( i = 0; i < pPEC; i++ ) |
anmar | 0:0903545c0460 | 167 | { |
anmar | 0:0903545c0460 | 168 | crc = calc_crc( readbuff[i] ^ crc ); |
anmar | 0:0903545c0460 | 169 | } |
anmar | 0:0903545c0460 | 170 | return (crc == readbuff[pPEC]); |
anmar | 0:0903545c0460 | 171 | } |