把一個廢柴插座轉眼變身遠程控制智能插座-Arduino-MQTT-Onenet-8266

該項目主要基於Arduino D1 mini(wemos)模塊和MQTT協議和移動Onenet物聯網雲平臺實現遠程控制

1、選插座一定要選擇這種花裏胡哨,內部空間大的,這樣便於後期改造

2、線路改造,可以看到進來兩根線一根線經過開關,結構簡單粗暴,便於改造
在這裏插入圖片描述

3、尋找合適的安裝位置,我這裏放了兩個3.3V的一路繼電器,和一個Arduino D1 MINI這種某寶一大堆,(本來準備把那個四路遙控器也安裝上去,但是無奈這個信號輸出是5V的所以不能用,用三極管改造一上午居然還給我搞壞了,氣死直接丟垃圾桶)
在這裏插入圖片描述
在這裏插入圖片描述
圖中畫圈區域就是改造區域,選用這個接線板的好處就是板載自帶5V電源,所以就不需要自己再接220VAC轉5V模塊了,直接上電測出5V電源連接到Arduino上的5V個GND即可,完成本項目所需的電源供應。因爲沒用到四路遙控模塊所以這裏連線非常簡單,就是繼電器信號線連接到D1和D2上即可。

4、打上熱熔膠,固定住元器件,(注意:熱熔膠在高溫下是導電的,如果你的插座比較好或者後期要用到大功率電器上,那麼儘量別用熱熔膠,選用其它膠水比如502這種),編寫程序,燒寫代碼,把螺絲擰上即可。
5、測試——效果完美,達到預期效果
在這裏插入圖片描述
在這裏插入圖片描述在這裏插入圖片描述
在這裏插入圖片描述
代碼:在這裏插入代碼片
由於部分代碼涉及隱私信息已用XXXXX代替,寫程序的時候注意修改即可
/*
Name: smartchazuo.ino
Created: 2019/12/2 17:26:00
Author: 60480
*/
#include <Arduino.h>
#include <ESP8266WiFi.h>
#include <ESP8266WiFiMulti.h>
#include <ESP8266HTTPClient.h>
#include <ESP8266httpUpdate.h>
#include <Ticker.h>
#include <PubSubClient.h>
#define DebugSerial Serial

#define JDQ1Pin D1
#define JDQ2Pin D2
#define BZLED D4 //D1mini是D4
ESP8266WiFiMulti WiFiMulti;
Ticker ticker1;
WiFiClient espClient;
PubSubClient PSClient(espClient);
const char* mqtt_server = “183.230.40.39”;
const char* DeviceID = “xxxxxx”;//設備ID
const char* ProductID = “xxxxxx”;//產品ID
const char* AuthInfo = “xxxxxx”;//鑑權信息
long lastMsg = 0;
char msg[100];
char tmp[100];
char d[3];
void setup() {
DebugSerial.begin(115200);
PSClient.setServer(mqtt_server, 6002);
PSClient.setCallback(callback);
WiFi.mode(WIFI_STA);
WiFiMulti.addAP("********", "**************");//WIFI賬號密碼
pinMode(BZLED, OUTPUT);
pinMode(JDQ1Pin, OUTPUT);
pinMode(JDQ2Pin, OUTPUT);
setup_wifi();
ticker1.attach(5, pubtoOnenet);//每隔發送數據到MQTT平臺
}
void loop() {
if (!PSClient.connected()) {
reconnect();
}
PSClient.loop();
}
//WIFI相關
void setup_wifi() {
unsigned long startTime = millis();
while (WiFiMulti.run() != WL_CONNECTED && millis() - startTime < 10000) {
digitalWrite(BZLED, HIGH);
delay(50);
digitalWrite(BZLED, LOW);
delay(50);
}
digitalWrite(BZLED, LOW);
}
void wificonncheck() {
// 檢查連接狀態
if (WiFi.status() == WL_CONNECTED)
{ //如果WiFi連接成功
digitalWrite(BZLED, LOW);
}
else
{ //WiFi連接不成功
digitalWrite(BZLED, HIGH);
setup_wifi();
}
}
//MQTT相關
void callback(char
topic, byte
payload, unsigned int length) {
if (payload[0] == ‘1’) {
if (payload[1] == ‘1’) {
digitalWrite(JDQ1Pin, LOW);
}
else
{
digitalWrite(JDQ1Pin, HIGH);
}
}
else if(payload[0]==‘2’)
{
if (payload[1] == ‘1’) {
digitalWrite(JDQ2Pin, LOW);
}
else
{
digitalWrite(JDQ2Pin, HIGH);
}
}
}
void pubtoOnenet() {
wificonncheck();//WIFI狀態檢測

snprintf(tmp, sizeof(tmp), "{\"JDQ1State\":1%d,\"JDQ2State\":2%d}", !digitalRead(JDQ1Pin),!digitalRead(JDQ2Pin));
uint16_t streamLen = strlen(tmp);
d[0] = '\x03';
d[1] = (streamLen >> 8);
d[2] = (streamLen & 0xFF);
snprintf(msg, sizeof(msg), "%c%c%c%s", d[0], d[1], d[2], tmp);
PSClient.publish("$dp", (uint8_t*)msg, streamLen + 3, false); //上傳onenet雲的語句

}
void reconnect() {
while (!PSClient.connected()) {
Serial.print(“Attempting MQTT connection…”);
// Attempt to connect

	if (PSClient.connect("xxxxxx", "xxxxxx", "xxxxxx")) {//設備ID;產品ID;鑑權信息
		Serial.println("connected");
		PSClient.subscribe("inTopic");
	}
	else {
		Serial.print("failed, 重連中...");
		Serial.print(PSClient.state());
		Serial.println(" try again in 5 seconds");
		// Wait 5 seconds before retrying
		delay(5000);
	}
}

}

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章