仅需13元,改成智能灯,根据环境亮度自动开关灯

2023-09-16

截止2023年09月,这个可能是比较便宜的改造智能灯的方案,结合ThingsPanel物联网平台,实现光线暗了开灯,亮了关灯。

思路

这个代码项目使用了ESP8266-01S继电器,使用220v转5v进行供电,使用MQTT协议与ThingsPanel物联网测试平台进行通信。

所需材料

1、ESP-01S继电器 8元

2、200v转5v电源 5元【强电操作,请务必注意安全】

3、ESP-01S刷写工具(最好买带黄色8孔插座的)

源代码

如下信息需要修改成自己的

  1. WiFi用户名密码
  2. MQTT用户名
  3. 订阅主题名
  4. 设备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();
  }
}


Github
Gitee
微信交流群
QQ交流群
商务咨询
北京极益科技有限公司 版权所有 ICP:京ICP备15045763号-12