Skip to content

Instantly share code, notes, and snippets.

@senhorinha
Created June 27, 2016 18:12
Show Gist options
  • Save senhorinha/e0053abc6a58ab688ebb224ff38a9501 to your computer and use it in GitHub Desktop.
Save senhorinha/e0053abc6a58ab688ebb224ff38a9501 to your computer and use it in GitHub Desktop.
Temperature and humidity sensor
#include <machine.h>
#include <alarm.h>
#include <utility/ostream.h>
#include <i2c.h>
#include <gpio.h>
#include <cpu.h>
#include <machine/cortex_m/emote3_gptm.h>
using namespace EPOS;
OStream cout;
class TemperatureAndHumiditySensor
{
private:
//Addresses
enum {
I2C_ADDR = 0x40, // The 7-bit base slave address is 0x40
RH_HOLD = 0xE5, // Measure Relative Humidity, Hold Master Mode
RH_NOHOLD = 0xF5, // Measure Relative Humidity, No Hold Master Mode
TEMP_HOLD = 0xE3, // Measure Temperature, Hold Master Mode
TEMP_NOHOLD = 0xF3, // Measure Temperature, No Hold Master Mode
TEMP_PREV = 0xE0, // Read Temperature Value from Previous RH Measurement
RESET_SI = 0xFE, // Reset
WREG = 0xE6, // Write RH/T User Register 1
RREG = 0xE7, // Read RH/T User Register 1
WHCR = 0x51, // Write Heater Control Register
RHCR = 0x11, // Read Heater Control Register
};
//Resolution
enum {
RH_12b_TEMP_14b = 0x0, ///< 12 bits for RH, 14 bits for Temp
RH_8b_TEMP_12b = 0x1, ///< 8 bits for RH, 12 bits for Temp
RH_10b_TEMP_13b = 0x2, ///< 10 bits for RH, 13 bits for Temp
RH_11b_TEMP_11b = 0x3, ///< 11 bits for RH, 11 bits for Temp
};
public:
TemperatureAndHumiditySensor() {
_i2c = new I2C(0, 'b', 1, 'b', 0); //master, SDA = PB1, SCL = PB0
}
int reset(void) {
if (_i2c->put(I2C_ADDR, RESET_SI) != 0) {
return -1;
}
return 0;
}
int getHumidity() {
char received_data[5] = "0000";
int umidade = 0;
if (_i2c->put(I2C_ADDR, RH_HOLD) != 0) {
return -1;
}
_i2c->get(I2C_ADDR, received_data, 2);
umidade = (received_data[0] << 8 ) | received_data[1];
umidade = 125 * umidade;
umidade /= 65536;
umidade -= 6;
return umidade;
}
int getTemperature() {
char received_data[5] = "0000";
int temperature = 0;
if (_i2c->put(I2C_ADDR, TEMP_HOLD) != 0) {
return -1;
}
_i2c->get(I2C_ADDR, received_data, 2);
temperature = (received_data[0] << 8) | received_data[1];
temperature = 175 * temperature;
temperature /= 65536;
temperature -= 46;
temperature -= 5;
return temperature;
}
private:
I2C * _i2c;
};
int main()
{
TemperatureAndHumiditySensor si;
cout << "I2C Test\n";
GPIO g('c',3, GPIO::OUTPUT);
char received_data[5] = "0000";
int temperature= 0, umidade=0;
//i2c = new I2C(0, 'b', 1, 'b', 0); //master, SDA = PB1, SCL = PB0
while(1)
{
g.set(1);
eMote3_GPTM::delay(1000000);
g.set(0);
eMote3_GPTM::delay(1000000);
umidade = si.getHumidity();
cout << "umidade()= " << umidade<< endl;
temperature = si.getTemperature();
cout << "getTemperature()= " << temperature<< endl;
}
return 0;
}
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment