Arduino STM32+霍爾傳感器+OLED顯示屏製作轉數計數器

前言

之前嘗試用紅外檢測、陀螺儀姿態檢測,效果都不好,只有這種磁吸感應方式最可靠,它的原理類似於自行車用的碼錶。

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無線模塊遙控距離測試

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章