<p><iframe name="ifd" src="https://mnifdv.cn/resource/cnblogs/ML307A_OPEN" frameborder="0" scrolling="auto" width="100%" height="1500"></iframe></p>
<iframe frameborder="0" height="1500" name="ifd" scrolling="auto" src="https://mnifdv.cn/resource/cnblogs/ML307A_OPEN" width="100%"></iframe>
测试
1,把文件拷贝到自己工程的 custom_main\src\ 路径下
这里还有串口的配置,用于串口打印,建议也拷贝过去,如果自己已经有自己的串口打印,则不需要拷贝
2,设置下.h文件和.c文件引用
#追加 .h文件路径 (custom/custom_main/src) INC += -I'$(CUSTOM_MAIN_DIR)/src' #追加源文件(.c文件) OC_FILES += $(CUSTOM_MAIN_DIR)/src/uart.c OC_FILES += $(CUSTOM_MAIN_DIR)/src/sht3x.c
3,连接上传感器
例程是使用I2C0
4,调用测试程序
#include "cm_sys.h" #include "cm_os.h" #include "cm_mem.h" #include "stdio.h" #include "stdlib.h" #include "stdarg.h" #include <string.h> #include "uart.h" #include "sht3x.h" /********************************************uart0**************************************************/ uartStruct uart0={0};//定义串口结构体变量 void uartRecvData(uint32_t flags, char *data, int len) { uartSendData(&uart0, data, len);//把接收的数据返回 } /********************************************Sht30**************************************************/ osThreadId_t osThreadIdSht30;//用于记录任务的句柄(ID码),可以用来停止任务 static void osThreadIdSht30Fun(void *param) { cm_i2c_cfg_t config = { CM_I2C_ADDR_TYPE_7BIT, CM_I2C_MODE_MASTER, CM_I2C_CLK_100KHZ }; int32_t ret=0; sht3x_init(&sht3x, SHT3X_DEV_ADDR); char print_buff[100]; int len=0; while (1) { //启动i2c if (cm_i2c_open(SHT3X_I2C_ID, &config)!=0) { cm_log_printf(0,"i2c init err, ret = %d\n", ret); osDelay(1000/5);//延时 cm_i2c_close(SHT3X_I2C_ID); osDelay(20/5);//延时 } else { cm_log_printf(0,"i2c init ok\n"); // 启动传感器 osDelay(20/5);//延时 ret = sht3x_begin(&sht3x); if (ret != 0) { cm_log_printf(0,"SHT3x begin failed\n"); osDelay(1000/5);//延时 cm_i2c_close(SHT3X_I2C_ID); osDelay(20/5);//延时 } else { osDelay(20);//延时 while (1) { ret = sht3x_measure(&sht3x);// 读取传感器数据 if (ret != 0) { cm_log_printf(0,"Failed to read from SHT3x\n"); break; } else { //打印温湿度数据 len = snprintf(print_buff, sizeof(print_buff), "Temperature: %.2f C, Humidity: %.2f %%\n", sht3x.temperature, sht3x.humidity); uartSendData(&uart0, print_buff, len);//串口发送可以改成自己的 cm_log_printf(0,"Temperature: %.2f C, Humidity: %.2f %%\n", sht3x.temperature, sht3x.humidity); } osDelay(100); //延时读取一次数据 } } } } } //相当于程序的main函数 int cm_opencpu_entry(char * param) { //配置串口 uart0.uartId = 0;//配置串口号 uart0.uartRecvCb = uartRecvData;//设置接收数据函数 uart0.config.baudrate = 115200;//波特率 uart0.config.byte_size = CM_UART_BYTE_SIZE_8;//数据位数 uart0.config.flow_ctrl = CM_UART_FLOW_CTRL_NONE;//硬件流控 uart0.config.parity = CM_UART_PARITY_NONE;//奇偶校验 uart0.config.stop_bit = CM_UART_STOP_BIT_ONE;//停止位 uart0.config.is_lpuart = 0;//若要配置为低功耗模式可改为1 if (uart_init(&uart0) !=0)//初始化串口 { return -1; } //配置任务sht30 osThreadAttr_t app_task_attr = {0}; app_task_attr.name = "osThreadIdSht30";//任务名字-随意 app_task_attr.stack_size = 4096 * 2;//任务使用栈大小-写这个就可以 app_task_attr.priority = osPriorityNormal;//任务优先级-普通优先级 //返回任务句柄 任务函数 给任务函数的参数 任务配置 osThreadIdSht30 = osThreadNew((osThreadFunc_t)osThreadIdSht30Fun, NULL, &app_task_attr); return 0; }
4,编译下载,然后使用串口调试助手查看
可以只连接串口模块的GND 和 RX(只接收数据)
5,如果测试有问题,可以使用日志口打印,查看问题
.
标签:OpenCPU,i2c,cm,ML307A,温湿度,sht3x,uart0,串口,include From: https://www.cnblogs.com/yangfengwu/p/18404477