Days 22 ElfBoard 基于QT的智慧家庭控制中心

1、项目介绍

1.1、项目功能简介

本项目基于elfboard开发板,利用qt搭建一个智慧家庭控制中心系统,该系统由四个部分组成:网络连接 、天气预报、室内环境监测和家具控制中心。网络连接部分的功能是扫描周围的wifi网络并连接,天气预报部分的功能是在网络连接成功后获得某地的天气信息。室内环境监测主要是利用温湿度传感器来监测室内的环境,家具控制中心主要是控制led灯和蜂鸣器。

1.2、项目软硬件需求

  • ELF1开发板一块

  • wifi

  • 触摸屏

  • qt

  • 注册获取天气接口 实况天气接口API开发指南 未来一天天气预报api - 天气API

2、项目功能

2.1、网络连接

网络连接部分的ui如图所示:

本项目使用wpa_supplicant工具连接wifi,该工具是elfborad开发板的操作系统自带的。

该部分的核心代码如下:

扫描附近的wifi,然后将数据存储到wifiname.txt文件中,核心代码如下。

 

system("killall wpa_suppicant"); qDebug()<<"killall wpa_suppicant"; system("rm -rf /var/run/wpa_supplicant"); qDebug() << "rm /var/run/wpa_supplicant"; QThread::msleep(1000); system("killall udhcpc"); qDebug() << "killall udhcpc"; QThread::msleep(1000); system("wpa_supplicant -D nl80211 -i wlan0 -c /etc/wpa_supplicant.conf -B"); qDebug() << "wpa_supplicant"; QThread::msleep(1000); system("killall wpa_cli"); QThread::msleep(1000); system("wpa_cli -i wlan0 scan"); QThread::msleep(1000); system("wpa_cli -i wlan0 scan_results > ./wifilist"); QThread::msleep(1000); system("cat wifilist |awk -F'\t' '{print $5}'> wifiname.txt");

该部分的代码的作用是读取wifiname.txt文件,然后将信息更新到ui中。

 

while (j<=12) { j++; str = in.readLine(); qDebug()<<str; if(str.isEmpty()) { str = ""; } switch (j-1) { case 1:ui->Wlan1->setVisible(true); ui->Wlan1->setText(str); break; case 2:ui->Wlan2->setVisible(true); ui->Wlan2->setText(str); break; case 3:ui->Wlan3->setVisible(true); ui->Wlan3->setText(str); break; case 4:ui->Wlan4->setVisible(true); ui->Wlan4->setText(str); break; case 5:ui->Wlan5->setVisible(true); ui->Wlan5->setText(str); break; case 6:ui->Wlan6->setVisible(true); ui->Wlan6->setText(str); break; case 7:ui->Wlan7->setVisible(true); ui->Wlan7->setText(str); break; case 8:ui->Wlan8->setVisible(true); ui->Wlan8->setText(str); break; case 9:ui->Wlan9->setVisible(true); ui->Wlan9->setText(str); break; case 10:ui->Wlan10->setVisible(true); ui->Wlan10->setText(str); break; case 11:ui->Wlan11->setVisible(true); ui->Wlan11->setText(str); break; case 12:ui->Wlan12->setVisible(true); ui->Wlan12->setText(str); break; default:break; } }

该部分代码的作用是在用户选择好连接的wifi并输入密码后连接wifi。

 

