飞凌嵌入式
直播中

fsdzdzy

11年用户 260经验值
擅长:嵌入式技术 控制/MCU opencv
私信 关注
[技术]

【飞凌RK3568开发板试用体验】14-WIFI控制家用电器

上篇,测试了OK3568-C开发板与ESP8266进行通信的功能,通过WIFI实现TCP无线连接,并且TCP服务端还设计了多客户端的处理功能。

本篇,来利用TCP无线通信,实现家中电器的控制,比如控制家里的灯和风扇。

1 Qt操作界面设计

首先来看下最终的界面效果:

  • 主界面上有一灯和风扇的图标,初始关闭状态时两个图标会灰色的,开的状态灯的图标会显示发光的黄色,风扇显示转动的蓝色
  • 灯和风扇的下方各有一个按钮,按下后,灯和风扇的工作状态会进行切换

2 开关指令发送

为了能控制实际的电器,需要通过TCP服务发送出对应的指令,这里自定义为使用字符串的方式代表不同的指令:

  • led on:打开灯
  • led off:关闭灯
  • fan on:打开风扇
  • fan off:关闭风扇

2.1 服务端指令发送

void TCPServer::LEDControl(bool bOn)
{
    printf("[%s] send ...\n", __func__);
    if (m_esp8266fd != -1)
    {
        printf("[%s] send ......\n", __func__);
        std::string msg = bOn ? "led on" : "led off";
        int ret = send(m_esp8266fd, msg.c_str(), msg.length(), 0);
        printf("[%s] send ret:%d\n", __func__, ret);
    }
}
​
void TCPServer::FanControl(bool bOn)
{
    printf("[%s] send ...\n", __func__);
    if (m_esp8266fd != -1)
    {
        printf("[%s] send ......\n", __func__);
        std::string msg = bOn ? "fan on" : "fan off";
        int ret = send(m_esp8266fd, msg.c_str(), msg.length(), 0);
        printf("[%s] send ret:%d\n", __func__, ret);
    }
}

2.2 客户端指令接收

ESP8266作为TCP客户端进行指令的接收,解析到不同的指令后,再控制电器的开关。

这里写了一个字符串分割函数,用于解析指令:

void splitBySpace(String &src, std::vector<String> &dst)
{
  int splitpos = 0;
  String recvStr = src;
  std::vector<String> splitArr;
  do {
    splitpos = recvStr.indexOf(' ');//找到字符串中逗号出现的位置
    if (splitpos != -1) //如果能找到逗号
    {
      splitArr.push_back(recvStr.substring(0, splitpos));
      recvStr = recvStr.substring(splitpos + 1, recvStr.length()); //recvStr变成去掉已打印的文本的剩余文本
    }
    else //如果没有找到逗号
    {
      if (recvStr.length() > 0) //message是否存在文本
      {
        splitArr.push_back(recvStr);
      }
    }
  }
  while (splitpos >= 0); //当逗号位置存在
  dst = splitArr;
}

ESP8266的主循环中,接收OK3568的指令,并进行IO电平的控制,进行实现电器的控制。

void loop()
{
  //向Tcp server发送数据
  Serial.println("发送数据到Tcp server");
  esp8266Client.print("This is ESP8266");
​
  while (1)
  {
    if (esp8266Client.available())
    {
      String recvStr = "";
      while (esp8266Client.available())
      {
        recvStr += char(esp8266Client.read());
      }
      Serial.println("收到服务端的信息:");
      Serial.println(recvStr);
      std::vector<String> splitStr;
      splitBySpace(recvStr, splitStr);
      if (splitStr.size() == 2)
      {
        if (splitStr[0] == "led")
        {
          if (splitStr[1] == "on")
          {
            Serial.println("开灯1");
            digitalWrite(LED_PIN, HIGH); // 点亮LED
          }
          else if (splitStr[1] == "off")
          {
            Serial.println("关灯1");
            digitalWrite(LED_PIN, LOW); // 熄灭LED
          }
        }
        else if (splitStr[0] == "fan")
        {
          if (splitStr[1] == "on")
          {
            Serial.println("开风扇");
            digitalWrite(FAN_PIN, HIGH); // 开风扇
          }
          else if (splitStr[1] == "off")
          {
            Serial.println("关风扇");
            digitalWrite(FAN_PIN, LOW); // 关风扇
          }
        }
      }
    }
  }
}

Qt部分的项目工程代码如下:

3 测试

OK3568开发板连接HDMI显示器。

ESP8266连接一个LED来模拟灯的开关,连接一个继电器来模拟电扇的开关。

两个板子连接同一wifi后,建立TCP通信,然后就可以在OK3568的Qt界面上,控制ESP8266上外接的电器了。

下面这个是控制灯的结果:Qt界面上灯的图标点亮,同时ESP8266的外接LED也点亮了

下面这个是控制风扇的结果:Qt界面上风扇的图标点亮,同时ESP8266的外接继电器也吸合了,发出了啪嗒的声音

4 总结

本篇介绍了利用TCP无线通信,实现家中电器的控制,控制家里的灯和风扇。

WIFI控制家用电器

更多回帖

发帖
×
20
完善资料,
赚取积分