TMP006/温度センサー

PSocとTIの超小型温度センサーTMP006を使用して温度を計測してみます。

このセンサーは通常の気温を測るものとは違い、物体から輻射されている熱線を非接触で測定する事ができます。

調理中の材料やガラスケース内のものなどに触れずに温度を測れるので衛生的だし便利です。

センサの前にいる人が輻射する体温も測れるので、通常のPIRセンサーだと人が動いていないと

すぐに検出できなくなってしまいますが、このセンサーなら持続的な人の検出が可能です。

購入:ストロベリーリナックス

https://strawberry-linux.com/catalog/items?code=12006

ピンアサイン:

コード:

TMP006 read

/* ========================================

*

* Copyright YOUR COMPANY, THE YEAR

* All Rights Reserved

* UNPUBLISHED, LICENSED SOFTWARE.

*

* CONFIDENTIAL AND PROPRIETARY INFORMATION

* WHICH IS THE PROPERTY OF your company.

*

* ========================================

*/

#include "project.h"

volatile uint32 gTick = 0;

CY_ISR(SysTick_Handler)

{

gTick++;

}

#include <stdbool.h>

#include <math.h>

#define bool _Bool

#define true 1

#define false 0

#define min(a, b) ((a) < (b) ? (a) : (b))

void I2CDev_initialize(void);

void I2CDev_cleanup(void);

bool I2CDev_readByte(uint8_t devAddr, uint8_t regAddr, uint8_t *data);

bool I2CDev_readBytes(uint8_t devAddr, uint8_t regAddr, uint8_t *data, uint8_t length);

int8_t I2CDev_readWords(uint8_t devAddr, uint8_t regAddr, uint8_t length, uint16_t *data);

int8_t I2CDev_readWord(uint8_t devAddr, uint8_t regAddr, uint16_t *data, uint16_t timeout);

int8_t I2CDev_readBit(uint8_t devAddr, uint8_t regAddr, uint8_t bitNum, uint8_t *data, uint16_t timeout);

int8_t I2CDev_readBitW(uint8_t devAddr, uint8_t regAddr, uint8_t bitNum, uint16_t *data, uint16_t timeout);

int8_t I2CDev_readBits(uint8_t devAddr, uint8_t regAddr, uint8_t bitStart, uint8_t length, uint8_t *data, uint16_t timeout);

int8_t I2CDev_readBitsW(uint8_t devAddr, uint8_t regAddr, uint8_t bitStart, uint8_t length, uint16_t *data, uint16_t timeout);

bool I2CDev_writeCommand(uint8_t devAddr, uint8_t command);

bool I2CDev_writeByte(uint8_t devAddr, uint8_t regAddr, uint8_t data);

bool I2CDev_writeBytes(uint8_t devAddr, uint8_t regAddr, uint8_t *data, uint8_t length);

bool I2CDev_writeWords(uint8_t devAddr, uint8_t regAddr, uint8_t length, uint16_t* data);

bool I2CDev_writeWord(uint8_t devAddr, uint8_t regAddr, uint16_t data);

bool I2CDev_writeBit(uint8_t devAddr, uint8_t regAddr, uint8_t bitNum, uint8_t data);

bool I2CDev_writeBitW(uint8_t devAddr, uint8_t regAddr, uint8_t bitNum, uint16_t data);

bool I2CDev_writeBits(uint8_t devAddr, uint8_t regAddr, uint8_t bitStart, uint8_t length, uint8_t data);

bool I2CDev_writeBitsW(uint8_t devAddr, uint8_t regAddr, uint8_t bitStart, uint8_t length, uint16_t data);

static uint8_t I2CDev_devAddr;

void I2CDev_initialize(void)

{

I2C_1_Start();

}

void I2CDev_cleanup(void)

{

I2C_1_Stop();

}

bool I2CDev_readByte(uint8_t devAddr, uint8_t regAddr, uint8_t *data)

{

I2C_1_MasterSendStart(devAddr, I2C_1_WRITE_XFER_MODE);

I2C_1_MasterWriteByte(regAddr);

I2C_1_MasterSendRestart(devAddr, I2C_1_READ_XFER_MODE);

*data = I2C_1_MasterReadByte(I2C_1_ACK_DATA);

I2C_1_MasterSendStop();

return true;

}

bool I2CDev_readBytes(uint8_t devAddr, uint8_t regAddr, uint8_t *data, uint8_t length)

