精品国产人成在线_亚洲高清无码在线观看_国产在线视频国产永久2021_国产AV综合第一页一个的一区免费影院黑人_最近中文字幕MV高清在线视频

0
  • 聊天消息
  • 系統消息
  • 評論與回復
登錄后你可以
  • 下載海量資料
  • 學習在線課程
  • 觀看技術視頻
  • 寫文章/發帖/加入社區
會員中心
創作中心

完善資料讓更多小伙伴認識你,還能領取20積分哦,立即完善>

3天內不再提示

ElfBoard開源項目|“智慧教室”開源項目技術文檔

ElfBoard ? 2024-09-11 10:51 ? 次閱讀

“智慧教室”項目的目標是實現實時采集環境中的溫度、濕度及光照信息,并將這些數據可視化地呈現在Qt圖形界面上。用戶既可以選擇手動控制風扇與窗簾的開關,也可以設置系統根據所采集的環境參數自動調節,以達到舒適的室內環境。接下來,將和各位小伙伴深入探討這一項目的具體實現方式。

一、 功能特性

1、數據監測與顯示:實時監測室內溫度、濕度和光照強度,并直觀地顯示在Qt界面上。

2、手動/感應控制:用戶可以通過切換界面按鈕選擇手動控制風扇和窗簾的狀態,或者根據實時監測到的環境數據,自動的調節風扇和窗簾的狀態,以提供最佳的舒適度和能源利用效率。

3、節能優化:自動調節功能可實時調整設備狀態,以減少能源消耗并提高設備壽命。

二、 環境說明

1、開發環境操作系統:Ubuntu18.04 64位版

2、交叉編譯工具鏈:arm-poky-linux-gnueabi-gcc 5.3.0

3、開發板使用Bootloader版本:u-boot-2016.03

4、開發板內核版本:linux-4.1.15

5、開發板移植QT版本:qt5.6.2

三、 硬件連接

1、風扇與板卡的連接

wKgaombg_OCACyXdAAJECmwSncQ098.png

2、步進電機與板卡的連接

wKgZombg_MqAMZdKAANO_8WH06Y162.png

四、 內核適配

ELF 1開發板已集成溫濕度傳感器與光線傳感器,實現環境溫度、濕度和光照強度的采集。為支持智慧教室系統的其它功能,需要對內核源碼進行以下適配步驟。

1、實現風扇轉動的功能

風扇采用pwm的方式來控制,需要在設備樹中進行pwm7的復用。

(1)拷貝ELF1開發板資料包\02-Linux 源代碼\02-0 出廠內核和uboot源碼\內核源碼\linux-4.1.15-elf1.tar.bz2內核源碼到開發環境/home/elf/work/目錄下解壓。

elf@ubuntu:~/work$ tar -xvf linux-4.1.15-elf1.tar.bz2

(2)修改頂層設備樹文件arch/arm/boot/dts/imx6ull.dtsi

elf@ubuntu:~/work$ cd linux-4.1.15-elf1/ elf@ubuntu:~/work/linux-4.1.15-elf1$ vi arch/arm/boot/dts/imx6ull.dtsi

wKgZombg_S2AQLlfAAXVGkRy0_s628.png

(3)修改設備樹文件arch/arm/boot/dts/imx6ull-elf1-emmc.dts

elf@ubuntu:~/work/linux-4.1.15-elf1$ vi arch/arm/boot/dts/imx6ull-elf1-emmc.dts

添加pwm7設備節點

&pwm7 { pinctrl-names = "default"; pinctrl-0 = <&pinctrl_pwm7>; status = "okay"; };

wKgZombg_WWAPSD4AAN9HPriB70074.png

在iomux節點下面添加pwm7引腳復用

pinctrl_pwm7: pwm7grp { fsl,pins = < MX6UL_PAD_CSI_VSYNC__PWM7_OUT 0x110b0 >; };

wKgaombg_h2AMQC5AASICkuEBUU451.png

取消其它用到csi功能的地方

wKgZombg_kSAFRXUAAOZ4JatwUs726.pngwKgaombg_lqAewehAAQSkZ0lfVo466.png

至此pwm7已經復用完成。

2、實現控制窗簾開合的功能

該項目選用28BYJ-48步進電機實現窗簾的開合操作,28BYJ-48電機需要4個GPIO來控制,需要在設備樹中進行GPIO的復用并在內核中添加電機驅動。(1)修改設備樹文件arch/arm/boot/dts/imx6ull-elf1-emmc.dts。

