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

发布于:2024-05-12 ⋅ 阅读:(90) ⋅ 点赞:(0)

简介

之前手头上有小熊派的开发板, 有一个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
}

其他组合部分(省略)