GO+树莓派+E53_IA1智慧农业模块

简介

之前手头上有小熊派的开发板, 有一个E53_IA1模块, 刚好用到树莓派上, 使用GO进行控制,实现智慧农业模块功能。

模块介绍

模块电路介绍

按硬件分成五块, 其中四块在本次用上了, 分别是

1. 补光模块(LED灯)

在这里插入图片描述

2. SHT30(温湿度传感器)

在这里插入图片描述

3. BH1750 光照强度传感器

在这里插入图片描述

4. 电机部分

在这里插入图片描述
在这里插入图片描述

5. AT24C02(EEPROM, 本次没用上)

在这里插入图片描述
注意: 除了电机和LED部分, 其余都在同一个I2C总线上。

树莓派接线

在这里插入图片描述
请添加图片描述
请添加图片描述

代码

1. SHT30部分

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

2. bh1750 部分

Go实现树莓派读取bh1750光照强度

3. LED部分

package sensor

import (
	"periph.io/x/conn/v3/gpio"
	"periph.io/x/conn/v3/gpio/gpioreg"
)

type LEDSensor struct {
	pin gpio.PinIO

	onLevel  gpio.Level
	offLevel gpio.Level
}

func NewLEDSensor(pinName string, highIsOn bool) (*LEDSensor, error) {
	var (
		sensor = &LEDSensor{}
		err    error
	)
	if err = sensor.init(pinName, highIsOn); nil != err {
		return nil, err
	}

	return sensor, nil
}

func (sensor *LEDSensor) init(pinName string, highIsOn bool) (err error) {
	sensor.pin = gpioreg.ByName(pinName)
	if nil == sensor.pin {
		return SensorPinCantFoundError
	}

	if highIsOn {
		sensor.onLevel = gpio.High
		sensor.offLevel = gpio.Low

	} else {
		sensor.onLevel = gpio.Low
		sensor.offLevel = gpio.High
	}
	///* 默认关灯 */
	//if err = sensor.pin.Out(sensor.offLevel); nil != err {
	//	return
	//}

	return
}

func (sensor *LEDSensor) GetState() OnOffState {
	//level := sensor.pin.Read()
	if sensor.onLevel == sensor.pin.Read() {
		return OnOffState_ON
	}
	return OnOffState_OFF
}

func (sensor *LEDSensor) SetState(state OnOffState) (err error) {
	if OnOffState_ON == state {
		err = sensor.pin.Out(sensor.onLevel)
	} else {
		err = sensor.pin.Out(sensor.offLevel)
	}
	return
}

func (sensor *LEDSensor) Toggle() (err error) {
	if sensor.GetState() == OnOffState_ON {
		err = sensor.SetState(OnOffState_OFF)
	} else {
		err = sensor.SetState(OnOffState_ON)
	}
	return
}

4. 电机部分

package sensor

import (
	"fmt"
	"periph.io/x/conn/v3/gpio"
	"periph.io/x/conn/v3/gpio/gpioreg"
)

type MotorSensor struct {
	opt MotorOption

	pin gpio.PinOut

	currDutyCycle uint8

	oned bool
}

func NewMotorSensor(opt MotorOption) (*MotorSensor, error) {
	var (
		sensor = &MotorSensor{
			opt:           opt,
			currDutyCycle: opt.DutyCycle,
		}
	)
	if opt.DutyCycle > 100 {
		return nil, fmt.Errorf("duty clycle %s", OutOfRangeError.Error())
	}

	sensor.pin = gpioreg.ByName(opt.PinNum.String())
	if nil == sensor.pin {
		return nil, CantFindPinError
	}
	return sensor, nil
}

func (sensor *MotorSensor) Init() error {
	return nil
}

func (sensor *MotorSensor) Destroy() error {
	return nil
}

func (sensor *MotorSensor) Control(isOpen bool) (err error) {
	if isOpen == sensor.oned {
		return
	}
	err = sensor.control(isOpen)
	if nil != err {
		return
	}
	sensor.oned = isOpen
	return
}

func (sensor *MotorSensor) control(isOpen bool) (err error) {
	if isOpen {
		err = sensor.pin.Out(gpio.High)

		//err = sensor.pin.PWM(gpio.DutyMax/gpio.Duty((100-sensor.currDutyCycle)+1), physic.Hertz*physic.Frequency(sensor.opt.Frequency))
	} else {
		err = sensor.pin.Out(gpio.Low)
		err = sensor.pin.Halt()
	}
	return
}

