搜索
bottom↓
回复: 23

我也来发一个斐讯插排TC1改造,基于ESP8266和阿里云IOT,含代码

  [复制链接]

出0入58汤圆

发表于 2019-7-17 15:45:23 | 显示全部楼层 |阅读模式
本帖最后由 shawn_bu 于 2019-7-17 15:56 编辑

看到坛友分享的贴子https://www.amobbs.com/forum.php ... ;page=1#pid10844421 我也买了一个排插,刚好手上有阿里云现成的代码就改造了一下。

拆开外包装的样子,做工真心不错:


开拆,首先拆掉底部的两颗螺丝:


接着用平口螺丝刀翘途中沿线位置把所有底部卡口都撬开就可以开盖了:


先瞧瞧原来的主控:


拆掉主控,技术不行啊,有些焊盘都掉了:


焊上排线,具体引脚定义参考上面apachectl的贴子:


排线的另一端,自己人肉打了标。


刚好手上有现成的nodemcu板子,接上:


再接上一个温湿度传感器,功能多多益善:


装回外壳,由于nodemcu体积有点大,只能这样放在外面了,幸好盖上盖子啥也看不到:


网页端控制软件,aliyun IoT Studio拖拽出来的。云端能正常控制,温湿度也正常显示。到此搞定。


下面是源代码:

阿里云端的配置,网上教程超级多,我就不一一介绍了。

建好一个产品,然后添加一个设备。在产品里面配置好“自定义功能”这些就是到时候nodemcu和控制端里面要用的字段:


设备详情页面,里面的ProductKey, DeviceName,DeviceSecret在esp8266代码里面需要用到


阿里云账号的区域,在代码里面要用到REGION_ID。我是上海地区的代码就填cn-shanghai


Password生成小工具是阿里云提供的,用于计算MQTT_PASSWD,或者根据规则自己算也可以。timestamp默认全用1234567890就可以




