如何用樹莓派控制 GPIO 引腳並操作繼電器
你是否曾經想知道怎樣使用手機或者電腦在任何地方控制你的風扇和燈等一些家用電器?
我現在想控制我的聖誕彩燈,是使用手機呢,還是使用平板電腦呢,或者是使用筆記本電腦呢?都不是,而是僅僅使用一個樹莓派。讓我來告訴你如何使用 PHP 和溫度感測器實現樹莓派控制 GPIO 引腳並操作繼電器。我使用 AJAX 把它們整合在了一起。
硬體要求:
- 樹莓派
- 安裝有 Raspbian 系統的 SD 卡(任何一張 SD 卡都可以,但是我更偏向使用大小為 32GB 等級為 class 10 的 SD 卡)
- 電源適配器
- 跳線(母對母跳線和公轉母跳線)
- 繼電器板(我使用一個用於 12V 繼電器的繼電器板)
- DS18B20 溫度感測器
- 樹莓派的 Wi-Fi 適配器
- 路由器(為了訪問互聯網,你需要有一個擁有埠轉發的路由器)
- 10KΩ 的電阻
軟體要求:
- 下載並安裝 Raspbian 系統到你的 SD 卡
- 有效的互聯網連接
- Apache web 伺服器
- PHP
- WiringPi
- 基於 Mac 或者 Windows 的 SSH 客戶端
一般的配置和設置
1、 插入 SD 卡到樹莓派,然後使用乙太網網線將它連接到路由器;
2、 連接 WiFi 適配器;
3、 使用 SSH 方式登錄到樹莓派,然後使用下面的命令編輯 interfaces
文件:
sudo nano /etc/network/interfaces
這個命令會用一個叫做 nano
的編輯器打開這個文件。它是一個非常簡單又易於使用的文本編輯器。如果你不熟悉基 Linux 的操作系統,可以使用鍵盤上的方向鍵來操作。
用 nano
打開這個文件後,你會看到這樣一個界面:
![File editor nano](/data/attachment/album/201706/13/221426wvszjemmzmdjvu6v.png "File editor nano")
4、要配置你的無線網路,按照下面所示修改這個文件:
iface lo inet loopback
iface eth0 inet dhcp
allow-hotplug wlan0
auto wlan0
iface wlan0 inet dhcp
wpa-ssid "Your Network SSID"
wpa-psk "Your Password"
5、 按 CTRL+O
保存,然後按 CTRL+X
退出編輯器。
到目前為止,一切都已經配置完成,接下來你需要做的就是使用命令重新載入網路:
sudo service networking reload
(警告:如果你是使用遠程連接的方式連接的樹莓派,連接將會中斷。)
軟體配置
安裝 Apache web 伺服器
Apache 是一個受歡迎的伺服器應用,你可以在樹莓派安裝這個程序讓它提供網頁服務。Apache 原本就可以通過 HTTP 方式提供 HTML 文件服務,添加其他模塊後,Apache 還可以使用像 PHP 這樣的腳本語言來提供動態網頁的服務。
可以在命令行輸入下面命令安裝 Apache:
sudo apt-get install apache2 -y
安裝完成後,可以在瀏覽器地址欄輸入樹莓派的 IP 地址來測試 web 伺服器。如果你可以獲得下面圖片的內容,說明你已經成功地安裝並設置好了你的伺服器。
![Successful server setup](/data/attachment/album/201706/13/221427a3gvppwcrru6gnr3.png "Successful server setup")
要改變這個默認的頁面和添加你自己的 html 文件,進入 var/www/html
目錄:
cd /var/www/html
添加一些文件來測試是否成功。
安裝 PHP
PHP 是一個預處理器,這意味著它是當伺服器收到網頁請求時才會運行的一段代碼。它開始運行,處理網頁上需要被顯示的內容,然後把網頁發送給瀏覽器。不像靜態的 HTML,PHP 在不同的環境下可以顯示不同的內容。其他的語言也可以做到這一點,但是由於 WordPress 是用 PHP 編寫的,有些時候你需要使用它。PHP 是 web 上一種非常受歡迎的語言,像 Facebok 和 Wikipeadia 這樣的大型項目都是用 PHP 編寫的。
使用下面的命令安裝 PHP 和 Apache 軟體包:
sudo apt-get install php5 libapache2-mod-php5 -y
測試 PHP
創建文件 index.php
:
sudo nano index.php
在裡面寫入一些 PHP 內容:
<?php echo "hello world"; ?>
保存文件,接下來刪除 index.html
,因為它比 index.php
的優先順序更高:
sudo rm index.html
刷新你的瀏覽器,你會看到 「hello world」。這並不是動態的,但是它仍然由 PHP 提供服務。如果你在上面看到提原始的 PHP 文件而不是「hello world」,重新載入和重啟 Apahce(LCTT 譯註,重啟即可):
sudo /etc/init.d/apache2 reload
sudo /etc/init.d/apache2 restart
安裝 WiringPi
為了可以對代碼的更改進行跟蹤,WiringPi 的維護採用 git。但假如你因為某些原因而沒法使用 git,還有一種可以替代的方案。(通常你的防火牆會把你隔離開來,所以請先檢查一下你的防火牆的設置情況!)
如果你還沒有安裝 git,那麼在 Debian 及其衍生版本中(比如 Raspbian),你可以這樣安裝它:
sudo apt-get install git-core
若是你遇到了一些錯誤,請確保你的樹莓派是最新版本的 Raspbian 系統:
sudo apt-get update sudo apt-get upgrade
使用 git 獲取最 WiringPi:
sudo git clone git://git.drogon.net/wiringPi
如果你之前已經使用過 clone 操作,那麼可以使用下面命令:
cd wiringPi && git pull origin
這個命令會將會獲取更新的版本,你然後可以重新運行下面的構建腳本。
有一個新的簡化的腳本來構建和安裝:
cd wiringPi && ./build
這個新的構建腳本將會為你完成編譯和安裝 WiringPi。它曾一度需要使用 sudo
命令,所以在運行這它之前你可能需要檢查一下這個腳本。
測試 WiringPi
運行 gpio
命令來檢查安裝成功與否:
gpio -v gpio readall
這將給你一些信心,軟體運行良好。
連接 DS18B20 感測器到樹莓派
- 感測器上的黑線用於 GND。
- 紅線用於 VCC。
- 黃線是 GPIO 線。
![GPIO image](/data/attachment/album/201706/13/221428zfqa01b46b6x386k.png "GPIO image")
連線:
- VCC 連接 3V 的 1 號引腳。
- GPIO 線連接 7 號引腳(GPIO4)。
- 地線連接 GND 的 9 號引腳。
軟體配置
為了用 PHP 使用 DS18B20 溫度感測器模塊,你需要執行下面的命令來激活用於樹莓派上 GPIO 引腳和 DS18B20 的內核模塊:
sudo modprobe w1-gpio
sudo modprobe w1-therm
你不想每次 Raspberry 重啟後都手動執行上述命令,所以你想每次開機能自動啟動這些模塊。可以在文件 /etc/modules
中添加下面的命令行來做到:
sudo nano /etc/modules/
添加下面的命令行到它裡面:
w1-gpio
w1-therm
為了測試,輸入:
cd /sys/bus/w1/devices/
現在輸入 ls
。
你會看到你的設備信息。在設備驅動程序中,你的 DS18B20 感測器應該作為一串字母和數字被列出。在本例中,設備被記錄為 28-000005e2fdc3
。然後你需要使用 cd
命令來訪問感測器,用你自己的序列號替代我的: cd 28-000005e2fdc3
。
DS18B20 會周期性的將數據寫入文件 w1_slave
,所以你只需要使用命令 cat
來讀出數據: cat w1_slave
。
這會生成下面的兩行文本,輸出中 t=
表示攝氏單位的溫度。在前兩位數後面加上一個小數點(例如,我收到的溫度讀數是 30.125 攝氏度)。
連接繼電器
1、 取兩根跳線,把其中一根連接到樹莓派上的 GPIO24(18 號引腳),另一根連接 GND 引腳。你可以參考下面這張圖。
2、 現在將跳線的另一端連接到繼電器板。GND 連接到繼電器上的 GND,GPIO 輸出線連接到繼電器的通道引腳號,這取決於你正使用的繼電器型號。記住,將樹莓派上的 GND 與繼電器上的 GND 連接連接起來,樹莓派上的 GPIO 輸出連接繼電器上的輸入引腳。
![Headers](/data/attachment/album/201706/13/221429upee9x53gi7e8988.png "Headers")
注意!將繼電器連接樹莓派的時候小心一些,因為它可能會導致電流迴流,這會造成短路。
3、 現在將電源連接繼電器,可以使用 12V 的電源適配器,也可以將 VCC 引腳連接到什麼破上的 3.3V 或 5.5V 引腳。
使用 PHP 控制繼電器
讓我們先寫一個藉助於 WiringPi 軟體用來控制 Paspberry Pi 上 GPIO 引腳的 PHP 腳本。
1、在 Apache 伺服器的網站根目錄下創建一個文件,使用下面命令切換到該目錄:
cd /var/www/html
2、 新建一個叫 Home
的文件夾:
sudo mkdir Home
3、 新建一個叫 on.php
的腳本
sudo nano on.php
4、 在腳本中加入下面的代碼:
<?php
system("gpio-g mode 24 out");
system("gpio-g write 24 1");
?>
5、 使用 CTRL+O
保存文件,CTRL+X
退出。
上面的代碼中,你在第一行使用命令將 24 號 GPIO引腳設置為 output 模式:
system("gpio-g mode 24 out");
在第二行,你使用 1
將 24 號引腳 GPIO 打開,在二進位中"1"表示打開,"0"表示關閉。
6、 為了關閉繼電器,可以創建另外一個 off.php
文件,並用 0
替換 1
。
<?php
system(" gpio-g mode 24 out ");
system(" gpio-g write 24 1 ");
?>
7、 如果你已經將繼電器連接了樹莓派,可以在瀏覽器中輸入你的樹莓派的 IP 地址,並在後面加上目錄名和文件名來進行訪問:
http://{IPADDRESS}/home/on.php
這將會打開繼電器。
8、 要關閉它,可以訪問叫 off.php
的文件:
http://{IPADDRESS}/home/off.php
現在你需要能夠在一個單獨的頁面來控制這兩樣事情,而不用單獨的刷新或者訪問這兩個頁面。你可以使用 AJAX 來完成。
9、 新建一個 HTML 文件,並在其中加入下面代碼:
<html>
<script src="https://ajax.googleapis.com/ajax/libs/jquery/1.11.3/jquery.min.js"></script>
<script type="text/javascript">// <![CDATA[
$(document).ready(function() {
$('#on').click(function(){
var a= new XMLHttpRequest();
a.open("GET", "on.php"); a.onreadystatechange=function(){
if (a.readyState==4){
if(a.status ==200){
} else alert ("http error");
}
}
a.send();
});
});
$(document).ready(function()
{
$('#Off').click(function(){
var a= new XMLHttpRequest();
a.open("GET", "off.php");
a.onreadystatechange=function(){
if(a.readyState==4){
if(a.status ==200){
} else alert ("http error");
}
}
a.send();
});
});
</script>
<button id="on" type="button"``Switch Lights On </button>
<button id="off" type="button"``Switch Lights Off </button>
10、 保存文件,進入你的 web 瀏覽器目錄,然後打開那個網頁。你會看到兩個按鈕,它們可以打開和關閉燈泡。基於同樣的想法,你還可以使用 bootstrap 和 CSS 來創建一個更加漂亮的 web 界面。
在這個網頁上觀察溫度
1、 新建一個 temperature.php
的文件:
sudo nano temperature.php
2、 在文件中加入下面的代碼,用你自己的設備 ID 替換 10-000802292522
:
<?php
//File to read
$file = '/sys/devices/w1_bus_master1/10-000802292522/w1_slave';
//Read the file line by line
$lines = file($file);
//Get the temp from second line
$temp = explode('=', $lines[1]);
//Setup some nice formatting (i.e., 21,3)
$temp = number_format($temp[1] / 1000, 1, ',', '');
//And echo that temp
echo $temp . " °C";
?>
3、 打開你剛剛創建的 HTML 文件,並創建一個新的帶有 id
為 「screen」 的 <div>
標籤
<div id="screen"></div>
4、 在這個標籤後或者這個文檔的尾部下面的代碼:
<script>
$(document).ready(function(){
setInterval(function(){
$("#screen").load('temperature.php')
}, 1000);
});
</script>
其中,#screen
是標籤 <div>
的 id
,你想在它裡面顯示溫度。它會每隔 1000 毫秒載入一次 temperature.php
文件。
我使用了 bootstrap 框架來製作一個漂亮的面板來顯示溫度,你還可以加入多個圖標和圖形讓網頁更有吸引力。
這只是一個控制繼電器板並顯示溫度的基礎的系統,你可以通過創建基於定時和從恆溫器讀數等基於事件觸發來進一步地對系統進行開發。
( 題圖:opensource.com)
作者簡介:
Abdul Hannan Mustajab: 我 17 歲,生活在印度。我正在追求科學,數學和計算機科學方面的教育。我在 spunkytechnology.com 上發表關於我的項目的博客。我一直在對使用不同的微控制器和電路板的基於物聯網的 AI 進行研究。
via: https://opensource.com/article/17/3/operate-relays-control-gpio-pins-raspberry-pi
作者:Abdul Hannan Mustajab 譯者:zhousiyu325 校對:wxy
本文轉載來自 Linux 中國: https://github.com/Linux-CN/archive