本帖最后由 水精灵 于 2024-8-22 16:55 编辑

今天非常荣幸地向各位小伙伴展示并分享共创社中一位成员精心完成的项目成果,该项目依托ElfBoard开发板为核心硬件平台,采用Qt框架构建了一套全面的智慧家庭控制中心系统。该系统由四大核心功能模块整合而成:网络通信接口、气象信息展示、室内环境监控及家居智能管理。

网络连接模块负责自动扫描并接入周边可用的Wi-Fi网络,确保系统与外部数据源的稳定互联。

天气预报模块在成功建立网络连接后,能够实时获取并显示指定地理位置的天气状况信息,为用户提供便捷的气象服务。

室内环境监测模块借助集成的温湿度传感器设备,实现对居住空间内部环境参数的实时监测和精准记录,以维护理想的居住环境条件。

家居控制中心作为系统的核心交互部分,具备对诸如LED照明设备以及蜂鸣器等家居设施的智能化管控能力,用户可通过该中心轻松实现远程操控与自动化场景设定。

项目软硬件需求
1、ELF 1开发板
2、4.3英寸电容屏
3、QT
4、实况天气接口API开发指南 未来一天天气预报api - 天气API
5、Wi-Fi(RTL8723DU)

01项目功能
1、网络连接
网络连接部分的UI如图所示:
4-3.png

本项目使用wpa_supplicant工具连接Wi-Fi,该工具是ElfBorad开发板的操作系统自带的。扫描附近的Wi-Fi,然后将数据存储到wifiname.txt文件中,核心代码如下:
  1.     system("killall wpa_suppicant");
  2.     qDebug()<<"killall wpa_suppicant";
  3.     system("rm -rf /var/run/wpa_supplicant");
  4.     qDebug() << "rm /var/run/wpa_supplicant";
  5.     QThread::msleep(1000);
  6.     system("killall udhcpc");
  7.     qDebug() << "killall udhcpc";
  8.     QThread::msleep(1000);
  9.     system("wpa_supplicant -D nl80211 -i wlan0 -c /etc/wpa_supplicant.conf -B");
  10.     qDebug() << "wpa_supplicant";
  11.     QThread::msleep(1000);
  12.     system("killall wpa_cli");
  13.     QThread::msleep(1000);
  14.     system("wpa_cli -i wlan0 scan");
  15.     QThread::msleep(1000);
  16.     system("wpa_cli -i wlan0 scan_results > ./wifilist");
  17.     QThread::msleep(1000);
  18.     system("cat wifilist |awk -F'\t' '{print $5}'> wifiname.txt");
复制代码

该部分的代码的作用是读取wifiname.txt文件,然后将信息更新到UI中。
  1.     while (j<=12)
  2.     {
  3.         j++;
  4.         str = in.readLine();
  5.         qDebug()<<str;
  6.         if(str.isEmpty())
  7.         {
  8.             str = "";
  9.         }

  10.         switch (j-1)
  11.         {
  12.         case 1:ui->Wlan1->setVisible(true);
  13.             ui->Wlan1->setText(str);
  14.             break;
  15.         case 2:ui->Wlan2->setVisible(true);
  16.             ui->Wlan2->setText(str);
  17.             break;
  18.         case 3:ui->Wlan3->setVisible(true);
  19.             ui->Wlan3->setText(str);
  20.             break;
  21.         case 4:ui->Wlan4->setVisible(true);
  22.             ui->Wlan4->setText(str);
  23.             break;
  24.         case 5:ui->Wlan5->setVisible(true);
  25.             ui->Wlan5->setText(str);
  26.             break;
  27.         case 6:ui->Wlan6->setVisible(true);
  28.             ui->Wlan6->setText(str);
  29.             break;
  30.         case 7:ui->Wlan7->setVisible(true);
  31.             ui->Wlan7->setText(str);
  32.             break;
  33.         case 8:ui->Wlan8->setVisible(true);
  34.             ui->Wlan8->setText(str);
  35.             break;
  36.         case 9:ui->Wlan9->setVisible(true);
  37.             ui->Wlan9->setText(str);
  38.             break;
  39.         case 10:ui->Wlan10->setVisible(true);
  40.             ui->Wlan10->setText(str);
  41.             break;
  42.         case 11:ui->Wlan11->setVisible(true);
  43.             ui->Wlan11->setText(str);
  44.             break;
  45.         case 12:ui->Wlan12->setVisible(true);
  46.             ui->Wlan12->setText(str);
  47.             break;
  48.         default:break;
  49.         }

  50.     }