ESP8266代码,直接在Arduino里面写的,目标板子选nodemcu即可。两个###之间的是需要根据各自阿里云配置修改的地方。
  1. #include <ESP8266WiFi.h>
  2. /* 依赖 PubSubClient 2.4.0 */
  3. #include <PubSubClient.h>
  4. /* 依赖 ArduinoJson 5.13.4 */
  5. #include <ArduinoJson.h>

  6. #include <DHT.h>


  7. /* 连接您的WIFI SSID和密码 */
  8. #define WIFI_SSID         "###你的wifi名称###"
  9. #define WIFI_PASSWD       "###你的wifi名称###"

  10. /* 设备证书信息*/
  11. #define PRODUCT_KEY       "###你的阿里云PRODUCT_KEY###"
  12. #define DEVICE_NAME       "###你的阿里云DEVICE_NAME###"
  13. #define DEVICE_SECRET     "###你的阿里云DEVICE_SECRET###"
  14. #define REGION_ID         "###你的阿里云REGION_ID###"

  15. /* 线上环境域名和端口号,不需要改 */
  16. #define MQTT_SERVER       PRODUCT_KEY ".iot-as-mqtt." REGION_ID ".aliyuncs.com"
  17. #define MQTT_PORT         1883
  18. #define MQTT_USRNAME      DEVICE_NAME "&" PRODUCT_KEY

  19. #define CLIENT_ID         "###你的阿里云DEVICE_NAME###|securemode=3,timestamp=1234567890,signmethod=hmacsha1|"
  20. // 请使用以上说明中的加密工具或参见MQTT-TCP连接通信文档加密生成password。
  21. // 加密明文是参数和对应的值(clientId${deviceName}deviceName${deviceName}productKey${productKey}timestamp1234567890)按字典顺序拼接
  22. // 密钥是设备的DeviceSecret
  23. #define MQTT_PASSWD       "###根据Password生成小工具算出来的密码,或者自己根据定义算出来的密码###"

  24. #define ALINK_BODY_FORMAT         "{"id":"123","version":"1.0","method":"thing.event.property.post","params":%s}"
  25. #define ALINK_TOPIC_PROP_POST     "/sys/" PRODUCT_KEY "/" DEVICE_NAME "/thing/event/property/post"

  26. int LightSwitch = 0;
  27. int LightSwitch1 = 0;   
  28. int LightSwitch2 = 0;   
  29. int CurtainSwitch = 0;   
  30. int CurtainSwitch1 = 0;   
  31. int CurtainSwitch2 = 0;

  32. #define LightSwitchPin 5  //D1
  33. #define LightSwitch1Pin 4  //D2
  34. #define LightSwitch2Pin 15 //D8
  35. #define CurtainSwitchPin 13  //D7
  36. #define CurtainSwitch1Pin 14  //D5
  37. #define CurtainSwitch2Pin 12  //D6

  38. #define DHTPIN 10 //SD3

  39. unsigned long lastMs = 0;
  40. WiFiClient espClient;
  41. PubSubClient  client(espClient);
  42. DHT dht(DHTPIN, DHT11,15);

  43. bool refreshStatus = false;

  44. void callback(char *topic, byte *payload, unsigned int length)
  45. {
  46.     Serial.print("Message arrived [");
  47.     Serial.print(topic);
  48.     Serial.print("] ");
  49.     payload[length] = '\0';
  50.     Serial.println((char *)payload);
  51.     DynamicJsonBuffer jsonBuffer;
  52.     JsonObject& root = jsonBuffer.parseObject((char *)payload);
  53.     if (!root.success())
  54.     {
  55.       Serial.print("parseObject(");
  56.       Serial.print((char *)payload);
  57.       Serial.println(") failed");
  58.     }
  59.     else
  60.     {
  61.       //###下面json里面的字段需要根据你产品定义里面的功能字段做修改###
  62.       JsonObject& params = root["params"];
  63.       if(params.containsKey("LightSwitch"))
  64.       {
  65.         LightSwitch = params["LightSwitch"];
  66.         Serial.print("LightSwitch: ");
  67.         Serial.print(LightSwitch);
  68.       }
  69.       if(params.containsKey("LightSwitch1"))
  70.       {
  71.         LightSwitch1 = params["LightSwitch1"];
  72.         Serial.print("LightSwitch1: ");
  73.         Serial.print(LightSwitch1);
  74.       }
  75.       if(params.containsKey("LightSwitch2"))
  76.       {
  77.         LightSwitch2 = params["LightSwitch2"];
  78.         Serial.print("LightSwitch2: ");
  79.         Serial.print(LightSwitch2);
  80.       }
  81.       if(params.containsKey("CurtainSwitch"))
  82.       {
  83.         CurtainSwitch = params["CurtainSwitch"];
  84.         Serial.print("CurtainSwitch: ");
  85.         Serial.print(CurtainSwitch);
  86.       }
  87.       if(params.containsKey("CurtainSwitch1"))
  88.       {
  89.         CurtainSwitch1 = params["CurtainSwitch1"];
  90.         Serial.print("CurtainSwitch1: ");
  91.         Serial.print(CurtainSwitch1);
  92.       }
  93.       if(params.containsKey("CurtainSwitch2"))
  94.       {
  95.         CurtainSwitch2 = params["CurtainSwitch2"];
  96.         Serial.print("CurtainSwitch2: ");
  97.         Serial.print(CurtainSwitch2);
  98.       }
  99.     }
  100.     refreshStatus = true;
  101. }


  102. void wifiInit()
  103. {
  104.     WiFi.mode(WIFI_STA);
  105.     WiFi.begin(WIFI_SSID, WIFI_PASSWD);
  106.     while (WiFi.status() != WL_CONNECTED)
  107.     {
  108.         delay(1000);
  109.         Serial.println("WiFi not Connect");
  110.     }

  111.     Serial.println("Connected to AP");
  112.     Serial.println("IP address: ");
  113.     Serial.println(WiFi.localIP());

  114.    
  115. Serial.print("espClient [");


  116.     client.setServer(MQTT_SERVER, MQTT_PORT);   /* 连接WiFi之后,连接MQTT服务器 */
  117.     client.setCallback(callback);
  118. }


  119. void mqttCheckConnect()
  120. {
  121.     while (!client.connected())
  122.     {
  123.         Serial.println("Connecting to MQTT Server ...");
  124.         if (client.connect(CLIENT_ID, MQTT_USRNAME, MQTT_PASSWD))

  125.         {

  126.             Serial.println("MQTT Connected!");

  127.         }
  128.         else
  129.         {
  130.             Serial.print("MQTT Connect err:");
  131.             Serial.println(client.state());
  132.             delay(5000);
  133.         }
  134.     }
  135. }


  136. void mqttIntervalPost()
  137. {
  138.     float h = dht.readHumidity();
  139.     float t = dht.readTemperature();
  140.     if (isnan(h) || isnan(t)) {
  141.       Serial.println("Failed to read from DHT sensor!");
  142.       return;
  143.     }
  144.    
  145.     char param[128];
  146.     char jsonBuf[256];
  147.     //###下面json里面的字段需要根据你产品定义里面的功能字段做修改###
  148.     sprintf(param,
  149.           "{"Temperature":%f,"Humidity":%f,"LightSwitch":%d,"LightSwitch1":%d,"LightSwitch2":%d,"CurtainSwitch":%d,"CurtainSwitch1":%d,"CurtainSwitch2":%d}"
  150.           ,t
  151.           ,h
  152.           ,LightSwitch
  153.           ,LightSwitch1
  154.           ,LightSwitch2
  155.           ,CurtainSwitch
  156.           ,CurtainSwitch1
  157.           ,CurtainSwitch2);
  158.     sprintf(jsonBuf, ALINK_BODY_FORMAT, param);
  159.     Serial.println(jsonBuf);
  160.     boolean d = client.publish(ALINK_TOPIC_PROP_POST, jsonBuf);
  161.     Serial.print("publish:0 失败;1成功");
  162.     Serial.println(d);
  163. }


  164. void setup()
  165. {
  166.     pinMode(LED_BUILTIN, OUTPUT);     // Initialize the LED_BUILTIN pin as an output   
  167.     pinMode(LightSwitchPin, OUTPUT);
  168.     pinMode(LightSwitch1Pin, OUTPUT);
  169.     pinMode(LightSwitch2Pin, OUTPUT);
  170.     pinMode(CurtainSwitchPin, OUTPUT);
  171.     pinMode(CurtainSwitch1Pin, OUTPUT);
  172.     pinMode(CurtainSwitch2Pin, OUTPUT);
  173.                

  174.     /* initialize serial for debugging */
  175.     Serial.begin(115200);
  176.     Serial.println("Demo Start");

  177.     wifiInit();
  178.     dht.begin();
  179. }


  180. // the loop function runs over and over again forever
  181. void loop()
  182. {
  183.     //IO输出
  184.     if(LightSwitch)
  185.     {
  186.       digitalWrite(LightSwitchPin, HIGH);
  187.     }
  188.     else
  189.     {
  190.       digitalWrite(LightSwitchPin, LOW);
  191.     }
  192.     if(LightSwitch1)
  193.     {
  194.       digitalWrite(LightSwitch1Pin, HIGH);
  195.     }
  196.     else
  197.     {
  198.       digitalWrite(LightSwitch1Pin, LOW);
  199.     }
  200.     if(LightSwitch2)
  201.     {
  202.       digitalWrite(LightSwitch2Pin, HIGH);
  203.     }
  204.     else
  205.     {
  206.       digitalWrite(LightSwitch2Pin, LOW);
  207.     }
  208.     if(CurtainSwitch)
  209.     {
  210.       digitalWrite(CurtainSwitchPin, HIGH);
  211.     }
  212.     else
  213.     {
  214.       digitalWrite(CurtainSwitchPin, LOW);
  215.     }
  216.     if(CurtainSwitch1)
  217.     {
  218.       digitalWrite(CurtainSwitch1Pin, HIGH);
  219.     }
  220.     else
  221.     {
  222.       digitalWrite(CurtainSwitch1Pin, LOW);
  223.     }
  224.     if(CurtainSwitch2)
  225.     {
  226.       digitalWrite(CurtainSwitch2Pin, HIGH);
  227.     }
  228.     else
  229.     {
  230.       digitalWrite(CurtainSwitch2Pin, LOW);
  231.     }
  232.     //提交数据
  233.     if ((millis() - lastMs >= 60000) || refreshStatus)
  234.     {
  235.         refreshStatus = false;
  236.         lastMs = millis();
  237.         mqttCheckConnect();
  238.         /* 上报消息心跳周期 */
  239.         mqttIntervalPost();
  240.     }
  241.     client.loop();
  242.     Serial.println("Loop!");
  243.     digitalWrite(LED_BUILTIN, HIGH);   // turn the LED on (HIGH is the voltage level)
  244.     delay(1000);                       // wait for a second
  245.     digitalWrite(LED_BUILTIN, LOW);    // turn the LED off by making the voltage LOW
  246.     delay(1000);                       // wait for a second
  247. }
