otp538u: some fixes to get working on the Arduino 101 with Firmata

There are some issues using this device on the 101 with Firmata:

1. You cannot use any other ADC resolution than 1024.  By default the
driver would try to set 12b resolution for improved accuracy.  Doing
this on the 101 yielded nonsensical readings causing the driver to
fail.  Using 10b resolution will yield less accuracy, but at least the
driver will function.

2. After the first ADC read, and for some time period after, the MRAA
aio_read() calls will always return 0.  This would cause an exception
to be thrown by the driver since this is an invalid reading.  Now, we
do an analog read on each channel and sleep for .5 seconds in the ctor
to get around this problem.  It is a hack and should be properly fixed
somewhere else (firmata?  MRAA?).

Some code was reworked/renamed to make it more clear what is actually
going on.  In addition a setDebug() method was added to enable some
debugging output.

Signed-off-by: Jon Trulson <jtrulson@ics.com>
This commit is contained in:
Jon Trulson
2016-08-16 11:07:56 -06:00
parent 19d1af6a48
commit dc93fb11ff
3 changed files with 135 additions and 31 deletions

View File

@ -25,6 +25,7 @@
#include <unistd.h>
#include <iostream>
#include <iomanip>
#include <stdexcept>
#include <signal.h>
#include "otp538u.hpp"
@ -52,14 +53,24 @@ int main()
// Object temperature.
upm::OTP538U *temps = new upm::OTP538U(0, 1, OTP538U_AREF);
// enable debugging if you would like
// temps->setDebug(true);
// Output ambient and object temperatures
while (shouldRun)
{
cout << "Ambient temp: " << std::fixed << setprecision(2)
<< temps->ambientTemperature()
<< " C, Object temp: " << temps->objectTemperature()
<< " C" << endl;
try {
cout << "Ambient temp: " << std::fixed << setprecision(2)
<< temps->ambientTemperature()
<< " C, Object temp: " << temps->objectTemperature()
<< " C" << endl;
}
catch (std::out_of_range& e) {
cerr << "Temperature(s) are out of range: " << e.what()
<< endl;
}
cout << endl;
sleep(1);
}
//! [Interesting]