查看: 65042|回复: 112

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

  [复制链接]
  • TA的每日心情
    慵懒
    2018-11-12 08:58
  • 签到天数: 37 天

    [LV.5]常住居民I

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

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

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


    打开ide修改下代码,如下

    kittenblock中小学创客名师推荐的图形化编程软件

    /*这篇把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);
            }
        }
      
      
    }


    烧写。。。
    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串口获取到的数据无线发送出去
    改下上面的代码即可

    kittenblock中小学创客名师推荐的图形化编程软件

    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);
    
        }


    这样透传就OK啦,把8266的rx,tx接在其他单片机的tx,rx上,然后其他的怎么写,你懂了
    附件下载 用到的软件.rar (657.67 KB, 下载次数: 2779)
    文章有帮助,可以请我喝杯咖啡

    4人打赏

  • TA的每日心情
    开心
    2015-11-24 12:49
  • 签到天数: 1 天

    [LV.1]初来乍到

    发表于 2015-11-24 12:31 | 显示全部楼层
    顶起来,不能沉!好帖就要发出好帖的光!

    该用户从未签到

    发表于 2015-11-24 13:50 | 显示全部楼层
    好东西,怎么没有人分享下,有没有8266的连接红外传感器的,或者是温湿度,透传到手机显示的?
  • TA的每日心情
    慵懒
    2018-11-12 08:58
  • 签到天数: 37 天

    [LV.5]常住居民I

     楼主| 发表于 2015-11-22 12:44 | 显示全部楼层
    Betteronly 发表于 2015-11-22 12:42
    新帖啊。。就是为我准备的是么,
    楼猪你这么好,你老婆知道吗?

    可是好幸酸的说,看都没几个人看,都沉底了都
    文章有帮助,可以请我喝杯咖啡

    3人打赏

  • TA的每日心情

    2017-7-1 00:59
  • 签到天数: 4 天

    [LV.2]偶尔看看I

    发表于 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

  • TA的每日心情
    开心
    2015-8-3 09:40
  • 签到天数: 1 天

    [LV.1]初来乍到

    发表于 2015-11-19 23:46 | 显示全部楼层
    谢谢lz分享
  • TA的每日心情
    奋斗
    2015-12-14 23:06
  • 签到天数: 22 天

    [LV.4]偶尔看看III

    发表于 2015-11-22 12:42 | 显示全部楼层
    新帖啊。。就是为我准备的是么,
    楼猪你这么好,你老婆知道吗?
  • TA的每日心情
    开心
    2017-1-3 21:52
  • 签到天数: 2 天

    [LV.1]初来乍到

    发表于 2015-11-29 10:49 | 显示全部楼层
    感觉很不错的文章啊。
  • TA的每日心情
    开心
    2015-11-29 23:22
  • 签到天数: 1 天

    [LV.1]初来乍到

    发表于 2015-11-29 23:22 | 显示全部楼层
    为了赞楼主,专门申请的论坛号
  • TA的每日心情
    奋斗
    2015-12-14 23:06
  • 签到天数: 22 天

    [LV.4]偶尔看看III

    发表于 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
    楼主怎么办啊
    您需要登录后才可以回帖 登录 | 立即注册  

    本版积分规则

    热门推荐

    请问一下微动开关 4X4矩阵键盘 16按键  怎么接ardiuno的 接口?
    请问一下微动开关 4X4矩阵
    请问下这款微动开关 4X4矩阵键盘 16按键的 8个接口分别接单片机的什么口,我
    Arduino MEGA 与UNO 通过nRF24L模块通讯
    Arduino MEGA 与UNO 通过n
    之前在深水宝很“实惠”的店铺买了一些原件,随手砍了esp8266以及nRF24L*3 因为缺
    Nano 一直显示上传,不显示上传成功。
    Nano 一直显示上传,不显
    前面用的还好好的,突然就传不上程序了。一直停留在上传状态中,就是不限显示上传成功
    【项目】基于Arduino Nano的多功能桌面感应垃圾桶
    【项目】基于Arduino Nano
    基于Arduino Nano的多功能桌面感应垃圾桶随着大学生活不断往前迈进,宿舍桌面上的杂物
    Arduino板接74HC拓展接驱动器接多个四项电机
    Arduino板接74HC拓展接驱
    一个Arduino板能不能接多个74HC595来得到多个拓展? 如果能的话要怎么接啊? 如果接
    Copyright   ©2015-2016  Arduino中文社区  Powered by©Discuz!   ( 蜀ICP备14017632号-3 )
    快速回复 返回顶部 返回列表