|
本帖最后由 dujq 于 2019-4-17 22:24 编辑
想做个wifi智能开关,在网上找了好久,没找到一个完整的教程,还是自己动脑筋做一个吧。当然首先要找一外壳
感觉有点大了,但是又一想,这样可以直接把电源做进去。用热转印做板
铁皮剪刀伺候
腐蚀好了,钻好孔,马马虎虎,不是很完美,焊接零件
那个AQH3223标称电流1.2A。我接到电视上两次就坏了,只好换上继电器
装起来,还不错啊。
分割线************************************************
硬件做好了,开始搞软件
物联网网站,开始用的是中移onenet,网站不会主动发送信息,需要不断去请求,这样每隔2秒请求一次开关状态,感觉比较暴力,偶尔还会出错。
后来找到了贝壳物联。tcp通信,只需要50秒发送一次信息,就可以保持连接,有状态改变,服务器会发送状态过来。嗯,这样比较好,还可以微信小程序控制。
首先在贝壳物联网站注册用户,新建一个智能开关,记下id 和apikey
下载例程
https://github.com/bigiot/bigiotArduino
把那个aJson文件夹复制到arduino里的libraries文件夹中,我用的是arduino1.85在D盘就复制到
D:\arduino-1.8.5\libraries文件夹
然后打开贝壳的例程,修改下
#include <ESP8266WiFi.h>
#include <aJSON.h>
//============= 此处必须修该============
String DEVICEID="***"; // 你的设备编号 ==
String APIKEY = "****"; // 设备密码==
//=======================================
unsigned long lastCheckInTime = 0; //记录上次报到时间
const unsigned long postingInterval = 40000; // 每隔40秒向服务器报到一次
const char* ssid = "***";//无线名称
const char* password = "***";//无线密码
const char* host = "www.bigiot.net";
const int httpPort = 8181;
#define led 16
int pins[4] = {D5,D6,D7,D8};
int state[4] = {HIGH,HIGH,HIGH,HIGH};
int arr_len = sizeof(pins)/sizeof(pins[0]);
void setup() {
Serial.begin(115200);
delay(1000);
WiFi.begin(ssid, password);
pinMode(led,OUTPUT );
//默认输出关闭电频
for(int i=0;i<arr_len;i++){
pinMode(pins, OUTPUT);
digitalWrite(pins, state);
}
}
WiFiClient client;
void loop() {
while (WiFi.status() != WL_CONNECTED) {
delay(1000);
Serial.print(".");
}
// Use WiFiClient class to create TCP connections
if (!client.connected()) {
if (!client.connect(host, httpPort)) {
Serial.println("connection failed");
delay(5000);
return;
}
}
if(millis() - lastCheckInTime > postingInterval || lastCheckInTime==0) {
checkIn();
}
// Read all the lines of the reply from server and print them to Serial
if (client.available()) {
String inputString = client.readStringUntil('\n');
inputString.trim();
Serial.println(inputString);
int len = inputString.length()+1;
if(inputString.startsWith("{") && inputString.endsWith("}")){
char jsonString[len];
inputString.toCharArray(jsonString,len);
aJsonObject *msg = aJson.parse(jsonString);
processMessage(msg);
aJson.deleteItem(msg);
}
}
}
void processMessage(aJsonObject *msg){
aJsonObject* method = aJson.getObjectItem(msg, "M");
aJsonObject* content = aJson.getObjectItem(msg, "C");
aJsonObject* client_id = aJson.getObjectItem(msg, "ID");
if (!method) {
return;
}
String M = method->valuestring;
if(M == "say"){
String C = content->valuestring;
String F_C_ID = client_id->valuestring;
if(C == "stop"){
// for(int i=0;i<arr_len;i++){
// state = LOW;
//digitalWrite(pins, state);
// }
digitalWrite(led, 0);
sayToClient(F_C_ID,"LED All off!");
}else {
//for(int i=0;i<arr_len;i++){
// state = HIGH;
// digitalWrite(pins, state);
// }
digitalWrite(led, 1);
sayToClient(F_C_ID,"LED All on!");
}
/* else{
int pin = C.toInt();
if(pin > 0 && pin <= arr_len){
pin--;
state[pin] = !state[pin];
digitalWrite(pins[pin], state[pin]);
}
sayToClient(F_C_ID,"LED pin:"+pin);
} */
}
}
void checkIn() {
String msg = "{\"M\":\"checkin\",\"ID\":\"" + DEVICEID + "\",\"K\":\"" + APIKEY + "\"}\n";
client.print(msg);
lastCheckInTime = millis();
}
void sayToClient(String client_id, String content){
String msg = "{\"M\":\"say\",\"ID\":\"" + client_id + "\",\"C\":\"" + content + "\"}\n";
client.print(msg);
lastCheckInTime = millis();
}
把这个写入8266中,我用的是esp-12
然后打开微信,下拉,搜索小程序 贝壳物联,登录,打开智能开关,点击play或stop就可以打开和关闭wifi开关了
pcb文件
|
本帖子中包含更多资源
您需要 登录 才可以下载或查看,没有账号?立即注册
x
打赏
-
查看全部打赏
|