复制代码



本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有帐号?注册

x

阿莫论坛20周年了!感谢大家的支持与爱护!!

一只鸟敢站在脆弱的枝条上歇脚,它依仗的不是枝条不会断,而是自己有翅膀,会飞。

出0入58汤圆

 楼主| 发表于 2019-7-17 15:54:13 | 显示全部楼层
贴一张串口日志图,证明代码是工作的 。开机默认所有继电器都关闭了,需要可以自己修改默认策略,也可以改成掉电保存上一次的状态啥的。


  1. 15:50:37.598 -> Loop!
  2. 15:50:39.578 -> Loop!
  3. 15:50:41.602 -> Loop!
  4. 15:50:43.584 -> Loop!
  5. 15:50:45.596 -> Loop!
  6. 15:50:47.598 -> Loop!
  7. 15:50:49.608 -> Connecting to MQTT Server ...
  8. 15:50:49.678 -> MQTT Connected!
  9. 15:50:49.713 -> {"id":"123","version":"1.0","method":"thing.event.property.post","params":{"Temperature":31.000000,"Humidity":13.000000,"LightSwitch":0,"LightSwitch1":0,"LightSwitch2":0,"CurtainSwitch":0,"CurtainSwitch1":0,"CurtainSwitch2":0}}
  10. 15:50:49.713 -> publish:0 失败;1成功1
  11. 15:50:49.713 -> Loop!
  12. 15:50:51.705 -> Loop!
  13. 15:50:53.710 -> Loop!
  14. 15:50:55.714 -> Loop!
  15. 15:50:57.686 -> Loop!
  16. 15:50:59.693 -> Loop!
  17. 15:51:01.722 -> Message arrived [/sys/a1myZkJoTPx/esp8266_01/thing/service/property/set] {"method":"thing.service.property.set","id":"944037471","params":{"LightSwitch1":1},"version":"1.0.0"}
  18. 15:51:01.722 -> LightSwitch1: 1Loop!
  19. 15:51:03.757 -> {"id":"123","version":"1.0","method":"thing.event.property.post","params":{"Temperature":32.000000,"Humidity":13.000000,"LightSwitch":0,"LightSwitch1":1,"LightSwitch2":0,"CurtainSwitch":0,"CurtainSwitch1":0,"CurtainSwitch2":0}}
  20. 15:51:03.757 -> publish:0 失败;1成功1
  21. 15:51:03.757 -> Loop!
  22. 15:51:05.766 -> Loop!
  23. 15:51:07.753 -> Message arrived [/sys/a1myZkJoTPx/esp8266_01/thing/service/property/set] {"method":"thing.service.property.set","id":"944038010","params":{"LightSwitch1":0},"version":"1.0.0"}
  24. 15:51:07.753 -> LightSwitch1: 0Loop!
  25. 15:51:09.805 -> {"id":"123","version":"1.0","method":"thing.event.property.post","params":{"Temperature":32.000000,"Humidity":13.000000,"LightSwitch":0,"LightSwitch1":0,"LightSwitch2":0,"CurtainSwitch":0,"CurtainSwitch1":0,"CurtainSwitch2":0}}
  26. 15:51:09.805 -> publish:0 失败;1成功1
  27. 15:51:09.805 -> Loop!
  28. 15:51:11.797 -> Loop!
  29. 15:51:13.815 -> Message arrived [/sys/a1myZkJoTPx/esp8266_01/thing/service/property/set] {"method":"thing.service.property.set","id":"944038559","params":{"LightSwitch":1},"version":"1.0.0"}
  30. 15:51:13.815 -> LightSwitch: 1Loop!
  31. 15:51:15.862 -> {"id":"123","version":"1.0","method":"thing.event.property.post","params":{"Temperature":32.000000,"Humidity":13.000000,"LightSwitch":1,"LightSwitch1":0,"LightSwitch2":0,"CurtainSwitch":0,"CurtainSwitch1":0,"CurtainSwitch2":0}}
  32. 15:51:15.862 -> publish:0 失败;1成功1
  33. 15:51:15.862 -> Loop!
  34. 15:51:17.850 -> Loop!
  35. 15:51:19.872 -> Message arrived [/sys/a1myZkJoTPx/esp8266_01/thing/service/property/set] {"method":"thing.service.property.set","id":"944039031","params":{"LightSwitch":0},"version":"1.0.0"}
  36. 15:51:19.872 -> LightSwitch: 0Loop!
  37. 15:51:21.906 -> {"id":"123","version":"1.0","method":"thing.event.property.post","params":{"Temperature":32.000000,"Humidity":13.000000,"LightSwitch":0,"LightSwitch1":0,"LightSwitch2":0,"CurtainSwitch":0,"CurtainSwitch1":0,"CurtainSwitch2":0}}
  38. 15:51:21.906 -> publish:0 失败;1成功1
  39. 15:51:21.906 -> Loop!
  40. 15:51:23.892 -> Loop!
  41. 15:51:25.898 -> Loop!
  42. 15:51:27.905 -> Message arrived [/sys/a1myZkJoTPx/esp8266_01/thing/service/property/set] {"method":"thing.service.property.set","id":"944039692","params":{"CurtainSwitch1":1},"version":"1.0.0"}
  43. 15:51:27.905 -> CurtainSwitch1: 1Loop!
  44. 15:51:29.952 -> {"id":"123","version":"1.0","method":"thing.event.property.post","params":{"Temperature":32.000000,"Humidity":13.000000,"LightSwitch":0,"LightSwitch1":0,"LightSwitch2":0,"CurtainSwitch":0,"CurtainSwitch1":1,"CurtainSwitch2":0}}
  45. 15:51:29.952 -> publish:0 失败;1成功1
  46. 15:51:29.952 -> Loop!
  47. 15:51:31.940 -> Loop!
  48. 15:51:33.940 -> Loop!
  49. 15:51:35.948 -> Loop!
  50. 15:51:37.958 -> Loop!
  51. 15:51:39.943 -> Loop!
  52. 15:51:41.942 -> Loop!
