前言
之前尝试用红外检测、陀螺仪姿态检测,效果都不好,只有这种磁吸感应方式最可靠,它的原理类似于自行车用的码表。
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. 实现效果
视频已上传Bilibili:[DIY] 用Arduino自制的航模遥控器信号能传输多远?19元的NRF24L01无线模块遥控距离测试