高通台灣AI黑客松|競賽說明會
|

【IoT實作】用Web控制Ameba驅動LED並在LCD顯示狀態

   

作者:小波、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 後,開啟上方選項的[檔案]=>[偏好設定]
IDE_set_1

(3) 於[額外的板子管理員網址]處輸入以下路徑:
https://github.com/neojou/arduino-ameba/raw/master/release/package_njiot.com_ameba_index.json
IDE_set_2

(4) 開啟上方選項:[工具]=>[板子]=>[板子管理員]
IDE_set_3

(5) 等待幾秒後,將拉桿拉到最下方會看到Realtek Ameba Boards的區塊,點選區塊後會出現[安裝]的字樣,接著再點選安裝:
IDE_set_4

安裝完成後會出現以下畫面:
IDE_set_5

(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的佈線圖

用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”,如下圖:

TFT

接者我們將這組IP Address 輸入至Google Chrome 就可以看到我們所設計的網頁了。

WEB

若網頁頁面正常顯示,我們可以看一下LCD目前的狀態,目前Duty Cycle為0,所以LED未亮。

結果1

若我們按下網頁的[UP],我們可以增加Duty Cycle的值,讓LED越來越亮。

結果2

結果3

小結

整體來說,Ameba這個平台可以說是近期配備了Wi-Fi功能的CortexM3核心模組中,性價比(C/P)相當高的一個方案,在支援了Arduino IDE後,開發起來也很容易上手,十分符合像我們這樣預算不高卻又想嘗試做出完整解決方案的Maker用來自由發揮及做開發應用。

訂閱MakerPRO知識充電報

與40000位開發者一同掌握科技創新的技術資訊!

Author:

Share This Post On
468 ad

1 Comment

  1. 為什麼用D4腳位,寫程式卻是用PIN 3

    Post a Reply

發佈回覆給「林依璇」的留言 取消回覆

發佈留言必須填寫的電子郵件地址不會公開。 必填欄位標示為 *