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@0:cee46eec60a8, 2020-02-25 (annotated)
- 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?
User | Revision | Line number | New 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 | } |