ESP8266-BH1750FVI数字光照传感器采集光照推送ThingsPanel
发布日期:
这个教程的目的是通过ESP8266开发板采集BH1750FVI数字光强传感器的数据,并在开源物联网平台实现数据监测。
设备介绍
- ESP8266:类型: 它是一个低成本的Wi-Fi微控制器模块。特点:嵌入式的TCP/IP协议栈。低功耗, 在睡眠模式下只需要微安培的电流。GPIO(通用输入输出)引脚,用于与其他硬件设备通信。可以用作Wi-Fi接入点或Wi-Fi客户端。被广泛地用于IoT项目,如智能家居设备。开发环境:使用Arduino IDE,NodeMCU或其他工具进行编程。支持多种编程语言,如Lua、MicroPython、C++等。
- BH1750FVI:类型: 是一款数字光强传感器。特点:可以直接通过I²C(互补型数字接口)与微控制器通信。能测量的范围为1 - 65535 lx(勒克斯,光照强度的单位)。高精度且稳定的性能。通常用于光强测量,如天气站、手机屏幕亮度调节等。使用:可以很容易地与Arduino、ESP8266、Raspberry Pi等平台集成。多数开发平台都有现成的库支持BH1750FVI,这使得开发变得非常简单。
总的来说,这两个模块在IoT(物联网)项目中非常受欢迎,因为它们都是低成本、高效能的硬件,能够轻松地与其他硬件和在线服务集成。
接线已经接好
在ThingsPanel中的监测效果
接线
具体对照可看文首图片
- BH1750FVI的SCL接入到ESP12-F的P2的i014
- BH1750FVI的DAT接入到ESP12-F的P1的i02
- BH1750FVI的ADDR接入到ESP12-F的P1的GND
刷写代码
如下代码中的配置参数中,部分需要修改,已经备注。其中MQTT连接部分,要在ThingsPanel平台创建设备。创建设备后,在参数编辑这里会获得连接信息。
// WiFi设置
const char* ssid = "Redmi"; 需要改成你自己的
const char* password = "123456789";需要改成你自己的
// MQTT服务器设置
const char* mqttServer = "dev.thingspanel.cn";
const int mqttPort = 1883;
const char* mqttUser = "e7dbb954-6693-4a1c-8b06-3889a69d8d27";需要改成你自己的
const char* mqttPassword = ""; // 密码为空
const char* mqtt_topic = "device/attributes"; // MQTT主题
#include <ESP8266WiFi.h>
#include <PubSubClient.h>
#include <ArduinoJson.h>
#include <Wire.h>
#include <BH1750.h>
// WiFi设置
const char* ssid = "Redmi";
const char* password = "123456789";
// MQTT服务器设置
const char* mqttServer = "dev.thingspanel.cn";
const int mqttPort = 1883;
const char* mqttUser = "e7dbb954-6693-4a1c-8b06-3889a69d8d27";
const char* mqttPassword = ""; // 密码为空
const char* mqtt_topic = "device/attributes"; // MQTT主题
// BH1750FVI设置
BH1750 lightMeter;
WiFiClient espClient;
PubSubClient client(espClient);
void setup() {
Serial.begin(115200);
// 初始化I2C
Wire.begin(2, 14); // SDA (i02) is on GPIO2, SCL (i014) is on GPIO14
lightMeter.begin();
// 连接WiFi
WiFi.begin(ssid, password);
while (WiFi.status() != WL_CONNECTED) {
delay(1000);
Serial.println("Connecting to WiFi...");
}
Serial.println("Connected to WiFi");
// 设置MQTT服务器并连接
client.setServer(mqttServer, mqttPort);
reconnectMQTT();
}
void loop() {
// 检查WiFi和MQTT连接状态
if (WiFi.status() != WL_CONNECTED) {
reconnectWiFi();
}
if (!client.connected()) {
reconnectMQTT();
}
client.loop(); // 处理MQTT的incoming messages
float lux = lightMeter.readLightLevel();
Serial.println("Light intensity: " + String(lux) + " lx");
sendMQTTMessage(lux);
delay(1000); // 检查间隔,可以根据需要调整
}
void reconnectWiFi() {
while (WiFi.status() != WL_CONNECTED) {
Serial.println("Reconnecting to WiFi...");
WiFi.begin(ssid, password);
delay(5000);
}
Serial.println("Connected to WiFi");
}
void reconnectMQTT() {
while (!client.connected()) {
Serial.println("Reconnecting to MQTT...");
if (client.connect("ESP8266Client", mqttUser, mqttPassword)) {
Serial.println("Connected to MQTT");
} else {
delay(5000);
}
}
}
void sendMQTTMessage(float luxValue) {
StaticJsonDocument<100> doc;
doc["LightIntensity"] = luxValue;
char jsonBuffer[100];
serializeJson(doc, jsonBuffer);
// 打印发送的JSON报文到串口监视器
Serial.print("Sending MQTT message: ");
Serial.println(jsonBuffer);
client.publish(mqtt_topic, jsonBuffer);
}