仅需13元,改成智能灯,根据环境亮度自动开关灯
发布日期:
截止2023年09月,这个可能是比较便宜的改造智能灯的方案,结合ThingsPanel物联网平台,实现光线暗了开灯,亮了关灯。
思路
这个代码项目使用了ESP8266-01S继电器,使用220v转5v进行供电,使用MQTT协议与ThingsPanel物联网测试平台进行通信。
所需材料
1、ESP-01S继电器 8元
2、200v转5v电源 5元【强电操作,请务必注意安全】
3、ESP-01S刷写工具(最好买带黄色8孔插座的)
源代码
如下信息需要修改成自己的
- WiFi用户名密码
- MQTT用户名
- 订阅主题名
- 设备ID
#include <ESP8266WiFi.h>
#include <PubSubClient.h>
#include <ArduinoJson.h>
// WiFi网络设置
const char* ssid = "Redmi";
const char* password = "123456789";
// MQTT服务器设置
const char* mqtt_server = "dev.thingspanel.cn";
const int mqtt_port = 1883;
const char* mqtt_user = "cb571775-cc97-6a3b-1370-c2a94880f87f";
const char* mqtt_pass = ""; // No password specified
const char* relay_topic = "device/attributes";
const char* relay_callback_topic = "device/attributes/cb571775-cc97-6a3b-1370-c2a94880f87f";
// 继电器引脚设置
const int relay_pin = 0;
WiFiClient espClient;
PubSubClient client(espClient);
long lastMsg = 0;
int relay_state = 0;
void setup() {
Serial.begin(115200);
setup_wifi();
client.setServer(mqtt_server, mqtt_port);
client.setCallback(callback);
pinMode(relay_pin, OUTPUT);
digitalWrite(relay_pin, LOW);
}
void setup_wifi() {
delay(10);
Serial.print("Connecting to ");
Serial.println(ssid);
WiFi.begin(ssid, password);
while (WiFi.status() != WL_CONNECTED) {
delay(500);
Serial.print(".");
}
Serial.println("");
Serial.print("WiFi connected - IP address: ");
Serial.println(WiFi.localIP());
}
void callback(char* topic, byte* message, unsigned int length) {
Serial.print("Message arrived [");
Serial.print(topic);
Serial.print("] ");
// 解析JSON消息
DynamicJsonDocument doc(1024);
deserializeJson(doc, message, length);
int switch_state = doc["switch"];
Serial.println(switch_state);
if (strcmp(topic, relay_callback_topic) == 0) {
if (switch_state == 1) {
relay_state = 1;
digitalWrite(relay_pin, HIGH);
}
else if (switch_state == 0) {
relay_state = 0;
digitalWrite(relay_pin, LOW);
}
sendState();
}
}
void reconnect() {
while (!client.connected()) {
Serial.print("Attempting MQTT connection...");
//设备ID需要修改成自己的
if (client.connect("cb571775-cc97-6a3b-1370-c2a94880f87f", mqtt_user, mqtt_pass)) {
Serial.println("connected");
client.subscribe(relay_callback_topic);
} else {
Serial.print("failed, rc=");
Serial.print(client.state());
Serial.println(" try again in 5 seconds");
delay(5000);
}
}
}
void sendState() {
// 创建JSON文档并发布继电器状态
DynamicJsonDocument doc(1024);
doc["switch"] = relay_state;
char buffer[1024];
serializeJson(doc, buffer);
client.publish(relay_topic, buffer);
}
void loop() {
if (!client.connected()) {
reconnect();
}
client.loop();
long now = millis();
if (now - lastMsg > 2000) {
lastMsg = now;
sendState();
}
}