func (sensor *MotorSensor) SetDutyCycle(duty uint8) error {
	//return UnsupportedError
	if 100 < duty {
		return fmt.Errorf("duty clycle %s", OutOfRangeError.Error())
	}
	if sensor.currDutyCycle == duty {
		return nil
	}
	sensor.currDutyCycle = duty

	if sensor.oned {
		if err := sensor.control(sensor.oned); nil != err {
			return err
		}
	}
	return nil
}

其他组合部分(省略)

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

SpringBoot结合Canal 实现数据同步

1、Canal介绍 Canal 指的是阿里巴巴开源的数据同步工具&#xff0c;用于数据库的实时增量数据订阅和消费。它可以针对 MySQL、MariaDB、Percona、阿里云RDS、Gtid模式下的异构数据同步等情况进行实时增量数据同步。 当前的 canal 支持源端 MySQL 版本包括 5.1.x , 5.5.x , 5.6.…

数据分析需要注意哪些法律法规

数据分析 前言一、数据处理过程二、数据收集阶段的法律规则数据收集应具备合法、正当、透明原则数据收集应坚持最小必要原则数据收集应遵守知情-同意规则数据收集应遵守目的明确性要求 三、数据储存的法律规则四、数据使用与处理的阶段的法律规则数据安全保护义务按照数据分级分…

全球首例!猪肾移植患者死亡,人类科技与伦理或将面临挑战?

全球首例猪肾移植患者的离世&#xff0c;如同一颗重磅炸弹&#xff0c;在医学界激起千层浪花&#xff0c;让原本充满希望的“死而复生”异种器官移植技术再次被推至风口浪尖。 今年3月&#xff0c;一场与命运的较量在麻省总医院悄然落幕。全球首位接受转基因猪肾移植的患者理查…

Boss让你设计架构图,你懵逼了,解救你的参考图来啦。

架构图是指用于描述系统或软件的结构和组成部分之间关系的图形表示。 它是一种高层次的图示&#xff0c;用于展示系统的组件、模块、接口和数据流等&#xff0c;以及它们之间的相互作用和依赖关系。架构图通常被用于可视化系统的整体设计和组织结构&#xff0c;帮助人们理解系…

数据结构(四)——二叉树和堆(下)

制作不易&#xff0c;三连支持一下呗&#xff01;&#xff01;&#xff01; 文章目录 前言一、二叉树链式结构的实现总结 前言 这篇博客我们将来了解普通二叉树的实现和应用&#xff0c;对大家之前分治和递归的理解有所挑战。 一、二叉树链式结构的实现 1.前置说明 在学习二叉…

对Windows超融合S2D的一些补充

先说一个不知道算不算BUG的例子&#xff0c;下面这个存储池是用两台服务器各2块10G建立的&#xff0c;除去系统保留的部分&#xff0c;显示还有13G可用。 但如果使用其新建虚拟磁盘会显示可用的空间为0 然后我又各增加了一块10G硬盘进池&#xff0c;变成了可用空间为30.5GB …

“二代”接班进行时:达利食品许阳阳揭秘“零食大王”成长密钥

“二代接班”早已不是一个新鲜话题。近年来&#xff0c;随着时间的推移&#xff0c;那些伴随改革开放和中国制造崛起的民营企业&#xff0c;更多的正在经历或已完成“二代接班”。 “毛巾王子”家的洁丽雅&#xff0c;最近因大手笔签约多位代言人而引起讨论的九牧王&#xff0…

基于Unity为Vision Pro 构建游戏的4个关键

为Vision Pro开发游戏时需要考虑的四个关键概念:输入的自然性、物理尺寸的真实匹配、交互空间的充足性以及Unity组件的有效利用。 AVP交互小游戏(Capsule Critters)作者分享了使用Unity构建的几个核心关键: Bounded - 游戏定义:Bounded(有限)是Unity的术语,指的是游戏作…

[AIGC] 几道 redis数据结构相关面试题

文章目录 7. 数据类型的实现8. 什么是空间预分配以及惰性空间释放&#xff0c;SDS 是怎么实现的9. 为什么说 SDS 是二进制安全的呢10. 说说 redis 里的对象11. 使用 RedisObject 的好处12. RedisObject 的具体结构是什么 7. 数据类型的实现 8. 什么是空间预分配以及惰性空间释放…

Tomcat添加服务以及设置开机自启

