[OK210開(kāi)發(fā)板體驗(yàn)]系統(tǒng)篇(4)基于OK210的智能家居系統(tǒng)之整合

原創(chuàng) 2015-12-24 10:05:00 [OK210開(kāi)發(fā)板體驗(yàn)]系統(tǒng)篇(4)基于OK210的智能家居系統(tǒng)之整合
前面介紹了OK210基于Linux的功能篇:LED、Key按、DS18B20溫度傳感器、PWM蜂鳴器、紅外遙控和ADC模數(shù)的驅(qū)動(dòng)以及系統(tǒng)篇:Boa服務(wù)器搭建、Bootstrap前端設(shè)計(jì)、CGI后端設(shè)計(jì)CGI,今天介紹基于OK210的智能家居系統(tǒng)的整合,即通過(guò)構(gòu)建Boa服務(wù)器,來(lái)控制OK210上的設(shè)備資源。對(duì)設(shè)備資源的訪問(wèn)是通過(guò)前面介紹的驅(qū)動(dòng)進(jìn)行的,對(duì)設(shè)備資源的控制是通過(guò)前面介紹的Boa服務(wù)器前端控制的。
    本節(jié)主要分3個(gè)部分:
  • 1 對(duì)驅(qū)動(dòng)的管理
  • 2 對(duì)驅(qū)動(dòng)的訪問(wèn)
  • 3 對(duì)界面的控制
一、對(duì)驅(qū)動(dòng)的管理
前面對(duì)驅(qū)動(dòng)的體驗(yàn)都是通過(guò)手動(dòng)加載上去的(insmod\rmmod\lsmod),現(xiàn)在要改成上電啟動(dòng)后,自動(dòng)加載,具體方法見(jiàn)【OK210試用體驗(yàn)】入門(mén)篇(4)編程入門(mén)(NFS登錄、驅(qū)動(dòng)入門(mén))中的附錄模板,這里要加載的驅(qū)動(dòng)有,LED驅(qū)動(dòng)、Key按按驅(qū)動(dòng)、DS18B20溫度傳感器驅(qū)動(dòng)、PWM蜂鳴器驅(qū)動(dòng)、ADC模數(shù)驅(qū)動(dòng)等,具體的驅(qū)動(dòng)代碼,見(jiàn)相關(guān)章節(jié)。
二、對(duì)驅(qū)動(dòng)的訪問(wèn)
1 新建文件和目錄:對(duì)驅(qū)動(dòng)的訪問(wèn),通過(guò)接口函數(shù)來(lái)實(shí)現(xiàn),
首先在Boa服務(wù)器的CGI目錄下,新建各自的源文件和頭文件,
其次,新建一配置文件config.ini,用來(lái)放置一些系統(tǒng)的初始化數(shù)據(jù)
再次,新建一控制文件main-cgi.c,用來(lái)響應(yīng)或管理前端的數(shù)據(jù)
最后的文件目錄如下所示:
 
