| 12
 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
 
 | extern "C" int readValue(int pin) {
 
    if (!bcm2835_init())
        return -1;
    int data[100];
    int counter = 0;
    int laststate = HIGH;
    int j = 0;
    int state=0;
    bcm2835_gpio_fsel(pin, BCM2835_GPIO_FSEL_OUTP);
    bcm2835_gpio_write(pin, HIGH);
    usleep(500000); // 500 ms
    bcm2835_gpio_write(pin, LOW);
    usleep(20000);
    bcm2835_gpio_fsel(pin, BCM2835_GPIO_FSEL_INPT);
    data[0] = data[1] = data[2] = data[3] = data[4] = 0;
    temp = hygro = 0;
    while (bcm2835_gpio_lev(pin) == 1) {
        usleep(1);
    }
    for (int i = 0; i < MAXTIMINGS; i++) {
        counter = 0;
        while (bcm2835_gpio_lev(pin) == laststate) {
            counter++;
            if (counter == 1000)
                break;
        }
        laststate = bcm2835_gpio_lev(pin);
        if (counter == 1000) break;
        if ((i > 3) && (i % 2 == 0)) {
            data[j / 8] <<= 1;
            if (counter > 200)
                data[j / 8] |= 1;
            j++;
        }
    }
    if ((j >= 39) &&
            (data[4] == ((data[0] + data[1] + data[2] + data[3]) & 0xFF))) {
        float f, h;
        h = data[0] * 256 + data[1];
        h /= 10;
        f = (data[2] & 0x7F)* 256 + data[3];
        f /= 10.0;
        if (data[2] & 0x80) f *= -1;
        temp = f;
        hygro = h;
        state =1;
    } else {
        temp = -1;
        hygro = -1;
        state =-1;
    }
    return state;
} |