前言
之前嘗試用紅外檢測、陀螺儀姿態檢測,效果都不好,只有這種磁吸感應方式最可靠,它的原理類似於自行車用的碼錶。
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無線模塊遙控距離測試