Driver for TMP06 temperature sensor. Data is sent by PWM. Tested on Hani-IoT board with TMP06BRTZ sensor.

Example usage

main.cpp

#include "mbed.h"
#include "TMP06.h"

int main()
{
    TMP06 temp_sensor(P0_1);
    float temperature;

    while (true) {
        if(temp_sensor.read(&temperature) == SUCCESS) {
            printf("Temperature: %f\n", temperature);
        }
        else {
            printf("Error!\n");
        }

        ThisThread::sleep_for(2000);
    }
}
Committer:
Pawel Zarembski
Date:
Tue Feb 25 11:30:44 2020 +0100
Revision:
0:cee46eec60a8
Child:
1:82fcfd05add8
populate repo

Who changed what in which revision?

UserRevisionLine numberNew contents of line
Pawel Zarembski 0:cee46eec60a8 1 #include "TMP06.h"
Pawel Zarembski 0:cee46eec60a8 2
Pawel Zarembski 0:cee46eec60a8 3 TMP06::TMP06(PinName pin) : _pwm_pin(pin), _semaphore(0, 1)
Pawel Zarembski 0:cee46eec60a8 4 {
Pawel Zarembski 0:cee46eec60a8 5
Pawel Zarembski 0:cee46eec60a8 6 }
Pawel Zarembski 0:cee46eec60a8 7
Pawel Zarembski 0:cee46eec60a8 8 TMP06::~TMP06()
Pawel Zarembski 0:cee46eec60a8 9 {
Pawel Zarembski 0:cee46eec60a8 10
Pawel Zarembski 0:cee46eec60a8 11 }
Pawel Zarembski 0:cee46eec60a8 12
Pawel Zarembski 0:cee46eec60a8 13 int TMP06::read(float *temperature)
Pawel Zarembski 0:cee46eec60a8 14 {
Pawel Zarembski 0:cee46eec60a8 15 _pwm_pin.disable_irq();
Pawel Zarembski 0:cee46eec60a8 16 _first_run = true;
Pawel Zarembski 0:cee46eec60a8 17 _timer1.reset();
Pawel Zarembski 0:cee46eec60a8 18 _timer2.reset();
Pawel Zarembski 0:cee46eec60a8 19 _pwm_pin.rise(callback(this, &TMP06::on_rise));
Pawel Zarembski 0:cee46eec60a8 20 _pwm_pin.fall(callback(this, &TMP06::on_fall));
Pawel Zarembski 0:cee46eec60a8 21 _pwm_pin.enable_irq();
Pawel Zarembski 0:cee46eec60a8 22
Pawel Zarembski 0:cee46eec60a8 23 // 200 - period of sensor should be around 100,
Pawel Zarembski 0:cee46eec60a8 24 // more would means there is some kind of issue
Pawel Zarembski 0:cee46eec60a8 25 if (_semaphore.try_acquire_for(SEM_TIMEOUT_MS)) {
Pawel Zarembski 0:cee46eec60a8 26 // based on TMP05/TMP06 datasheet rev. C
Pawel Zarembski 0:cee46eec60a8 27 *temperature = (421 - 751 * ((float)_timer1.read_us() / (float)_timer2.read_us()));
Pawel Zarembski 0:cee46eec60a8 28 return SUCCESS;
Pawel Zarembski 0:cee46eec60a8 29 }
Pawel Zarembski 0:cee46eec60a8 30 else {
Pawel Zarembski 0:cee46eec60a8 31 return FAILURE;
Pawel Zarembski 0:cee46eec60a8 32 }
Pawel Zarembski 0:cee46eec60a8 33 }
Pawel Zarembski 0:cee46eec60a8 34
Pawel Zarembski 0:cee46eec60a8 35 void TMP06::on_rise()
Pawel Zarembski 0:cee46eec60a8 36 {
Pawel Zarembski 0:cee46eec60a8 37 if (_first_run) {
Pawel Zarembski 0:cee46eec60a8 38 _timer1.start();
Pawel Zarembski 0:cee46eec60a8 39 _first_run = false;
Pawel Zarembski 0:cee46eec60a8 40 }
Pawel Zarembski 0:cee46eec60a8 41 else {
Pawel Zarembski 0:cee46eec60a8 42 _timer2.stop();
Pawel Zarembski 0:cee46eec60a8 43 _semaphore.release();
Pawel Zarembski 0:cee46eec60a8 44 _pwm_pin.disable_irq();
Pawel Zarembski 0:cee46eec60a8 45 }
Pawel Zarembski 0:cee46eec60a8 46 }
Pawel Zarembski 0:cee46eec60a8 47
Pawel Zarembski 0:cee46eec60a8 48 void TMP06::on_fall()
Pawel Zarembski 0:cee46eec60a8 49 {
Pawel Zarembski 0:cee46eec60a8 50 _timer1.stop();
Pawel Zarembski 0:cee46eec60a8 51 _timer2.start();
Pawel Zarembski 0:cee46eec60a8 52 }