手头有一块ESP8266_01WIFI模块,是前段时间在网上买arduino套件时送的,套件中还有一个单路继电器,反正这些东西折腾完了以后也没什么用,就将网上的资料汇总了一下,做了一个远程控制的智能排插,功能非常简单,就是通过手机远程控制排插通电或断电。
先看下完成后的使用演示视频
http://v.youku.com/v_show/id_XNDAxNTg5NzYwNA==.html?spm=a2ha1.12325017.uerCenter.5!3~5~5!2~5~DL~DD~A&firsttime=1

OK,进入正题,先说下需要的材料:
1、ESP8266_01WIFI模块一个
2、单路继电器一个
3、1K电阻和和LED发光二极管各一枚。(用于指示通电或断电)
4、Arduino UNO R3单片机一块。
5、220v转5v真流电源模块一个(旧手机充电器就可以)
6、排插一个。
7、面包板一块,导线若干。
8、无线路由器一个(需要知道密码),还有就是一台能上网的电脑,呵呵。
制作过程分为三步,第一步在第三方平台申请远程控制的帐号、密码及APIKEY,第二步要把程序写到esp8266_01中,并进行测试;第三步进行组装并实现控制。

在开始之前,我们有必须先简单了解一下ESP8266的工作原理,或者说ESP8266在在手机控制电路通断过程中发挥什么作用,我们来看下面的这张图:

我们在手机上发出通电或断电指令后,相关指令会上传到第三方平台(一般是一个网站),第三方平台按指令修改存储的数据(一般是json格式的数据,如手机发发通电信号时,将变量a的值从0改为1,断电时从1改成0),ESP8266通过无线路由不停地查询网站上指定这个数据的状态,并按指定的格式将数据状态返回EPS8266,ESP8266将接收到的数据进行格式解析后,通知继电器执行通电或断电的操作。
当然,网上还有许多ESP8266其它的工作方式,如将ESP8266作为服务器,通过指令改变ESP8266的数据状态来控制设备。但需要在路由器上设置端口映射,还需要外网透传,对我来说难度有点大,呵呵。
好了,闲话说完,进入正题。我用的第三方平台是酱菜创客(网络还有许多类似的物联网平台,但我感觉这个最简单,适合初学)。首先需要在酱菜创客创建一个帐号。

1、在酱菜创客上注册、添加设备,安装APP。

登录www.jcckiot.com,注册一个新用户。

按要求填写用户名,邮箱,密码,提交后注册邮箱会收到一个激活邮件,激活后再次登录,进入用户中心,会有一个重要的信息需要保存:就是下图中的apikey,这个需要记下来,后面要用到。

返回主页后,就可以添加设备了。

随便添加一个,如灯光照明,然后点击添加新电灯开关,输入设备名称后点击添加设备,就能在设备列表中看到我们新添加的LED1了(当然也可以用其它名字,如台灯,电动车充电插座等等)。

点击LED1下面的文字链接(不是图标,是文字链接),就能看到LED1的sid和nid(我们的是3和0),记下来,这个是设备的编号,我们回头要用到。

酱菜创客还提供了一个APP,在首页最下面,下载下来安装到手机上。

APP运行的界面和网页一样,第一次运行需要点击右上角的头像登录,登录后回到主界面,打开灯光照明,就能看到我们在前面添加过的LED1了。当然现在还控制不了,还需要我们把程序写到ESP8266模块上并连接有关线路。

2 、把程序写到ESP8266模块上

网上对ESP8266程序写入的教程大致有三种,1是下载别人做好的bin文件包,使用专用软件烧录到ESP8266,我查了下,资料比较多,貌似难度很大,俺就知难而退了;2是使用USB转TTL工具进行写入,俺手头没有这种高级货;3是用Arduino UNO R3,利用Arduino IDE进行写入,我们就用这种方法。
打开Arduino IDE,默认的Arduino IDE是没有ESP8266库的,需要我们自己添加上。
点击Arduino IDE的文件-首选项,在附加开发板管理器网址中填入:http://arduino.esp8266.com/stable/package_esp8266com_index.json,然后确定

然后点击工具-开发板XXXXXXXX-开发板管理器,在搜索框中输入esp8266,然后回车,稍等一会儿,就能在搜索结果中看到esp866 for esp8266 community的项目,点击安装。

安装需要一些时间,完成后重启Arduino IDE,再看开发板管理器,就能看到esp866 for esp8266 community的状态是安装过的(installed)。

这时候再打开工具-开发板XXXX,在开发板管理器下面,就能找到我们的ESP8266 Module了,点击选中它。
这时我们打开工具,开发板XXXX就变成了Generic ESP8266 Module了,说明当前的开发板是ESP8266了。


在Generic ESP8266 Module下面还有许多选项,是配置参数的,因为ESP8266有许多配本,烧录时的参数设置也不一样,我用的是ESP8266_01,我用的参数是:Flash Mode:DIO/Upload Speed:115200/Flash Size:4M(1MSPIFFS),其它参数没变。
OK,开发环境配置好了,我们可以连接上ESP8266进行上传和烧录了。
先看ESP8266_01接口说明:

将ESP8266_01接到Arduino UNO R3上。
需要说明的几点:
I、VVC和CH_PD接3.3V,不能接5V。
II、RX接Arduino的RX,TX接Arduino的TX,有些资料说要反过来接,经证明不行。
III、GND接Arduino的GND,GPIO0在烧录时接GND,但在运行时需要断开。
IV、有的资料说烧录时需要将Arduino的ATmega芯片(也就是最大最长的那块)给拆下,俺试了下,不拆下也行。
V、最后一点,也是让我折腾了好半天的一点:一定要用一个1K电阻将GPIO_2和3.3V连接上,这点是从其它资料中找到的,不接的话,烧录了N次都失败。
接线面包板图如下:

连接好后,就可以写入程序烧录了。

将以下代码粘贴到Arduino IDE中,

/*
 * 通过酱菜创客控制继电器
*/

#include <ESP8266WiFi.h>
WiFiClient client;
#define relay1 2 //运行时继电器连接在8266的GPIO2上
const char *ssid     = "TP-LINK_123";//这里是我的wifi,你使用时修改为你要连接无线路由的ssid
const char *password = "a1234567";//你的wifi密码
const char *host = "www.jcckiot.com";//酱菜创客服务器IP,不要改
const int httpPort =8266;//端口号,不要改
String line ="";
int m=0; 
void setup() 
{  
  Serial.begin(115200);  
  delay(10);  
  pinMode(relay1,OUTPUT);  //设置relay1的工作模式为输出   
  Serial.println();  
  Serial.println();  
  Serial.print("Connecting to ");  
  Serial.println(ssid);     
  WiFi.begin(ssid, password);     
  while (WiFi.status() != WL_CONNECTED)//如果连接不能wifi,在0.5秒后再试 
  {    
    delay(500);    
    Serial.print(".");
  }
  Serial.println("");
  Serial.println("WiFi connected");//在串口监示器中显示wifi连接成功
  Serial.println("IP address: ");  
  Serial.println(WiFi.localIP());  //显示服务器的地址
  while (!client.connect(host, httpPort))//如果连接不上服务器,就提示连接失败,0.5秒后再试 
  {    
    Serial.println("connection failed");
    //return;    
    delay(500);
  } 
  Serial.print("connecting to ");
  Serial.println(host);  
  client.write("mode=bind&apikey=XXXXXX&data={ck001000bind}\r\n");//绑定apikey,把XXXXXX修改成你在酱菜创客上的apikey
  delay(10);
}
//int value = 0; 
void loop() 
{  
  while(client.available())
  {    
    String line = client.readStringUntil('\r');
    Serial.println(line);
    //valueread=line[47];
    //Serial.println(valueread);
    if(line[5]=='3' & line[8]=='0' & line[9]=='1')//3是你要控制的设备的 sid,0是nid,1代表是通电
//意思是如果指定的设备的状态是1,就让realy1设置为高电平,即让继电器通电
    {      
      digitalWrite(relay1,HIGH);
      Serial.println("Relay on");
    }
    if(line[5]=='3' & line[8]=='0' & line[9]=='0') //3是你要控制的设备的 sid,0是nid,0代表是断电
//意思是如果指定的设备的状态是0,就让realy1设置为低电平,即让继电器断电
    {
      digitalWrite(relay1,LOW);
      Serial.println("Relay off");
    }
  }
  String line ="";  
  m++;
  if(m%40==0)
  {
    client.write("mode=up&apikey=XXXXXX&data={ck003000life}\r\n");/把XXXXXX修改成你自己的apikey
    m=0;
  }  
  delay(500);
}

程序很简单,需要说明的地方我已经放到注释里了。我相信不需要再进行解释了。
把Arduino接上电脑的USB口,这时ESP8266红灯会亮。
点击工具栏最左的验证按钮开始编译,如无问题会提示编译完成。

然后点击工具栏的上传按钮,开始编译并上传,上传完成后会自动开始烧录,烧录时Arduino IDE的状态栏会有红色的点及烧录进度的百分率。达到100%后,烧录就完成了。

这时拔掉GPIO_0(面包板图中的橙色的线),打开Arduino的串口监视器,就可以看到EPS8266的运行情况了。如出现“WiFi connected”和路由器给ESP8266的IP地址,就说明连接成功了,否则会出现“connection failed”,这时就需要再检查下你代码中路由器设置是否正确。

到这里,对ESP8266的烧录已经完成了,如果你迫不及待的想试一下,可以先接一个发光二极管,再加一个3.3V的电源(我用的是一节18650电池,检测电压是3.9V,也能正常运行)按如下方式接线:

在手机打开酱菜创客的APP,进入灯光照明,找开我们的LED1点击一下,让LED1处于ON的状态,稍等一会,面包板上的发光二极管是不是就亮了?然后再点,让LED1处于OFF状态,稍等发光二极管就灭了。


说明一下:我的手机要用来拍照,只能在电脑上用网站方式操作了,效果和用手机操作是一样一样的,呵呵。
3、线路连接和组装
剩下的事情就简单了,我们要将esp8266_01和继电器装到排插里,因为继电器和ESP8266都要用DC电源,我们还要一个220v交流转5v直流的变压器,就用一个拆掉外壳的手机充电头,上面的usb接口还可以用在插座上给手机充电,呵呵(其实ESP8266需要的是3.3v的电源,我没找到,就凑合一下吧!)
把上面的东东接下图接线。

(不会做电路图,只好用实物图代替了,大家将就看吧......)
如果大家能找到3.3v的电源,最好也用上,那么实物图应该是下面这样的:

我的排插比较小,占用了两个插孔位置后,还是非常紧促,安装的实际如下图(请原谅我蹩脚的焊工):

最后为了安全起见,我把前面两个被占用的孔用热熔胶给封上了,省得哪天喝大了直接把手机插在火线上,那就抖大发了……

我的电动自行车每天晚上都要在地下室充电,充的时间太短怕充不满,充的时间太长又怕过充不安全。有了这个东东,我就不用每天晚上大半夜从六楼跑下来给电动车断电了,从温暖的被窝里拿出手机,轻轻一按,一切搞定,嘻嘻……
------------------------------全剧终-----------------------------