2 關(guān)鍵代碼說(shuō)明
  1. if( (fp_html=fopen("./../main.html","r")) == NULL)//打開(kāi)網(wǎng)頁(yè)主頁(yè)面
  2.         {
  3.                 exit(1);//如果打不開(kāi),直接退出
  4.         }
  5.         while(fgets(buf,512,fp_html))//每次獲取主頁(yè)面上的512個(gè)字符,直到讀取完
  6.         {
  7.                 if(strncmp(buf,"$CurTemp$",9)==0)//如果找到溫度的顯示位置
  8.                 {
  9.                         ds18b20_fun(temperation);//讀取OK210上的DS18B20的數(shù)據(jù)
  10.                         if (temperation[0]>0&&temperation[1]>0)
  11.                                 printf("  %2d.%d ℃\n", temperation[0], temperation[1]);//更新數(shù)據(jù)顯示
  12.                         else
  13.                                 printf("  85.0 ℃\n");
  14.                         //printf("  85.0 ℃\n");
  15.                 }
  16.                 else if(strncmp(buf,"$CurHumidity$",13)==0)<font size="2"><font face="Tahoma"><font size="3">//如果找到濕度的顯示位置</font></font></font>
  17.                 {
  18.                         adc_data = adc_fun(0);//通過(guò)ADC模擬濕度,讀取模擬值
  19.                         printf("     %2d %\n", (adc_data/100));<font size="2"><font face="Tahoma"><font size="3">//更新數(shù)據(jù)顯示</font></font></font>
  20.                 }
  21.                 else if(strncmp(buf,"$PWMMotor$",10)==0)//通過(guò)PWM模擬窗簾動(dòng)作<font size="2"><font face="Tahoma"><font size="3"></font></font></font>
  22.                 {
  23.                         if(pwm_config[0]==0)
  24.             {
  25.                 printf("<img src=\"./../bootstrap-3.3.5-dist/image/off.png\" width=30 height=30 hspace=35 >");<font size="2"><font face="Tahoma"><font size="3"><font size="2"><font face="Tahoma"><font size="3">//更新顯示狀態(tài)</font></font></font></font></font></font>
  26.             }
  27.             else
  28.             {
  29.                 printf("<img src=\"./../bootstrap-3.3.5-dist/image/on.png\" width=30 height=30 hspace=35 >");
  30.             }
  31.                 }
  32.                 else if(strncmp(buf,"$LedSwitch$",11)==0)<font size="2"><font face="Tahoma"><font size="3">//通過(guò)LED模擬開(kāi)關(guān)動(dòng)作</font></font></font>
  33.                 {
  34.                         int i=0;
  35.                         for(i=0; i < 4; i++)
  36.                         {
  37.                                 if(led_config[i]==1)
  38.                                 {
  39.                                         printf("<img src=\"./../bootstrap-3.3.5-dist/image/off.png\" width=30 height=30 hspace=35 >");<font size="2"><font face="Tahoma"><font size="3"><font size="2"><font face="Tahoma"><font size="3"><font size="2"><font face="Tahoma"><font size="3">//更新顯示狀態(tài)</font></font></font></font></font></font></font></font></font>
  40.                                 }
  41.                                 else
  42.                                 {
  43.                                         printf("<img src=\"./../bootstrap-3.3.5-dist/image/on.png\" width=30 height=30 hspace=35 >");
  44.                                 }
  45.                         }
  46.                 }
  47.                 else
  48.                         printf("%s",buf);<font size="2"><font face="Tahoma"><font size="3"><font size="2"><font face="Tahoma"><font size="3"><font size="2"><font face="Tahoma"><font size="3">//否則保護(hù)原來(lái)的數(shù)據(jù)</font></font></font></font></font></font></font></font></font>
  49.         }
復(fù)制代碼
3編譯
arm-linux-gcc -o main-cgi.cgi main-cgi.c ds18b20-cgi.c adc-cgi.c leds-cgi.c pwm-cgi.c
三、對(duì)界面的控制
1 界面設(shè)計(jì)
1)主要有3個(gè)界面,index.html,login.html,main.html
boa服務(wù)器首先啟動(dòng)index.html文件(在boa.conf中設(shè)置),在該頁(yè)面,通過(guò)登錄按鍵,將頁(yè)面跳轉(zhuǎn)到login.html界面,如下代碼:
  1. <p><a class="btn btn-lg btn-success" href="login.html" role="button">登錄</a></p>
復(fù)制代碼
在login.html中,通過(guò)登錄按鍵,觸發(fā)onclick事件,該事件響應(yīng)myFunction()函數(shù),如下代碼所示:
  1. <button class="btn btn-lg btn-primary btn-block" onclick="myFunction()" type="submit">登錄</button>
復(fù)制代碼
在myFunction()函數(shù),驗(yàn)證提交的登錄信息,如果正確,則跳轉(zhuǎn)到main-cgi.cig文件。
  1. if(document.getElementById("inputEmail").value=="gjianw217@163.com"&&document.getElementById("inputPassword").value=="111111")
  2. {
  3. window.open("./cgi-bin/main-cgi.cgi");
  4. }
