加入星計劃,您可以享受以下權(quán)益:

  • 創(chuàng)作內(nèi)容快速變現(xiàn)
  • 行業(yè)影響力擴(kuò)散
  • 作品版權(quán)保護(hù)
  • 300W+ 專業(yè)用戶
  • 1.5W+ 優(yōu)質(zhì)創(chuàng)作者
  • 5000+ 長期合作伙伴
立即加入
  • 正文
  • 推薦器件
  • 相關(guān)推薦
  • 電子產(chǎn)業(yè)圖譜
申請入駐 產(chǎn)業(yè)圖譜

項目分享 | 基于QT的智慧家庭控制中心

02/22 11:02
3069
閱讀需 21 分鐘
加入交流群
掃碼加入
獲取工程師必備禮包
參與熱點資訊討論

今天非常榮幸地向各位小伙伴展示并分享共創(chuàng)社中一位成員精心完成的項目成果,該項目依托ElfBoard開發(fā)板為核心硬件平臺,采用Qt框架構(gòu)建了一套全面的智慧家庭控制中心系統(tǒng)。該系統(tǒng)由四大核心功能模塊整合而成:網(wǎng)絡(luò)通信接口、氣象信息展示、室內(nèi)環(huán)境監(jiān)控及家居智能管理。

網(wǎng)絡(luò)連接模塊負(fù)責(zé)自動掃描并接入周邊可用的Wi-Fi網(wǎng)絡(luò),確保系統(tǒng)與外部數(shù)據(jù)源的穩(wěn)定互聯(lián)。

天氣預(yù)報模塊在成功建立網(wǎng)絡(luò)連接后,能夠?qū)崟r獲取并顯示指定地理位置的天氣狀況信息,為用戶提供便捷的氣象服務(wù)。

室內(nèi)環(huán)境監(jiān)測模塊借助集成的溫濕度傳感器設(shè)備,實現(xiàn)對居住空間內(nèi)部環(huán)境參數(shù)的實時監(jiān)測和精準(zhǔn)記錄,以維護(hù)理想的居住環(huán)境條件。

家居控制中心作為系統(tǒng)的核心交互部分,具備對諸如LED照明設(shè)備以及蜂鳴器等家居設(shè)施的智能化管控能力,用戶可通過該中心輕松實現(xiàn)遠(yuǎn)程操控與自動化場景設(shè)定。

項目軟硬件需求

1、ELF 1開發(fā)板

2、4.3英寸電容屏

3、QT

4、實況天氣接口API開發(fā)指南 未來一天天氣預(yù)報api - 天氣API

5、Wi-Fi(RTL8723DU)

項目功能

1、網(wǎng)絡(luò)連接

網(wǎng)絡(luò)連接部分的UI如圖所示:

?

    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;
        }

    }

該部分代碼的作用是在用戶選擇好連接的Wi-Fi并輸入密碼后連接Wi-Fi。

    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、天氣預(yù)報

該頁面的UI如圖所示:

準(zhǔn)備工作

在實況天氣接口API開發(fā)指南 未來一天天氣預(yù)報api - 天氣API網(wǎng)站注冊,注冊好后可以看到如下信息,每個郵箱號有3000次的免費的請求機(jī)會。

這里使用的是V61接口,https://tianqiapi.com/index/doc?version=v61,該接口下的天氣信息的JSON格式如下所示:

