使用 ATmega328P-AUR 微控制器构建一款紧凑型环境数据记录仪
环境监测是小型嵌入式系统中一项实用的应用。数据记录仪可用于车间、储藏室、温室或实验室中记录温度、湿度和光照情况。
许多 Arduino 项目采用完整的开发板,而本项目则采用不同的方法,将 ATmega328P-AUR 直接集成在电路板上。其目的是展示如何利用一个常见的 AVR 微控制器作为独立数据采集系统的主控核心。
ATmega328P-AUR 为该应用提供了充足的存储空间和外设接口。TWI 接口连接 OLED 显示屏和 BH1750FVI 光感传感器,SPI 接口连接 MicroSD 卡,DHT22 传感器通过单条数字数据线进行通信。
系统工作原理
微控制器由外部晶振驱动,运行频率为 16 MHz。稳定的 3.3 V 电源为 ATmega328P-AUR 及其外围设备供电。
DHT22 用于测量温度和相对湿度。BH1750FVI 通过其 I2C 接口测量环境光,OLED 屏幕显示最新的传感器读数。
每 10 秒,固件会生成一个包含当前时间、温度、湿度和光照强度的 CSV 记录,并将该记录追加到 MicroSD 卡上名为 ENVLOG.CSV 的文件中。
用户可通过按钮立即保存测量数据。成功写入后,状态指示灯会短暂闪烁。
为何使用独立式 ATmega328P-AUR?
ATmega328P 广泛应用于 Arduino 兼容的设计,但定制 PCB 可减少不必要的板级硬件,使设计更易于集成到大型产品中。
AUR 版本采用 TQFP-32 封装,适合紧凑型 PCB 设计。它具备与其他 ATmega328P 封装版本相同的主控器功能,并根据封装提供相应的引脚布局。
数据记录格式
该项目以简单的 CSV 格式存储数据:
时间字段为秒级经过的时间计数,不是实际的日历时间戳,因为设计中未包含实时时钟。
电路搭建
首先使用ATmega328P-AUR电源、晶振、复位电路和ICSP接口进行测试。在添加传感器之前,需确认电源电压及基本的编程连接。
OLED显示屏和BH1750FVI共用同一根I2C总线。MicroSD卡使用SPI接口,DHT22则连接到独立的数字输入端口。
电路应分阶段进行测试:先确认微控制器能否成功编程,然后分别检查OLED显示屏、传感器读数以及MicroSD卡。
测试
使用数字万用表检查3.3 V电源,并在通电前排查短路情况。
将DHT22传感器与已知的室温和湿度值进行比对。如果可用,可将BH1750FVI的读数与独立的光度计读数进行比较。
对于MicroSD卡,将其格式化为FAT32,并验证固件能否创建并追加ENVLOG.CSV文件。
当传感器环境发生变化时,应检查记录数据是否出现合理的变化。本项目不保证实验室级精度或经过校准的环境测量结果。
可能的改进方案
可进一步扩展项目功能,例如:
- 使用DS3231实时时钟实现日历时间戳;
- 添加可充电电池供电;
- 实现低功耗睡眠模式;
- 集成无线通信模块;
- 更大的OLED显示屏;
- 增加其他模拟传感器;
- 添加网页仪表板以查看记录的数据;
- 设计定制外壳用于户外监测。
电路原理图与接线图
该电路采用3.3 V稳压电源。ATmega328P-AUR支持1.8 V至5.5 V的工作电压范围,因此3.3 V电源适用于此设计。
电源
•ATmega328P-AUR VCC → 3.3 V。
•ATmega328P-AUR AVCC → 3.3 V。
•ATmega328P-AUR GND → 公共地。
•VCC 与 GND 之间连接一个 100 nF 电容。
•AVCC 与 GND 之间连接一个 100 nF 电容。
•AREF → 连接一个 100 nF 电容 → GND。
•3.3 V 与 GND 之间连接一个 10 µF 电容。
•MCP1700-3302E/TO 提供稳定的 3.3 V 电源。
时钟与复位
•XTAL1 → 16 MHz 晶振 → XTAL2。
•XTAL1 → 22 pF 电容 → GND。
•XTAL2 → 22 pF 电容 → GND。
•RESET → 连接一个 10 kΩ 电阻 → 3.3 V。
•RESET → 推按钮 → GND。
DHT22 温湿度传感器
•DHT22 VCC → 3.3 V。
•DHT22 GND → GND。
•DHT22 DATA → PD2 / Arduino 数字引脚 2。
•DATA 与 3.3 V 之间连接一个 1 kΩ 电阻。
BH1750FVI 光电传感器
•BH1750FVI VCC → 3.3 V。
•BH1750FVI GND → GND。
•BH1750FVI SDA → PC4 / A4。
•BH1750FVI SCL → PC5 / A5。
I2C总线需要上拉电阻。如果传感器和OLED模块未自带,需在SDA与3.3V之间、SCL与3.3V之间使用4.7 kΩ电阻。
SSD1306 OLED显示屏
•OLED VCC → 3.3 V。
•OLED GND → GND。
•OLED SDA → PC4 / A4。
•OLED SCL → PC5 / A5。
OLED与BH1750FVI共用同一I2C总线。
MicroSD卡
•MicroSD VCC → 3.3 V。
•MicroSD GND → GND。
•MicroSD MOSI → PB3 / Arduino数字引脚11。
•MicroSD MISO → PB4 / Arduino数字引脚12。
•MicroSD SCK → PB5 / Arduino数字引脚13。
•MicroSD CS → PB2 / Arduino数字引脚10。
请使用专为3.3V工作设计的MicroSD模块。切勿在未确认接口要求的情况下,将仅支持5V的SD模块直接连接至3.3V的ATmega328P电源。
状态指示灯
•PD6 / Arduino数字引脚6 → 330 Ω电阻 → LED阳极。
•LED阴极 → GND。
数据写入成功后,指示灯会闪烁。
按钮
•PD7 / Arduino数字引脚7 → 按钮 → GND。
固件会启用内部上拉电阻。
ICSP接口
ICSP信号
ATmega328P-AUR连接方式
•MISO
•PB4
•MOSI
•PB3
•SCK
•PB5
•重置
•重置
•VCC
•3.3 V
•GND
•GND
ICSP引脚用于对微控制器进行编程,也可用于安装引导程序。
代码
以下Arduino代码用于读取DHT22和BH1750FVI传感器,更新OLED显示屏,并将CSV数据写入MicroSD卡。
代码说明
固件使用Arduino AVR平台进行ATmega328P开发。16 MHz时钟设置必须与实际晶振及电路板配置相匹配。
OLED显示屏的地址设置为0x3C。部分SSD1306模块使用不同的地址,如果显示屏无响应,请检查模块文档。
DHT22传感器的数据线上需要连接合适的上拉电阻,部分扩展模块已内置该电阻。
MicroSD卡应格式化为FAT32。若文件夹中不存在ENVLOG.CSV,则固件会自动创建该文件。
记录的时间为经过的秒数计数,而非实时时间。如需日历时间戳,可添加DS3231模块。
结论
本项目展示了ATmega328P-AUR如何作为独立型环境数据记录仪的主控制器。它利用微控制器的I2C、SPI、GPIO和定时器资源,连接多个实用外设。
该设计适用于学习、原型开发以及基于定制PCB的监控系统开发。同时,它也可作为需要低功耗、无线通信或实时时钟支持的更高级数据记录项目的起点。
对于内存、处理能力和外设接口均能满足需求的小型嵌入式应用而言,ATmega328P仍然是一个实用的选择。在进行新设计时,工程师还应参考Microchip当前推荐的产品,并将其与ATmega328P进行比较,再决定是否采用长期生产的设计方案。
本文编译自hackster.io





