本项目基于elfboard开发板,利用qt搭建一个智慧家庭控制中心系统,该系统由四个部分组成:网络连接 、天气预报、室内环境监测和家具控制中心。网络连接部分的功能是扫描周围的wifi网络并连接,天气预报部分的功能是在网络连接成功后获得某地的天气信息。室内环境监测主要是利用温湿度传感器来监测室内的环境,家具控制中心主要是控制led灯和蜂鸣器。
ELF1开发板一块
wifi
触摸屏
qt
注册获取天气接口 实况天气接口API开发指南 未来一天天气预报api - 天气API
网络连接部分的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()<
该部分代码的作用是在用户选择好连接的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");
该页面的ui如图所示:
在实况天气接口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" } }
请求天气数据的代码如下所示,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:" <
该部分的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); } }
该部分的ui如图所示:
该部分主要是利用为了充分的展示开发板上的硬件而制作,我们假设3个led灯就是我们家里的灯,蜂鸣器可以假设为报警器。本身而言没什么。
开发板的qt应用教程对如何在elfboard开发板上编译qt程序有详细的介绍,在此我就不多做介绍了。我只想强调一点的是,在使用arm-gcc编译完成后的可执行文件是不能在我们x86的电脑上运行的,如图所示。我们需要先在电脑上调试我们软件,成功之后,再使用arm-gcc编译,然后移植到开发板上。
本项目制作了一个智慧家庭的app,该app充分的利用了开发板自带的wifi,led灯,温湿度传感器,蜂鸣器等硬件,同时也考虑连接wifi后可以访问网络的特性,制作了一个天气页面,该页面可以获得不同地区的天气情况。