{
    "cityid":"101271201", #城市編號
    "date":"2020-07-15",
    "week":"星期三",
    "update_time":"10:15", #更新時間
    "city":"內(nèi)江", #城市名稱
    "cityEn":"neijiang",
    "country":"中國",
    "countryEn":"China",
    "wea":"陰", #實時天氣情況
    "wea_img":"yin",
    "tem":"25", #實時溫度
    "tem1":"29", #高溫
    "tem2":"23", #低溫
    "win":"西風(fēng)", #風(fēng)向
    "win_speed":"2級", #風(fēng)力等級
    "win_meter":"小于12km/h", #風(fēng)速
    "humidity":"97%", #濕度
    "visibility":"24.22km", #能見度
    "pressure":"961", #氣壓
    "uvIndex":"3", #紫外線等級
    "uvDescription": "中等",#紫外線描述
    "air":"15", #空氣質(zhì)量
    "air_pm25":"8", #pm2.5
    "air_level":"優(yōu)",
    "air_tips":"空氣很好,可以外出活動,呼吸新鮮空氣,擁抱大自然!",
    "rain_pcpn":"2.5",#降雨量2.5mm
    "alarm":{
        "alarm_type":"暴雨",  #預(yù)警類型
        "alarm_level":"橙色", #預(yù)警等級
        "alarm_content":"內(nèi)江市氣象臺7月15日5時23分發(fā)布第16號暴雨橙色預(yù)警信號:
   預(yù)計我市市中區(qū)部分地方3小時降雨量將達(dá)50毫米以上,并伴有雷電和陣性大風(fēng),請加強(qiáng)防范強(qiáng)降水、雷電和大風(fēng)等帶來的危害。
(預(yù)警信息來源:國家預(yù)警信息發(fā)布中心)" #預(yù)警描述
    },
    "aqi":{ #空氣質(zhì)量指數(shù)詳情
        "air":"15",
        "air_level":"優(yōu)",
        "air_tips":"空氣很好,可以外出活動,呼吸新鮮空氣,擁抱大自然!",
        "pm25":"8",
        "pm25_desc":"優(yōu)",
        "pm10":"10",
        "pm10_desc":"優(yōu)",
        "o3":"47",
        "o3_desc":"優(yōu)",
        "no2":"12",
        "no2_desc":"優(yōu)",
        "so2":"8",
        "so2_desc":"優(yōu)",
        "co": "1",
        "co_desc": "優(yōu)",
        "kouzhao":"無需戴口罩",
        "waichu":"適宜外出",
        "yundong":"適宜運動",
        "kaichuang":"適宜開窗",
        "jinghuaqi":"關(guān)閉凈化器",
        "cityid":"101271201",
        "city":"內(nèi)江",
        "cityEn":"neijiang",
        "country":"中國",
        "countryEn":"China"
    }
}

請求數(shù)據(jù)

請求天氣數(shù)據(jù)的代碼如下所示,appid后面的數(shù)字和appsecret是在注冊時網(wǎng)站給的密匙。

    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);    /*發(fā)送get網(wǎng)絡(luò)請求*/

在發(fā)送完請求信息后,會獲得回復(fù)信息,信息是JSON格式,我們只需要解析該JSON數(shù)據(jù)就行。主要代碼如下所示。

   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);
    }

3、室內(nèi)環(huán)境監(jiān)測

該部分的UI如圖所示:

該部分的代碼比較簡單,主要是新建立一個線程,然后不停的讀取傳感器的信息,然后將相關(guān)的信息展示即可。核心代碼如下:

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);
    }
}

4、家居控制中心

該部分的UI如圖所示:

該部分主要是利用為了充分的展示開發(fā)板上的硬件而制作,我們假設(shè)3個led燈就是我們家里的燈,蜂鳴器可以假設(shè)為報警器。本身而言沒什么。

軟件編譯

在ElfBoard的官方教程中有詳細(xì)介紹如何在ELF 1開發(fā)板上編譯QT程序。在這里需要強(qiáng)調(diào)一點的是,在使用arm-gcc編譯完成后的可執(zhí)行文件是不能在X86的電腦上運行的,需要先在電腦上調(diào)試軟件,成功之后,再使用arm-gcc編譯,然后移植到ELF 1開發(fā)板上。

項目總結(jié)

這款智慧家庭的APP深度整合了ELF 1開發(fā)板硬件資源,包括Wi-Fi模塊、LED照明系統(tǒng)、溫濕度傳感器以及蜂鳴器等組件。項目構(gòu)建過程中巧妙的利用了Wi-Fi,特別定制了一個功能完備的天氣預(yù)報界面,用戶通過該界面能夠輕松獲取不同地區(qū)的實時天氣信息,從而將智慧佳通控制范圍拓展至環(huán)境監(jiān)測及在線信息服務(wù)領(lǐng)域。

推薦器件

更多器件
器件型號 數(shù)量 器件廠商 器件描述 數(shù)據(jù)手冊 ECAD模型 風(fēng)險等級 參考價格 更多信息
JST01TMAC1CY5GE2 1 Viavi Solutions Inc Transceiver,
暫無數(shù)據(jù) 查看
6N137-X007T 1 Vishay Intertechnologies Optocoupler Logic-Out Open Collector DC-IN 1-CH 8-Pin PDIP SMD T/R

ECAD模型

下載ECAD模型
$2.22 查看
TJA1055T/3/CM,118 1 NXP Semiconductors TJA1055 - Enhanced fault-tolerant CAN transceiver SOIC 14-Pin

ECAD模型

下載ECAD模型
$1.95 查看

相關(guān)推薦

電子產(chǎn)業(yè)圖譜