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
如果觉得我的文章对您有用,请随意打赏。您的支持将鼓励我继续创作!