elf@ubuntu:~/work$ cd linux-4.1.15-elf1/ elf@ubuntu:~/work/linux-4.1.15-elf1$ vi arch/arm/boot/dts/imx6ull-elf1-emmc.dts

添加設備節點

mymotor { compatible = "motor"; pinctrl-names = "default"; pinctrl-0 = <&mymotor>; status = "okay"; motorA-gpios = <&gpio4 21 GPIO_ACTIVE_HIGH>; motorB-gpios = <&gpio4 22 GPIO_ACTIVE_HIGH>; motorC-gpios = <&gpio4 23 GPIO_ACTIVE_HIGH>; motorD-gpios = <&gpio4 24 GPIO_ACTIVE_HIGH>; };

wKgaombg_qOAZJOaAATRxK0wbnY310.png

在iomux節點下面添加引腳復用

mymotor: mymotorgrp { fsl,pins = < MX6UL_PAD_CSI_DATA00__GPIO4_IO21 0x10b0 MX6UL_PAD_CSI_DATA01__GPIO4_IO22 0x10b0 MX6UL_PAD_CSI_DATA02__GPIO4_IO23 0x10b0 MX6UL_PAD_CSI_DATA03__GPIO4_IO24 0x10b0 >; };

wKgaombg_saAUrGWAATV-6ALB6k044.png

(2)添加電機驅動

拷貝motor.c到內核源碼的drivers/gpio目錄下,修改drivers/gpio目錄下的Makefile文件,添加如下內容:

obj-y += motor.o

wKgZombg_veAfTYvAAmxUaLDuDg818.png

3、編譯并替換設備樹和內核

(1)執行環境變量

elf@ubuntu:~/work/linux-4.1.15-elf1$ . /opt/fsl-imx-x11/4.1.15-2.0.0/environment-setup-cortexa7hf-neon-poky-linux-gnueabi

(2)編譯設備樹和內核

elf@ubuntu:~/work/linux-4.1.15-elf1$ make imx6ull_elf1_defconfig elf@ubuntu:~/work/linux-4.1.15-elf1$ make dtbs elf@ubuntu:~/work/linux-4.1.15-elf1$ make zImage

(3)將arch/arm/boot/路徑下的zImage和arch/arm/boot/dts/路徑下的imx6ull-elf1-emmc.dtb放到U盤,通過U盤拷貝到開發板。

root@ELF1:~# cp /run/media/sda1/imx6ull-elf1-emmc.dtb /run/media/mmcblk1p1/ root@ELF1:~# cp /run/media/sda1/zImage /run/media/mmcblk1p1/

(4)保存并重啟開發板

root@ELF1:~# sync root@ELF1:~# reboot

五、基于Qt界面的數據采集和控制

1、程序設計

wKgZombhAlaAMEpfAAKabUVYMOU641.png

主函數的實現main.cpp

int main(int argc, char* argv[]) { QApplication a(argc, argv); if(!ControllerHandler::instance()->startController()) { return 0; } a.setStyle("Fusion"); QFont f = a.font(); f.setPointSize(20); f.setPixelSize(16); a.setFont(f); MWainWindow w; w.setWindowFlags(Qt::FramelessWindowHint); if(a.primaryScreen()) { w.resize(a.primaryScreen()->size()); } w.show(); int ret = a.exec(); return ret; }

設置顯示的時間的樣式和位置

