当前位置: 首页 > news >正文

温湿度传感器(学习笔记上)

在学习这个项目之前,我们先了解一下传感器,查阅资料可知,电路板上温湿度传感器型号是GXHTC3,是北京中科银河芯科技有限公司研发的一款芯片,采用I2C接口与ESP32-C3通信,I2C地址是0x70。

接下来我们要进行编写i2c驱动程序,首先我们复制esp-idf-v5.1.3\examples\get-started\sample_project这个工程到我们的之前所创的实验文件夹底下,然后把这个文件夹的名称修改为humi_temp,humi是湿度的前4个首字母,temp是温度的前4个首字母

接着在VScode中打开我们将要进行学习的项目,打开humi_temp文件夹

我们可以先打开humi_temp工程目录下的CMakeList.txt文件,修改工程的名称为humi_temp(也就是project后面括号里的,咱们第一节在例程学习中说到过),然后保存关闭此文件

(1)接下来要进行正式的操作了,右击main,选择新建文件,写入文件名称,分别命名为myi2c.c、myi2c.h、gxhtc3.c和gxhtc3.h

(2)接着打开main下的CMakeList.txt文件,可以看到gxhtc3.c和myi2c.c文件已经被添加到路径里面了,如果没有的话,咱们可以自己手动添加一下哈

(3)根据视频教程,我们需要给myi2c.h和gxhtc3.h文件的最开始处分别加入代码#pragma once,这是一条预处理指令,告诉编译器这个头文件只可以编译一次

(4)在myi2c.c文件的最开始,添加头文件myi2c.h;在gxhtc3.c文件的最开始,添加头文件gxhtc3.h;在main.c文件的最开始,添加头文件myi2c.h和gxhtc3.h

(5)我们复制i2c_simple工程下i2c_simple_main.c文件中的60~79行代码到humi_temp工程下myi2c.c文件


static esp_err_t i2c_master_init(void)
{int i2c_master_port = I2C_MASTER_NUM;i2c_config_t conf = {.mode = I2C_MODE_MASTER,.sda_io_num = I2C_MASTER_SDA_IO,.scl_io_num = I2C_MASTER_SCL_IO,.sda_pullup_en = GPIO_PULLUP_ENABLE,.scl_pullup_en = GPIO_PULLUP_ENABLE,.master.clk_speed = I2C_MASTER_FREQ_HZ,};i2c_param_config(i2c_master_port, &conf);return i2c_driver_install(i2c_master_port, conf.mode, I2C_MASTER_RX_BUF_DISABLE, I2C_MASTER_TX_BUF_DISABLE, 0);
}

上述代码是咱们复制的之前的代码,随后会进行修改,莫慌莫慌,通过资料与老师的讲解,我们可以知道这个函数用于初始化I2C接口为主机模式,ESP32为I2C主机,温湿度传感器为I2C从机。因为这个函数会被其它文件调用,所以需要把static关键字去掉

我们看课程视频了解,这里面用到了几个宏定义,复制i2c_simple_main.c文件中第25~31行代码,放到myi2c.h文件中,我把这几个宏定义放到下面(相当于没有修改的),接下来会说到修正的

#define I2C_MASTER_SCL_IO           CONFIG_I2C_MASTER_SCL  //定义SCL和SDA的引脚需要    
#define I2C_MASTER_SDA_IO           CONFIG_I2C_MASTER_SDA      
#define I2C_MASTER_NUM              0                     //定义I2C的序号,ESP32-C3芯片内部只有一个I2C外设,这里定义成0就可以了    
#define I2C_MASTER_FREQ_HZ          400000     //定义I2C通信速率               
#define I2C_MASTER_TX_BUF_DISABLE   0          //定义发送缓存和接收缓存大小,主机模式下,这两个值设置为0,从机模式下才需要用到这个值                
#define I2C_MASTER_RX_BUF_DISABLE   0                         
#define I2C_MASTER_TIMEOUT_MS       1000

修正过后的宏定义如下,

#define I2C_MASTER_SCL_IO           GPIO_NUM_1      
#define I2C_MASTER_SDA_IO           GPIO_NUM_0     
#define I2C_MASTER_NUM              0               
#define I2C_MASTER_FREQ_HZ          400000         
#define I2C_MASTER_TX_BUF_DISABLE   0               
#define I2C_MASTER_RX_BUF_DISABLE   0             
#define I2C_MASTER_TIMEOUT_MS       1000

上面的代码使我们修正过后的宏定义,依据条件是,第1、2行代码定义SCL和SDA的引脚需要,我们需要按照开发板原理图修改;第3行定义I2C的序号,ESP32-C3芯片内部只有一个I2C外设,这里定义成0就可以了;第4行定义I2C通信速率,一般情况下,I2C器件的通信速率有3种,100k、400k、1M,速度越大,通信越快,I2C传感器芯片手册上会提到支持的最大速率,温湿度传感器GXHTC3的I2C通信速率可以达到1M,这里写的是400k,不需要修改;第5、6行定义发送缓存和接收缓存大小,主机模式下,这两个值设置为0,从机模式下才需要用到这个值