{

uint8_t i=0;

I2C_1_MasterSendStart(devAddr, I2C_1_WRITE_XFER_MODE);

I2C_1_MasterWriteByte(regAddr);

I2C_1_MasterSendRestart(devAddr, I2C_1_READ_XFER_MODE);

while (i++ < (length-1)) {

*data++ = I2C_1_MasterReadByte(I2C_1_ACK_DATA);

}

*data = I2C_1_MasterReadByte(I2C_1_NAK_DATA);

I2C_1_MasterSendStop();

return true;

}

int8_t I2CDev_readWords(uint8_t devAddr, uint8_t regAddr, uint8_t length, uint16_t *data)

{

int8_t count;

for (uint8_t k = 0; k < length * 2; k += length * 2) {

I2C_1_MasterSendStart(devAddr, I2C_1_WRITE_XFER_MODE);

I2C_1_MasterWriteByte(regAddr);

I2C_1_MasterSendRestart(devAddr, I2C_1_READ_XFER_MODE);

bool msb = true; // starts with MSB, then LSB

for (count = 0; count < length;) {

if (msb) {

// first byte is bits 15-8 (MSb=15)

data[count] = I2C_1_MasterReadByte(I2C_1_ACK_DATA) << 8;

} else {

// second byte is bits 7-0 (LSb=0)

data[count] |= I2C_1_MasterReadByte(I2C_1_ACK_DATA);

count++;

}

msb = !msb;

}

}

I2C_1_MasterSendStop();

return count;

}

int8_t I2CDev_readWord(uint8_t devAddr, uint8_t regAddr, uint16_t *data, uint16_t timeout)

{

return I2CDev_readWords(devAddr, regAddr, 1, data);

}

int8_t I2CDev_readBit(uint8_t devAddr, uint8_t regAddr, uint8_t bitNum, uint8_t *data, uint16_t timeout)

{

uint8_t b;

uint8_t count = I2CDev_readByte(devAddr, regAddr, &b);

*data = b & (1 << bitNum);

return count;

}

int8_t I2CDev_readBitW(uint8_t devAddr, uint8_t regAddr, uint8_t bitNum, uint16_t *data, uint16_t timeout)

{

uint16_t b;

uint8_t count = I2CDev_readWord(devAddr, regAddr, &b, timeout);

*data = b & (1 << bitNum);

return count;

}

int8_t I2CDev_readBits(uint8_t devAddr, uint8_t regAddr, uint8_t bitStart, uint8_t length, uint8_t *data, uint16_t timeout)

{

// 01101001 read byte

// 76543210 bit numbers

// xxx args: bitStart=4, length=3

// 010 masked

// -> 010 shifted

uint8_t count, b;

if ((count = I2CDev_readByte(devAddr, regAddr, &b)) != 0) {

uint8_t mask = ((1 << length) - 1) << (bitStart - length + 1);

b &= mask;

b >>= (bitStart - length + 1);

*data = b;

}

return count;

}

int8_t I2CDev_readBitsW(uint8_t devAddr, uint8_t regAddr, uint8_t bitStart, uint8_t length, uint16_t *data, uint16_t timeout)

{

// 1101011001101001 read byte

// fedcba9876543210 bit numbers

// xxx args: bitStart=12, length=3

// 010 masked

// -> 010 shifted

uint8_t count;

uint16_t w;

if ((count = I2CDev_readWord(devAddr, regAddr, &w, timeout)) != 0) {

uint16_t mask = ((1 << length) - 1) << (bitStart - length + 1);

w &= mask;

w >>= (bitStart - length + 1);

*data = w;

}

return count;

}

bool I2CDev_writeCommand(uint8_t devAddr, uint8_t command)

{

I2C_1_MasterSendStart(devAddr, I2C_1_WRITE_XFER_MODE);

I2C_1_MasterWriteByte(command);

I2C_1_MasterSendStop();

return true;

}

bool I2CDev_writeByte(uint8_t devAddr, uint8_t regAddr, uint8_t data)

{

I2C_1_MasterSendStart(devAddr, I2C_1_WRITE_XFER_MODE);

I2C_1_MasterWriteByte(regAddr);

I2C_1_MasterWriteByte(data);

I2C_1_MasterSendStop();

return true;

}

bool I2CDev_writeBytes(uint8_t devAddr, uint8_t regAddr, uint8_t *data, uint8_t length)