下载地址连接 Index of /dist/tomcat&#x1f453; 注意点&#xff1a;不要出现中文路径 #环境变量 CATALINA_HOMED:\apache-tomcat-7.0.62 TOMCAT_HOMED:\apache-tomcat-7.0.62 JAVA_HOMED:\tool\jdk1.8.0_111 PATH%CATALINA_HOME%\bin;%CATALINA_HOME%\lib;%CATALINA_HOME%\…

【JVM基础篇】类加载器分类介绍

文章目录 类加载器什么是类加载器类加载器的作用是什么应用场景类加载器的分类启动类加载器用户扩展基础jar包 扩展类加载器和应用程序类加载器扩展类加载器通过扩展类加载器去加载用户jar包&#xff1a; 应用程序加载器 Arthas中类加载器相关功能 文章说明 类加载器 什么是类…

车载测试:为什么你投十份简历,只有一两家公司约你?

最根本的原因&#xff0c;就是一方在汲汲渴求&#xff0c;而恰恰另一方呈现出的关键点让其怦然心动。求者心中有所想&#xff0c;而应者恰恰展现了求者所想的那一面。这就是个中奥妙。 程序员在找工作时&#xff0c;在一开始有三件事情会对能否获得面试机会至关重要&#xff1…

C++笔记(STL标准库)

1.STL六大部件 容器 Containers分配器 Allocators&#xff1a;帮容器分配内存算法 Algorithms迭代器 Iterators&#xff1a;算法通过迭代器操作容器里的数据&#xff0c;是一种泛化的指针适配器 Adapters&#xff1a;修改或扩展已有类或函数的接口以满足特定的需求仿函数 Func…

自动秒收录网址导航分类目录模板

自动秒收录网址导航是一个以html5css3进行开发的免费版网址自动收录模板源码。 模板特点&#xff1a;全站响应式H5网站制作技术&#xff0c;一个网站适应不同终端&#xff0c;模板支持网址导航一键采集入库&#xff0c;免规则文章资讯智能批量采集内置伪原创&#xff0c;本地化…

DSA理解理解蓝桥杯例题signature

一、历史 1991年8月&#xff0c;NIST&#xff08;Nation Institute of Standards and Technology&#xff0c;美国国家标准技术研究所&#xff09;提出了数字签名算法&#xff08;DSA&#xff09;用于他们的数字签名标准&#xff08;DSS&#xff09;中。 DSA是算法&#xff0c…

SCI论文发表:寻找论文选题的7种方法 (建议收藏)!

我是娜姐 迪娜学姐 &#xff0c;一个SCI医学期刊编辑&#xff0c;探索用AI工具提效论文写作和发表。 近期有好几个同学问娜姐关于论文选题的问题&#xff1a;什么样的选题是好的选题-有价值好发表。这篇来分享7种寻找有效选题的方法。 在我们寻找论文选题的过程中&#xff0c;…

Linux配置两个局域网间的网络转发

网络拓扑如上图所示&#xff0c;有192.168.1.0(255.255.255.0)&#xff0c;192.168.2.0(255.255.255.0)两个局域网。若要使host1可直接通过ip地址访问host3&#xff0c;则需在host2中配置路由转发。 host2 配置静态路由&#xff08;系统一般会自动配置&#xff09; # 添加静…

Electron、QT、WPF三强争霸,该支持谁呢?

Electron、QT、WPF都是跨平台的桌面应用开发框架&#xff0c;都是非常流行的&#xff0c;作为开发者该选用哪个呢&#xff1f;本文从多个角度分析一下。 一、定义 Electron、Qt 和 WPF 都是用于创建桌面应用程序的框架或工具&#xff0c;它们各自有着不同的特点和优势。 Elec…

Windows下安装 Emscripten 详细过程

背景 最近研究AV1编码标准的aom编码器&#xff0c;编译的过程中发现需要依赖EMSDK&#xff0c;看解释EMSDK就是Emscripten 的相应SDK&#xff0c;所以此博客记录下EMSDK的安装过程&#xff1b;因为之前完全没接触过Emscripten 。 Emscripten Emscripten 是一个用于将 C 和 …

论文盲审吐槽多,谁给盲审不负责的老师买单?如何看待浙江大学「一刀切」的研究生学位论文双盲评审制度?

::: block-1 “时问桫椤”是一个致力于为本科生到研究生教育阶段提供帮助的不太正式的公众号。我们旨在在大家感到困惑、痛苦或面临困难时伸出援手。通过总结广大研究生的经验&#xff0c;帮助大家尽早适应研究生生活&#xff0c;尽快了解科研的本质。祝一切顺利&#xff01;—…