Arduino DIY 电压表:Nokia 5110 屏幕显示,手把手教学
元器件清单
| 元器件 | 数量 | 备注 |
|---|---|---|
| Arduino UNO | 1 | 主控板 |
| 电压传感器模块 (0-25V) | 1 | 分压电路,可自制 |
| Nokia 5110 LCD 显示屏 | 1 | PCD8544 控制器,84×48 像素 |
| 面包板 | 1 | |
| 杜邦线若干 | 1 |
项目成本约 10 美元,极具性价比。
所需软件
- Arduino IDE
- LCD5110_Graph 库 (Henning Karlsen 开发,官网下载)
项目简介
本教程详细讲解如何利用 Arduino UNO 和 Nokia 5110 LCD 制作一款直流电压表,测量范围 0-25V。通过这个项目,你将深入理解电压表原理、欧姆定律应用、分压电路设计,以及 Arduino 模拟量读取与图形显示技术。完成后可用于电池监测、电路调试等场景。
步骤 1:了解电压传感器模块
该模块本质是一个分压电路,仅包含两个电阻:
- R1 = 30 kΩ
- R2 = 7.5 kΩ
根据分压公式:Vout = Vin × R2 / (R1 + R2)
输入 25V 时,输出恰好为 5V(Arduino 模拟引脚最大耐压)。输入 0-25V 对应输出 0-5V,Arduino 10 位 ADC 分辨率约 25mV。警告:输入电压严禁超过 25V,否则烧毁 Arduino 模拟引脚!
如需更高精度,可使用 Arduino Due (12 位 ADC) 并自制 3.3V 逻辑电平的分压电路。
步骤 2:Nokia 5110 LCD 简介
- 原诺基亚手机屏幕,PCD8544 控制器,SPI 接口
- 极低功耗:开启背光 0.4mA,休眠 < 0.06mA
- 8 根线即可驱动,配合 Henning Karlsen 库极易上手
- 支持图形、文字、位图显示
步骤 3:硬件接线
电压传感器 (仅用 3 脚中的 2 脚)
| 传感器引脚 | Arduino 引脚 |
|---|---|
| - (GND) | GND |
| + (VCC) | 悬空不接 |
| S (信号) | A0 |
Nokia 5110 LCD (8 根线)
| LCD 引脚 | Arduino 引脚 |
|---|---|
| RST | 12 |
| CE | 11 |
| DC | 10 |
| DIN | 9 |
| CLK | 8 |
| VCC | 3.3V |
| LIGHT | GND (接地开启背光) |
| GND | GND |
步骤 4:核心代码逻辑
主程序包含两个文件:VoltMeter.ino (主逻辑) 和 ui.c (界面图形数据)。
电压读取核心函数
float readVoltage() {
sensorValue = analogRead(sensorPin); // 读取 ADC 值 (0-1023)
vout = (sensorValue * 5.0) / 1024.0; // 转换为电压 (0-5V)
vin = vout / (R2 / (R1 + R2)); // 反推输入电压 (0-25V)
return vin;
}
若自制分压电路,只需修改 R1 和 R2 变量值即可。
主程序流程
- 初始化串口、LCD,显示启动画面 3 秒
- 显示主界面 UI (含电压单位、标尺等图形)
- 每秒读取一次电压,转为字符串并在 LCD 指定位置显示
- 同时串口输出数值,便于电脑端记录
完整代码 (VoltMeter.ino)
#include
// 引脚: CLK=8, DIN=9, DC=10, RST=12, CE=11
LCD5110 lcd(8, 9, 10, 12, 11);
extern unsigned char BigNumbers[]; // 大号数字字体
extern uint8_t ui[]; // 主界面图形
extern uint8_t startScreen[]; // 启动画面
float voltage = 0.0;
int sensorPin = A0;
float sensorValue = 0.0f;
String voltageString = "0.0";
int stringLength = 0;
float vout = 0.0;
float vin = 0.0;
float R1 = 30000.0;
float R2 = 7500.0;
void setup() {
Serial.begin(9600);
lcd.InitLCD();
lcd.drawBitmap(0, 0, startScreen, 84, 48); // 启动画面
lcd.update();
delay(3000);
lcd.setFont(BigNumbers);
delay(1000);
}
void loop() {
lcd.clrScr();
lcd.drawBitmap(0, 0, ui, 84, 48); // 绘制主界面
voltage = readVoltage();
Serial.println(voltage);
voltageString = String(voltage, 1); // 保留 1 位小数
stringLength = voltageString.length();
displayVoltage(stringLength); // 根据长度调整显示位置
lcd.update();
delay(1000);
}
float readVoltage() {
sensorValue = analogRead(sensorPin);
vout = (sensorValue * 5.0) / 1024.0;
vin = vout / (R2 / (R1 + R2));
return vin;
}
void displayVoltage(int length) {
switch (length) {
case 3: lcd.print(voltageString, 14, 19); break; // 如 "3.3"
case 4: lcd.print(voltageString, 2, 19); break; // 如 "12.5"
default: lcd.print(voltageString, 2, 19); break;
}
}
测试验证
作者使用可充电 AA 电池 (1.2V)、18650 锂电池 (3.7V)、12V 报警电池测试,读数与专业万用表非常接近,验证了项目的实用性。
进阶建议
- 增加电池电量百分比显示 (需根据电池类型建立电压-电量曲线)
- 添加数据记录功能 (配合 SD 卡模块)
- 设计 3D 打印外壳,做成便携式万用表
- 扩展交流电压测量 (需整流滤波电路)
制造工艺
- 树莓派打造空气质量与气象站:InfluxDB+Grafana可视化
- 用 Arduino UNO 和 OLED 显示屏制作经典 Pong 游戏:分步教程
- 用 Arduino Nano 和 Nokia 5110 LCD 自制 20kHz 示波器:简易 DIY 指南
- Arduino 与智能手机打造智能电压表——简单易做的 DIY 项目
- Arduino Due 驱动 3.2″ TFT 实现温度监测与实时时钟
- 基于 Arduino Mega 与 Nextion 显示屏的交互式气象站
- Arduino DIY 电压表:Nokia 5110 屏幕显示,手把手教学
- 使用 Nextion 显示屏构建 Fridgeye 应用:分步指南
- Arduino 合成乐音:从零实现 88 键钢琴全音域
- Arduino GPS与TFT触摸屏扩展板:实时定位显示项目
- 高级智能电池充电器:多路复用与数字显示
- 信用卡大小 Arduboy 克隆机:Arduino Nano + I²C OLED 复古游戏机自制