复制代码

该部分代码的作用是在用户选择好连接的Wi-Fi并输入密码后连接Wi-Fi。
  1.     char set_ssid[64];
  2.     char set_password[64];
  3.     char select_wlan[64];

  4.     if (ui->wifimima->text().isEmpty())
  5.     {
  6.         QMessageBox::warning(this,tr("Connect information"), tr("密码不能为空"));
  7.     }
  8.     else
  9.     {

  10.         int i =get_i();
  11.         sprintf(set_ssid,"wpa_cli -i wlan0 set_network %d ssid '"%s"'",i,wifiName.toLatin1().data());
  12.         sprintf(set_password, "wpa_cli -i wlan0 set_network %d psk '"%s"' ",i,ui->wifimima->text().toLatin1().data());
  13.         qDebug() << set_password;
  14.         sprintf(select_wlan, "wpa_cli -i wlan0 select_network %d ",i);
  15.         system(set_ssid);
  16.         system(set_password);
  17.         system("wpa_cli -i wlan0 list_network");
  18.         system(select_wlan);
  19.         system("udhcpc -i wlan0 -B");
复制代码

2、天气预报
该页面的UI如图所示:
4-4.png

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

这里使用的是V61接口,https://tianqiapi.com/index/doc?version=v61,该接口下的天气信息的JSON格式如下所示:
  1. {
  2.     "cityid":"101271201", #城市编号
  3.     "date":"2020-07-15",
  4.     "week":"星期三",
  5.     "update_time":"10:15", #更新时间
  6.     "city":"内江", #城市名称
  7.     "cityEn":"neijiang",
  8.     "country":"中国",
  9.     "countryEn":"China",
  10.     "wea":"阴", #实时天气情况
  11.     "wea_img":"yin",
  12.     "tem":"25", #实时温度
  13.     "tem1":"29", #高温
  14.     "tem2":"23", #低温
  15.     "win":"西风", #风向
  16.     "win_speed":"2级", #风力等级
  17.     "win_meter":"小于12km/h", #风速
  18.     "humidity":"97%", #湿度
  19.     "visibility":"24.22km", #能见度
  20.     "pressure":"961", #气压
  21.     "uvIndex":"3", #紫外线等级
  22.     "uvDescription": "中等",#紫外线描述
  23.     "air":"15", #空气质量
  24.     "air_pm25":"8", #pm2.5
  25.     "air_level":"优",
  26.     "air_tips":"空气很好,可以外出活动,呼吸新鲜空气,拥抱大自然!",
  27.     "rain_pcpn":"2.5",#降雨量2.5mm
  28.     "alarm":{
  29.         "alarm_type":"暴雨",  #预警类型
  30.         "alarm_level":"橙色", #预警等级
  31.         "alarm_content":"内江市气象台7月15日5时23分发布第16号暴雨橙色预警信号:
  32.    预计我市市中区部分地方3小时降雨量将达50毫米以上,并伴有雷电和阵性大风,请加强防范强降水、雷电和大风等带来的危害。
  33. (预警信息来源:国家预警信息发布中心)" #预警描述
  34.     },
  35.     "aqi":{ #空气质量指数详情
  36.         "air":"15",
  37.         "air_level":"优",
  38.         "air_tips":"空气很好,可以外出活动,呼吸新鲜空气,拥抱大自然!",
  39.         "pm25":"8",
  40.         "pm25_desc":"优",
  41.         "pm10":"10",
  42.         "pm10_desc":"优",
  43.         "o3":"47",
  44.         "o3_desc":"优",
  45.         "no2":"12",
  46.         "no2_desc":"优",
  47.         "so2":"8",
  48.         "so2_desc":"优",
  49.         "co": "1",
  50.         "co_desc": "优",
  51.         "kouzhao":"无需戴口罩",
  52.         "waichu":"适宜外出",
  53.         "yundong":"适宜运动",
  54.         "kaichuang":"适宜开窗",
  55.         "jinghuaqi":"关闭净化器",
  56.         "cityid":"101271201",
  57.         "city":"内江",
  58.         "cityEn":"neijiang",
  59.         "country":"中国",
  60.         "countryEn":"China"
  61.     }
  62. }
复制代码

请求数据
请求天气数据的代码如下所示,appid后面的数字和appsecret是在注册时网站给的密匙。
  1.     char quest_array[256] = "http://v1.yiketianqi.com/api?unescape=1&version=v61&appid=19311841&appsecret=nAGo24xi&city=";

  2.     QNetworkRequest quest;
  3.     sprintf(quest_array, "%s%s", quest_array, cityStr.toUtf8().data());
  4.     quest.setUrl(QUrl(quest_array));
  5.     quest.setHeader(QNetworkRequest::UserAgentHeader, "RT-Thread ART");
  6.     manager->get(quest);    /*发送get网络请求*/
复制代码

在发送完请求信息后,会获得回复信息,信息是JSON格式,我们只需要解析该JSON数据就行。主要代码如下所示。
  1.    QJsonDocument json_recv = QJsonDocument::fromJson(all.toUtf8(), &err);//解析json对象

  2.     if (!json_recv.isNull() && err.error == QJsonParseError::NoError)
  3.     {
  4.         QJsonObject object = json_recv.object();
  5.         QStringList keys = object.keys();
  6.         foreach (const QString& key,keys){
  7.             qDebug() << "Key:" <<key;
  8.         }
  9.         QString weather_type = object.value("wea").toString();
  10.         qDebug()<<"weather_type :"<<weather_type;
  11.         QString tuijian = object.value("air_tips").toString();
  12.         qDebug()<<"tuijian: "<<tuijian;
  13.         QString low = object.value("tem2").toString();
  14.         qDebug()<<"low :"<<low;
  15.         QString high = object.value("tem1").toString();
  16.         QString wendu = low.mid(low.length() - 4, 4) + "~" + high.mid(high.length() - 4, 4);
  17.         qDebug()<<"wendu: "<<wendu;
  18.         QString strength = object.value("win_speed").toString();
  19.         qDebug()<<"strength: "<<strength;
  20.         strength.remove(0, 8);
  21.         strength.remove(strength.length() - 2, 2);
  22.         QString fengli = object.value("win").toString() + strength;
  23.         QString ziwaixian = object.value("uvIndex").toString();
  24.         qDebug()<<"ziwaixian :"<<ziwaixian;
  25.         QString kongqizhiliang = object.value("air").toString();
  26.         qDebug()<<"kongqizhiliang :"<<kongqizhiliang;

  27.         ui->label_weather_2->setText(weather_type);   
  28.         ui->label_temperature_2->setText(wendu);
  29.         ui->label_wind_2->setText(fengli);
  30.         ui->label_kongqizhiliang->setText(kongqizhiliang);
  31.         ui->label_uv->setText(ziwaixian);
  32.         ui->label_recommend_2->setText(tuijian);
  33.     }
复制代码

3、室内环境监测
该部分的ui如图所示:
4-1.jpg

该部分的代码比较简单,主要是新建立一个线程,然后不停读取传感器的信息,然后将相关的信息展示即可。核心代码如下:
  1. void CollentdataThread::run()
  2. {
  3.     int fd = aht20_init();
  4.     emit send(temp,hum);
  5.     while (1)
  6.     {
  7.         /*read temp data*/
  8.         aht20_read(fd);
  9.         emit send(temp,hum);
  10.         sleep(2);
  11.     }
  12. }
复制代码

4、家居控制中心
该部分的UI如图所示:
4-2.jpg

该部分展示通过开发板上的硬件而制作,3个led灯就是家里的灯,蜂鸣器为报警器。
软件编译
在ElfBoard的官方教程中有详细介绍如何在ELF 1开发板上编译QT程序。在这里需要强调一点的是,在使用arm-gcc编译完成后的可执行文件是不能在X86的电脑上运行的,需要先在电脑上调试软件,成功之后,再使用arm-gcc编译,然后移植到ELF 1开发板上。

项目总结
这款智慧家庭的APP深度整合了ELF 1开发板硬件资源,包括Wi-Fi模块、LED照明系统、温湿度传感器以及蜂鸣器等组件。项目构建过程中巧妙的利用了Wi-Fi,特别定制了一个功能完备的天气预报界面,用户通过该界面能够轻松获取不同地区的实时天气信息,从而将智慧佳通控制范围拓展至环境监测及在线信息服务领域。

    您需要登录后才可以回帖 登录 | 立即注册

    本版积分规则

    Powered by Discuz! X3.5  © 2001-2013 Comsenz Inc.