37款传感器与模块的提法,在网络上广泛流传,其实Arduino能够兼容的传感器模块肯定是不止37种的。鉴于本人手头积累了一些传感器和执行器模块,依照实践出真知(一定要动手做)的理念,以学习和交流为目的,这里准备逐一动手试试多做实验,不管成功与否,都会记录下来——小小的进步或是搞不掂的问题,希望能够抛砖引玉。
【Arduino】168种传感器模块系列实验(资料代码+仿真编程+图形编程)
实验六十九:GY30 数字光强度 光照传感器 BH1750FVI 环境光度检测模块
GY-30光强度传感器的实验环境
一、GY-30光强度传感器模块实验所需硬件清单
Arduino Uno开发板 X1
0.96寸OLED显示屏X1
杜邦线 若干(备了9条)
GY-30光照强度传感器模块X1
高电平触发有源蜂鸣器模块X1
LED发光二极管(绿、蓝色)X2
高电平触发单路5V继电器模块X1
蓝色诺基亚5110 LCD液晶屏模块X1
Proto Shield 原型扩展板(带mini面包板)X1
二、传感器模块实验所需软件平台
代码编程 Arduino IDE (版本1.8.19)
仿真编程 Linkboy (版本V4.6.3)
图形编程 Mind+ (版本 V1.7.0 RC2.0)
以及编玩边学(线上平台https://ide.codepku.com/?type=Arduino)
三、实验接线示意图
程序三:不带库的 BH1750FVI 控制
(1)Arduino参考开源代码
/*
【Arduino】168种传感器模块系列实验(资料代码+仿真编程+图形编程)
程序三:不带库的 BH1750FVI 控制
实验接线:
GY-30 UNO
VCC —— 5V
GND —— GND
SCL —— A5
SDA —— A4
*/
#include <Wire.h>
#define BH_1750 0x23//模块的标准 I2C 地址为 0x23
#define DATA_REG_RESET 0b00000111
#define POWER_DOWN 0b00000000
#define POWER_ON 0b00000001
enum BH1750Mode {
//“一次”模式的优点是模块在测量后自动进入关机模式,从而节省电力
CHM = 0b00010000, //CHM: 连续 H 分辨率模式
CHM_2 = 0b00010001, //CHM_2: 连续 H 分辨率模式 2
CLM = 0b00010011, //CLM: 连续 L 分辨率模式
OTH = 0b00100000, //OTH:一次性 H 分辨率模式
OTH_2 = 0b00100001, //OTH_2:一次性 H 分辨率模式 2
OTL = 0b00100011 // OTL:一次 L 分辨率模式
} mode;
//输入 MTReg 值 (measuringTimeFactor) 作为因子,
//并从中计算 MT 寄存器的字节值
float measuringTimeFactor;
void setup() {
Serial.begin(9600);
Wire.begin();
mode = CHM;
measuringTimeFactor = 1;
setMode();
setMeasuringTime();
delay(200);
}
void loop() {
getLux();
delay(100);
}
void getLux() {
uint16_t rawLux;
float lux;
rawLux = readBH1750();
if ((mode == CHM_2) || (mode == OTH_2)) {
//输入 MTReg 值 (measuringTimeFactor) 作为因子,
//并从中计算 MT 寄存器的字节值
lux = (rawLux / 2.4) / measuringTimeFactor;
}
else {
lux = (rawLux / 1.2) / measuringTimeFactor;
}
Serial.print(F("光强度: "));
Serial.print(lux);
Serial.println(F(" Lux"));
}
void powerDown() {
writeBH1750(POWER_DOWN);
}
void powerOn() {
writeBH1750(POWER_ON);
setMode();
}
void dataRegReset() {
writeBH1750(DATA_REG_RESET);
}
void setMode() {
writeBH1750(mode);
}
//通过控制代码设置分辨率
void setMeasuringTime() {
byte mt = round(measuringTimeFactor * 69);
//计算字节的最佳方法是通过二进制操作
byte highByteMT = ((mt >> 5) | 0b01000000);
byte lowByteMT = (mt & 0b01111111);
lowByteMT |= 0b01100000;
writeBH1750(highByteMT);
writeBH1750(lowByteMT);
}
uint16_t readBH1750() {
uint8_t MSbyte, LSbyte;
Wire.requestFrom(BH_1750, 2);
if (Wire.available()) {
MSbyte = Wire.read();
LSbyte = Wire.read();
}
return ((MSbyte << 8) + LSbyte);
}
void writeBH1750(byte val) {
Wire.beginTransmission(BH_1750);
Wire.write(val);
Wire.endTransmission();
}
(2)实验串口返回情况
(3)实验串口绘图器返回情况
程序四:读取光照强度传感器的动态数值
(1)实验开源图形编程(Mind+、编玩边学)
(2)实验串口返回情况
(3)实验串口绘图器返回情况
程序五:测试环境光亮强度
(1)Arduino参考开源代码
/*
【Arduino】168种传感器模块系列实验(资料代码+仿真编程+图形编程)
程序五:测试环境光亮强度
实验接线:
GY-30 UNO
VCC —— 5V
GND —— GND
SCL —— A5
SDA —— A4
*/
#include <Wire.h>
#define ADDRESS_BH1750FVI 0x23 //此模块的ADDR="L"
#define ONE_TIME_H_RESOLUTION_MODE 0x20
//一次性H分辨率模式:
//分辨率 = 1 勒克斯
//测量时间(最大值)= 180ms
//每次测量后断电
byte highByte = 0;
byte lowByte = 0;
unsigned int sensorOut = 0;
unsigned int illuminance = 0;
void setup() {
Wire.begin();
Serial.begin(115200);
}
void loop() {
//“通知”匹配设备
Wire.beginTransmission(ADDRESS_BH1750FVI);
//设置操作模式
Wire.write(ONE_TIME_H_RESOLUTION_MODE);
Wire.endTransmission();
delay(180);
//要求Arduino从传感器读回2个字节
Wire.requestFrom(ADDRESS_BH1750FVI, 2);
highByte = Wire.read(); // 获取高字节
lowByte = Wire.read(); // 获取低字节
sensorOut = (highByte << 8) | lowByte;
illuminance = sensorOut / 1.2;
Serial.print(illuminance);
Serial.println(" lux");
delay(10);
}
(2)实验串口返回情况
(3)实验串口绘图器返回情况