复制代码

本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有帐号?注册

x

出0入12汤圆

发表于 2019-7-17 16:45:00 | 显示全部楼层
都是大牛

出0入0汤圆

发表于 2019-7-17 18:47:15 来自手机 | 显示全部楼层
牛,就是不知道插座哪里买的。

出0入0汤圆

发表于 2019-7-17 21:31:41 | 显示全部楼层
牛,插座咸鱼或者淘宝有,六七十块

出0入0汤圆

发表于 2019-7-17 22:21:58 | 显示全部楼层
牛!mark备用

出0入0汤圆

发表于 2019-7-17 22:27:57 | 显示全部楼层
牛!mark备用

出0入0汤圆

发表于 2019-7-18 00:23:40 来自手机 | 显示全部楼层
酷!流行改插座了么。

出0入0汤圆

发表于 2019-7-18 01:27:08 | 显示全部楼层
刚63买了一个

出0入0汤圆

发表于 2019-7-18 03:26:52 来自手机 | 显示全部楼层
谢谢分享!

出0入0汤圆

发表于 2019-7-18 09:44:39 | 显示全部楼层
TC1太大了  还是DC1比较好

出0入228汤圆

发表于 2019-7-18 15:35:20 | 显示全部楼层
缺了个电流检测

出0入0汤圆