char set_ssid[64]; char set_password[64]; char select_wlan[64]; if (ui->wifimima->text().isEmpty()) { QMessageBox::warning(this,tr("Connect information"), tr("密码不能为空")); } else { int i =get_i(); sprintf(set_ssid,"wpa_cli -i wlan0 set_network %d ssid '\"%s\"'",i,wifiName.toLatin1().data()); sprintf(set_password, "wpa_cli -i wlan0 set_network %d psk '\"%s\"' ",i,ui->wifimima->text().toLatin1().data()); qDebug() << set_password; sprintf(select_wlan, "wpa_cli -i wlan0 select_network %d ",i); system(set_ssid); system(set_password); system("wpa_cli -i wlan0 list_network"); system(select_wlan); system("udhcpc -i wlan0 -B");

2.2、天气预报

该页面的ui如图所示:

2.2.1、准备工作

在实况天气接口API开发指南 未来一天天气预报api - 天气API网站注册,注册好后可以看到如下信息,每个邮箱号有3000次的免费的请求机会

我使用的是v61接口,https://tianqiapi.com/index/doc?version=v61,该接口下的天气信息的json格式如下所示:

 

{ "cityid":"101271201", #城市编号 "date":"2020-07-15", "week":"星期三", "update_time":"10:15", #更新时间 "city":"内江", #城市名称 "cityEn":"neijiang", "country":"中国", "countryEn":"China", "wea":"阴", #实时天气情况 "wea_img":"yin", "tem":"25", #实时温度 "tem1":"29", #高温 "tem2":"23", #低温 "win":"西风", #风向 "win_speed":"2级", #风力等级 "win_meter":"小于12km/h", #风速 "humidity":"97%", #湿度 "visibility":"24.22km", #能见度 "pressure":"961", #气压 "uvIndex":"3", #紫外线等级 "uvDescription": "中等",#紫外线描述 "air":"15", #空气质量 "air_pm25":"8", #pm2.5 "air_level":"优", "air_tips":"空气很好,可以外出活动,呼吸新鲜空气,拥抱大自然!", "rain_pcpn":"2.5",#降雨量2.5mm "alarm":{ "alarm_type":"暴雨", #预警类型 "alarm_level":"橙色", #预警等级 "alarm_content":"内江市气象台7月15日5时23分发布第16号暴雨橙色预警信号: 预计我市市中区部分地方3小时降雨量将达50毫米以上,并伴有雷电和阵性大风,请加强防范强降水、雷电和大风等带来的危害。 (预警信息来源:国家预警信息发布中心)" #预警描述 }, "aqi":{ #空气质量指数详情 "air":"15", "air_level":"优", "air_tips":"空气很好,可以外出活动,呼吸新鲜空气,拥抱大自然!", "pm25":"8", "pm25_desc":"优", "pm10":"10", "pm10_desc":"优", "o3":"47", "o3_desc":"优", "no2":"12", "no2_desc":"优", "so2":"8", "so2_desc":"优", "co": "1", "co_desc": "优", "kouzhao":"无需戴口罩", "waichu":"适宜外出", "yundong":"适宜运动", "kaichuang":"适宜开窗", "jinghuaqi":"关闭净化器", "cityid":"101271201", "city":"内江", "cityEn":"neijiang", "country":"中国", "countryEn":"China" } }

2.2.2、请求数据

请求天气数据的代码如下所示,appid后面的数字和appsecret是在注册时网站给的密匙。

 

char quest_array[256] = "http://v1.yiketianqi.com/api?unescape=1&version=v61&appid=19311841&appsecret=nAGo24xi&city="; QNetworkRequest quest; sprintf(quest_array, "%s%s", quest_array, cityStr.toUtf8().data()); quest.setUrl(QUrl(quest_array)); quest.setHeader(QNetworkRequest::UserAgentHeader, "RT-Thread ART"); manager->get(quest); /*发送get网络请求*/

我们在发送完请求信息后,会获得回复信息,信息是json格式,我们只需要解析该json数据就行。主要代码如下所示。

 

QJsonDocument json_recv = QJsonDocument::fromJson(all.toUtf8(), &err);//解析json对象 if (!json_recv.isNull() && err.error == QJsonParseError::NoError) { QJsonObject object = json_recv.object(); QStringList keys = object.keys(); foreach (const QString& key,keys){ qDebug() << "Key:" <<key; } QString weather_type = object.value("wea").toString(); qDebug()<<"weather_type :"<<weather_type; QString tuijian = object.value("air_tips").toString(); qDebug()<<"tuijian: "<<tuijian; QString low = object.value("tem2").toString(); qDebug()<<"low :"<<low; QString high = object.value("tem1").toString(); QString wendu = low.mid(low.length() - 4, 4) + "~" + high.mid(high.length() - 4, 4); qDebug()<<"wendu: "<<wendu; QString strength = object.value("win_speed").toString(); qDebug()<<"strength: "<<strength; strength.remove(0, 8); strength.remove(strength.length() - 2, 2); QString fengli = object.value("win").toString() + strength; QString ziwaixian = object.value("uvIndex").toString(); qDebug()<<"ziwaixian :"<<ziwaixian; QString kongqizhiliang = object.value("air").toString(); qDebug()<<"kongqizhiliang :"<<kongqizhiliang; ui->label_weather_2->setText(weather_type); ui->label_temperature_2->setText(wendu); ui->label_wind_2->setText(fengli); ui->label_kongqizhiliang->setText(kongqizhiliang); ui->label_uv->setText(ziwaixian); ui->label_recommend_2->setText(tuijian); }

2.3、室内环境监测

该部分的ui如图所示:

该部分的代码比较简单,主要是新建立一个线程,然后不停的读取传感器的信息,然后将相关的信息展示即可。核心代码如下:

 

void CollentdataThread::run() { int fd = aht20_init(); emit send(temp,hum); while (1) { /*read temp data*/ aht20_read(fd); emit send(temp,hum); sleep(2); } }

2.4、家具控制中心

该部分的ui如图所示:

该部分主要是利用为了充分的展示开发板上的硬件而制作,我们假设3个led灯就是我们家里的灯,蜂鸣器可以假设为报警器。本身而言没什么。

3、软件编译

开发板的qt应用教程对如何在elfboard开发板上编译qt程序有详细的介绍,在此我就不多做介绍了。我只想强调一点的是,在使用arm-gcc编译完成后的可执行文件是不能在我们x86的电脑上运行的,如图所示。我们需要先在电脑上调试我们软件,成功之后,再使用arm-gcc编译,然后移植到开发板上。

4、项目总结

本项目制作了一个智慧家庭的app,该app充分的利用了开发板自带的wifi,led灯,温湿度传感器,蜂鸣器等硬件,同时也考虑连接wifi后可以访问网络的特性,制作了一个天气页面,该页面可以获得不同地区的天气情况。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/670537.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

C#入门及进阶|数组和集合(二):数组的初始化及元素访问

目录 1.数组的初始化 1. 1 一维数组初始化 1.2多维数组初始化 1.3 不规则数组初始化 2.数组的访问 2.1 一维数组的引用 2.2 多维数组的引用 2.3 不规则数组的引用 1.数组的初始化 1. 1 一维数组初始化 语法形式1&#xff1a; type [ ] arrayName new type [size] { …

Vue3——模板语法(文本插值、vue内置指令)

文章目录 文本插值{{}}受限的全局访问指令Directives指令的参数指令的修饰符vue3的内置指令渲染文本内容&#xff08;v-text&#xff09;渲染html &#xff08;v-html&#xff09;单项绑定&#xff08;v-bind&#xff09;单项绑定的使用单项绑定v-bind的简写同名简写动态绑定多…

机器学习 | 探索朴素贝叶斯算法的应用

朴素贝叶斯算法是一种基于贝叶斯定理和特征条件独立假设的分类算法。它被广泛应用于文本分类、垃圾邮件过滤、情感分析等领域&#xff0c;并且在实际应用中表现出色。 朴素贝叶斯法是基于贝叶斯定理与特征条件独立假设的分类方法&#xff1a; 1&#xff09;对于给定的待分类项r…

达梦数据库主备切换知识

一、切换模式 达梦数据库主备切换分为主动切换和被动切换模式 primary:主库状态 standby:备库状态 suspend;挂起状态,数据库会变成只读模式 主库正常切换的前提: 1、监视器正常 2、接管备库是 Standby 模式、Open 状态。 二、监视器模式 MON_DW_CONFIRM为1时为确认监视…

Architecture Lab:Part C【流水线通用原理/Y86-64的流水线实现/实现IIADDQ指令】

目录 任务描述 知识回顾 流水线通用原理 Y86-64流水线实现&#xff08;PIPE-与PIPE&#xff09; 开始实验 IIADDQ指令的添加 优化 ncopy.ys 仅用第四章知识&#xff0c;CEP11.55 8x1展开&#xff0c;CPE9.35 8x1展开2x1展开消除气泡&#xff0c;CPE8.10 流水线化通过…

算法每日一题: 使用循环数组所有元素相等的最少秒数 | 哈希

大家好&#xff0c;我是星恒&#xff0c;今天给大家带来的是一道需要感觉规律的题目&#xff0c;只要读懂题目中的规律&#xff0c;就可以做出来了 这道题用到了哈希&#xff0c;还有一个关键点比较类似循环队列 题目&#xff1a;leetcode 2808 给你一个下标从 0 开始长度为 n…

C++ 值传递,引用传递,以及指针传递

值传递&#xff1a; 直接复制变量值给函数使用&#xff0c;函数内部不影响原变量。 引用传递&#xff1a; 不复制变量&#xff0c;而是提供对原变量的直接访问&#xff0c;函数内部操作可改变原变量值。 指针传递&#xff1a; 通过传递变量地址间接访问和操作变量&#xff0c;提…

Postman发送带登录信息的请求

环境&#xff1a;win10Postman10.17.7 假设有个请求是这样的&#xff1a; RequiresPermissions("tool:add") PostMapping(value"/predict") ResponseBody /** * xxx * param seqOrderJson json格式的参数 * return */ public String predictSampleIds(Req…

svg基础(三)分组、渐变

上一篇文章简单介绍了svg常用标签及其属性,本篇主要介绍分组&#xff0c;渐变 1 分组<g> 分组容器 添加到g元素上的变换会应用到其所有的子元素上添加到g元素的属性会被其所有的子元素继承定义复杂对象&#xff0c;可通过<use>元素引用 1.1 分组 <svg>&…

EasyExcel分页上传数据

EasyExcel分页上传数据 一、实例 controller上传入口 PostMapping("/upload")ResponseBodyLog(title "导入工单", businessType BusinessType.IMPORT)public AjaxResult uploadFile(HttpServletRequest request, MultipartFile files) throws Exceptio…

Node.js+Express+Mysql服务添加环境变量

1、使用dotenv插件 1&#xff09;安装插件&#xff1a;npm install dotenv-cli --save-dev 2&#xff09;在项目根目录下添加对应的 .env 配置文件&#xff1b; // .env配置文件内容 MODEdevelopment, BASE_URLhttp://127.0.0.1:80813) 在启动命令中设置对应的加载文件&#…

springboot159基于springboot框架开发的景区民宿预约系统的设计与实现

简介 【毕设源码推荐 javaweb 项目】基于springbootvue 的 适用于计算机类毕业设计&#xff0c;课程设计参考与学习用途。仅供学习参考&#xff0c; 不得用于商业或者非法用途&#xff0c;否则&#xff0c;一切后果请用户自负。 看运行截图看 第五章 第四章 获取资料方式 **项…

STM32内部Flash

目录 一、内部Flash简介 二、内部Flash构成 1. 主存储器 2. 系统存储区 3. 选项字节 三、内部Flash写入过程 1. 解锁 2. 页擦除 3. 写入数据 四、工程空间分布 某工程的ROM存储器分布映像&#xff1a; 1. 程序ROM的加载与执行空间 2. ROM空间分布表 一、内部Flash…

2024.3.28-29日ICVS-AI智能汽车产业峰会(杭州)

本次安策将携手泰雷兹一起&#xff0c;参展ICVS2024第四届AI智能汽车产业峰会(杭州)&#xff0c;2024年3月28日-29日&#xff0c;欢迎新老朋友参加和莅临27号展台交流。 随着自动驾驶汽车政策密集落地。从我国四部门联合发布《关于开展智能网联汽车准入和上路通行试点工作的通知…

【0256】揭晓pg内核中MyBackendId的分配机制(后端进程Id,BackendId)(二)

上一篇:【0255】揭晓pg内核中MyBackendId的分配机制(后端进程Id,BackendId)(一) 文章目录 1. 前言2. 分配BackendId2.1 何时为backend process分配BackendId2.1.1 找出未使用的slot(inactive slot)2.3 BackendId序号从多少开始?2.4 后端进程退出后,其BackendId被释放…

【头歌·计组·自己动手画CPU】一、计算机数据表示(讲解版) 【计算机硬件系统设计】

&#x1f57a;作者&#xff1a; 主页 我的专栏C语言从0到1探秘C数据结构从0到1探秘Linux &#x1f618;欢迎关注&#xff1a;&#x1f44d;点赞&#x1f64c;收藏✍️留言 &#x1f3c7;码字不易&#xff0c;你的&#x1f44d;点赞&#x1f64c;收藏❤️关注对我真的很重要&…

五、Redis之发布订阅及事务管理

5.1 发布订阅 5.1.1 Redis 发布订阅 (pub/sub) 是一种消息通信模式&#xff1a;发送者 (pub) 发送消息&#xff0c;订阅者 (sub) 接收消息。Redis 客户端可以订阅任意数量的频道。下图展示了频道 channel1 &#xff0c;以及订阅这个频道的三个客户端 —— client1 、client2 …

力扣题目-1633.各赛事的用户注册率

力扣题目-1633.各赛事的用户注册率 仅作学习&#xff0c;不作他用 题干 用户表&#xff1a; Users Column NameTypeuser_namevarcharuser_idint user_id 是该表的主键(具有唯一值的列)。 该表中的每行包括用户 ID 和用户名。 注册表&#xff1a; Register Column NameTy…

C入门番外篇——C, Are you OK?

今日路上看到一个车牌&#xff0c;52U0K&#xff0c;感觉很有意思&#xff0c;如果做一下简单的翻译就是&#xff0c;“我爱你&#xff0c;好么&#xff1f;” 这样让我脑子中闪现了这样的一个画面&#xff1a;“一个男生追一个女生&#xff0c;看到女生不怎么搭理自己的样子&a…

Spring核心基础:全面总结Spring中提供的那些基础工具类!

内容概要 Spring Framework 提供了众多实用的工具类&#xff0c;这些工具类在简化开发流程、提升代码质量和维护性方面发挥了重要作用&#xff0c;以下是部分关键工具类的总结及其使用场景&#xff1a; StringUtils&#xff1a;不仅提供了基础的字符串操作&#xff0c;如拼接…