拓普微智能TFT液晶显示模块HMT070ETD-1D,带电容触摸的7寸智能显示模块,支持网络更新界面,以及通过互联网控制、查询TFT显示状态,十分适合 IoT 应用场景。
开箱,话不多说,直接上照
查看手册了解到,这块智能屏竟然支持网口控制。那我们直接使用屏幕、网线配合家庭服务器,搭建一个家庭智能中控,监测家中各项环境指标(暂且为温湿度+光照),曲线显示,配合控制自制的无线开关。
敢单介绍
设置背景图
照着教程捋一捋。先去网上找个1024*600分辨率的图片,另存为BMP文件,最好是24位的。
1、新建工程
打开软件新建工程:
导入个背景图:
分辨率不够还会自动调整:
选中背景图:
2、编译下载
下载程序需要注意,需要先断电(DC口的电源),然后连接USB:
先编译再下载:
下载即可:
发送数字到智能屏
接下来,实现个QT的TCP连接,发送数字到智能屏。
先整下屏幕设置屏幕IP设置:
添加个数字控件:
下载默认是0。
1、QT操作建立新工程
先设计个UI:
引用网络:
添加socket库:
初始化套接字:
新建头文件添加发送结构体:
添加大小端转换函数(QT和屏幕大小端不同):
添加两个按键函数:
编译运行一气呵成:
2、测试
对比指令正确,同时屏幕数字发生变化,直接芜湖
3、优化了界面,使之对齐
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地址。
}
采集端使用的是之前G070板卡现成的代码,前文地址如下:
http://forum.eepw.com.cn/thread/346099/1
成果展示
展示视频:
https://www.bilibili.com/video/bv1e64y1x7Qp
文中代码下载:
http://share.eepw.com.cn/share/download/id/388889
免责声明:本文系网络转载或改编,未找到原创作者,版权归原作者所有。如涉及版权,请联系删