发表于 2019-7-18 15:39:09 | 显示全部楼层

牛!mark备用

出0入4汤圆

发表于 2019-7-18 15:44:07 | 显示全部楼层
网页端这个不错

出0入0汤圆

发表于 2019-7-18 20:53:04 | 显示全部楼层
CoolBird007 发表于 2019-7-17 18:47
牛,就是不知道插座哪里买的。

咸鱼搜TC1插座就有,一般65左右包邮

出0入0汤圆

发表于 2019-11-4 06:38:02 | 显示全部楼层
楼主你好,我复制了主楼的代码在arduino中编译通不过,能把ino文件共享一下吗?谢谢!

出0入0汤圆

发表于 2019-11-4 10:12:59 | 显示全部楼层
183这行老是通不过,请楼主赐教

本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有帐号?注册

x

出0入58汤圆

 楼主| 发表于 2019-11-4 10:56:59 | 显示全部楼层
eaglebear 发表于 2019-11-4 06:38
楼主你好,我复制了主楼的代码在arduino中编译通不过,能把ino文件共享一下吗?谢谢! ...

ino文件就是一纯文本,我把我这边的密码等信息删除了。应该是跟楼主位的信息一样的。

本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有帐号?注册

x

出0入0汤圆

发表于 2019-11-4 22:30:52 | 显示全部楼层
shawn_bu 发表于 2019-11-4 10:56
ino文件就是一纯文本,我把我这边的密码等信息删除了。应该是跟楼主位的信息一样的。

