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 Mar 03 14:28:12 2020 +0100
Revision:
2:1ff2f041925a
Parent:
1:82fcfd05add8
blocker for rise and fall functions

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 2:1ff2f041925a 18 _first_run = true; // blocker for "rise"
Pawel Zarembski 2:1ff2f041925a 19 _started = false; // blocker for "fall"
Pawel Zarembski 0:cee46eec60a8 20 _timer1.reset();
Pawel Zarembski 0:cee46eec60a8 21 _timer2.reset();
Pawel Zarembski 0:cee46eec60a8 22 _pwm_pin.rise(callback(this, &TMP06::on_rise));
Pawel Zarembski 0:cee46eec60a8 23 _pwm_pin.fall(callback(this, &TMP06::on_fall));
Pawel Zarembski 0:cee46eec60a8 24 _pwm_pin.enable_irq();
Pawel Zarembski 0:cee46eec60a8 25
Pawel Zarembski 2:1ff2f041925a 26 // 250 - period of sensor should be around 100,
Pawel Zarembski 0:cee46eec60a8 27 // more would means there is some kind of issue
Pawel Zarembski 0:cee46eec60a8 28 if (_semaphore.try_acquire_for(SEM_TIMEOUT_MS)) {
Pawel Zarembski 0:cee46eec60a8 29 // based on TMP05/TMP06 datasheet rev. C
Pawel Zarembski 0:cee46eec60a8 30 *temperature = (421 - 751 * ((float)_timer1.read_us() / (float)_timer2.read_us()));
Pawel Zarembski 0:cee46eec60a8 31 return SUCCESS;
Pawel Zarembski 0:cee46eec60a8 32 }
Pawel Zarembski 0:cee46eec60a8 33 else {
Pawel Zarembski 0:cee46eec60a8 34 return FAILURE;
Pawel Zarembski 0:cee46eec60a8 35 }
Pawel Zarembski 0:cee46eec60a8 36 }
Pawel Zarembski 0:cee46eec60a8 37
Pawel Zarembski 0:cee46eec60a8 38 void TMP06::on_rise()
Pawel Zarembski 0:cee46eec60a8 39 {
Pawel Zarembski 0:cee46eec60a8 40 if (_first_run) {
Pawel Zarembski 0:cee46eec60a8 41 _timer1.start();
Pawel Zarembski 0:cee46eec60a8 42 _first_run = false;
Pawel Zarembski 2:1ff2f041925a 43 _started = true;
Pawel Zarembski 0:cee46eec60a8 44 }
Pawel Zarembski 0:cee46eec60a8 45 else {
Pawel Zarembski 0:cee46eec60a8 46 _timer2.stop();
Pawel Zarembski 0:cee46eec60a8 47 _semaphore.release();
Pawel Zarembski 0:cee46eec60a8 48 _pwm_pin.disable_irq();
Pawel Zarembski 0:cee46eec60a8 49 }
Pawel Zarembski 0:cee46eec60a8 50 }
Pawel Zarembski 0:cee46eec60a8 51
Pawel Zarembski 0:cee46eec60a8 52 void TMP06::on_fall()
Pawel Zarembski 0:cee46eec60a8 53 {
Pawel Zarembski 2:1ff2f041925a 54 if (_started) {
Pawel Zarembski 2:1ff2f041925a 55 _timer1.stop();
Pawel Zarembski 2:1ff2f041925a 56 _timer2.start();
Pawel Zarembski 2:1ff2f041925a 57 _started = false;
Pawel Zarembski 2:1ff2f041925a 58 }
Pawel Zarembski 0:cee46eec60a8 59 }