简介
之前手头上有小熊派的开发板, 有一个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 sensorimport ("periph.io/x/conn/v3/gpio""periph.io/x/conn/v3/gpio/gpioreg"
)type LEDSensor struct {pin gpio.PinIOonLevel gpio.LeveloffLevel 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.Highsensor.offLevel = gpio.Low} else {sensor.onLevel = gpio.Lowsensor.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 sensorimport ("fmt""periph.io/x/conn/v3/gpio""periph.io/x/conn/v3/gpio/gpioreg"
)type MotorSensor struct {opt MotorOptionpin gpio.PinOutcurrDutyCycle uint8oned 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 = isOpenreturn
}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 UnsupportedErrorif 100 < duty {return fmt.Errorf("duty clycle %s", OutOfRangeError.Error())}if sensor.currDutyCycle == duty {return nil}sensor.currDutyCycle = dutyif sensor.oned {if err := sensor.control(sensor.oned); nil != err {return err}}return nil
}