[success]这个东西看起来高大上,其实原理非常简单。我们直接利用一个nodemcu模块和一个物联平台就可以实现这个效果了。[/success]
准备硬件
因为要控制门锁,我们那个门锁是由电机控制的,控制电机的正转反转就可以实现开门和关门的效果。所以我用到了两个模块首先nodemcu,就是下面这个样子,主要用于连接wifi并与物联网平台进行通信,还有就是控制IO口输出
因为mcu的IO口驱动能力有限,所以就只能用上次信达杯(智能车比赛)剩下的L298N驱动,IO口输入10或01就可以对应输出相反的电压了。
编写程序
硬件准备完毕就可以直接开始写程序了。因为我们是直接与物联网平台连接,所以就可以直接使用别人提供的例程。我选择的是一个叫贝壳物联的平台。然后找到了相关文档。它这个文档使用nodemcu的编译器烧程序,事先还要往wifi模块烧录固件。我是完全按照这个来的,但是烧录进去后wifi模块串口一直输出错误信息,我找了半天无果后就想用其他的方法来实现。
我偶然在贝壳物联的github上找到了arduino程序,因为arduino是支持直接往esp8266烧录的,我之前也做过了不少笔记。所以我就果断选择使用arduino。这里贴一下下载地址。
所以程序这块就只需要在这个例程上稍微修改一下就可以了。
注册设备
程序也有了,下面就是登陆贝壳物联网平台注册设备了。这里注册设备很简单,只需要添加设备就可以了,然后会获得ID号和APIKEY,这两个后面都用的到。
注册完毕后我们还需要打开天猫精灵app(注意这个需要连接你的天猫精灵),添加智能设备。
具体可以参考这篇文章。
烧录程序
注册好设备后我们就可以直接开始烧录程序了。我们需要在原程序的基础上进行改动,这里我就直接贴出我的代码,我这里要实现的效果就是和天猫精灵说开锁,esp826就输出两个相反的电平,然后L298N就控制电机正反转,实现开关锁的效果。
实际代码:
[highlight lanaguage=”cpp”]
/* 此文件需安装Arduino esp8266开发环境支持,环境搭建参见:http://www.bigiot.net/talk/237.html 本程序可以用来控制四路继电器 ESP8266烧入此程序直接,使用高低电频控制光耦继电器来控制电灯 我的继电器默认高电频关闭,所以在初始化时都初始化为高电频,play关闭开启,stop关闭关闭,输入1-4打开或关闭对应的引脚 代码基于https://github.com/bigiot/bigiotArduino/blob/master/examples/ESP8266/kaiguan/kaiguan.ino 上的代码进行调整,修复了部分bug,解决了断线重连问题,此代码可以直接烧入到nodemcu模块,分享代码希望对大家有帮助 */ #include <ESP8266WiFi.h> #include <aJSON.h> //============= 此处必须修该============ String DEVICEID="xxx"; // 你的设备编号 == String APIKEY = "xxx"; // 设备密码== //======================================= unsigned long lastCheckInTime = 0; //记录上次报到时间 const unsigned long postingInterval = 40000; // 每隔40秒向服务器报到一次 const char* ssid = "xxxx";//无线名称 const char* password = "xxx";//无线密码 const char* host = "www.bigiot.net"; const int httpPort = 8181; 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); //默认输出关闭电频 for(int i=0;i<arr_len;i++){ pinMode(pins[i], OUTPUT); digitalWrite(pins[i], state[i]); } } 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(' '); 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 == "play"){ digitalWrite(pins[0], HIGH); digitalWrite(pins[1], LOW); delay(500); digitalWrite(pins[0], LOW); digitalWrite(pins[1], LOW); delay(3000); digitalWrite(pins[1], HIGH); digitalWrite(pins[0], LOW); delay(500); digitalWrite(pins[0], LOW); digitalWrite(pins[1], LOW); sayToClient(F_C_ID,"LED All on!"); }else if(C == "stop"){ digitalWrite(pins[1], HIGH); digitalWrite(pins[0], LOW); delay(500); digitalWrite(pins[0], LOW); digitalWrite(pins[1], LOW); sayToClient(F_C_ID,"LED All off!"); }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 + ""} "; client.print(msg); lastCheckInTime = millis(); } void sayToClient(String client_id, String content){ String msg = "{"M":"say","ID":"" + client_id + "","C":"" + content + ""} "; client.print(msg); lastCheckInTime = millis(); }
[/highlight]
这里就只需要把wifi名字,密码,id,key改下就好。当然还有开锁的逻辑部分不同用品的用法不同。自己按照要求改就可以了。
实际测试
把程序烧进去后,连接好硬件后我们就可以开始测试了。这里我们需要等待设备上线。然后点击设备对话,发送play和stop,如果平台收到了数据,就说明数据发送成功。到此一个天猫精灵控制的门锁就做好了。