QBoat Sunny 玩創意(一): 打造室內溫溼度無線感測的應用


物聯網的蓬勃發展,讓熱愛研發科技產品和服務的創客們,有了揮灑無盡創意的新天地。而為了因應開發者不同的需求,市售開發版琳瑯滿目,凡舉 Arduino、Rasberry Pi 各有相應的不同功能。而在外部連網的時代,東西有多智慧,物件有什麼特色,才是 IoT 競爭環境下的致勝關鍵。

由 QNAP 推出的微型單板伺服器 QBoat Sunny ,可視為小型 NAS,特別適合做為攜帶型的 IoT Gateway!不僅相容於物聯網通訊協定 MQTT ,還可以 Node-red 為基礎下去開發應用程式。然而其與 NAS 最大不同在於容量的限制。QBoat Sunny 使用固態硬碟(SSD),雖容量無法與傳統硬碟(HDD)比擬,但已足以用於邊緣運算。

「不過是壓低成本改用 ARM 當 base,把硬碟改成 SSD 做的 NAS」或許是很多人對 QBoat Sunny 的評價,然而 NAS 並不僅只是 PC 灌個 Windows 或 Linux 作為檔案與資料庫的伺服器,軟硬體的良好整合性,能適時提供使用者需要的服務功能才是其核心價值。以下的範例操作,是為了以無線感測的方式,讓使用者能用網頁方式查詢室內的溫濕度。就來看看作為小型 NAS 的 QBoat Sunny 在「打造無線感測應用」,有多輕鬆省事吧!

 

基礎架構


準備工具及操作方式

  • Media Tek Linklt  7697 開發版 + DHT11
    1. 連接 MTK 7697 開發版及DHT 11,其腳位連接方式如下:

    DHT11

    MediaTek LinkIt 7697

    +

    5V

    GND

    DO

    P3


    2. 透過 LWiFi 連結 Wireless AP router,並套用 DHT11 的程式庫。編譯完成後可用瀏覽器,如 : http://192.168.1.xxx/temp  查看是否能傳出感測數值。

    GET參數 功用
    /temp 取得攝氏溫度
    /humi 取得濕度百分比值

    完整程式碼如下:

    <strong>&lt;&lt; MonitorNode.ino &gt;&gt;</strong>
     
     #include &lt;LWiFi.h&gt;
     #include "DHT.h"
    
    #define DHTPIN 3 // what digital pin we’re connected to
     #define WARNPIN 13
    
    // Uncomment whatever type you’re using!
     #define DHTTYPE DHT11 // DHT 11
     //#define DHTTYPE DHT22 // DHT 22 (AM2302), AM2321
     //#define DHTTYPE DHT21 // DHT 21 (AM2301)
     DHT dht(DHTPIN, DHTTYPE);
    
    char ssid[] = “LaisanHere”; // your network SSID (name)
     char pass[] = “t101419008”; // your network password
     int keyIndex = 0; // your network key Index number (needed only for WEP)
    
    int status = WL_IDLE_STATUS;
    
    WiFiServer server(80);
    
    void setup() {
     //Initialize serial and wait for port to open:
     Serial.begin(9600);
     while (!Serial) {
     ; // wait for serial port to connect. Needed for native USB port only
     }
    
    // attempt to connect to Wifi network:
     while (status != WL_CONNECTED) {
     Serial.print(“Attempting to connect to SSID: “);
     Serial.println(ssid);
     // Connect to WPA/WPA2 network. Change this line if using open or WEP network:
     status = WiFi.begin(ssid, pass);
     }
     server.begin();
     // you’re connected now, so print out the status:
     printWifiStatus();
    
    // Activate DHT11
     dht.begin();
    
    pinMode(WARNPIN, OUTPUT);
     digitalWrite(WARNPIN, LOW);
     }
     void loop() {
     // listen for incoming clients
     WiFiClient client = server.available();
     if (client) {
     Serial.println(“new client”);
    
    String msg;
     String param;
    
    // an http request ends with a blank line
     if (client.connected()) {
     while (client.available()) {
     char c = client.read();
     msg += String(c);
     }
     }
    
    Serial.print(msg);
    
    int posi = msg.indexOf(“Referer: “);
     if(posi &gt; 0)
     {
     String sb = msg.substring(posi);
     int p = sb.indexOf(“/”);
     param = sb.substring(p+2);
     p = param.indexOf(“/”);
     param = param.substring(p, p+5);
     }
     else
     {
     posi = msg.indexOf(“GET”);
     param = msg.substring(posi+4, posi+9);
     }
    
    Serial.println(param);
    
    // send a standard http response header
     client.println(“HTTP/1.1 200 OK”);
     client.println(“Content-Type: text/html”);
     client.println(“Connection: close”); // the connection will be closed after completion of the response
     client.println();
    
    if(param == “/warn”)
     {
     digitalWrite(WARNPIN, HIGH);
     client.println(“WARNING !!”);
     }
     if(param == “/cler”)
     {
     digitalWrite(WARNPIN, LOW);
     client.println(“CLEAR”);
     }
     if(param == “/temp”)
     {
     float t = dht.readTemperature();
     client.println(t);
     }
     if(param == “/humi”)
     {
     float h = dht.readHumidity();
     client.println(h);
     }
    
    // close the connection:
     client.stop();
     Serial.println(“client disonnected”);
     }
    
    // give the web browser time to receive the data
     delay(100);
     }
    
    void printWifiStatus() {
     // print the SSID of the network you’re attached to:
     Serial.print(“SSID: “);
     Serial.println(WiFi.SSID());
    
    // print your WiFi shield’s IP address:
     IPAddress ip = WiFi.localIP();
     Serial.print(“IP Address: “);
     Serial.println(ip);
    
    // print the received signal strength:
     long rssi = WiFi.RSSI();
     Serial.print(“signal strength (RSSI):”);
     Serial.print(rssi);
     Serial.println(” dBm”);
     }

     

  • QBoat Sunny:
    透過 QIoT Suite Lite 內建的Node-red,能在瀏覽器上設定的GUI。最後 HTTP Request 就能以 0.5、1 分鐘的間隔頻率,分別讀取 DHT11 上的溫度和濕度!

 

更詳細的教學示範可參考以下影片:

Related posts

發表迴響