Arduino开发实例-DIY风速测量及显示

DIY风速测量及显示

1、应用介绍

本次实例将使用一款具有 NPN 脉冲输出的数字风速计传感器。 NPN脉冲输出风速计效果好,性价比高。另外它仅在 5V 电源下工作。

在这里插入图片描述

在本次实例中,将此风速计传感器与 Arduino 板和 0.96 英寸 OLED 显示屏连接。 OLED显示屏将以米/秒为单位显示风速,并可测量每秒0至70米范围内的风速。

2、硬件接线图

本次使用的风速计传感器是一种NPN 脉冲输出风速计传感器是 3 杯型风速计,能够测量高达每秒 70 米或 156 英里/小时的风速。 它由外壳、风杯、电路模块组成。与模拟输出版本的风速计不同,这种风速计输出脉冲更准确地反映了风速。 此外,这款风速计完全防水,安装设计稳定,适合户外应用。它在 5 伏至 30 伏直流电压之间工作。 输出为脉冲型,分辨率为 0.0875 米/秒。 测风范围在每秒 0 到 70 米之间。

本次使用到的风速计传感器引脚如下:

引脚 标志 描述
棕色线 VCC 电源正极
黑色线 GND 接地(负极)
绿色线 (PNP)输出 脉冲输出
蓝色线 (NPNR)输出 脉冲输出

本次实例使用到的硬件配件如下:

序号 配件名称 数量
1 Arduino Nano 1
2 0.96” I2C OLED 显示屏 1
3 风速计传感器 1
4 杜邦线 10

本次实例的硬件接线图如下:

在这里插入图片描述

OLED显示屏和风速计传感器通过 Arduino 的 5 伏引脚供电。 风速计的输出引脚连接到 Arduino 的 D2 引脚。 同样,LCD 连接到 Arduino 的 I2C 引脚。

关于SSD1306 OLED驱动请参考:

3、驱动实现

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
#include <Adafruit\_GFX.h>
#include <Adafruit\_SSD1306.h>

#define SCREEN\_WIDTH 128 // OLED显示屏宽度
#define SCREEN\_HEIGHT 64 // OLED显示屏高度

#define OLED\_RESET -1 // OLED显示屏复位引脚(I2C不使用)
Adafruit_SSD1306 display(SCREEN_WIDTH, SCREEN_HEIGHT, &Wire, OLED_RESET);

unsigned long lastDebounceTime = 0; // 最后一次切换输出引脚
unsigned long debounceDelay = 1000; // 去抖时间

int pinInterrupt = 2;

int Count = 0;

void onChange()
{
if ( digitalRead(pinInterrupt) == LOW )
Count++;
}


void setup()
{
Serial.begin(115200); // 初始化串口
pinMode( pinInterrupt, INPUT_PULLUP);// 设置中断

// 注册中断服务
attachInterrupt( digitalPinToInterrupt(pinInterrupt), onChange, FALLING);
// OLED初始化
display.begin(SSD1306_SWITCHCAPVCC, 0x3C);
delay(500);
display.clearDisplay();
display.setTextColor(WHITE);

}

void loop()
{
if ((millis() - lastDebounceTime) > debounceDelay)
{
lastDebounceTime = millis();

Serial.print((Count \* 8.75)/100);

// 清屏
display.clearDisplay();

display.setTextSize(2);
display.setCursor(4, 0);
display.print("Anemometer");

display.setCursor(2, 20); //oled display
display.setTextSize(2);
display.println("Wind Speed");

display.setCursor(0, 40); //oled display
display.setTextSize(3);
display.print((Count \* 8.75)/100);
display.setCursor(70, 45);
display.setTextSize(2);
display.println(" m/s");
display.display();

Count = 0;

Serial.println("m/s");

}
delay(1);
}

代码如何运行?

1)导入依赖库

1
2
3
#include <Adafruit\_GFX.h>
#include <Adafruit\_SSD1306.h>

2)设备定义

1
2
3
4
5
6
#define SCREEN\_WIDTH 128 // OLED显示屏宽度
#define SCREEN\_HEIGHT 64 // OLED显示屏高度

#define OLED\_RESET -1 // OLED显示屏复位引脚(I2C不使用)
Adafruit_SSD1306 display(SCREEN_WIDTH, SCREEN_HEIGHT, &Wire, OLED_RESET);

3)定义风速计算变量

1
2
3
4
5
unsigned long lastDebounceTime = 0;  // 最后一次切换输出引脚
unsigned long debounceDelay = 1000; // 去抖时间
int pinInterrupt = 2;
int Count = 0;

4)设备初始化

setup函数中,初始化OLED、串口等。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
void setup()
{
Serial.begin(115200); // 初始化串口
pinMode( pinInterrupt, INPUT_PULLUP);// 设置中断

// 注册中断服务
attachInterrupt( digitalPinToInterrupt(pinInterrupt), onChange, FALLING);
// OLED初始化
display.begin(SSD1306_SWITCHCAPVCC, 0x3C);
delay(500);
display.clearDisplay();
display.setTextColor(WHITE);

}

函数onChange用于风速计传感器脉冲计数。

1
2
3
4
5
6
void onChange()
{
if ( digitalRead(pinInterrupt) == LOW )
Count++;
}

5)风速计算及显示

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
void loop()
{
if ((millis() - lastDebounceTime) > debounceDelay)
{
lastDebounceTime = millis();

Serial.print((Count \* 8.75)/100);

// 清屏
display.clearDisplay();

display.setTextSize(2);
display.setCursor(4, 0);
display.print("Anemometer");

display.setCursor(2, 20); //oled display
display.setTextSize(2);
display.println("Wind Speed");

display.setCursor(0, 40); //oled display
display.setTextSize(3);
display.print((Count \* 8.75)/100);
display.setCursor(70, 45);
display.setTextSize(2);
display.println(" m/s");
display.display();

Count = 0;

Serial.println("m/s");

}
delay(1);
}

文章来源: https://iotsmart.blog.csdn.net/article/details/128170841