復(fù)制代碼
在main-cgi.cgi中,首先打開(kāi)main.html文件,獲取信息后,再輸出的頁(yè)面上。
2 主界面
主界面主要通過(guò)表單<form>和cgi進(jìn)行數(shù)據(jù)的交互,如環(huán)境檢測(cè)表單,用來(lái)顯示溫度值和濕度值。其中濕度值是模擬值。代碼中有兩點(diǎn)值得注意
1)表單數(shù)據(jù)的提交方法,使用post
2)表單中通過(guò)變量$xx$來(lái)定位數(shù)據(jù)
  1.      <font size="2"><font face="Tahoma"><font size="3"><FORM  class="form-horizontal" role="form" METHOD="post"></font></font></font>
  2. <legend>環(huán)境檢測(cè)</legend>
  3.            <div class="form-group">
  4.                     <label class="col-sm-2 control-label" for="ds_id">溫度檢測(cè)</label>
  5.                     <div class="col-sm-4">
  6.                         <p><font color="red"><h5 align=center> 溫    度
  7. $CurTemp[        DISCUZ_CODE_1046        ]lt;/h5><b>
  8.                      </div>
  9.            </div>
  10.            <div class="form-group">
  11.                     <label class="col-sm-2 control-label" for="ds_id">濕度檢測(cè)</label>
  12.                     <div class="col-sm-4">
  13.                         <p><font color="red"><h5 align=center> 濕    度
  14. $CurHumidity[        DISCUZ_CODE_1046        ]lt;/h5><b>
  15.                      </div>
  16.            </div>
  17.                         
  18.   </form>
復(fù)制代碼
再如通過(guò)led燈來(lái)模擬開(kāi)關(guān),同樣注意表單的提交方法(post)和變量的設(shè)置
  1. <FORM  class="form-horizontal" role="form" METHOD="post">
  2. <legend>燈光控制</legend>
  3. $LedSwitch$
  4.         <br>
  5.         <input type="submit" name="led2" value=" 臥  室 "> 
  6.         <input type="submit" name="led2" value=" 廚  房 "> 
  7.         <input type="submit" name="led3" value=" 客  廳 "> 
  8.         <input type="submit" name="led4" value=" 衛(wèi)生間 "> 
  9.         <br>

  10. </FORM>
復(fù)制代碼
3 調(diào)試結(jié)果
最后附幾張調(diào)試圖片
1)下圖為登錄控制界面后,當(dāng)前的溫度為32.10度,濕度為16%,默認(rèn)為讀廚房和餐廳的燈亮

2)下圖對(duì)應(yīng)上圖的控制信息,顯示讀廚房和餐廳的燈亮

3)下圖顯示窗簾正在運(yùn)行,此時(shí)OK210的蜂鳴器在響
 

相關(guān)產(chǎn)品 >

  • OKMX6UL-C開(kāi)發(fā)板

    飛凌嵌入式專注imx6系列imx6ul開(kāi)發(fā)板、飛思卡爾imx6ul核心板等ARM嵌入式核心控制系統(tǒng)研發(fā)、設(shè)計(jì)和生產(chǎn),i.mx6UL系列產(chǎn)品現(xiàn)已暢銷(xiāo)全國(guó),作為恩智浦imx6ul,imx6ul開(kāi)發(fā)板,i.mx6提供者,飛凌嵌入式提供基于iMX6 iMX6UL解決方案定制。

    了解詳情
    OKMX6UL-C開(kāi)發(fā)板
  • OKMX6ULL-C開(kāi)發(fā)板

    40*29mm,雙網(wǎng)雙CAN,8路串口| i.MX6ULL開(kāi)發(fā)板是基于NXP i.MX6ULL設(shè)計(jì)開(kāi)發(fā)的的一款Linux開(kāi)發(fā)板 ,主頻800MHz,體積小,其核心板僅40*29mm,采用板對(duì)板連接器,適應(yīng)場(chǎng)景豐富。 了解詳情
    OKMX6ULL-C開(kāi)發(fā)板

推薦閱讀 換一批 換一批