作者:小波、Lance KKo/Aeroprobing
日前參與了由MakerPRO舉辦的Ameba開發板課程,得到了不少心得,由於最近正好在研究TFTLCD螢幕的驅動,所以我們將所學直接派上用場,透過Web端來操控Ameba驅動LED亮度,並同步將控制狀況顯示於LCD面板上頭,本文即為這次入門IoT開發實作的心得分享。
1. Ameba-Arduino IDE Set Up
首先我們需要先安裝開發環境,由於Ameba已支援Arduino的開發環境,所以我們就選用簡單易上手的Arduino IDE來作程式開發。1.6.4版本開始可用板子管理員(board manager),直接從網路上進行Ameba-Arduino 相關裝載,以下就是Ameba的Arduino IDE安裝方法:
(1) 先進行Arduino 1.6.7下載(註:1.6.5版本會有遺漏檔案的情形!)
(2) 打開 Arduino 後,開啟上方選項的[檔案]=>[偏好設定]
(3) 於[額外的板子管理員網址]處輸入以下路徑:
https://github.com/neojou/arduino-ameba/raw/master/release/package_njiot.com_ameba_index.json
(4) 開啟上方選項:[工具]=>[板子]=>[板子管理員]
(5) 等待幾秒後,將拉桿拉到最下方會看到Realtek Ameba Boards的區塊,點選區塊後會出現[安裝]的字樣,接著再點選安裝:
安裝完成後會出現以下畫面:
(6) 最後點選上方選項[工具]=>[板子]往下找到[Arduino Ameba]即完成 Ameba-Arduino 環境設定。
2. 完成LCD與Ameba佈線圖
完成了Ameba-Arduino IDE Set Up 後,我們就可以開始測試Ameba的一些功能,既然現在是 IoT 的時代,那就讓我們試試看用Wi-Fi建立一個Web連線,並且設計簡單的Button去控制Ameba PWM,最後我們再把目前PWM的狀態顯示在LCD上。
首先完成我們的佈線圖,將LCD上面的VCC以及背光(LED)接至3.3V;同時利用D4(PWM)去控制LED燈:

用Ameba控制LCD的佈線圖
3. 撰寫控制程式碼
接著開始撰寫我們的程式碼,其中LED的pin腳位,在上圖中是用D4,但寫程式請用pin 3(line 5);此外,SSID及Passward可改為自己的(line 13, 14)。程式碼如下:
#include <WiFi.h> #include "SPI.h" #include "AmebaILI9341.h" #define LED_pin 3 #define TFT_RESET 8 #define TFT_DC 9 #define TFT_CS 10 #define ILI9341_SPI_FREQUENCY 20000000 int flag=0; int duty_LED=0; char ssid[] = "55424255"; char pass[] = "55424255"; int status = WL_IDLE_STATUS; AmebaILI9341 tft = AmebaILI9341(TFT_CS, TFT_DC, TFT_RESET); WiFiServer server(80); void setup() { Serial.begin(9600); pinMode(LED_pin, OUTPUT); if (WiFi.status() == WL_NO_SHIELD) { Serial.println("WiFi shield not present"); while (true); } while (status != WL_CONNECTED) { Serial.print("/n-->Network named: "); Serial.println(ssid); status = WiFi.begin(ssid,pass); delay(15000); } server.begin(); SPI.setDefaultFrequency(ILI9341_SPI_FREQUENCY); tft.begin(); Serial.println("\nTFT is OK !!"); } void loop() { flag++; WiFiClient client = server.available(); Serial.println(client); if (client) { Serial.println("Start client"); String currentLine = ""; while (client.connected()) { if (client.available()) { char c = client.read(); Serial.write(c); if (c == '\n') { if (currentLine.length() == 0) { client.println("HTTP/1.1 200 OK"); client.println("Content-type:text/html"); client.println(); client.println("<html>"); client.print("<table align='center' border='5'>"); client.print("<tr>"); client.print("<td colspan='2' align='center'>Control the PWM</td>"); client.print("</tr>"); client.print("<td><input type='button' value='DOWN' onclick=self.location.href=\"/slow\" style='width:90px;height:30px;font-size:20px;'></td>"); client.print("<td><input type='button' value='UP' onclick=self.location.href=\"/quick\" style='width:90px;height:30px;font-size:20px;'></td>"); client.print("</table>"); client.println(); client.println("</html>"); break; } else { currentLine = ""; } } else if (c != '\r') { currentLine += c; } if (currentLine.endsWith("GET /quick")) { duty_LED += 1; if (duty_LED > 10) duty_LED=10; analogWrite(LED_pin,(255/10)*duty_LED); } if (currentLine.endsWith("GET /slow")) { duty_LED -= 1; if (duty_LED <= -1) duty_LED=0; analogWrite(LED_pin,(255/10)*duty_LED); } } } // close the connection: client.stop(); Serial.println("client disonnected"); } if (flag ==2) { testText(); flag=0; } } unsigned long testText() { tft.clr(); tft.setRotation(1); tft.setCursor(0, 0); tft.setForeground(ILI9341_GREEN); tft.setFontSize(3); tft.println("Ameba_ILI9341"); tft.println(" "); tft.setForeground(ILI9341_WHITE); tft.setFontSize(2); tft.print("Duty Cycle is:"); tft.setForeground(ILI9341_RED); tft.setFontSize(3); tft.print(duty_LED*10); tft.println("%"); tft.setForeground(ILI9341_YELLOW); tft.setFontSize(3); tft.println("\n2016 presented by"); tft.setForeground(ILI9341_GREENYELLOW); tft.println("Aeroprobing Inc."); }
4. 遠端控制LED亮度並驅動LCD顯示
在完成測試程式碼撰寫並燒入開發板後,打開我們的監視視窗並且按下chip reset ,我們會先看到由Wi-Fi所產生的IP Address,接著LCD作初始化需經過一小段時間,在完成初始化後電腦終端視窗會顯示出”TFT is OK”,如下圖:
接者我們將這組IP Address 輸入至Google Chrome 就可以看到我們所設計的網頁了。
若網頁頁面正常顯示,我們可以看一下LCD目前的狀態,目前Duty Cycle為0,所以LED未亮。
若我們按下網頁的[UP],我們可以增加Duty Cycle的值,讓LED越來越亮。
小結
整體來說,Ameba這個平台可以說是近期配備了Wi-Fi功能的CortexM3核心模組中,性價比(C/P)相當高的一個方案,在支援了Arduino IDE後,開發起來也很容易上手,十分符合像我們這樣預算不高卻又想嘗試做出完整解決方案的Maker用來自由發揮及做開發應用。
訂閱MakerPRO知識充電報
與40000位開發者一同掌握科技創新的技術資訊!
2020/05/29
為什麼用D4腳位,寫程式卻是用PIN 3