1 /*
2 * Copyright (C) 2015-2021 Alibaba Group Holding Limited
3 */
4
5 /**********************************CHT8305编程说明***************************************/
6 // CHT8305兼容I2C/SMBus通讯协议,操作简单,读取温湿度数据分三步操作:
7 // 1)主机向从机地址(有4种可选)发送读0x00寄存器指令,此操作将启动温湿度转换;
8 // [指令结构:start+address(ack)+Reg(ack/unack)+stop]
9 // 2)等待转换完成(15ms);
10 // 3)主机读取从机数据————00:16bit温度数据;01:16bit湿度数据。两个寄存器数据可以一次性读取。
11 // [指令结构:start+address(ack)+T高8位(ack)+T低8位(ack)+H高8位(ack)+H低8位(ack)+stop]
12 // 特别提醒:1)VCC上电时序要先于或等于I2C上电时序
13 // 2)从波形上看,每个bit的SDA上升沿和下降沿应充分包裹SCL的上升沿和下降沿
14 // 3) 建议CHT8305独享一个I2C总线,否则需要保证总线上每个star都对应一个stop;
15 // 4) 采用外部电阻上拉时,MCU的IO口应配置成开漏模式;
16 /****************************************************************************************/
17
18 #include "drv_temp_humi_sensylink_cht8305.h"
19 #include "aos/kernel.h"
20 #include "ulog/ulog.h"
21 #include <math.h>
22 #include <stdlib.h>
23
24 #define CHT8305_I2C_PORT 1
25 #define CHT8305_ADDRESS 0x40
26
cht8305_init(void)27 void cht8305_init(void)
28 {
29 int32_t ret = sensor_i2c_open(CHT8305_I2C_PORT, CHT8305_ADDRESS, I2C_BUS_BIT_RATES_400K, 0);
30 if (ret) {
31 printf("sensor i2c open failed, ret:%d\n", ret);
32 return;
33 }
34
35 }
36 // get temp and humidity
cht8305_getTempHumidity(float * humidity,float * temperature)37 void cht8305_getTempHumidity(float *humidity, float *temperature)
38 {
39 char reg = 0;
40 uint8_t buf[4] = {0};
41 unsigned int cht8305_temp = 0;
42 unsigned int cht8305_humi = 0;
43
44 sensor_i2c_master_send(CHT8305_I2C_PORT, CHT8305_ADDRESS, ®, 1, 1000);
45 aos_msleep(30);
46 sensor_i2c_master_recv(CHT8305_I2C_PORT, CHT8305_ADDRESS, buf, 4, 1000);
47 // printf("%d-%d-%d-%d\n",buf[0],buf[1],buf[2],buf[3]);
48
49 cht8305_temp = (buf[0] << 8) + buf[1];
50 if (cht8305_temp & 0xFFFC) {
51 // *temperature = (175.72f * (float)value) / 65536.0f - 46.85f;
52 *temperature = (165.0f * (float)cht8305_temp) / 65536.0f - 40.0f;
53 LOGD("SENDOR", "temperature: %2f\n", *temperature);
54 } else {
55 LOGE("SENDOR", "Error on temp\n");
56 return 1;
57 }
58
59 cht8305_humi = (buf[2] << 8) + buf[3];
60 if (cht8305_humi & 0xFFFE) {
61 // *humidity = (((float)cht8305_humi) / 65535.0f);
62 *humidity = ((125.0f * (float)cht8305_humi) / 65535.0f) - 6.0f;
63 LOGD("SENDOR", "humidity: %f\n", *humidity);
64 } else {
65 LOGE("SENDOR", "Error on humidity\n");
66 return 1;
67 }
68 }
69
cht8305_deinit(void)70 void cht8305_deinit(void)
71 {
72 int32_t ret = sensor_i2c_close(CHT8305_I2C_PORT);
73 if (ret) {
74 LOGE("SENSOR", "sensor i2c close failed, ret:%d\n", ret);
75 }
76
77 return;
78 }
79