温湿度传感器(学习笔记上)
在学习这个项目之前,我们先了解一下传感器,查阅资料可知,电路板上温湿度传感器型号是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");
}
到这里呢,我们的温湿传感器上半部分结束,下半部分我将继续学习,主播学的有点头大!
相关文章:
温湿度传感器(学习笔记上)
在学习这个项目之前,我们先了解一下传感器,查阅资料可知,电路板上温湿度传感器型号是GXHTC3,是北京中科银河芯科技有限公司研发的一款芯片,采用I2C接口与ESP32-C3通信,I2C地址是0x70。 接下来我们要进行编写i2c驱动程序,首先我们复制esp-idf-v5.1.3\examples\get-started\samp…...
sv标准研读第十九章-功能覆盖率
书接上回: sv标准研读第十八章-随机化和约束 第19章 功能覆盖率 19.1 总览 -定义cover group -定义cover point -定义cross cover -cover选项 -cover系统函数和系统方法 -cover计算 19.2 概述 覆盖率广义上分为两种:功能覆盖率和工具可以自动…...
图集短视频去水印云函数开发实践——小红书
前两篇主要讲解了抖音和快手的图集短视频对去水印解析的云函数开发实践,今天说一些小红书图集解析的云函数实践。 图集短视频去水印云函数开发实践——抖音 图集短视频去水印云函数开发实践——快手 其实都是大差不差的,首先获取到小红书的分享链接&…...
Uni-App-03
登录功能开发 实现POST提交 HTTP协议规定请求消息内容类型(Content-Type)有哪些?—— 只有四种 text/plain 没有编码的普通数据 application/x-www-form-urlencoded 编码后的普通数据 multipart/form-data 请求主体中包含文件上传域 application/json 请求主体是 J…...
解决 VScode 每次打开都是上次打开的文件问题
每次使用 VScode 打开总是上次的文件,可以简单设置即可,记录一下。 VScode Visual Studio Code(简称VSCode)是一个由微软开发的免费、开源的代码编辑器。它支持多种编程语言,并提供了代码高亮、智能代码补全、代码重构…...
redis高级篇之skiplist跳表 第164节答疑
跳表查询的空间复杂度分析 比起单纯的单链表,跳表需要存储多级索引,肯定要消耗更多的存储空间。那到底需要消耗多少额外的存储空间呢? 我们来分析一下跳表的空间复杂度。 第一步:首先原始链表长度为n, 第二步:两两取首,每层索引的…...
Java 线程池:深入理解与高效应用
在 Java 并发编程中,线程池是一种非常重要的技术。它可以有效地管理和复用线程,提高系统的性能和资源利用率。本文将深入探讨 Java 线程池的概念、原理、使用方法以及最佳实践,帮助读者更好地理解和应用线程池。 一、引言 在现代软件开发中&a…...
week08 zookeeper多种安装与pandas数据变换操作-new
课程1-hadoop-Zookeeper安装 Ububtu18.04安装Zookeeper3.7.1 环境与版本 这里采用的ubuntu18.04环境的基本配置为: hostname 为master 用户名为hadoop 静态IP为 192.168.100.3 网关为 192.168.100.2 防火墙已经关闭 /etc/hosts已经配置全版本下载地址࿱…...
js构造函数和原型对象,ES6中的class,四种继承方式
一、构造函数 1.构造函数是一种特殊的函数,主要用来初始化对象 2.使用场景 常见的{...}语法允许创建一个对象。可以通过构造函数来快速创建多个类似的对象。 const Peppa {name: 佩奇,age: 6,sex: 女}const George {name: 乔治,age: 3,sex: 男}const Mum {nam…...
电脑连接海康相机并在PictureBox和HWindowControl中分别显示。
展示结果: 下面附上界面中所有控件的Name,只需照着红字设置对应的控件Name即可 下面附上小编主界面的全部代码: using System; using System.Collections.Generic; using System.ComponentModel; using System.Data; using System.Drawing; …...
直播系统源码技术搭建部署流程及配置步骤
系统环境要求 PHP版本:5.6、7.3 Mysql版本:5.6,5.7需要关闭严格模式 Nginx:任何版本 Redis:需要给所有PHP版本安装Redis扩展,不需要设置Redis密码 最好使用面板安装:宝塔面板 - 简单好用的…...
Spring+ActiveMQ
1. 环境搭建 1.1 env-version JDK 1.8 Spring 2.7.13 Maven 3.6 ActiveMQ 5.15.2 1.2 docker-compose.yml version: 3.8services:activemq:image: rmohr/activemq:5.16.3container_name: activemqports:- "61616:61616"- "8161:8161"environment…...
Linux 常用命令总汇
查询所有wifi nmcli dev wifi list 链接wifi sudo nmcli dev wifi connect XXXX password XXXX 查询本机IP ifconfig 查询联网情况 ping www.baidu.com 进入.bash gedit ~/.bashrc sudo dpkg -i XXX.deb 安装超级终端 sudo apt install terminator 超级终端常用…...
fmql之Linux RTC
模拟i2c,连接rtc芯片。 dts: /{ // 根节点i2c_gpio: i2c-gpio {#address-cells <1>;#size-cells <0>;compatible "i2c-gpio";// MIO56-SDA, MIO55-SCL // 引脚编号gpios <&portc 2 0&portc 1 0 >;i2c-gp…...
Flask-SocketIO 简单示例
用于服务端和客户端通信,服务端主动给客户端发送消息 前提: 确保安装了socket库: pip install flask-socketio python-socketio服务端代码 from flask import Flask from flask_socketio import SocketIO import threading import timeap…...
Vue 3 的组件式开发(2)
1 Vue 3 组件的插槽 插槽(Slot)是Vue组件中的一个重要概念,它允许父组件向子组件中插入HTML结构或其他组件,从而实现内容的自定义和复用。以下是对Vue 3组件插槽的详细讲解: 1.1 插槽的基本概念 插槽可以被视为子组…...
python 爬虫 入门 四、线程,进程,协程
目录 一、进程 特征: 使用: 初始代码 进程改装代码 二、线程 特征: 使用: 三、协程 后续:五、抓取图片、视频 线程和进程大部分人估计都知道,但协程就不一定了。 一、进程 进程是操作系统分配资…...
cloak斗篷伪装下的独立站
随着互联网的不断进步,越来越多的跨境电商卖家开始认识到独立站的重要性,并纷纷建立自己的独立站点。对于那些有志于进入这一领域的卖家来说,独立站是什么呢?独立站是指个人或小型团队自行搭建和运营的网站。 独立站能够帮助跨境…...
【Nas】X-DOC:在Mac OS X 中使用 WOL 命令唤醒局域网内 PVE 主机
【Nas】X-DOC:在Mac OS X 中使用 WOL 命令唤醒局域网内 PVE 主机 1、Mac OS X 端2、PVE 端(Debian Linux) 1、Mac OS X 端 (1)安装 wakeonlan 工具 brew install wakeonlan(2)唤醒 PVE 命令 …...
u盘装win10系统提示“windows无法安装到这个磁盘,选中的磁盘采用GPT分区形式”解决方法
我们在u盘安装原版win10 iso镜像时,发现在选择硬盘时提示了“windows无法安装到这个磁盘,选中的磁盘采用GPT分区形式”,直接导致了无法继续安装下去。出现这种情况要怎么解决呢?下面小编分享u盘安装win10系统提示“windows无法安装到这个磁盘…...
Phi-3-mini-128k-instruct实战案例:中小企业技术文档自动解析与结构化提取
Phi-3-mini-128k-instruct实战案例:中小企业技术文档自动解析与结构化提取 1. 项目背景与价值 对于中小企业而言,技术文档管理一直是个令人头疼的问题。工程师们经常需要从大量PDF、Word文档中提取关键信息,手动整理成结构化数据。这个过程…...
GF-1遥感影像水体提取实战:Unet++、Deeplabv3+、MANet模型对比与避坑指南
GF-1遥感影像水体提取实战:三大模型对比与避坑全攻略 当国产高分一号(GF-1)卫星数据遇上深度学习语义分割技术,水体提取这项传统遥感任务正在经历革命性变革。本文将带您深入Unet、Deeplabv3和MANet三大主流模型在GF-1影像上的实战…...
OpenClaw故障排查大全:GLM-4.7-Flash接口超时与网关启动失败
OpenClaw故障排查大全:GLM-4.7-Flash接口超时与网关启动失败 1. 问题背景与典型症状 最近在本地部署OpenClaw对接GLM-4.7-Flash模型时,遇到了两个棘手问题:接口调用频繁超时和网关服务启动失败。作为一个习惯用技术解决实际问题的开发者&am…...
2026 工程指南:为什么 AWS Bedrock + Claude 4.6 正在成为多 Agent 协作的底层首选?
进入 2026 年第一季度,大模型领域的竞争已经从“单纯的参数规模”转向了“端到端的工程效率”。随着 GPT-5.4 陷入推理成本高企的泥潭,Anthropic 联手亚马逊发布的 Claude 4.6 托管方案,正在通过 Amazon Bedrock 平台迅速收割企业级市场。作为…...
OpenClaw多模态扩展:Qwen3.5-4B-Claude处理截图与PDF
OpenClaw多模态扩展:Qwen3.5-4B-Claude处理截图与PDF 1. 为什么需要多模态能力? 去年夏天,我遇到一个头疼的问题:需要从几百份PDF报告里提取关键数据。手动复制粘贴不仅耗时,还容易出错。当时我就在想,如…...
云服务器购买怎么选?2026云服务器优惠与租赁指南
在AI创作、3D渲染、远程办公快速发展的今天,「云服务器购买」「云服务器租赁」已经成为越来越多个人和企业的刚需。但面对复杂的配置和价格体系,很多人都会问:👉 到底怎么选最划算? 👉 有没有长期稳定又有“…...
Monocle 3实战:5步搞定单细胞marker基因筛选与可视化(R语言版)
Monocle 3实战:5步搞定单细胞marker基因筛选与可视化(R语言版) 单细胞RNA测序技术正在重塑我们对复杂生物系统的理解。在这个数据爆炸的时代,如何从海量的单细胞数据中快速准确地识别关键marker基因,成为每个研究者必须…...
从零开始:如何用Python训练一个AI模型(超详细教程)
引言 人工智能(AI)——一个熟悉又神秘的词汇。我们常听说它可以生成诗歌、编写代码、创作艺术,甚至回答各种问题。然而,当你想亲手实现一个“AI 模型”时,却可能感到无从下手。这篇教程正是为你准备的,将带…...
AS_BH1750库:BH1750FVI环境光传感器嵌入式驱动设计与工程实践
1. AS_BH1750库概述:面向嵌入式系统的BH1750FVI环境光传感器驱动设计与工程实践BH1750FVI是由ROHM Semiconductor推出的高精度数字环境光传感器(Ambient Light Sensor, ALS),采用IC接口,具备宽动态范围(0.1…...
别再死记硬背了!用Python脚本+Modbus Poll工具,5分钟搞懂Modbus功能码怎么用
用PythonModbus Poll实战:5分钟解锁功能码核心逻辑 第一次接触Modbus协议时,那些晦涩的功能码总让我头疼——01H、03H、05H这些十六进制代码就像天书,文档里的理论描述看完就忘。直到我发现用Python脚本配合Modbus Poll工具进行实操测试&…...
