文/廣州市番禺區(qū)職業(yè)技術(shù)學(xué)校 莊進(jìn)樣
近年來物聯(lián)網(wǎng)編程工具Node-Red和樹莓派以學(xué)習(xí)門檻低、硬件成本低和具有趣味性的特點(diǎn),在中職信息技術(shù)教學(xué)中倍受青睞。如廣州市中職信息技術(shù)教研會在2019年舉行了兩期樹莓派與人工智能機(jī)器人培訓(xùn),全國職校信息技術(shù)技能大賽中職組在2018年和2019年舉行了可視化智能控制系統(tǒng)設(shè)計(jì)與調(diào)試競賽,該賽項(xiàng)的內(nèi)容正是使用Node-Red編程工具和樹莓派。
目前的中職物聯(lián)網(wǎng)應(yīng)用系統(tǒng)開發(fā)課程教學(xué)主要選擇單片機(jī)和C語言作為開發(fā)工具,而本文則基于實(shí)踐教學(xué)設(shè)計(jì),介紹了如何使用可視化編程工具Node-Red和樹莓派進(jìn)行物聯(lián)網(wǎng)應(yīng)用系統(tǒng)開發(fā)。
樹莓派(Raspberry Pi)的尺寸只有信用卡大小,是為計(jì)算機(jī)編程教育而設(shè)計(jì)的微型電腦。它除了能代替日常桌面計(jì)算機(jī)的用途外,還能使用GPIO(General-Purpose Input/Output,通用輸入/輸出端口)為物聯(lián)網(wǎng)應(yīng)用提供很好的實(shí)踐案例。官方推薦安裝操作系統(tǒng)為基于Debian的Raspbian,該系統(tǒng)中預(yù)安裝了Node-Red編程工具。
Node-Red是IBM開發(fā)的一個(gè)開源項(xiàng)目,以新穎有趣的方式將硬件設(shè)備、應(yīng)用程序接口、在線服務(wù)連接起來,編程時(shí)只需要在瀏覽器中拖拽節(jié)點(diǎn)(Node),然后把這些節(jié)點(diǎn)用線連接起來,而數(shù)據(jù)則通過這些連線在節(jié)點(diǎn)間傳遞。節(jié)點(diǎn)是封裝了特定功能的模塊,核心節(jié)點(diǎn)會隨Node-Red一起被默認(rèn)安裝,包括8個(gè)主要類別:輸入、輸出、功能、社交、存儲、高級和Raspberry Pi。除了核心節(jié)點(diǎn)外,用戶還可以在線安裝其他節(jié)點(diǎn),如儀表盤節(jié)點(diǎn)(node-red-dashboard)、DHT溫濕度傳感器(node-dht-sensor)等等。正是由于Node-Red這種簡單、高效的編程方式,它被用作物聯(lián)網(wǎng)的一種粘合劑并很快發(fā)展成為一種通用的、可視化的物聯(lián)網(wǎng)編程工具。
物聯(lián)網(wǎng)應(yīng)用系統(tǒng)以智能教室系統(tǒng)為例,實(shí)現(xiàn)的功能包括:在終端顯示教室燈光當(dāng)前的狀態(tài);進(jìn)行開燈、關(guān)燈操作;顯示教室實(shí)時(shí)的溫度和濕度。除此之外,系統(tǒng)還能夠設(shè)定溫度的閾值,如果溫度高于設(shè)定的值,系統(tǒng)則發(fā)出人聲報(bào)警(“濕度太高,可以開空調(diào)”)和蜂鳴器鳴叫,并能夠設(shè)定濕度的閾值,如果濕度高于設(shè)定的值,則自動打開排氣扇進(jìn)行抽濕。
現(xiàn)實(shí)智能教室功能的硬件主要包括樹莓派、LED、DHT11溫濕度傳感器、蜂鳴器、12V排氣扇、12V電源、繼電器、杜邦線。然而因?yàn)闃漭蒅PIO輸出不能達(dá)到12V,無法直接驅(qū)動排氣扇,所以需要使用繼電器進(jìn)行電路轉(zhuǎn)換。
樹莓派提供40個(gè)GPIO引腳,通過它們輸出高低電平或者通過它們讀入引腳的狀態(tài):高電平或低電平。用戶可以通過樹莓派的GPIO口和硬件進(jìn)行數(shù)據(jù)交互、控制硬件工作、讀取硬件的工作狀態(tài)信號等,GPIO引腳如圖1所示。
圖1 樹莓派的GPIO示意圖
各種傳感器和執(zhí)行器在樹莓派GPIO上的連接設(shè)計(jì)盡可能布局合理,減少線材交叉,達(dá)到方便編寫程序又美觀的目的。具體說明如下表1所示。
表1 傳感器和執(zhí)行器在樹莓派的引腳分配
排氣扇的工作電壓為12V,故不能直接連接到GPIO上,控制排氣扇還需要通過繼電器實(shí)現(xiàn)電路轉(zhuǎn)換。
Node-Red可視化編程在智能控制系統(tǒng)的應(yīng)用,只需要拖拽節(jié)點(diǎn),設(shè)置相應(yīng)的參數(shù),連接節(jié)點(diǎn),即可搭建一個(gè)具備數(shù)據(jù)顯示、處理與控制界面的控制系統(tǒng),可用于通信與控制、物聯(lián)網(wǎng)、互聯(lián)網(wǎng)+等行業(yè)。Node-Red既可以下載安裝在電腦中,也可以在安裝了Raspbian操作系統(tǒng)的樹莓派中直接使用,更多的安裝使用方法可以參考官方網(wǎng)址https://nodered.org/docs/getting-started/,也可以使用在線版Node-Red,如:在瀏覽器中輸入網(wǎng)址https://goiot.cc/,注冊登錄后即可開始Node-Red的編程之旅。
因?yàn)楸局悄芙淌蚁到y(tǒng)以樹莓派為控制中心,所以更方便的編程方式是在樹莓派中開啟Node-Red服務(wù),然后在同一局域網(wǎng)中電腦端的瀏覽器中訪問http://<樹莓派IP>:1880/即可進(jìn)行Node-Red程序編寫,以及訪問http://<樹莓派IP>:1880/UI即可運(yùn)行用戶交互界面。
圖3 智能教室運(yùn)行的界面
(二)顯示和交互界面
儀表盤節(jié)點(diǎn)(Dashboard)主要用于創(chuàng)建實(shí)時(shí)圖形化交互界面,與其它節(jié)點(diǎn)安裝類似,在菜單中的“節(jié)點(diǎn)管理”中“安裝”選項(xiàng)卡中輸入“dashboard”,找到名為“node-red-dashboard”并點(diǎn)擊安裝即可。
儀表盤的布局由Tab和Group兩個(gè)屬性組成。Tab相當(dāng)于分頁,Group是分組,每個(gè)Tab中可以包含多個(gè)Group。智能教室系統(tǒng)設(shè)置一個(gè)Tab,命名為:智能教室;設(shè)置三個(gè)Group,分別命名為:燈光控制、濕度控制、溫度控制。每個(gè)Group包括dashboard的若干個(gè)節(jié)點(diǎn):
燈光控制:text節(jié)點(diǎn),用于顯示當(dāng)前燈光的狀態(tài)(亮或滅);button節(jié)點(diǎn)兩個(gè),分別對應(yīng)開燈和關(guān)燈的按鈕。
溫度控制:text節(jié)點(diǎn),用于顯示當(dāng)前設(shè)置閾值;slider節(jié)點(diǎn),用于調(diào)節(jié)溫度的臨界值,即當(dāng)教室的溫度高于設(shè)定的閾值時(shí),觸發(fā)蜂鳴器鳴叫和人聲報(bào)警(人聲報(bào)警使用文字轉(zhuǎn)語音節(jié)點(diǎn)實(shí)現(xiàn));guage節(jié)點(diǎn),用于顯示教室的實(shí)時(shí)溫度。
濕度控制:與溫度控制類似,當(dāng)環(huán)境濕度高于設(shè)置的閾值時(shí),自動開啟排氣扇進(jìn)行抽濕。
智能教室系統(tǒng)的顯示和交互界面,如圖2、圖3所示。
圖2 顯示和交互設(shè)計(jì)
開燈和關(guān)燈使用節(jié)點(diǎn)button,控制樹莓派引腳使用節(jié)點(diǎn)rpi-gpio out。在開燈節(jié)點(diǎn)button發(fā)送有效載荷設(shè)置為數(shù)字1(高電平),關(guān)燈節(jié)點(diǎn)button發(fā)送有效載荷設(shè)置為數(shù)字0(低電平)。然后分別從兩個(gè)節(jié)點(diǎn)button右邊的小方塊拉出連接線,并連接到節(jié)點(diǎn)rpi-gpio out左邊的小方塊,如圖4所示。
圖4 實(shí)現(xiàn)開燈關(guān)燈
燈光LED的正極與引腳40-GPIO21相連,因此可以初始化該引腳為低電平(0),使燈光處于滅的狀態(tài)。當(dāng)用戶點(diǎn)擊“開燈”時(shí),數(shù)據(jù)流向右邊發(fā)送,使引腳40-GPIO21處于高電平狀態(tài),從而點(diǎn)亮教室的燈光;當(dāng)用戶點(diǎn)擊“關(guān)燈”時(shí),數(shù)據(jù)流向右邊發(fā)送,使引腳40-GPIO21處于低電平狀態(tài),從而熄滅教室的燈光。
為便于用戶在終端知道當(dāng)前燈光的狀態(tài),最直觀的方式是在界面中顯示“亮”或“滅”,然而用戶點(diǎn)擊開燈或關(guān)燈時(shí),發(fā)送的是數(shù)字1或0,那如何才能顯示相對應(yīng)的“亮”或“滅”呢?Node-Red的節(jié)點(diǎn)function(函數(shù)),允許用戶編寫javascript代碼,從而實(shí)現(xiàn)轉(zhuǎn)換發(fā)送的數(shù)據(jù)。
變量msg.payload是從上一流程中接收到的有效載荷,最終函數(shù)返回對象msg,實(shí)現(xiàn)其轉(zhuǎn)換后的有效載荷往下一流程發(fā)送。完成后的燈光控制程序,如圖5所示。
圖5 燈光控制的程序
獲取連接到樹莓派引腳溫濕度傳感器DHT11的數(shù)據(jù),需要安裝節(jié)點(diǎn)rpi-dht22(支持dht11和dht22)。值得注意的是:智能教室的溫濕度數(shù)據(jù)并不是獲取一次就終止了,而是按一定的時(shí)間間隔(如5秒)重復(fù)地獲取實(shí)時(shí)數(shù)據(jù)并在終端上更新。
節(jié)點(diǎn)inject能以有規(guī)律的時(shí)間間隔向下一節(jié)點(diǎn)發(fā)送消息,該消息中的有效載荷可以是字符串、Javascript對象或者當(dāng)前時(shí)間等。把節(jié)點(diǎn)inject發(fā)送的內(nèi)容設(shè)置成當(dāng)前時(shí)間,并每隔5秒執(zhí)行一次,正符合我們的設(shè)計(jì)要求。
節(jié)點(diǎn)rpi-dht11獲取到的溫度數(shù)據(jù)包含在msg.payload中,而獲取到的濕度數(shù)據(jù)則包含在msg.humidity。為了在儀表上能分別顯示溫度和濕度,可以使用節(jié)點(diǎn)function編寫Javascript代碼進(jìn)行有效載荷的轉(zhuǎn)換,溫濕度顯示的程序如圖6所示。
圖6 溫濕度獲取并顯示的程序
圖7 溫度與報(bào)警聯(lián)動程序
在智能教室系統(tǒng)中,當(dāng)溫度高于設(shè)定的閾值時(shí),將會觸發(fā)報(bào)警,蜂鳴器鳴叫,同時(shí)把警示文字轉(zhuǎn)換成語音在終端中播放;當(dāng)濕度高于設(shè)定的閾值時(shí),將會觸發(fā)繼電器接通排氣扇進(jìn)行抽濕。
以溫度高于閾值報(bào)警為例,用戶設(shè)置的閾值保存為函數(shù)節(jié)點(diǎn)中的全局變量,代碼為:flow.set(‘yuzhi_wendu’,msg.payload)。在下一節(jié)點(diǎn)的函數(shù)中則獲取上一節(jié)點(diǎn)的全局變量后存放于新的變量yuzhi_wendu中,如果獲取失敗,則賦值26,代碼為:varyuzhi_wendu=flow.get(‘yuzhi_wendu’)||26。實(shí)時(shí)溫度與用戶設(shè)置的閾值相比較,使用else-if條件分支語句進(jìn)行判斷,程序如圖7所示。
濕度高于用戶設(shè)置的閾值時(shí)將會觸發(fā)排氣扇抽濕的程序,與溫度高于閾值時(shí)將會觸發(fā)報(bào)警程序的原理一致,只需要在上述程序基礎(chǔ)上修改少量代碼即可實(shí)現(xiàn)。
用于實(shí)踐教學(xué)設(shè)計(jì)的中職物聯(lián)網(wǎng)應(yīng)用系統(tǒng)開發(fā),因使用Node-Red和樹莓派而變得簡單和有趣,又因以智能教室為例,是學(xué)生所熟悉的情境,能夠較好地促進(jìn)教學(xué)目標(biāo)的達(dá)成?;贜ode-Red和樹莓派學(xué)習(xí)開發(fā)智能教室系統(tǒng),能幫助學(xué)生掌握物聯(lián)網(wǎng)應(yīng)用系統(tǒng)開發(fā)的基本方法,同時(shí),通過替換、增加傳感器和融入更多的Node-Red節(jié)點(diǎn),使學(xué)生能夠開發(fā)功能更加完備的應(yīng)用系統(tǒng),從而更好地進(jìn)行創(chuàng)新創(chuàng)業(yè)活動。