Go实现树莓派I2C读取SHT30温度湿度传感器

简介

树莓派其实本身包含很多资源引脚, 合理利用其实可以自制智能家居的一部分,本身硬件和Linux系统等高级语言支持加生态, 不说了,
做就好了…

I2C 功能开启

参考之前的文章就可以了 Go实现树莓派读取bh1750光照强度

查看I2C总线上SHT30的设备地址

树莓派上两路i2c总线, 我们连接的是第一路,指令也是 -y 1, 如下
i2cdetect -y 1
在这里插入图片描述
为什么是0x44, 接着向下看, SHT3x默认地址就是0x44, 当Addr引脚接地则地址是0x44, 接VCC则是0x45, 电路图如下, 所以地址是0x44
在这里插入图片描述

在这里插入图片描述

代码

sht30.go

package sensorimport ("context""periph.io/x/conn/v3/gpio""periph.io/x/conn/v3/gpio/gpioreg""time"
)type SHT3xOption struct {I2COptionOnAlerted   func()AlertPinNum PinNum
}type SHT30TemperatureValue struct {value int64
}func (v SHT30TemperatureValue) Fahrenheit() float32 {return -49.0 + (315.0 * float32(v.value) / 65535.0)
}func (v SHT30TemperatureValue) Celsius() float32 {return -49.0 + (175.0 * float32(v.value) / 65535.0)
}type SHT30Value struct {temperature SHT30TemperatureValuehumidity    float32
}func (s *SHT30Value) setValues(temp int64, hum int64) {s.temperature.value = temps.humidity = 100.0 * (float32(hum) / 65535.0)
}func (s *SHT30Value) Humidity() float32 {return s.humidity
}func (s *SHT30Value) Temperature() SHT30TemperatureValue {return s.temperature
}type SHT30Sensor struct {opt      SHT3xOptionalertPin gpio.PinIni2cDevicecancalFunc context.CancelFunc
}func NewSHT30Sensor(opt SHT3xOption) (*SHT30Sensor, error) {var (sensor = &SHT30Sensor{opt: opt,})if opt.AlertPinNum > 0 {sensor.alertPin = gpioreg.ByName(opt.AlertPinNum.String())if nil == sensor.alertPin {return nil, CantFindPinError}}sensor.setDeviceInfo(opt.I2COption)return sensor, nil
}func (sensor *SHT30Sensor) Init() (err error) {if err = sensor.init(); nil != err {return err}if nil != sensor.opt.OnAlerted && nil != sensor.alertPin {err = sensor.alertPin.In(gpio.PullNoChange, gpio.NoEdge)if nil != err {return err}var ctx context.Contextctx, sensor.cancalFunc = context.WithCancel(context.Background())go sensor.monitorAlertPin(ctx)}//if err = sensor.reset(); nil != err {//	return err//}return
}func (sensor *SHT30Sensor) Destroy() error {if nil != sensor.cancalFunc {sensor.cancalFunc()sensor.cancalFunc = nil}return nil
}func (sensor *SHT30Sensor) GetValue() (v SHT30Value, err error) {var (sendBytes = []byte{0xE0, 0x00} // read commandrecvBytes = make([]byte, 6)temp, hum int64)err = sensor.dev.Tx(sendBytes, recvBytes)if nil != err {return}if !sensor.checksumCompare(recvBytes[:2], recvBytes[2]) {err = CRCCheckFailedErrorreturn}if !sensor.checksumCompare(recvBytes[3:5], recvBytes[5]) {err = CRCCheckFailedErrorreturn}temp = int64(recvBytes[0])<<8 | int64(recvBytes[1])v.temperature.value = temphum = int64(recvBytes[3])<<8 | int64(recvBytes[4])v.setValues(temp, hum)return
}/*
同硬件上nReset相同, 但这里是软件发送指令, 硬件是引脚触发, 不再响应指令
目前调用就会报错,所以直接返回
*/
func (sensor *SHT30Sensor) reset() error {var (sendBytes = []byte{0x30, 0xA2} // 软重置)_, err := sensor.dev.Write(sendBytes)if nil != err {return err}time.Sleep(time.Millisecond * (15 + 1)) // 软重置最长时间 1ms, 可能后续需要考虑指令取消,  最长15ms,目前先跟数据手册单个指令时间来return err
}/*
设置测量周期mps 0.5, 指令 0x20, 0x32/0x24/0x2F(High/Medium/Low)mps 1  , 指令 0x21, 0x30/0x26/0x2D(High/Medium/Low)mps 2  , 指令 0x22, 0x36/0x20/0x2B(High/Medium/Low)mps 4  , 指令 0x23, 0x34/0x22/0x29(High/Medium/Low)mps 10 , 指令 0x27, 0x37/0x21/0x2A(High/Medium/Low)
*/
func (sensor *SHT30Sensor) init() error {var (sendBytes = []byte{0x22, 0x36})_, err := sensor.dev.Write(sendBytes)if nil != err {return err}time.Sleep(time.Millisecond * 15)return err
}func (sensor *SHT30Sensor) checksumCompare(dat []byte, checksum byte) bool {var crc = sensor.crc8(dat)return crc == checksum
}func (sensor *SHT30Sensor) crc8(dat []byte) byte {var polynomial = byte(0x31) // 多项式值var crc byte = 0xFF         // 初始化值for _, v := range dat {crc ^= vfor i := 0; i < 8; i++ {if (crc & 0x80) != 0 {crc = (crc << 1) ^ polynomial} else {crc <<= 1}crc &= 0xFF // 保持 crc 为 8 位}}return crc
}func (sensor *SHT30Sensor) monitorAlertPin(ctx context.Context) {var (triggered bool // 用于确保不会反复提醒...)for {if gpio.Low == sensor.alertPin.Read() {if !triggered {go sensor.opt.OnAlerted()triggered = true}} else {if triggered {triggered = false}}select {case <-ctx.Done():returncase <-time.After(time.Millisecond * 10):}}
}

使用代码
main.go

package mainimport ("IntelligentAgriculture/sensor""fmt""periph.io/x/conn/v3/i2c/i2creg""time"
)const (AlertPinNum = 27MotorPinNum = 17LEDPinNum   = 22I2CSHT30Addr   = 0x44I2CAt24C02Addr = 0x50I2CBH1750Addr  = 0x23
)func main() {i2cBus, err := i2creg.Open("")if nil != err {fmt.Println("i2creg.Open:", err)return}defer i2cBus.Close()s, err := sensor.NewSHT30Sensor(sensor.SHT3xOption{OnAlerted: func() {fmt.Println("alerted!!!")},AlertPinNum: AlertPinNum,I2COption: sensor.I2COption{I2CBus:        i2cBus,DeviceAddress: I2CSHT30Addr,},})if nil != err {fmt.Println("sensor.NewSHT30Sensor:", err)return}defer s.Destroy()err = s.Init()if nil != err {fmt.Println("sensor.Init:", err)return}for {v, err := s.GetValue()if nil != err {fmt.Println("sensor.GetValue: ", err)continue}fmt.Printf("%0.2f℃, %0.2f℉, %0.2f(RH)\n", v.Temperature().Celsius(), v.Temperature().Fahrenheit(), v.Humidity())time.Sleep(time.Second)}
}

其他文章

Go实现树莓派读取bh1750光照强度
Go实现树莓派读取at24c02 eeprom读写数据
Go实现树莓派控制舵机
Go实现树莓派超声波测距

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.rhkb.cn/news/328055.html

如若内容造成侵权/违法违规/事实不符,请联系长河编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

【数据结构】顺序表(一)

✨✨✨专栏&#xff1a;数据结构 &#x1f9d1;‍&#x1f393;个人主页&#xff1a;SWsunlight 不怕别人看不起&#xff0c;就怕自己不争气。路是人走出来的&#xff0c;关键要靠自己闯。振作起来&#xff0c;生活的含义就是前进。 目录 一、顺序表的概念&#xff1a; 二…

【C语言深度解剖】:(11)函数指针、函数指针数组、指向函数指针数组的指针、回调函数

&#x1f921;博客主页&#xff1a;醉竺 &#x1f970;本文专栏&#xff1a;《C语言深度解剖》《精通C指针》 &#x1f63b;欢迎关注&#xff1a;感谢大家的点赞评论关注&#xff0c;祝您学有所成&#xff01; ✨✨&#x1f49c;&#x1f49b;想要学习更多C语言深度解剖点击专栏…

python:rename函数用法

在Pandas库中&#xff0c;rename函数是一个非常实用的方法&#xff0c;用于重命名DataFrame或Series的轴标签&#xff08;如列名或索引&#xff09;。以下是rename函数的基本用法、参数以及一些示例。 1.rename基本语法 DataFrame.rename(mapperNone, indexNone, columnsNone…

秋招算法——AcWing101——拦截导弹

文章目录 题目描述思路分析实现源码分析总结 题目描述 思路分析 目前是有一个笨办法&#xff0c;就是创建链表记录每一个最长下降子序列所对应的节点的链接&#xff0c;然后逐个记录所有结点的访问情况&#xff0c;直接所有节点都被访问过。这个方法不是很好&#xff0c;因为需…

HarmonyOS开发案例:【生活健康app之获取成就】(3)

获取成就 本节将介绍成就页面。 功能概述 成就页面展示用户可以获取的所有勋章&#xff0c;当用户满足一定的条件时&#xff0c;将点亮本页面对应的勋章&#xff0c;没有得到的成就勋章处于熄灭状态。共有六种勋章&#xff0c;当用户连续完成任务打卡3天、7天、30天、50天、…

【Redis】Redis键值存储

大家好&#xff0c;我是白晨&#xff0c;一个不是很能熬夜&#xff0c;但是也想日更的人。如果喜欢这篇文章&#xff0c;点个赞&#x1f44d;&#xff0c;关注一下&#x1f440;白晨吧&#xff01;你的支持就是我最大的动力&#xff01;&#x1f4aa;&#x1f4aa;&#x1f4aa…

009.Rx(Reactive Extenstions)的关系

响应式扩展库在组成响应式系统的应用程序中发挥作用&#xff0c;它与消息驱动的概念相关。Rx不是在应用程序或服务器之间移动消息的机制&#xff0c;而是在消息到达时负责处理消息并将其沿着应用程序内部的执行链传递的机制。需要说明的是&#xff0c;即使您没有开发包含许多组…

【Java】/*逻辑控制语句和输入输出—快速总结*/

目录 前言 一、分支语句 1.1 if 语句 1.2 switch 语句 二、循环语句 2.1 while 循环 2.1.1 break 2.1.2 continue 2.2 for 循环 2.3 do_while 循环 三、逻辑语句的小结 四、Java 中的输入输出 4.1 输出到控制台 4.2 从键盘输入 前言 Java 中的逻辑控制语句和C语…

【微信小程序开发】微信小程序、大前端之flex布局方式详细解析

✨✨ 欢迎大家来到景天科技苑✨✨ &#x1f388;&#x1f388; 养成好习惯&#xff0c;先赞后看哦~&#x1f388;&#x1f388; &#x1f3c6; 作者简介&#xff1a;景天科技苑 &#x1f3c6;《头衔》&#xff1a;大厂架构师&#xff0c;华为云开发者社区专家博主&#xff0c;…

激光切割机价格多少钱一台?

随着科技的飞速发展&#xff0c;激光切割技术在制造业中的应用越来越广泛。它以高精度、高效率和高质量著称&#xff0c;是金属加工行业的理想选择。然而&#xff0c;对于初次接触或打算购买激光切割机的用户来说&#xff0c;最关心的问题之一就是价格。那么&#xff0c;激光切…

相机模型的内参、外参

相机模型的内参、外参 文章目录 相机模型的内参、外参1. 针孔模型、畸变模型&#xff08;内参&#xff09;2. 手眼标定&#xff08;外参&#xff09; Reference 这篇笔记主要参考&#xff1a;slam十四讲第二版&#xff08;高翔&#xff09; 相机将三维世界中的坐标点&#xff…

架构设计入门(Redis架构模式分析)

目录 架构为啥要设计Redis 支持的四种架构模式单机模式性能分析优点缺点 主从复制&#xff08;读写分离&#xff09;结构性能分析优点缺点适用场景 哨兵模式结构优点缺点应用场景 集群模式可用性和可扩展性分析单机模式主从模式哨兵模式集群模式 总结 本文主要以 Redis 为例&am…

记一次跨域问题

线上跨域问题&#xff0c;在自己配置确认没问题下&#xff0c;要及时找运维看看是不是nginx配置问题。 两个方面&#xff1a; 项目代码 nginx配置 SpringBoot 解决跨域问题的 5 种方案&#xff01; SpringBoot解决CORS跨域问题 SpringBoot-实现CORS跨域原理及解决方案

【linux-IMX6ULL-定时器-GPT-串口配置流程-思路】

目录 1. 定时器配置流程1.1 EPIT定时器简介1.2 定时器1(epit1)的配置流程1.3 配置代码(寄存器版本)1.4 定时器-配合按键消抖1.4.1 实现原理1.4.2 代码实现&#xff08;寄存器版&#xff09; 2. GPT定时器实现高精度延时2.1 延时原理分析2.2 代码实现 3. UART串口配置流程3.1 UA…

WebRTC 的核心:RTCPeerConnection

WebRTC 的核心&#xff1a;RTCPeerConnection WebRTC 的核心&#xff1a;RTCPeerConnection创建 RTCPeerConnection 对象RTCPeerConnection 与本地音视频数据绑定媒体协商ICE什么是 Candidate&#xff1f;收集 Candidate交换 Candidate尝试连接 SDP 与 Candidate 消息的互换远端…

OpenAI GPT-4o - 介绍

本文翻译整理自&#xff1a; Hello GPT-4o https://openai.com/index/hello-gpt-4o/ 文章目录 一、关于 GPT-4o二、模型能力三、能力探索四、模型评估1、文本评价2、音频 ASR 性能3、音频翻译性能4、M3Exam 零样本结果5、视觉理解评估6、语言 tokenization 六、模型安全性和局限…

相机模型,坐标变换,畸变

小孔成像模型 墨子就记录了小孔成像是倒立的。这从几何光学的角度是很好理解的&#xff1a;光沿直线传播&#xff0c;上方和下方的光线交叉&#xff0c;导致在成像平面位置互换。 小孔的大小有什么影响&#xff1f; 小孔越大&#xff0c;进光量变大了&#xff0c;但是成像平…

Stable Diffusion入门使用技巧及个人实例分享--大模型及lora篇

大家好&#xff0c;近期使用Stable Diffusion比较多&#xff0c;积累整理了一些内容&#xff0c;得空分享给大家。如果你近期正好在关注AI绘画领域&#xff0c;可以看看哦。 本文比较适合已经解决了安装问题&#xff0c;&#xff08;没有安装的在文末领取&#xff09; 在寻找合…

智能防疫电梯模拟控制系统设计-设计说明书

设计摘要&#xff1a; 本设计是基于单片机的智能防疫电梯模拟控制系统&#xff0c;主要实现了多项功能。首先&#xff0c;系统进行无接触测温&#xff0c;如果温度正常则可以启动电梯运行&#xff0c;如果温度异常则电梯会报警提示有乘客体温异常&#xff0c;电梯不会运行。其…

04、Kafka集群安装

1、准备工作 首先准备一台虚拟机&#xff0c;centos7系统&#xff0c;先在一台上配置安装后&#xff0c;最后克隆成多台机器。 1.1 安装JDK &#xff08;1&#xff09;下载JDK&#xff0c;上传到 /root/software 路径 下载地址&#xff1a;https://www.oracle.com/cn/java/…