Arduino STM32+霍尔传感器+OLED显示屏制作转数计数器
2025-10-29 来源:bilibili
前言
之前尝试用红外检测、陀螺仪姿态检测,效果都不好,只有这种磁吸感应方式最可靠,它的原理类似于自行车用的码表。
1. 材料清单
1. STM32F103C8T6黑色开发板1个(也可以使用蓝色板)

2. 霍尔传感器模块

3. OLED屏幕(4管脚)

4. 杜邦线、面包板、导线插针若干
2. 硬件连接
电路原理图如下

电路原理图
实物连接效果

3. Arduino代码
通过简单的几行代码,将它的输出显示在串口上。我们可以发现,当磁铁靠近时,它的输出会由1变成0。
再加上简单的下降沿检测就可以用来计数了,为了将数字显示出来,我使用了一个oled屏幕,又添加了一点代码,但是由于屏幕这段代码执行的时间较长,会导致计数错误。所以我利用计时,让程序只在轮子停止转动时才刷新屏幕。
给32开发板烧写程序前,要先完成环境配置,并安装Adafruit GFX和Adafruit SSD1306两个库
/* ArduinoSTM32开发板+霍尔传感器=转数计数器
* PB1 -> Hall_D0
* PB6 -> SCL
* PB7 -> SDA
*/
#include <SPI.h>
#include <Wire.h>
#include <Adafruit_GFX.h>
#include <Adafruit_SSD1306_STM32.h>
#define OLED_RESET 4
Adafruit_SSD1306 display(OLED_RESET);
int tR, tG, tB, tBP;
#define LOGO16_GLCD_HEIGHT 16
#define LOGO16_GLCD_WIDTH 16
#if (SSD1306_LCDHEIGHT != 64)
#error("Height incorrect, please fix Adafruit_SSD1306.h!");
#endif
void setup()
{
pinMode(PB1, INPUT);
Serial.begin(9600);
display.begin(SSD1306_SWITCHCAPVCC, 0x3C); // initialize with the I2C addr 0x3D (for the 128x64)
display.display();
delay(1000);
}
int state = 1;
int lastState = 1;
int num = 0;
unsigned long lastTime = 0;
void loop()
{
state = digitalRead(PB1);
if(!state and lastState){
num += 1;
Serial.println(num);
lastTime = millis();
}
lastState = state;
unsigned long now = millis();
if(now - lastTime > 5000){
display.clearDisplay(); //清理1306屏幕,准备显示:
display.setTextSize(5); //设置字体大小,正比
display.setTextColor(WHITE); //设置字体颜色白色
display.setCursor(2,18); //设置字体的起始位置
display.println(num); //输出num
display.display(); //把缓存都显示
}
}
4. 实现效果
测试视频:https://www.bilibili.com/video/BV1kk4y1673K/
- 六大全新产品系列推出,MCX A微控制器家族迎来创新
- 意法半导体全新STM32C5系列,重新定义入门级微控制器性能与价值,赋能万千智能设备
- 模组复用与整机重测在SRRC、CCC、CTA/NAL认证中的实践操作指南
- 有源晶振与无源晶振的六大区别详解
- 英飞凌持续巩固全球微控制器市场领导地位
- 使用 Keil Studio for Visual Studio Code开发 STM32 设备
- 从控制到系统:TI利用边缘AI重塑嵌入式MCU的边界
- 蓝牙信道探测技术原理与开发套件实践
- Microchip 推出生产就绪型全栈边缘 AI 解决方案,赋能MCU和MPU实现 智能实时决策
- LoRa、LoRaWAN、NB-IoT与4G DTU技术对比及工业无线方案选型分析




