adding tmp102 sensor for the econotag from Hedde Bosman.
This can be pulling in as a common driver if we can make a generic i2c Contiki driver.
This commit is contained in:
parent
485d6716e0
commit
697af5ef08
3 changed files with 132 additions and 1 deletions
|
@ -4,7 +4,7 @@ CONTIKI_TARGET_DIRS = . dev apps net
|
||||||
CONTIKI_CORE=contiki-mc1322x-main
|
CONTIKI_CORE=contiki-mc1322x-main
|
||||||
CONTIKI_TARGET_MAIN = ${CONTIKI_CORE}.o
|
CONTIKI_TARGET_MAIN = ${CONTIKI_CORE}.o
|
||||||
|
|
||||||
CONTIKI_TARGET_SOURCEFILES += contiki-mc1322x-main.c clock.c button-sensor.c sensors.c slip.c light-sensor.c
|
CONTIKI_TARGET_SOURCEFILES += contiki-mc1322x-main.c clock.c button-sensor.c sensors.c slip.c light-sensor.c tmp102-sensor.c
|
||||||
|
|
||||||
CONTIKIMC1322X=$(CONTIKI)/cpu/mc1322x
|
CONTIKIMC1322X=$(CONTIKI)/cpu/mc1322x
|
||||||
CONTIKIBOARD=.
|
CONTIKIBOARD=.
|
||||||
|
|
87
platform/redbee-econotag/dev/tmp102-sensor.c
Normal file
87
platform/redbee-econotag/dev/tmp102-sensor.c
Normal file
|
@ -0,0 +1,87 @@
|
||||||
|
/*
|
||||||
|
* An interface to the TI TMP102 temperature sensor
|
||||||
|
* 12 bit temperature reading, 0.5 deg. Celsius accuracy
|
||||||
|
* -----------------------------------------------------------------
|
||||||
|
*
|
||||||
|
* Author : Hedde Bosman (heddebosman@incas3.eu)
|
||||||
|
*/
|
||||||
|
|
||||||
|
#include "contiki.h"
|
||||||
|
#include "lib/sensors.h"
|
||||||
|
#include "dev/tmp102-sensor.h"
|
||||||
|
|
||||||
|
#ifndef bool
|
||||||
|
#define bool uint8_t
|
||||||
|
#endif
|
||||||
|
|
||||||
|
#ifndef false
|
||||||
|
#define false 0
|
||||||
|
#endif
|
||||||
|
|
||||||
|
#ifndef true
|
||||||
|
#define true 1
|
||||||
|
#endif
|
||||||
|
|
||||||
|
|
||||||
|
static void set_configuration(uint8_t rate, bool precision) {
|
||||||
|
uint8_t tx_buf[] = {TMP102_REGISTER_CONFIGURATION,
|
||||||
|
0,
|
||||||
|
(precision ? TMP102_CONF_EXTENDED_MODE : 0) | ((rate << 6) & TMP102_CONF_CONVERSION_RATE)
|
||||||
|
};
|
||||||
|
|
||||||
|
i2c_transmitinit(TMP102_ADDR, 3, tx_buf);
|
||||||
|
}
|
||||||
|
|
||||||
|
/*---------------------------------------------------------------------------*/
|
||||||
|
static int value(int type) {
|
||||||
|
uint8_t reg = TMP102_REGISTER_TEMPERATURE;
|
||||||
|
uint8_t temp[2];
|
||||||
|
int16_t temperature = 0;
|
||||||
|
|
||||||
|
/* transmit the register to start reading from */
|
||||||
|
i2c_transmitinit(TMP102_ADDR, 1, ®);
|
||||||
|
while (!i2c_transferred()); // wait for data to arrive
|
||||||
|
|
||||||
|
/* receive the data */
|
||||||
|
i2c_receiveinit(TMP102_ADDR, 2, temp);
|
||||||
|
while (!i2c_transferred()); // wait for data to arrive
|
||||||
|
|
||||||
|
// 12 bit normal mode
|
||||||
|
temperature = ((temp[0] <<8) | (temp[1])) >> 4; // lsb
|
||||||
|
|
||||||
|
// 13 bit extended mode
|
||||||
|
//temperature = ((temp[0] <<8) | (temp[1])) >> 3; // lsb
|
||||||
|
|
||||||
|
temperature = (100*temperature)/16; // in 100th of degrees
|
||||||
|
|
||||||
|
return temperature;
|
||||||
|
}
|
||||||
|
/*---------------------------------------------------------------------------*/
|
||||||
|
static int status(int type) {
|
||||||
|
switch (type) {
|
||||||
|
case SENSORS_ACTIVE:
|
||||||
|
case SENSORS_READY:
|
||||||
|
return 1; // fix?
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
/*---------------------------------------------------------------------------*/
|
||||||
|
static int configure(int type, int c) {
|
||||||
|
switch (type) {
|
||||||
|
case SENSORS_ACTIVE:
|
||||||
|
if (c) {
|
||||||
|
// set active
|
||||||
|
set_configuration(1, false); // every 1 second, 12bit precision
|
||||||
|
} else {
|
||||||
|
// set inactive
|
||||||
|
}
|
||||||
|
return 1;
|
||||||
|
}
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
/*---------------------------------------------------------------------------*/
|
||||||
|
SENSORS_SENSOR(tmp102_sensor, "Temperature", value, configure, status); // register the functions
|
||||||
|
|
44
platform/redbee-econotag/dev/tmp102-sensor.h
Normal file
44
platform/redbee-econotag/dev/tmp102-sensor.h
Normal file
|
@ -0,0 +1,44 @@
|
||||||
|
/*
|
||||||
|
* An interface to the TI TMP102 temperature sensor
|
||||||
|
* 12 bit temperature reading, 0.5 deg. Celsius accuracy
|
||||||
|
* -----------------------------------------------------------------
|
||||||
|
*
|
||||||
|
* Author : Hedde Bosman (heddebosman@incas3.eu)
|
||||||
|
*/
|
||||||
|
|
||||||
|
#ifndef __TMP102_SENSOR_H__
|
||||||
|
#define __TMP102_SENSOR_H__
|
||||||
|
|
||||||
|
#include "i2c.h"
|
||||||
|
|
||||||
|
#include "lib/sensors.h"
|
||||||
|
|
||||||
|
extern const struct sensors_sensor tmp102_sensor;
|
||||||
|
|
||||||
|
#define TMP102_VALUE_TYPE_DEFAULT 0
|
||||||
|
|
||||||
|
#define TMP102_ADDR 0x48 // if A0 @ ground
|
||||||
|
//#define TMP102_ADDR 0x49 // if A0 @ V+
|
||||||
|
//#define TMP102_ADDR 0x4A // if A0 @ SDA
|
||||||
|
//#define TMP102_ADDR 0x4B // if A0 @ SCL
|
||||||
|
|
||||||
|
#define TMP102_REGISTER_TEMPERATURE 0x00
|
||||||
|
#define TMP102_REGISTER_CONFIGURATION 0x01
|
||||||
|
#define TMP102_REGISTERO_T_LOW 0x02
|
||||||
|
#define TMP102_REGISTERO_T_HIGH 0x03
|
||||||
|
|
||||||
|
|
||||||
|
#define TMP102_CONF_EXTENDED_MODE 0x10
|
||||||
|
#define TMP102_CONF_ALERT 0x20
|
||||||
|
#define TMP102_CONF_CONVERSION_RATE 0xC0 // 2 bits indicating conversion rate (0.25, 1, 4, 8 Hz)
|
||||||
|
|
||||||
|
#define TMP102_CONF_SHUTDOWN_MODE 0x01
|
||||||
|
#define TMP102_CONF_THERMOSTAT_MODE 0x02 // 0 = comparator mode, 1 = interrupt mode
|
||||||
|
#define TMP102_CONF_POLARITY 0x04
|
||||||
|
#define TMP102_CONF_FAULT_QUEUE 0x18 // 2 bits indicating number of faults
|
||||||
|
#define TMP102_CONF_RESOLUTION 0x60 // 2 bits indicating resolution, default = b11 = 0x60
|
||||||
|
#define TMP102_CONF_ONESHOT_READY 0x80 //
|
||||||
|
|
||||||
|
|
||||||
|
#endif
|
||||||
|
|
Loading…
Reference in a new issue