...

谢谢!已搞定,我拷贝后#define的后面有非英文空格引起的问题。
另外一开始无法连接阿里云mqtt,修改pubsubclient.h中MQTT_MAX_PACKET_SIZE的值, 最好要大于1024, MQTT_KEEPALIVE 大于60解决。

出0入0汤圆

发表于 2019-11-4 23:07:11 | 显示全部楼层
膜拜一下!!!

出100入101汤圆

发表于 2019-11-7 19:33:26 | 显示全部楼层
膜拜下大牛!
回帖提示: 反政府言论将被立即封锁ID 在按“提交”前,请自问一下:我这样表达会给举报吗,会给自己惹麻烦吗? 另外:尽量不要使用Mark、顶等没有意义的回复。不得大量使用大字体和彩色字。【本论坛不允许直接上传手机拍摄图片,浪费大家下载带宽和论坛服务器空间,请压缩后(图片小于1兆)才上传。压缩方法可以在微信里面发给自己(不要勾选“原图),然后下载,就能得到压缩后的图片】。另外,手机版只能上传图片,要上传附件需要切换到电脑版(不需要使用电脑,手机上切换到电脑版就行,页面底部)。
您需要登录后才可以回帖 登录 | 注册

本版积分规则

手机版|Archiver|amobbs.com 阿莫电子技术论坛 ( 粤ICP备2022115958号, 版权所有:东莞阿莫电子贸易商行 创办于2004年 (公安交互式论坛备案:44190002001997 ) )

GMT+8, 2024-3-29 08:51

© Since 2004 www.amobbs.com, 原www.ourdev.cn, 原www.ouravr.com

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