summaryrefslogtreecommitdiff
path: root/platformio/temphum/src/temphum.cpp
blob: 164f01ea84c8a02aa207abf6225b9860343a8668 (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
#ifndef CONFIG_TARGET_ESP01
#include <Arduino.h>
#endif
#include <homekit/logging.h>
#include "temphum.h"

namespace homekit::temphum {

void BaseSensor::setup() const {
#ifndef CONFIG_TARGET_ESP01
    pinMode(CONFIG_SDA_GPIO, OUTPUT);
    pinMode(CONFIG_SCL_GPIO, OUTPUT);

    Wire.begin(CONFIG_SDA_GPIO, CONFIG_SCL_GPIO);
#else
    Wire.begin();
#endif
}

void BaseSensor::writeCommand(int reg) const {
    Wire.beginTransmission(dev_addr);
    Wire.write(reg);
    Wire.endTransmission();
    delay(500); // wait for the measurement to be ready
}

SensorData Si7021::read() {
    writeCommand(0xf3); // command to measure temperature
    Wire.requestFrom(dev_addr, 2);
    uint16_t temp_raw = Wire.read() << 8 | Wire.read();
    double temperature = ((175.72 * temp_raw) / 65536.0) - 46.85;

    writeCommand(0xf5); // command to measure humidity
    Wire.requestFrom(dev_addr, 2);
    uint16_t hum_raw = Wire.read() << 8 | Wire.read();
    double humidity = ((125.0 * hum_raw) / 65536.0) - 6.0;

    return {
            .temp = temperature,
            .rh = humidity
    };
}

SensorData DHT12::read() {
    SensorData sd;
    byte raw[5];

    writeCommand(0);
    Wire.requestFrom(dev_addr, 5);

    if (Wire.available() < 5) {
        PRINTLN("DHT12: could not read 5 bytes");
        goto end;
    }

    // Parse the received data
    for (uint8_t i = 0; i < 5; i++)
        raw[i] = Wire.read();

    if (((raw[0] + raw[1] + raw[2] + raw[3]) & 0xff) != raw[4]) {
        PRINTLN("DHT12: checksum error");
        goto end;
    }

    // Calculate temperature and humidity values
    sd.temp = raw[2] + (raw[3] & 0x7f) * 0.1;
    if (raw[3] & 0x80)
        sd.temp *= -1;

    sd.rh = raw[0] + raw[1] * 0.1;

end:
    return sd;
}

}