跳到主要内容

整合打包代码

通过前面的分析,我们可以整合出如下 DHT11 完整的 One—Wire 通信代码:

#define TIMEOUT 1e5
#define DHT11_OKAY 0x00
#define DHT11_ERROR 0x01

uint8_t humidity;
float temperature;
uint8_t sensorPin = 2;

void getLowTime();
void getHighTime();
void updateData();

void setup() {
Serial.begin(115200);
}

void loop() {
switch (updataData()) {
case DHT11_ERROR:
Serial.println("DHT11 ERROR!");
break;
case DHT11_OKAY:
Serial.print("DHT11 Okay,humidity is ");
Serial.print(humidity);
Serial.print(", temperature is ");
Serial.println(temperature);
break;
}
delay(3000);
}

uint32_t getLowTime() {
uint32_t lastTime = micros();
while (!digitalRead(sensorPin)) {
if (micros() - lastTime > TIMEOUT) {
break;
}
}
return (micros() - lastTime);
}

uint32_t getHighTime() {
uint32_t lastTime = micros();
while (digitalRead(sensorPin)) {
if (micros() - lastTime > TIMEOUT) {
break;
}
}
return (micros() - lastTime);
}

bool updataData() {
/*MCU发送开始信号, 并等待应答*/
pinMode(sensorPin, OUTPUT);
//拉低18ms
digitalWrite(sensorPin, LOW);
delay(18);
//拉高40us
digitalWrite(sensorPin, HIGH);
delayMicroseconds(40);

/*接受DHT11做出的应答*/
pinMode(sensorPin, INPUT_PULLUP);
getLowTime();
getHighTime();

/*开始接受40bit数据*/
uint8_t buffer[5] = {0};
for (uint8_t i = 0; i < 5; i++) {
for (uint8_t j = 0; j < 8; j++) {
getLowTime();
if (getHighTime() > 50)
buffer[i] |= (0x80 >> j);
}
}

/*结束通信*/
getLowTime();

/*检查校验和*/
if (buffer[0] + buffer[1] + buffer[2] + buffer[3] != buffer[4])
return DHT11_ERROR;

/*更新数据*/
humidity = buffer[0];
temperature = buffer[2] + buffer[3] * 0.1;
return DHT11_OKAY;
}