基于esp8266的智能家居控制系统-局域网篇1手机控制和透传-Arduino中文社区 - Powered by Discuz!

Arduino中文社区

 找回密码
 立即注册

QQ登录

只需一步,快速开始

查看: 102576|回复: 115

基于esp8266的智能家居控制系统-局域网篇1手机控制和透传

  [复制链接]
发表于 2015-11-14 19:06 | 显示全部楼层 |阅读模式
本帖最后由 跑龙套的保 于 2016-3-13 23:18 编辑

通过上一篇我们使用了电脑tcp调试软件来控制继电器,今天我们使用手机来控制继电器,这里同样是使用调试软件手机和8266接入同一个wifi网络即接同一个路由器,手机放热点也可以。这里我们使用的是手机和8266连接同一个路由器。打开手机上的网络调试助手
QQ图片20151110121736.png

点击配置输入端口号8266,点击激活。ps:端口号可以任意取一个两边对应即可
QQ图片20151110121746.png


打开ide修改下代码,如下
[mw_shl_code=c,true]/*这篇把8266作为TCPcleint,加入手机创建的tcpServer中
来控制一个继电器*/
  
#include <ESP8266WiFi.h>
  
#define relay1 2 //继电器连接在8266的GPIO2上
const char *ssid     = "KMYZ8HL";//这里是我的wifi,你使用时修改为你要连接的wifi ssid
const char *password = "kmyz6051180";//你要连接的wifi密码
const char *host = "192.168.191.4";//修改为手机的的tcpServer服务端的IP地址,即手机在路由器上的ip
WiFiClient client;
const int tcpPort = 8266;//修改为你建立的Server服务端的端口号
  
  
void setup()
{    pinMode(relay1,OUTPUT);//原来的盆友注意了,原来的代码这里漏了句i am so sorry
    Serial.begin(115200);
    delay(10);
    Serial.println();
    Serial.println();
    Serial.print("Connecting to ");//写几句提示,哈哈
    Serial.println(ssid);
  
    WiFi.begin(ssid, password);
  
    while (WiFi.status() != WL_CONNECTED)//WiFi.status() ,这个函数是wifi连接状态,返回wifi链接状态
                                         //这里就不一一赘述它返回的数据了,有兴趣的到ESP8266WiFi.cpp中查看
    {
        delay(500);
        Serial.print(".");
    }//如果没有连通向串口发送.....
  
    Serial.println("");
    Serial.println("WiFi connected");
    Serial.println("IP address: ");
    Serial.println(WiFi.localIP());//WiFi.localIP()返回8266获得的ip地址
}
  
  
void loop()
{
    while (!client.connected())//几个非连接的异常处理
    {
        if (!client.connect(host, tcpPort))
        {
            Serial.println("connection....");
            //client.stop();
            delay(500);
  
        }
    }
while (client.available())//available()同ARDUINO,不解释了
    {
        char val = client.read();//read()同arduino
        if(val=='a'){//pc端发送a和b来控制
           digitalWrite(relay1, LOW);
        }
        if(val=='b')
        {
            digitalWrite(relay1, HIGH);
        }
    }
  
  
}[/mw_shl_code]

烧写。。。
234452gglfwf63kaw22att.png

给8266上电,打开手机调试软件可以看到已经有一个设备加入网络了
QQ图片20151110123928.png

发送我们设定的0和1开关继电器
2015-11-10-12-44-50.png

哈哈,就可以开关继电器啦。
我也发一个有按钮的调试软件,用法一样
2015-11-10-12-55-51.png 2015-11-10-12-55-58.png

