37款传感器与模块的提法,在网络上广泛流传,其实Arduino能够兼容的传感器模块肯定是不止37种的。鉴于本人手头积累了一些传感器和执行器模块,依照实践出真知(一定要动手做)的理念,以学习和交流为目的,这里准备逐一动手试试多做实验,不管成功与否,都会记录下来——小小的进步或是搞不掂的问题,希望能够抛砖引玉。
【Arduino】168种传感器模块系列实验(资料代码+仿真编程+图形编程)
实验一百二十二:GY-302 数字量光强度检测 光照传感器 BH1750FVI 光线检测模块
GY-302光照传感器模块的实验环境
一、GY-302光照传感器模块实验所需硬件清单
Arduino Uno开发板 X1
杜邦线 若干(备了9条)
GY-302光照传感器模块X1
IIC/I2C 1602 LCD液晶屏模块X1
高电平触发有源蜂鸣器模块X1
LED发光二极管(绿、蓝色)X2
高电平触发单路5V继电器模块X1
Proto Shield 原型扩展板(带mini面包板)X1
程序四:使用OLED显示环境光照度值
(1)实验接线示意图
(2)Arduino参考开源代码
/*
【Arduino】168种传感器模块系列实验(资料代码+仿真编程+图形编程)
程序四:使用OLED显示环境光照度值
*/
#include <Wire.h>
#include <BH1750.h>
BH1750 lightMeter;
//设置OLED相关参数
#include <Adafruit_SSD1306.h>
#define OLED_ADDR 0x3C
#define SCREEN_WIDTH 128
#define SCREEN_HEIGHT 64
#define OLED_RESET 1
Adafruit_SSD1306 display(SCREEN_WIDTH, SCREEN_HEIGHT, &Wire, OLED_RESET);
void setup() {
//初始化监视器序列
Serial.begin(9600);
// 初始化和取消显示
display.begin(SSD1306_SWITCHCAPVCC, OLED_ADDR);
display.display();
delay(2000);
display.clearDisplay();
// 初始化总线 I2C
Wire.begin();
lightMeter.begin();
Serial.println(F("BH1750传感器开始测量"));
}
void loop() {
float lux = lightMeter.readLightLevel();
//监控系列
Serial.print("光照: ");
Serial.print(lux);
Serial.println(" lx");
//OLED显示
display.setTextColor(WHITE);
display.setTextSize(2);
display.setCursor(30, 0);
display.println("BH1750");
display.setCursor(15, 20);
display.print(lux, 1);
display.println(" lx");
display.setTextSize(1);
display.setCursor(15, 50);
display.println("www.Arduino.com");
display.display();
delay(1000);
display.clearDisplay();
}
(3)实验串口返回情况
(4)实验场景图
程序五:测量环境光照度值
(1)Arduino参考开源代码
/*
【Arduino】168种传感器模块系列实验(资料代码+仿真编程+图形编程)
程序五:测量环境光照度值
*/
#include <Wire.h>
#include <math.h> //导入math库
int BH1750address = 0x23; //i2c地址
byte buff[2];
void setup(){
Wire.begin();
Serial.begin(57600);//初始化串口
}
void loop(){
int i;
uint16_t val=0;
BH1750_Init(BH1750address);
delay(200);
if(2==BH1750_Read(BH1750address))
{
val=((buff[0]<<8)|buff[1])/1.2;
Serial.print(val,DEC); //串口打印光照值
Serial.println("lux");
}
delay(150);
}
int BH1750_Read(int address)
{
int i=0;
Wire.beginTransmission(address);
Wire.requestFrom(address, 2);
while(Wire.available())
{
buff[i] = Wire.read();//接收一个字节
i++;
}
Wire.endTransmission();
return i;
}
void BH1750_Init(int address)
{
Wire.beginTransmission(address);
Wire.write(0x10);//1lx 分辨率 120ms
Wire.endTransmission();
}
(2)实验串口返回情况
程序六:Arduino 和 GY-302 模块
(1)Arduino参考开源代码
/*
【Arduino】168种传感器模块系列实验(资料代码+仿真编程+图形编程)
程序六:Arduino 和 GY-302 模块
*/
#include <Wire.h>
#include <BH1750.h>//导入BH1750库
BH1750 GY302; // 初始化 BH1750 对象
void setup() {
Serial.begin(9600); //初始化串口
GY302.begin(); //初始化GY-302模块
}
void loop() {
uint16_t lux = GY302.readLightLevel();// 从模块中读取
Serial.print("Light: ");// 显示到串口监视器
Serial.print(lux);
Serial.println(" lx");
delay(1000);//暂停1秒
}
(2)实验串口返回情况
程序七:通过1602 LCD屏显示光照值
(1)实验接线示意图
(2)Arduino参考开源代码
/*
【Arduino】168种传感器模块系列实验(资料代码+仿真编程+图形编程)
程序七:通过1602 LCD屏显示光照值
*/
#include <Wire.h>
#include <BH1750.h>//导入BH1750驱动库
#include <LiquidCrystal_I2C.h>//导入1602 LCD驱动库
BH1750 lightMeter;
LiquidCrystal_I2C lcd(0x27,16,2);//设置1602 LCD参数
void setup(){
lcd.init(); //初始化1602 LCD显示屏
lcd.init();
lcd.backlight();
lcd.setCursor(0,0);
lcd.print("Light intensity");
lcd.setCursor(0,1);
Serial.begin(9600);//初始化串口
Wire.begin();
lightMeter.begin();
Serial.println(F("BH1750 Test"));
}
void loop() {
uint16_t lux = lightMeter.readLightLevel();//读取BH1750数据
Serial.print("Light: ");
Serial.print(lux);
Serial.println(" lx");
lcd.setCursor(0,1);
lcd.print(lux);
lcd.println(" LUX ");
delay(1000);
}
(3)实验串口返回情况
(4)实验场景图