上篇,测试了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());
}
else
{
if (recvStr.length() > 0)
{
splitArr.push_back(recvStr);
}
}
}
while (splitpos >= 0);
dst = splitArr;
}
ESP8266的主循环中,接收OK3568的指令,并进行IO电平的控制,进行实现电器的控制。
void loop()
{
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);
}
else if (splitStr[1] == "off")
{
Serial.println("关灯1");
digitalWrite(LED_PIN, LOW);
}
}
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无线通信,实现家中电器的控制,控制家里的灯和风扇。