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 */