- 项目介绍+设计思路
利用ESP32C3作为控制核心,设计了一个由两轴舵机云台带动的追光太阳能板,由太阳能板负责供电,可以长期部署在户外,向服务器反馈温度,湿度,是否下雨等遥测数据。
- 设计方向的市场介绍
由于项目使用的是太阳能供电,在装上透明防水外壳后,可以长期无人值守在野外恶劣条件下工作,有一定的实用价值。
- 方案原理图介绍
先介绍一下项目的功能框图:
项目中使用到的核心主控是ESP32-C3,C3自带了WIFI和蓝牙,特别适用于这类物联网项目。
整个系统的供电由太阳能板负责,其中3.3V主控电压和通信电压由LDO降压得到。
追光平台由一个两轴舵机云台带动,光照方向的测量由四个光敏电阻完成。
气象站相关的传感器包括一个下雨传感器和一个I2C的温湿度传感器。我还额外引出了UART的引脚,可以用来拓展其他的传感器或通信模块,例如Lora等。
再来看看项目原理图设计:
板子上核心部分是一块ESP32-C3-MINI模块,在模块周围进行了一些必要的引脚上拉配置,并添加了两个按键开关,方便选择启动模式。
与电脑的通信使用了ESP32-C3自带的USB转串口,这个USB接口仅可用作串口通信类使用,可以用来上传固件,以及串口调试。
剩余的部分都是拓展引脚。其中模拟传感器引脚增加了滤波电容以及上拉电阻。所有传感器类的外设都使用了3.3V电压,而舵机这边由于是功率器件,使用5V电压进行供电。
- 方案中可能用到的规定厂商元器件介绍
项目中的主控是ESP32-C3,这是一款由乐鑫科技(Espressif Systems)推出的低功耗Wi-Fi和蓝牙芯片,它是ESP32家族的最新成员。ESP32-C3采用了RISC-V架构的单核32位处理器,主频高达160 MHz。该芯片具有出色的性能和丰富的功能,适用于各种物联网(IoT)应用。
以下是ESP32-C3的主要特点和功能:
1,Wi-Fi和蓝牙:ESP32-C3集成了Wi-Fi 4(802.11b/g/n)和蓝牙5.0技术,可以实现无线连接和通信。它支持Wi-Fi站点(STA)模式、热点(AP)模式和Wi-Fi直连(Wi-Fi Direct)等功能,以及蓝牙低功耗(BLE)和经典蓝牙(BR/EDR)通信。
2,低功耗:ESP32-C3采用了优化的低功耗设计,在待机模式下功耗非常低。它支持多种省电模式,包括睡眠模式和深度睡眠模式,以延长电池寿命。
3,多种外设接口:ESP32-C3提供了丰富的外设接口,包括多个通用输入输出(GPIO)引脚、UART、I2C、SPI、PWM、ADC等,以便与其他设备进行连接和通信。
4,安全性:ESP32-C3支持硬件加密和安全引导功能,可以保护设备的数据和通信安全。它还提供了随机数生成器(RNG)和加密引擎等功能,用于加密算法和安全协议的实现。
- PCB绘制与打板介绍
由于项目使用的光传感器并没有现成的可以买,因此光传感器也是自己绘制打板,一共绘制了两块PCB:
由于光源方向传感器要尽可能避免光线反射带来的影响,因此我选用了黑色PCB。控制板颜色无所谓,选择自己喜欢的即可。
主控板的焊接比较简单,贴片元件摆好后直接上铁板烧,烧完后再用烙铁焊一下针脚就可以。光传感器部分焊接稍微麻烦点,因为是立体的,需要先拼接好,固定好后,再上锡焊接。
至此所有焊接工作完成,剩余传感器均使用的是成品,直接接上就可以用。
- 关键代码解释
项目代码是使用Micropython编写的,调试起来非常方便。
除了自带库外,使用了三个第三方库,一个用来发邮件,另外两个用来驱动外设。
import umail
import servo
import sht4x
代码分为两路循环,一路是负责光源追踪,实时读取传感器数据,并调整舵机云台角度。另一路是气象站,每间隔一段时间读取一下环境传感器数据,并通过邮件发送。其中第二路循环实现非常简单,调库即可。唯一需要注意的是在smtp发送邮件时,标题与正文之间需要一个额外的空行,没有这个空行的话无法正确识别正文。我在这里踩坑浪费了不少时间。
def email(_content):
smtp = umail.SMTP(sender_stmp, sender_port, ssl=True)
smtp.login(sender_email, sender_app_password)
smtp.to(recipient_email)
smtp.write("From:" + sender_name + "<"+ sender_email+">\n")
smtp.write("Subject:" + email_subject + "\n")
smtp.write("\n")
smtp.write(_content)
_code, _msg = smtp.send()
print("Email Sent")
print(_code)
print(_msg)
print("")
smtp.quit()
最主要的核心功能就是光源追踪了,首先先对传感器数据进行采样。为了避免异常值,我进行了多次采样并取平均。随后利用采样到的数据计算出X方向和Y方向的光强差。
def sampling(adc):
value = 0
for i in range(sampling_num):
value += adc.read_u16()
result = value / sampling_num
return result
def light():
ulv = sampling(ul)
urv = sampling(ur)
blv = sampling(bl)
brv = sampling(br)
# print(f"Upper left : {ulv:.2f}")
# print(f"Upper right : {urv:.2f}")
# print(f"Bottom left : {blv:.2f}")
# print(f"Bottom right : {brv:.2f}")
print("")
upper = (ulv + urv) / 2
bottom = (blv + brv) / 2
left = (ulv + blv) / 2
right = (urv + brv) / 2
# print(f"Upper : {upper:.2f}")
# print(f"Bottom : {bottom:.2f}")
# print(f"Left : {left:.2f}")
# print(f"Right : {right:.2f}")
# print("")
diff_x = -(left - right)
diff_y = (upper - bottom)
# print(f"Diff X : {diff_x:.2f}")
# print(f"Diff Y : {diff_y:.2f}")
# print("")
return [diff_x, diff_y]
得到光强差后,就可以控制舵机像光强高的方向转动,直到两边光强差低于阈值。这里的单次调整步长可以用来设置转动的速度,为了演示效果明显我设置为了角度2,实际使用时由于太阳位置变化缓慢,使用us设定设置为1都是可以的,可以达到更加平稳的运行效果。在代码中X和Y舵机我分别使用角度和us两种不同的方法进行设定,可以方便大家参考。
def follow(diff):
global x_deg
global y_deg
diff_x = diff[0]
diff_y = diff[1]
if diff_x > deadband:
x_deg = x_deg + x_step
if diff_x < -deadband:
x_deg = x_deg - x_step
if diff_y > deadband:
y_deg = y_deg + y_step
if diff_y < -deadband:
y_deg = y_deg - y_step
if x_deg > 90 + x_range/2:
x_deg = 90 + x_range/2
if x_deg < 90 - x_range/2:
x_deg = 90 - x_range/2
if y_deg > 1500 + y_range/2:
y_deg = 1500 + y_range/2
if y_deg < 1500 - y_range/2:
y_deg = 1500 - y_range/2
# print(f"Degree X : {x_deg:.0f}")
# print(f"Degree Y : {y_deg:.0f}")
# print("")
servo_x.write(x_deg)
servo_y.write_us(y_deg)
比较重要的部分就这些,完整项目代码大家可以自行去附件里下载。
- 功能展示
整个气象站加上太阳能板后重量较重,为了可以平稳放置,我用了个玻璃饭盒做底座。
额外添加了两个环境传感器,一个是雨滴传感器,通过GPIO连接。另一个是温湿度传感器,通过I2C连接。
光源传感器安装位置不重要,但是一定要和太阳能板平行,并且与太阳能板相对静止。
太阳能得到的5V电并不能直接供给单片机使用,这里还需要一个电源管理模块,这个电源管理模块还需要附带锂电池充放电路,以实现24小时不间断运行。我把模块直接贴在了太阳能板的后面。
光源追踪功能的示范无法在室外进行,因为我手中的人造光源完全打不过太阳光,室外环境太亮。因此太阳能供电部分展示和其他功能展示必须得分开进行。在这里我们测试一下户外太阳能板所能提供的电流,可以看到高达500mA,一整天的照射完全可以充满自带的锂电池,并维持工作所需电流。
接着我们回到室内,我们可以展示一下其他的功能。具体展示可以参考视频开头部分。
- 对本大赛的心得体会
项目已经做完,但其实还有很多不完善的地方。比如这么杂乱的线,做原型可以,如果是成品的话需要再做一块接口板来整合接线。再比如主控,舵机部分需要在确保散热的前提下尽可能密封,保证工作稳定;而温湿度传感器需要和外部空气接触,但不能淋雨;而雨滴传感器需要彻底暴露。这就对外壳的设计带来的一定的要求。但不管怎么说,利用这次活动,让我接触到了一些平时没有机会认识的新工具,我觉得非常有意义。希望电子森林也能将这类活动坚持办下去,祝愿活动越办越好!