这块智能屏竟然支持网口控制,那我们直接使用屏幕、网线配合家庭服务器,搭建一个家庭智能中控,监测家中各项环境指标(暂且为温湿度+光照),曲线显示,配合控制自制的无线开关。
敢单介绍
1.服务器开发(打算挑战一下自己用QT或者失败用C#)
2.智能屏的UI及逻辑设计
3.家庭环境采集(用的是我之前设计的采集卡)
4.无线开关控制(也是之前设计的无线开关)

打开软件新建工程

导入个背景图

分辨率不够还会自动调整

选中背景图


下载程序需要注意,需要先断电(DC口的电源),然后连接USB

先编译再下载

下载即可


徐福
今天实现个QT TCP连接发送数字到智能屏
先整下屏幕设置屏幕IP设置

添加个数字控件


下载默认是0
QT操作建立新工程(不细写了)
先设计个UI

引用网络

添加socket库

初始化套接字


新建头文件添加发送结构体

添加大小端转换函数(QT和屏幕大小端不同)

添加两个按键函数

编译运行一气呵成

测试

对比指令正确,同时屏幕数字发生变化,直接芜湖
优化了界面,使之对齐
qt的拖拽操作没有C#的好用,QT没有对齐参考线,在搞对齐时有点烦人

主界面
控件使用情况:日期时间 进度条 两种表盘 静态图标 静态字符串 数字 触摸键

其中发现了一个问题,表盘以及进度条的范围都不支持有符号数吗?
展示一波金主们(主界面点击跳转)


QT添加测试功能及校时功能

附加一个校时代码
struct WRITE_TIME
{
u8 head; //帧头
u8 cmd; //命令
u8 year; //年
u8 month;//月
u8 day; //日
u8 hour; //时
u8 min; //分
u8 sec; //秒
u32 tail; //帧尾
};
void eepw_central::on_pushButton_clicked()
{
QTime time = QTime::currentTime();
QDate date = QDate::currentDate();
struct WRITE_TIME write_time;
write_time.head = 0xaa;
write_time.cmd = 0x9c;
write_time.year = date.year()-2000;
write_time.month = date.month();
write_time.day = date.day();
write_time.hour = time.hour();
write_time.min = time.minute();
write_time.sec = time.second();
write_time.tail = BLEndianUint32(0xcc33c33c);//大小端转换
QByteArray data;
data.resize(sizeof(struct WRITE_TIME));
memcpy(data.data(), &write_time, sizeof(struct WRITE_TIME));
//向服务器发数据
mSocket->connectToHost("192.168.2.10",1234);//连接智能屏
mSocket->write(data);
mSocket->disconnectFromHost();//断开连接
#if debug
testSocket->write(data);
#endif
}WiFi开关的控制
用的是ESP8266,直接wifi接入局域网,连接服务器,获取服务器转发命令即可控制
#include <ESP8266WiFi.h>
WiFiClient client;
const char* ssid = "****"; // 连接WiFi名
const char* password = "****"; // 连接WiFi密码
const char *host = "192.168.2.19";
const int httpPort = 9999;
// the setup function runs once when you press reset or power the board
void setup() {
// initialize digital pin LED_BUILTIN as an output.
Serial.begin(115200);// 初始化串口
pinMode(LED_BUILTIN, OUTPUT);
connectWiFi();
while (!client.connect(host, httpPort))
{
Serial.println("connection failed");
}
}
// the loop function runs over and over again forever
void loop() {
while (client.connected() || client.available())
{
if (client.available())
{
String line = client.readStringUntil('\n');
Serial.println(line);
if(line == "000")
{
digitalWrite(LED_BUILTIN, HIGH); // turn the LED on (HIGH is the voltage level)
}
else if(line == "111")
{
digitalWrite(LED_BUILTIN, LOW); // turn the LED off by making the voltage LOW
}
}
}
if(!client.connected())
{
while (!client.connect(host, httpPort))
{
Serial.println("connection failed");
}
}
}
// 连接WiFi
void connectWiFi(){
WiFi.begin(ssid, password); // 启动网络连接
Serial.print("Connecting to "); // 串口监视器输出网络连接信息
Serial.print(ssid); Serial.println(" ..."); // 告知用户NodeMCU正在尝试WiFi连接
int i = 0; // 这一段程序语句用于检查WiFi是否连接成功
while (WiFi.status() != WL_CONNECTED) { // WiFi.status()函数的返回值是由NodeMCU的WiFi连接状态所决定的。
delay(1000); // 如果WiFi连接成功则返回值为WL_CONNECTED
Serial.print(i++); Serial.print(' '); // 此处通过While循环让NodeMCU每隔一秒钟检查一次WiFi.status()函数返回值
} // 同时NodeMCU将通过串口监视器输出连接时长读秒。
// 这个读秒是通过变量i每隔一秒自加1来实现的。
Serial.println(""); // WiFi连接成功后
Serial.println("Connection established!"); // NodeMCU将通过串口监视器输出"连接成功"信息。
Serial.print("IP address: "); // 同时还将输出NodeMCU的IP地址。这一功能是通过调用
Serial.println(WiFi.localIP()); // WiFi.localIP()函数来实现的。该函数的返回值即NodeMCU的IP地址。
}召唤神龙层
全家福

视频
(家庭小中控)EEPW-TOPWAY智能屏使用活动_哔哩哔哩_bilibili
https://www.bilibili.com/video/bv1e64y1x7Qp
打包代码
| 有奖活动 | |
|---|---|
| 硬核工程师专属补给计划——填盲盒 | |
| “我踩过的那些坑”主题活动——第002期 | |
| 【EEPW电子工程师创研计划】技术变现通道已开启~ | |
| 发原创文章 【每月瓜分千元赏金 凭实力攒钱买好礼~】 | |
| 【EEPW在线】E起听工程师的声音! | |
| 高校联络员开始招募啦!有惊喜!! | |
| 【工程师专属福利】每天30秒,积分轻松拿!EEPW宠粉打卡计划启动! | |
| 送您一块开发板,2025年“我要开发板活动”又开始了! | |