void dht11_update(void) { int flag = 1; unsigned char dat1, dat2, dat3, dat4, dat5, ck; //主机拉低18ms COM_CLR; DelaymS(18); //COM_IN; COM_SET; flag = 0; while (COM_R && ++flag); if (flag == 0) return; //总线由上拉电阻拉高 主机延时20us //主机设为输入 判断从机响应信号 //判断从机是否有低电平响应信号 如不响应则跳出,响应则向下运行 flag = 0; while (!COM_R && ++flag); if (flag == 0) return; flag = 0; while (COM_R && ++flag); if (flag == 0) return; dat1 = dht11_read_byte(); dat2 = dht11_read_byte(); dat3 = dht11_read_byte(); dat4 = dht11_read_byte(); dat5 = dht11_read_byte(); ck = dat1 + dat2 + dat3 + dat4; if (ck == dat5) { sTemp = dat3; sHumidity = dat1; } #if 1 // printf("%02x, %02x, %02x, %02x %02x\r\n", // dat1, dat2, dat3, dat4, dat5); printf("湿度: %u%% 温度: %u℃ \r\n", dat1, dat3); gdat1=dat1; gdat2=dat3; #endif }
int JSON_RPC(read)(jsmn_node_t* pjn, fp_json_delegate_ack ack, void* ctx) //继承于fp_json_delegate_start { int ret = STATE_OK; char* err_msg = NULL; LOG_INFO("DELEGATE dht11.read.\r\n"); /* { "method":"dht11.read", "params":{} } */ //----温度高8位== U8T_data_H------ //----温度低8位== U8T_data_L------ //----湿度高8位== U8RH_data_H----- //----湿度低8位== U8RH_data_L----- //----校验 8位 == U8checkdata----- u8_t temp_h, temp_l, humi_h, humi_l, chk; if(STATE_OK != (ret = dht11_start()) || STATE_OK != (ret = dht11_read_byte(&humi_h))|| STATE_OK != (ret = dht11_read_byte(&humi_l))|| STATE_OK != (ret = dht11_read_byte(&temp_h))|| STATE_OK != (ret = dht11_read_byte(&temp_l))|| STATE_OK != (ret = dht11_read_byte(&chk))) {} dht11_stop(); if(STATE_OK != ret){ err_msg = "read time out."; LOG_WARN("dht11:%s %d.\r\n", err_msg, ret); goto exit_err; } if(chk != temp_h+temp_l+humi_h+humi_l){ ret = STATE_ERROR; err_msg = "checksum err."; LOG_WARN("dht11:%s.\r\n", err_msg); goto exit_err; } if(ack){ char json[128]; u32_t n = 0; n += _snprintf(json+n, sizeof(json)-n, "{\"result\":{\"temperature\":%u.%u,\"humidity\":%u.%u}}",temp_h, temp_l, humi_h, humi_l); jsmn_node_t jn = {json, n, NULL}; ack(&jn, ctx); //这里对json请求 回应json } return ret; //exit_safe: if(ack) jsmn.delegate_ack_result(ack, ctx, ret); return ret; exit_err: if(ack) jsmn.delegate_ack_err(ack, ctx, ret, err_msg); return ret; }