{

uint8_t i;

I2C_1_MasterSendStart(devAddr, I2C_1_WRITE_XFER_MODE);

I2C_1_MasterWriteByte(regAddr);

for (i = 0; i < length; i++)

{

I2C_1_MasterWriteByte(*(data+i));

}

I2C_1_MasterSendStop();

return true;

}

bool I2CDev_writeWords(uint8_t devAddr, uint8_t regAddr, uint8_t length, uint16_t* data)

{

I2C_1_MasterSendStart(devAddr, I2C_1_WRITE_XFER_MODE);

I2C_1_MasterWriteByte(regAddr);

for (uint8_t i = 0; i < length * 2; i++) {

I2C_1_MasterWriteByte((uint8_t)((data[i] >> 8) & 0xFF));

I2C_1_MasterWriteByte( (uint8_t)(data[i++] & 0xFF));

}

I2C_1_MasterSendStop();

return true;

}

bool I2CDev_writeWord(uint8_t devAddr, uint8_t regAddr, uint16_t data)

{

return I2CDev_writeWords(devAddr, regAddr, 1, &data);

}

bool I2CDev_writeBit(uint8_t devAddr, uint8_t regAddr, uint8_t bitNum, uint8_t data)

{

uint8_t b;

I2CDev_readByte(devAddr, regAddr, &b);

b = (data != 0) ? (b | (1 << bitNum)) : (b & ~(1 << bitNum));

return I2CDev_writeByte(devAddr, regAddr, b);

}

bool I2CDev_writeBitW(uint8_t devAddr, uint8_t regAddr, uint8_t bitNum, uint16_t data)

{

uint16_t w;

I2CDev_readWord(devAddr, regAddr, &w, 0);

w = (data != 0) ? (w | (1 << bitNum)) : (w & ~(1 << bitNum));

return I2CDev_writeWord(devAddr, regAddr, w);

}

bool I2CDev_writeBits(uint8_t devAddr, uint8_t regAddr, uint8_t bitStart, uint8_t length, uint8_t data)

{

// 010 value to write

// 76543210 bit numbers

// xxx args: bitStart=4, length=3

// 00011100 mask byte

// 10101111 original value (sample)

// 10100011 original & ~mask

// 10101011 masked | value

uint8_t b;

if (I2CDev_readByte(devAddr, regAddr, &b) != 0) {

uint8_t mask = ((1 << length) - 1) << (bitStart - length + 1);

data <<= (bitStart - length + 1); // shift data into correct position

data &= mask; // zero all non-important bits in data

b &= ~(mask); // zero all important bits in existing byte

b |= data; // combine data with existing byte

return I2CDev_writeByte(devAddr, regAddr, b);

} else {

return false;

}

}

bool I2CDev_writeBitsW(uint8_t devAddr, uint8_t regAddr, uint8_t bitStart, uint8_t length, uint16_t data)

{

// 010 value to write

// fedcba9876543210 bit numbers

// xxx args: bitStart=12, length=3

// 0001110000000000 mask word

// 1010111110010110 original value (sample)

// 1010001110010110 original & ~mask

// 1010101110010110 masked | value

uint16_t w;

if (I2CDev_readWord(devAddr, regAddr, &w, 0) != 0) {

uint16_t mask = ((1 << length) - 1) << (bitStart - length + 1);

data <<= (bitStart - length + 1); // shift data into correct position

data &= mask; // zero all non-important bits in data

w &= ~(mask); // zero all important bits in existing word

w |= data; // combine data with existing word

return I2CDev_writeWord(devAddr, regAddr, w);

} else {

return false;

}

}

uint16_t w_temperature;

float f_temperature;

#define TMP006_ADDRESS 0x40 // 100 0000

#define TMP006_EXISTS

int main(void)

{

CyIntSetSysVector(15,(cyisraddress)SysTick_Handler);

SysTick_Config(BCLK__BUS_CLK__HZ/1000);

CyGlobalIntEnable; /* Enable global interrupts. */

I2C_1_Start();

PWM_1_Start();

for(;;)

{

#ifdef TMP006_EXISTS

I2CDev_readWord(TMP006_ADDRESS, 0x01, &w_temperature, 0);

int temperature_flag;

temperature_flag = 0;

if (w_temperature & 0x8000)

{

temperature_flag = 1; // minus

}

f_temperature = (float)(w_temperature >> 2);

if (temperature_flag) {

f_temperature *= -1.0;

}

f_temperature *= 0.0315;

#endif

}

}

/* [] END OF FILE */