💡 ESP32 Mini打印机:打印头缺纸检测模块
实时监测打印纸状态,避免空打损坏打印头
基于原始代码的实现与原理分析
📌 为什么需要缺纸检测?
打印头在无纸情况下继续工作,可能导致:
- 打印头损坏:热敏打印头直接接触胶辊,长时间空转磨损
- 浪费电量:电机空转消耗电池
- 用户体验差:用户以为在打印,实际无输出
因此,一个可靠的缺纸检测模块是打印机的必备功能。
直观理解:
就像复印机没纸时会亮红灯提醒,我们的打印机也需要一双“眼睛”盯着纸有没有。
一、硬件原理简述
传感器类型
常用缺纸检测有两种方式:
- 光电传感器:纸张经过时反射/遮挡光线,输出电平变化
- 微动开关:纸张顶起机械触点,开关闭合/断开
本例使用光电传感器,有纸时输出低电平(0),无纸时输出高电平(1)。
引脚定义
#define PIN_PAPER 24 // 缺纸检测传感器输入引脚
二、代码实现(原始版本)
以下代码实现了基础的缺纸状态读取和中断触发检测。
1. 状态定义
#include <Arduino.h>
#define PIN_PAPER 24
typedef enum {
PAPER_STATUS_NORMAL = 0, // 有纸(低电平)
PAPER_STATUS_LACK = 1, // 无纸(高电平)
} paper_status_t;
volatile paper_status_t status = PAPER_STATUS_NORMAL;
- 使用枚举提高可读性
volatile修饰全局状态,因为中断中会修改
2. 轮询读取函数
void read_paper_statue(){
if(digitalRead(PIN_PAPER) == PAPER_STATUS_NORMAL){
Serial.println("有纸");
status = PAPER_STATUS_NORMAL;
} else {
Serial.println("无纸");
status = PAPER_STATUS_LACK;
}
}
- 直接读取引脚电平并更新状态
- 打印调试信息
3. 中断服务函数
void paper_isr() {
status = PAPER_STATUS_LACK;
}
- 当引脚检测到上升沿(无纸)时触发,立即置为缺纸状态
4. 初始化函数
void lack_init() {
pinMode(PIN_PAPER, INPUT);
attachInterrupt(PIN_PAPER, paper_isr, RISING);
}
- 设置引脚为输入模式
- 附加上升沿中断,当无纸时触发
四、使用总结
| 关键词/技巧 | 一句话记忆 |
|---|---|
pinMode(INPUT) | 设置输入引脚,倾听传感器的声音 |
attachInterrupt | 给引脚配个电话,一有变化就打电话 |
RISING 触发模式 | 只关心无纸(上升沿)这一种变化 |
volatile | 告诉编译器这个变量可能被中断偷偷改掉 |
| 轮询 + 中断 | 两种方式配合,确保状态及时更新 |
五、写在最后
缺纸检测是打印机的“眼睛”,原始代码提供了最基础的中断触发和轮询读取逻辑,能满足基本功能演示。但在实际产品中,还需要考虑消抖、状态恢复、减少调试输出等问题。