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
| 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;
} |