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); } }
TMP06.cpp@2:1ff2f041925a, 2020-03-03 (annotated)
- 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?
User | Revision | Line number | New 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 | } |