Arduino STM32+霍尔传感器+OLED显示屏制作转数计数器

前言

之前尝试用红外检测、陀螺仪姿态检测,效果都不好,只有这种磁吸感应方式最可靠,它的原理类似于自行车用的码表。

1. 材料清单

1. STM32F103C8T6黑色开发板1个(也可以使用蓝色板)

2. 霍尔传感器模块

3. OLED屏幕(4管脚)

4. 杜邦线、面包板、导线插针若干

2. 硬件连接

电路原理图如下

实物连接效果

扫描二维码关注公众号,回复: 11338536 查看本文章

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. 实现效果

视频已上传Bilibili:[DIY] 用Arduino自制的航模遥控器信号能传输多远?19元的NRF24L01无线模块遥控距离测试

猜你喜欢

转载自blog.csdn.net/weixin_42268054/article/details/106135918