手机设置为服务端,这里我们使用一个指令控制,改下代码就可以了
先申明一个变量来存状态
boolean ONorOFF=LOW;
在改成
if(val == 1) {
            digitalWrite(2,ONorOFF);
            Serial.print("ON");
            ONorOFF = (!ONorOFF);

这样就可以一个指令控制了。ps:路人甲:楼主废话真多

2.透传
8266叫串口wifi模块,so透传肯定不能少,通过这几篇帖子我们学习了,控制gpio,把8266作为透传同理就是把8266串口获取到的数据无线发送出去
改下上面的代码即可
[mw_shl_code=cpp,true]while (client.available())//改动的就这里啦,无线读取到的数据转发到到串口
    {
        uint8_t c = client.read();
        Serial.write(c);
    }


    if (Serial.available())//串口读取到的转发到wifi,因为串口是一位一位的发送所以在这里缓存完再发送
    {
        size_t counti = Serial.available();
        uint8_t sbuf[counti];
        Serial.readBytes(sbuf, counti);
        client.write(sbuf, counti);

    }[/mw_shl_code]

这样透传就OK啦,把8266的rx,tx接在其他单片机的tx,rx上,然后其他的怎么写,你懂了
附件下载 用到的软件.rar (657.67 KB, 下载次数: 3034)
你们的回复就是我的动力,2015.11.30更新下一篇


发表于 2015-11-24 12:31 | 显示全部楼层
顶起来,不能沉!好帖就要发出好帖的光!
发表于 2015-11-24 13:50 | 显示全部楼层
好东西,怎么没有人分享下,有没有8266的连接红外传感器的,或者是温湿度,透传到手机显示的?
 楼主| 发表于 2015-11-22 12:44 | 显示全部楼层
Betteronly 发表于 2015-11-22 12:42
新帖啊。。就是为我准备的是么,
楼猪你这么好,你老婆知道吗?

可是好幸酸的说,看都没几个人看,都沉底了都
发表于 2017-6-16 18:23 | 显示全部楼层
狗尾续貂,在作者辛苦劳动的基础上添加点玩意:(作用嘛就是无视IP,全局域网内广播通信。测试在WESMOS D1完美通过,很奇怪的在ESP-13 MODULE上编译上传成功,就是发不出广播包,定向的能发)#include <ESP8266WiFi.h>
#include <WiFiUdp.h>

const char *ssid = "MyWIFI";//这里是我的wifi,你使用时修改为你要连接的wifi ssid
const char *password = "123123123";//你要连接的wifi密码
const char *UDPhost = "255.255.255.255";//局域网全网UDP广播地址,也可以使用你本地网段后缀为255也行,不过适应能力就弱了
WiFiClient client;
const int udpPort = 4321;//修改为你建立的Server服务端的端口号
unsigned int localPort = 3888;//UDP端口侦听
char packetBuffer[255]; //存放接收到的UDP数据
char  whoamiBuffer[128]="Udp Test01";
char  ReplyBuffer[255] = "I Received packet!";       // 回复广播发送者
WiFiUDP Udp;

void setup()
{
  Serial.begin(115200);
  delay(10);
  Serial.println();
  Serial.println();
  Serial.print("Connecting to ");//写几句提示,哈哈
  Serial.println(ssid);
  WiFi.begin(ssid, password);//连接WIFI热点

  while (WiFi.status() != WL_CONNECTED)//WiFi.status() ,这个函数是wifi连接状态,返回wifi链接状态
  {
    delay(500);
    Serial.print(".");//如果没有连通向串口发送.....
  }

  Serial.println("");
  Serial.println("WiFi connected");
  Serial.println("IP address: ");
  Serial.println(WiFi.localIP());//WiFi.localIP()返回8266获得的本机ip地址
  long rssi = WiFi.RSSI();
  Serial.print("signal strength (RSSI):");
  Serial.print(rssi);
  Serial.println(" dBm");//整几个高大上的数字,比如信号强度啥米的,呵呵

  // 开始UDP端口侦听
  Udp.begin(localPort);

  //先把自己是谁广播出去
  Udp.beginPacket(UDPhost, udpPort);
  Udp.write(whoamiBuffer);
  Udp.endPacket();
  Serial.println(UDPhost);
}
void loop()
{

  //UDP广播数据到达处理
  int packetSize = Udp.parsePacket();
  if (packetSize) {
    Serial.print("Received packet of size ");
    Serial.println(packetSize);
    Serial.print("From ");
    IPAddress remoteIp = Udp.remoteIP();//获取远程广播包发送IP
    Serial.print(remoteIp);
    Serial.print(", port ");
    Serial.println(Udp.remotePort());

  // 将到达的数据包读入packetBufffer
    int len = Udp.read(packetBuffer, 255);
    if (len > 0) {
      packetBuffer[len] = 0;
    }
    Serial.println("Contents:");
    Serial.println(packetBuffer);

    // 回复信息给广播发送IP
    Udp.beginPacket(Udp.remoteIP(), Udp.remotePort());
//    strcat(ReplyBuffer,Udp.remoteIP());
    Udp.write(Udp.remoteIP());
    Udp.write(ReplyBuffer);
    Udp.endPacket();
  }
}
lunt01.jpg

发表于 2015-11-19 23:46 | 显示全部楼层
谢谢lz分享
发表于 2015-11-22 12:42 | 显示全部楼层
新帖啊。。就是为我准备的是么,
楼猪你这么好,你老婆知道吗?
发表于 2015-11-29 10:49 | 显示全部楼层
感觉很不错的文章啊。
发表于 2015-11-29 23:22 | 显示全部楼层
为了赞楼主,专门申请的论坛号
发表于 2015-11-29 23:27 | 显示全部楼层
又从头看了一遍!!
发表于 2015-11-30 21:09 | 显示全部楼层

sketch_nov30b.ino:57:1: error: stray '\' in program
sketch_nov30b.ino:57:1: error: stray '\' in program
sketch_nov30b.ino:62:1: error: stray '\' in program
sketch_nov30b.ino:62:1: error: stray '\' in program
sketch_nov30b.ino: In function 'void loop()':
sketch_nov30b.ino:57:15: error: 'u201crelay1' was not declared in this scope
sketch_nov30b.ino:62:15: error: 'u201crelay1' was not declared in this scope
stray '\' in program
编译出错,使用的是1.6.5
楼主怎么办啊
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

小黑屋|Archiver|手机版|Arduino中文社区

GMT+8, 2024-11-28 00:34 , Processed in 0.215120 second(s), 23 queries .

Powered by Discuz! X3.4

Copyright © 2001-2021, Tencent Cloud.

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