void MWainWindow::showtime() { /* 實例化與設置顯示的位置大小*/ lcdNumber = new QLCDNumber(this); QScreen *screen = QGuiApplication::primaryScreen(); // 獲取屏幕分辨率的大小 QSize screenSize = screen->size(); int screenWidth = screenSize.width(); int screenHeight = screenSize.height(); // 根據屏幕分辨率的大小執行不同的操作 if (screenWidth == 1024 && screenHeight == 600) { lcdNumber->setGeometry( 850, 9, 100, 40); } else if (screenWidth == 800 && screenHeight == 480) { lcdNumber->setGeometry( 650, 9, 100, 40); } else { qDebug() << "Performing other operation";} /* 設置顯示的位數 8 位 */ lcdNumber->setDigitCount(8); /* 設置樣式 */ lcdNumber->setFrameStyle(QFrame::NoFrame); /* 設置 lcd 顯示為當前系統時間 */ QTime time = QTime::currentTime(); /* 設置顯示的樣式 */ lcdNumber->display(time.toString("hh:mm:ss")); lcdNumber->setStyleSheet("color: black"); }

設置顯示的圖片的大小和位置

void MWainWindow::showphoto() { /* 設置大小與位置 */ this->setGeometry(0, 0, 1024, 600); /* 使用資源里的文件時格式是 :+前綴+文件路徑 */ QPixmap pixmap(":images/res.png"); labelImage = new QLabel(this); QScreen *screen = QGuiApplication::primaryScreen(); // 獲取屏幕分辨率的大小 QSize screenSize = screen->size(); int screenWidth = screenSize.width(); int screenHeight = screenSize.height(); // 根據屏幕分辨率的大小執行不同的操作 if (screenWidth == 1024 && screenHeight == 600) { labelImage->setGeometry(14, 61, 343, 524); } else if (screenWidth == 800 && screenHeight == 480) { labelImage->setGeometry(14, 61, 343, 403); } else { qDebug() << "Performing other operation"; } /* 設置圖像 */ labelImage->setPixmap(pixmap); /* 開啟允許縮放填充 */ labelImage->setScaledContents(true); }

獲取設備的狀態

void MWainWindow::readData() { /* 當定時器計時 1000 毫秒后,刷新 lcd 顯示當前系統時間 */ QTime time = QTime::currentTime(); /* 設置顯示的樣式 */ lcdNumber->display(time.toString("hh:mm:ss")); ControllerHandler* pInstance =ControllerHandler::instance(); float value=-100; int curtainstate = targetCurtainState; pInstance->getValue(TEMPERATURE_SENSOR,value); ui->widget_temp->setData("溫度", QString::number(value) +"°"); if(bOpen==1) { if(value > 31) { ControllerHandler::instance()->setValue(FAN, 10, ' ', ' '); } else { ControllerHandler::instance()->setValue(FAN, 0, ' ', ' '); } } pInstance->getValue(HUMIDITY_SENSOR,value); ui->widget_hum->setData("濕度", QString::number(value) +"%"); pInstance->getValue(LIGHT_SENSOR,value); ui->widget_light->setData("亮度", QString::number(value) +" lt"); if(bOpen==1) { if (value >= 0 && value < 100) { if (curtainstate == 0) { printf("Automatic curtain opening!!!\n"); //ControllerHandler::instance()->setValue(MYMOTOR, ' ', 'R', 2048); targetCurtainState = 1; } } else if (value >= 100 && value < 500) { if (curtainstate == 1) { printf("Automatic curtain closing!!!\n"); //ControllerHandler::instance()->setValue(MYMOTOR, ' ', 'L', 2048); targetCurtainState = 0; } } } if(bOpen==0) { if(bOpen2==1) { //printf("Fan open!!!\n"); ControllerHandler::instance()->setValue(FAN, 10, ' ', ' '); } if(bOpen2==0) { //printf("Fan close!!!\n"); ControllerHandler::instance()->setValue(FAN, 0, ' ', ' '); } } if(bOpen == 0){ if (isFirstCheck) { lastbOpen3 = bOpen3; isFirstCheck = false; } else if (bOpen3 != lastbOpen3) { if(bOpen3 == 1){ printf("Curtain open!!!\n"); //ControllerHandler::instance()->setValue(MYMOTOR, ' ', 'R', 2048); } else { printf("Curtain close!!!\n"); //ControllerHandler::instance()->setValue(MYMOTOR, ' ', 'L', 2048); } lastbOpen3 = bOpen3; } } }

設置界面樣式

void MWainWindow::Style() { QString qssFileName; qssFileName = ":/green.qss"; QFile file(qssFileName); if(file.open(QFile::ReadOnly| QFile::Text)){ QString qss =file.readAll(); QApplication *app = dynamic_cast(qApp); if(!qss.isEmpty()){ app->setStyleSheet(qss); } file.close(); } }

2、應用編譯

(1)拷貝smartclassroom.tar.bz2到開發環境/home/elf/work目錄下解壓

elf@ubuntu:~/work$ tar xvf smartclassroom.tar.bz2

(2)執行環境變量

elf@ubuntu:~/work/adc$ . /opt/fsl-imx-x11/4.1.15-2.0.0/environment-setup-cortexa7hf-neon-poky-linux-gnueabi

(3)編譯

elf@ubuntu:~/work$ cd smartclassroom/ elf@ubuntu:~/work/smartclassroom$ qmake elf@ubuntu:~/work/smartclassroom$ make

(4)壓縮

elf@ubuntu:~/work/smartclassroom$ cd ../smartclassroom_output/release/ elf@ubuntu:~/work/smartclassroom_output/release$ tar -cjvf smartclassroom.tar.bz2 *

(5)拷貝smartclassroom.tar.bz2壓縮包到開發板/home/root路徑下解壓

root@ELF1:~# cp /run/media/sda1/smartclassroom.tar.bz2 ./ root@ELF1:~# tar xvf smartclassroom.tar.bz2 root@ELF1:~# chmod 777 * root@ELF1:~# cp lib* /usr/lib root@ELF1:~# sync

六、項目測試

1、確保開發板已正確連接風扇、步進電機和屏幕

2、執行應用

root@ELF1:~# export DISPLAY=:0.0 root@ELF1:~# ./app

應用執行成功后,Qt界面顯示如下,此時可以通過切換按鈕選擇手動控制或者感應控制風扇開關以及窗簾開合。

聲明:本文內容及配圖由入駐作者撰寫或者入駐合作網站授權轉載。文章觀點僅代表作者本人,不代表電子發燒友網立場。文章及其配圖僅供工程師學習之用,如有內容侵權或者其他違規問題,請聯系本站處理。 舉報投訴
  • 單片機
    +關注

    關注

    6023

    文章

    44377

    瀏覽量

    628507
  • 嵌入式
    +關注

    關注

    5046

    文章

    18821

    瀏覽量

    298640
  • 開源代碼
    +關注

    關注

    0

    文章

    31

    瀏覽量

    2896
  • 學習開發板
    +關注

    關注

    0

    文章

    10

    瀏覽量

    197
收藏 人收藏

    評論

    相關推薦

    Matepad pro12.2 已上市半個月,但是還沒有在開源網站看到該項目開源信息,違背開源精神

    Matepad pro12.2 已上市半個月,本人自己也購買了同款12+256的pad,想要同步學習下這款pad的一些體驗還不錯的功能點,但是目前為止還沒有在開源網站看到該項目開源信息,也查詢不到
    發表于 08-27 17:25

    嵌入式學習-飛凌嵌入式ElfBoard-項目分享|基于ELF 1S開發板完成的物聯網開源項目

    工程師借助ELF 1S開發板完成的嵌入式物聯網項目,見證智慧技術的火花。 關于這個項目的思維導圖,如下圖所示: 接下來,將會從云-網-邊-端的物聯網體系架構出發,描述整個
    發表于 05-16 09:19

    飛凌嵌入式-ElfBoard-項目分享|基于ELF 1S開發板完成的物聯網開源項目

    工程師借助ELF 1S開發板完成的嵌入式物聯網項目,見證智慧技術的火花。 關于這個項目的思維導圖,如下圖所示: 接下來,將會從云-網-邊-端的物聯網體系架構出發,描述整個
    發表于 05-16 09:12

    項目分享|基于ELF 1S開發板完成的物聯網開源項目

    ElfBoard作為飛凌嵌入式旗下教育品牌,自成立以來,持續吸引著各界的矚目,其中也贏得了一些工程師的青睞。今天,就和各位小伙伴分享一位杰出工程師借助ELF1S開發板完成的嵌入式物聯網項目,見證智慧
    的頭像 發表于 05-14 09:03 ?1223次閱讀
    <b class='flag-5'>項目</b>分享|基于ELF 1S開發板完成的物聯網<b class='flag-5'>開源</b><b class='flag-5'>項目</b>

    項目分享|基于ElfBoard的遠程監測系統

    技術領域的專業素養。值得一提的是,社群內部已經涌現出許多富有創意的產品設計理念與技術解決方案,今天就跟大家分享一名共創官完成的項目報告“基于ElfBoard的遠程監測系
    的頭像 發表于 01-17 11:14 ?418次閱讀
    <b class='flag-5'>項目</b>分享|基于<b class='flag-5'>ElfBoard</b>的遠程監測系統

    關于FPGA的開源項目介紹

    Hello,大家好,之前給大家分享了大約一百多個關于FPGA的開源項目,涉及PCIe、網絡、RISC-V、視頻編碼等等,這次給大家帶來的是不枯燥的娛樂項目,主要偏向老的游戲內核使用FPGA進行硬解,涉及的內核數不勝數,主要目標是
    的頭像 發表于 01-10 10:54 ?1197次閱讀
    關于FPGA的<b class='flag-5'>開源</b><b class='flag-5'>項目</b>介紹

    開源FPGA項目有哪些

    請問開源FPGA項目有哪些?
    發表于 12-26 12:09

    開源項目維護者分論壇圓滿舉辦

    開源維護者——一個被嚴重誤解的群體,在一個開源項目中,開源維護者 往往擁有很高的權限,比如合并其他人的代碼,又或者是無須經過他人review就可以提交,當這些人的心態炸裂,就會發生諸如
    的頭像 發表于 12-22 18:20 ?459次閱讀
    <b class='flag-5'>開源</b><b class='flag-5'>項目</b>維護者分論壇圓滿舉辦

    書寫開源之魂|2023 年活力開源貢獻者、開源項目揭曉

    開源事業的蓬勃發展,離不開持之以恒的開源貢獻者。他們用一行行代碼孕育出無數獨具特色的產品,凝聚成了源遠流長、代代相傳的開源精神。集眾智、采眾長,他們以堅定的信念和滿腔的熱情傳播開源文化
    的頭像 發表于 12-22 09:26 ?523次閱讀
    書寫<b class='flag-5'>開源</b>之魂|2023 年活力<b class='flag-5'>開源</b>貢獻者、<b class='flag-5'>開源</b><b class='flag-5'>項目</b>揭曉

    開放原子開源基金會與 9 個開源項目舉行捐贈簽約儀式

    軟件、OpenTenBase、MetaToC、crowdos、NXROS、Dorothy SSR、onps 開源網絡協議共 9 個開源項目捐贈方代表共同簽約。 開源
    的頭像 發表于 12-21 17:30 ?705次閱讀
    開放原子<b class='flag-5'>開源</b>基金會與 9 個<b class='flag-5'>開源</b><b class='flag-5'>項目</b>舉行捐贈簽約儀式

    書寫開源之魂|2023年活力開源貢獻者、開源項目揭曉

    開源事業的蓬勃發展,離不開持之以恒的開源貢獻者。他們用一行行代碼孕育出無數獨具特色的產品,凝聚成了源遠流長、代代相傳的開源精神。集眾智、采眾長,他們以堅定的信念和滿腔的熱情傳播開源文化
    的頭像 發表于 12-18 15:55 ?386次閱讀

    開放原子開源基金會與9個開源項目舉行捐贈簽約儀式

    軟件、OpenTenBase、MetaToC、crowdos、NXROS、Dorothy SSR、onps開源網絡協議共9個開源項目捐贈方代表共同簽約。 開源
    的頭像 發表于 12-17 15:55 ?665次閱讀

    誠邀報名|聚焦項目管理和社區協作,解讀開源治理前沿見解和最佳實踐

    了多方的智慧,推動了社會的共同進步。伴隨著近年來開源技術的迅猛發展,眾多企業、組織和開發者紛紛加入開源生態。作為這一生態系統支柱的開源社區,
    的頭像 發表于 12-09 18:45 ?592次閱讀
    誠邀報名|聚焦<b class='flag-5'>項目</b>管理和社區協作,解讀<b class='flag-5'>開源</b>治理前沿見解和最佳實踐

    2023貢獻者、開源項目評選正式啟動!

    開源倡導開放、平等、協作、共享理念,是推動技術創新的重要手段,也是促進全球協同發展的源動力。為了進一步匯聚開發者力量、繁榮開源生態,開放原子開源基金會特發起 2023貢獻者、
    的頭像 發表于 11-09 21:40 ?541次閱讀
    2023貢獻者、<b class='flag-5'>開源</b><b class='flag-5'>項目</b>評選正式啟動!

    開源項目專訪 | XuperCore——讓信任的鏈接更加便捷

    開源基金會,通過基金會快速推動開源項目的健康成熟發展。 在數字經濟蓬勃發展、數據成為重要生產要素的時代,區塊鏈已經不僅僅是一項技術、一種工具,更是一種思維方式和一類商業模式。區塊鏈作
    的頭像 發表于 09-25 14:48 ?401次閱讀
    <b class='flag-5'>開源</b><b class='flag-5'>項目</b>專訪 | XuperCore——讓信任的鏈接更加便捷