数码之家

 找回密码
 立即注册
搜索
查看: 8590|回复: 14

[AVR] 做个8266智能开关arduino贝壳物联,微信控制

[复制链接]
发表于 2019-4-17 10:17:31 | 显示全部楼层 |阅读模式
本帖最后由 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

打赏

参与人数 2家元 +20 收起 理由
dongxueqi520 + 10
数码家园 + 10 謝謝分享

查看全部打赏

发表于 2019-4-17 18:50:25 | 显示全部楼层
电路图不分享一下吗?
回复 支持 反对

使用道具 举报

发表于 2019-4-17 18:51:00 | 显示全部楼层
本帖最后由 Never。 于 2019-4-17 18:52 编辑

就用一路是不是浪费啊,多开几路用用啊
回复 支持 反对

使用道具 举报

 楼主| 发表于 2019-4-17 22:19:00 | 显示全部楼层
shenlan121 发表于 2019-4-17 18:50
电路图不分享一下吗?

这个电路简单,没有电路图。可以提供pcb文件。已上传
回复 支持 反对

使用道具 举报

发表于 2019-4-20 19:45:13 来自手机浏览器 | 显示全部楼层
贝壳可以支持4路否?那样就性价比高了。
回复 支持 反对

使用道具 举报

发表于 2019-4-20 20:17:37 | 显示全部楼层
还可以小度音箱语音控制。
回复 支持 反对

使用道具 举报

发表于 2019-4-23 22:35:33 | 显示全部楼层


使用MQTT协议,可以自动的。。。。MQTT才是物联网。

回复 支持 反对

使用道具 举报

发表于 2019-5-26 16:45:49 | 显示全部楼层
大佬麻烦把PCB文件发我份吧多谢多谢1010058812@qq.com
回复 支持 反对

使用道具 举报

发表于 2019-6-4 14:49:10 | 显示全部楼层
微信可有语音控制?
回复 支持 反对

使用道具 举报

发表于 2019-7-12 16:42:19 | 显示全部楼层
我买的ESP-12F,吃灰好几年了,果壳确实不错,回头研究下,楼主能写详细点就好了,都是软件小白
回复 支持 反对

使用道具 举报

发表于 2020-3-2 10:37:43 | 显示全部楼层
请教下楼主,无法编译通过,是用arduino ide进行编译吧,库文件都下载了
回复 支持 反对

使用道具 举报

 楼主| 发表于 2020-3-2 11:31:42 | 显示全部楼层
ebeeb 发表于 2020-3-2 10:37
请教下楼主,无法编译通过,是用arduino ide进行编译吧,库文件都下载了

是的arduino ide
回复 支持 反对

使用道具 举报

发表于 2021-5-24 16:23:48 | 显示全部楼层
请问能定时控制吗?
回复 支持 反对

使用道具 举报

发表于 2021-5-25 09:56:34 | 显示全部楼层
要50秒发送一次信息,就可以保持连接

完全不能接受,
我用巴法云,mqtt协议,想什么时候发都可以,也能从微信小程序中读到云上的数据
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

APP|手机版|小黑屋|关于我们|联系我们|法律条款|技术知识分享平台

闽公网安备35020502000485号

闽ICP备2021002735号-2

GMT+8, 2025-5-24 18:52 , Processed in 0.124800 second(s), 10 queries , Redis On.

Powered by Discuz!

© 2006-2025 MyDigit.Net

快速回复 返回顶部 返回列表