X
首页
技术
模拟电子
单片机
半导体
电源管理
嵌入式
传感器
最能打国产芯
应用
汽车电子
工业控制
家用电子
手机便携
安防电子
医疗电子
网络通信
测试测量
物联网
最能打国产芯
大学堂
首页
直播
专题
TI 培训
论坛
汽车电子
国产芯片
电机驱动控制
电源技术
单片机
模拟电子
PCB设计
电子竞赛
DIY/开源
嵌入式系统
医疗电子
颁奖专区
【厂商专区】
【电子技术】
【创意与实践】
【行业应用】
【休息一下】
最能打国产芯
活动中心
直播
发现活动
颁奖区
电子头条
参考设计
下载中心
分类资源
文集
排行榜
电路图
Datasheet
最能打国产芯
DigiKey得捷技术专区
[经验分享] 【2024 DigiKey 创意大赛】开发板读取D6T传感器值、LVGL显示
pomin
2024-10-31 23:37
楼主
为了把 D6T 传感器连接到开发板,先查看原理图,开发板有一些预留的 IO 接口,但是大多数都不能随意使用
然后查看原理图可以知道 IO47 和 IO48 这两个引脚是作为了 IIC 使用,外接的是屏幕板的电容触摸芯片 FT5406,在代码中也可以看到:
然后查了查文档,FT5406 的 IIC 七位地址是 0x38,而 D6T 的 IIC 七位地址是 0x0A,所以可以把这两个器件都接在 IO47、IO48,然后把 D6T 模块接在开发板的 IO47、IO48上面,代码如下 ```c /* * SPDX-FileCopyrightText: 2023 Espressif Systems (Shanghai) CO LTD * * SPDX-License-Identifier: CC0-1.0 */ #include "core/lv_disp.h" #include "freertos/FreeRTOS.h" #include "freertos/task.h" #include "esp_log.h" #include "esp_check.h" #include "nvs_flash.h" #include "nvs.h" #include "bsp_board_extra.h" #include "bsp/esp-bsp.h" #include
#include
#include "driver/i2c.h" static char *TAG = "app_main"; #define LOG_MEM_INFO (0) /* defines */ #define D6T_ADDR 0x0A// for I2C 7bit address #define D6T_CMD 0x4C // for D6T-44L-06/06H, D6T-8L-09/09H, for D6T-1A-01/02 #define N_ROW 1 #define N_PIXEL 1 #define N_READ ((N_PIXEL + 1) * 2 + 1) uint8_t rbuf[N_READ]; double ptat; double pix_data[N_PIXEL]; uint8_t calc_crc(uint8_t data) { int index; uint8_t temp; for (index = 0; index < 8; index++) { temp = data; data <<= 1; if (temp & 0x80) { data ^= 0x07; } } return data; } /** D6T PEC(Packet Error Check) calculation. * calculate the data sequence, * from an I2C Read client address (8bit) to thermal data end. */ bool D6T_checkPEC(uint8_t buf[], int n) { int i; uint8_t crc = calc_crc((D6T_ADDR << 1) | 1);// I2C Read address (8bit) for (i = 0; i < n; i++) { crc = calc_crc(buf
^ crc); } bool ret = crc != buf[n]; if (ret) { printf("PEC check failed:"); } return ret; } /** convert a 16bit data from the byte stream. */ int16_t conv8us_s16_le(uint8_t* buf, int n) { uint16_t ret; ret = (uint16_t)buf[n]; ret += ((uint16_t)buf[n + 1]) << 8; return (int16_t)ret; // and convert negative. } void d6t_1a_01_read(void) { int i = 0; int16_t itemp = 0; uint8_t txbuf[16]; memset(rbuf, 0, N_READ); txbuf[0] = D6T_CMD; i2c_master_write_read_device(CONFIG_BSP_I2C_NUM, D6T_ADDR, txbuf, 1, rbuf, N_READ, 100 / portTICK_PERIOD_MS); //Convert to temperature data (degC) ptat = (double)conv8us_s16_le(rbuf, 0) / 10.0; for (i = 0; i < N_PIXEL; i++) { itemp = conv8us_s16_le(rbuf, 2 + 2 * i); pix_data
= (double)itemp / 10.0; } //Output results printf("PTAT: %f", ptat); printf(" [degC], Temperature: "); for (i = 0; i < N_PIXEL; i++) { printf("%f , ", pix_data
); } printf(" [degC]\r\n"); } void app_main(void) { ESP_LOGI(TAG, "Compile time: %s %s", __DATE__, __TIME__); bsp_i2c_init(); while (1) { d6t_1a_01_read(); vTaskDelay(pdMS_TO_TICKS(5000)); } } ``` 然后使用 idf 烧录到开发板,并打开串口监控 ``` idf.py flash -p /dev/ttyUSB0 -b 460800 && idf.py monitor -p /dev/ttyUSB0 -b 115200 ```
可以看到已经成功读取到了 D6T 传感器的温度值了,然后把这个数据用 LVGL 来显示,在 idf.py menuconfig 中配置好 LVGL 后编写代码 ```c /* * SPDX-FileCopyrightText: 2023 Espressif Systems (Shanghai) CO LTD * * SPDX-License-Identifier: CC0-1.0 */ #include "core/lv_disp.h" #include "freertos/FreeRTOS.h" #include "freertos/task.h" #include "esp_log.h" #include "esp_check.h" #include "nvs_flash.h" #include "nvs.h" #include "bsp_board_extra.h" #include "bsp/esp-bsp.h" #include "lv_example_pub.h" #include "lv_demos.h" #include
#include
#include "driver/i2c.h" #include "widgets/lv_label.h" static char *TAG = "app_main"; #define LOG_MEM_INFO (0) /* defines */ #define D6T_ADDR 0x0A// for I2C 7bit address #define D6T_CMD 0x4C // for D6T-44L-06/06H, D6T-8L-09/09H, for D6T-1A-01/02 #define N_ROW 1 #define N_PIXEL 1 #define N_READ ((N_PIXEL + 1) * 2 + 1) uint8_t rbuf[N_READ]; double ptat; double pix_data[N_PIXEL]; uint8_t calc_crc(uint8_t data) { int index; uint8_t temp; for (index = 0; index < 8; index++) { temp = data; data <<= 1; if (temp & 0x80) { data ^= 0x07; } } return data; } /** D6T PEC(Packet Error Check) calculation. * calculate the data sequence, * from an I2C Read client address (8bit) to thermal data end. */ bool D6T_checkPEC(uint8_t buf[], int n) { int i; uint8_t crc = calc_crc((D6T_ADDR << 1) | 1);// I2C Read address (8bit) for (i = 0; i < n; i++) { crc = calc_crc(buf
^ crc); } bool ret = crc != buf[n]; if (ret) { printf("PEC check failed:"); } return ret; } /** convert a 16bit data from the byte stream. */ int16_t conv8us_s16_le(uint8_t* buf, int n) { uint16_t ret; ret = (uint16_t)buf[n]; ret += ((uint16_t)buf[n + 1]) << 8; return (int16_t)ret; // and convert negative. } void d6t_1a_01_read(void) { int i = 0; int16_t itemp = 0; uint8_t txbuf[16]; memset(rbuf, 0, N_READ); txbuf[0] = D6T_CMD; i2c_master_write_read_device(CONFIG_BSP_I2C_NUM, D6T_ADDR, txbuf, 1, rbuf, N_READ, 100 / portTICK_PERIOD_MS); //Convert to temperature data (degC) ptat = (double)conv8us_s16_le(rbuf, 0) / 10.0; for (i = 0; i < N_PIXEL; i++) { itemp = conv8us_s16_le(rbuf, 2 + 2 * i); pix_data
= (double)itemp / 10.0; } //Output results printf("PTAT: %f", ptat); printf(" [degC], Temperature: "); for (i = 0; i < N_PIXEL; i++) { printf("%f , ", pix_data
); } printf(" [degC]\r\n"); } void app_main(void) { ESP_LOGI(TAG, "Compile time: %s %s", __DATE__, __TIME__); /* Initialize NVS. */ esp_err_t err = nvs_flash_init(); if (err == ESP_ERR_NVS_NO_FREE_PAGES || err == ESP_ERR_NVS_NEW_VERSION_FOUND) { ESP_ERROR_CHECK(nvs_flash_erase()); err = nvs_flash_init(); } ESP_ERROR_CHECK(err); bsp_spiffs_mount(); bsp_i2c_init(); bsp_extra_codec_init(); bsp_extra_player_init(BSP_SPIFFS_MOUNT_POINT"/mp3"); bsp_display_start(); bsp_display_lock(0); lv_style_pre_init(); lv_obj_t *label = lv_label_create(lv_scr_act()); // lv_create_home(&main_Layer); // lv_demo_benchmark(); // lv_create_clock(&clock_screen_layer, TIME_ENTER_CLOCK_2MIN); bsp_display_unlock(); while (1) { lv_label_set_text_fmt(label, "PTAT: %.2f [degC], Temperature: %.2f ,[degC]", ptat, pix_data[0]); lv_obj_set_style_text_font(label, &lv_font_montserrat_16, LV_PART_MAIN|LV_STATE_DEFAULT); d6t_1a_01_read(); vTaskDelay(pdMS_TO_TICKS(5000)); } } ``` 然后就可以在屏幕上用 LVGL 显示数据了
点赞
回复评论
暂无评论,赶紧抢沙发吧
最新活动
有奖直播报名中!抢占工业4.1先机 文晔科技日等你来!
2024 瑞萨电子MCU/MPU工业技术研讨会——深圳、上海站, 火热报名中
罗姆有奖直播 | 重点解析双极型晶体管的实用选型方法和使用方法
STM32N6终于要发布了,ST首款带有NPU的MCU到底怎么样,欢迎小伙们来STM32全球线上峰会寻找答案!
免费下载 | 安森美电动汽车充电白皮书,看碳化硅如何缓解“里程焦虑”!
是德科技有奖直播 | 应对未来高速算力芯片的设计与测试挑战
随便看看
请问大家 mobile中 怎么接收html数据包的内容?非常感谢,急急急!!!
基于FSK调制的无线传输(1)
电气\电子元件
【N32L43x评测】3、利用串口接收中断和空闲中断,实现不定长数据接收
帮忙计算一个宏的值
四个8x8LED点阵屏焊成一个16X16屏的电路接线法
非晶、纳米晶软磁合金磁 芯 介 绍
LDO输入、输出加磁珠或电感
数字图像及数字音频处理的开发平台
2401数字源表的“闪光点”
EEWORLD大学堂----了解功率密度的基本技术
付费500求CC1101驱动指导
RedMonk的2020年6月最流行的20种编程语言
[求助]430day上的赠品:430f2274,TA_2程序调试时候,等待晶振稳定始终不行
winxp的默认分辨率能否在驱动中改?
avr单片机的操作系统的详细资料 英文的
【转】PCB各层作用详解
服务器安全维护技巧
电子鼻传感器
放大电路基础
电子工程世界版权所有
京B2-20211791
京ICP备10001474号-1
京公网安备 11010802033920号
回复
写回复
收藏
回复