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:36:34 2020 +0100
Revision:
1:82fcfd05add8
Parent:
0:cee46eec60a8
Child:
2:1ff2f041925a
update license

Who changed what in which revision?

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