接着,我们在myi2c.h文件中,声明一下刚才在myi2c.c文件中定义的函数,放到define宏定义的下面

extern esp_err_t i2c_master_init(void);

由于这里用到了esp_err_t,所以需要在前面包含esp_err.h文件

#include "esp_err.h"

接着,我们打开myi2c.c文件,这个文件中用到了i2c函数,需要在文件中添加头文件i2c.h,不然无法正常运行,(我的理解为调用这个头文件里的函数)

#include "driver/i2c.h"

到这一步,我们的基本代码就已经全部修改完了,这是完整的代码,

#include "myi2c.h"
#include "driver/i2c.h"esp_err_t i2c_master_init(void)
{int i2c_master_port = I2C_MASTER_NUM;i2c_config_t conf = {.mode = I2C_MODE_MASTER,.sda_io_num = I2C_MASTER_SDA_IO,.scl_io_num = I2C_MASTER_SCL_IO,.sda_pullup_en = GPIO_PULLUP_ENABLE,.scl_pullup_en = GPIO_PULLUP_ENABLE,.master.clk_speed = I2C_MASTER_FREQ_HZ,};i2c_param_config(i2c_master_port, &conf);return i2c_driver_install(i2c_master_port, conf.mode, I2C_MASTER_RX_BUF_DISABLE, I2C_MASTER_TX_BUF_DISABLE, 0);
}

跟随老师的步伐,我们接下来在app_main函数中,调用i2c_master_init初始化函数,复制i2c_simple_main.c文件中第85~86行代码,放到main.c文件中的app_main函数中,如下代码所示

void app_main(void)
{ESP_ERROR_CHECK(i2c_master_init()); //调用初始化函数,并且检测是否初始化成功ESP_LOGI(TAG, "I2C initialized successfully"); //相当于是一个printf函数,第1个参数TAG是一个字符串指针变量,到时候会输出到串口,这个TAG需要在前面定义
}

紧接着,复制i2c_simple_main.c文件中第23行代码,放到include代码下面

static const char *TAG = "i2c-simple-example";

然后我们把TAG的内容改成main,以后在终端窗口看到main,就表示这个输出来自于main.c文件,改完后如下所示

static const char *TAG = "main";

接下来我们给main.c添加头文件,文件中用到了ESP_ERROR_CHECK和ESP_LOGI,需要添加esp_log.h头文件

#include "esp_log.h"

到这步,main的主要函数就是如下

#include <stdio.h>
#include "myi2c.h"
#include "gxhtc3.h"
#include "esp_log.h"static const char *TAG = "main";void app_main(void)
{ESP_ERROR_CHECK(i2c_master_init());ESP_LOGI(TAG, "I2C initialized successfully");
}

到这里呢,我们的温湿传感器上半部分结束,下半部分我将继续学习,主播学的有点头大!

http://www.lryc.cn/news/470244.html

相关文章:

  • sv标准研读第十九章-功能覆盖率
  • 图集短视频去水印云函数开发实践——小红书
  • Uni-App-03
  • 解决 VScode 每次打开都是上次打开的文件问题
  • redis高级篇之skiplist跳表 第164节答疑
  • Java 线程池:深入理解与高效应用
  • week08 zookeeper多种安装与pandas数据变换操作-new
  • js构造函数和原型对象,ES6中的class,四种继承方式
  • 电脑连接海康相机并在PictureBox和HWindowControl中分别显示。
  • 直播系统源码技术搭建部署流程及配置步骤
  • Spring+ActiveMQ
  • Linux 常用命令总汇
  • fmql之Linux RTC
  • Flask-SocketIO 简单示例
  • Vue 3 的组件式开发(2)
  • python 爬虫 入门 四、线程,进程,协程
  • cloak斗篷伪装下的独立站
  • 【Nas】X-DOC:在Mac OS X 中使用 WOL 命令唤醒局域网内 PVE 主机
  • u盘装win10系统提示“windows无法安装到这个磁盘,选中的磁盘采用GPT分区形式”解决方法
  • Linux系统之dc计算器工具的基本使用
  • 使用Python计算相对强弱指数(RSI)进阶
  • vue 解决:npm ERR! code ERESOLVE 及 npm ERR! ERESOLVE could not resolve 的方案
  • Android 原生开发与Harmony原生开发浅析
  • VIVO售后真好:屏幕绿线,4年免费换屏
  • 数据类型【MySQL】
  • 流媒体协议.之(RTP,RTCP,RTSP,RTMP,HTTP)(二)
  • 在 Kakarot ZkEVM 上使用 Starknet Scaffold 构建应用
  • DBeave如何连接达梦数据库,设置达梦驱动,真酷
  • 2024年全球 MoonBit 编程创新赛-零基础早鸟教程-使用wasm4八小时开发井子棋小游戏
  • 机器学习4