2019-01-05

Arduino 基礎篇 - 數位輸入輸出,按鈕亮燈

應用:
1. 讀取 A0 - A7 的 Analog Input 類比輸入參數值(指撥開關狀態 High 或 Low)。
2. 當讀取的 Analog Input 類比輸入參數值 低於 1/2 參考電壓,
    則設定輸出腳位為 "LOW" ,LED 燈滅
2. 當讀取的 Analog Input 類比輸入參數值 高於 1/2 參考電壓,
    則設定輸出腳位為 "HIGH" ,LED 燈亮


範例:按鈕亮燈 (指撥開關 On/Off 亮 LED 燈 )
(讀取 A0-A7 按鈕狀態,設定 LED0-LED7  亮或滅)
==================================================
// 定義 輸出 LED 腳位 號碼,由 D2-D13 腳位
int LEDPin[] = { 2, 3, 4, 5, 6, 7, 8, 9 ,10, 11, 12, 13};
// 定義 輸入 DIP SW 腳位 號碼,由 A0-A7 腳位
//int SensorPin[] = { 14, 15, 16, 17, 18, 19, 20, 21 };
int SensorPin[] = { A0, A1, A2, A3, A4, A5, A6, A7 };

int delayMs = 10;   // 設定延遲時間
int SensorValue;

void setup() {
    // put your setup code here, to run once:
    // 初始化設定
    for (int LoopCount = 0; LoopCount <= 7; LoopCount++) {
         pinMode(LEDPin[LoopCount], OUTPUT);    // 設定輸出腳位
         pinMode(SensorPin[LoopCount], INPUT);  // 設定輸入腳位
         // Nano A6/A7 需要設定為 Input Analog Mode
    } 
     Serial.begin(9600);
}

void loop() {

  // put your main code here, to run repeatedly:
  for (int LoopCount = 0; LoopCount <= 7; LoopCount++) {

      // For Arduino Uno A0-A5 Digital Input
      //SensorValue = digitalRead(SensorPin[LoopCount]);
   
      // read the value from the sensor: For Nano A0-A7 Analog Pin
      SensorValue = analogRead(SensorPin[LoopCount]);

      // 透過 Serial Monitor Port 顯示輸入腳位 狀態 或 類比數值
      Serial.print("SensorPin[");
      Serial.print(LoopCount);
      Serial.print("] = Pin");
      Serial.print(SensorPin[LoopCount]);
      Serial.print(" = ");
      Serial.print(SensorValue);
      Serial.print(" --> ");
   
      if ( SensorValue > 512 ) {
        // 當 Analog Input 類比輸入高於 1/2 電壓時,設定為 LOW Lever 輸出
        // 因為目前的實驗板 Analog Input 有加 Pull High 上拉電阻,
        // 所以 DIP SW 撥到 On 時,Analog Input 類比輸入為 低準位 LOW
        digitalWrite(LEDPin[LoopCount], LOW);
      }     
       else {
        // 否則,當 Analog Input 類比輸入低於 1/2 電壓時,設定為 HIGH Lever 輸出
        digitalWrite(LEDPin[LoopCount], HIGH);
      }   
   
      // 透過 Serial Monitor Port 顯示輸出腳位 狀態 或 類比數值
      Serial.print("LEDPin[");
      Serial.print(LoopCount);
      Serial.print("] = ");
      Serial.print(SensorValue);
      Serial.println(""); 
 
    delay(delayMs);   // 延遲一段 delayMs 設定的週期時間
 
  }   // for (int LoopCount = 0; LoopCount <= 7; LoopCount++) {

}

==================================================
(程式範例結束)
DIP SW 1,3,6,8 On; LED 1,3,6,8 亮 

DIP SW 1,2,4,8 On; LED 1,2,4,8 亮




Arduino 基礎篇 - 數位輸出,跑馬燈

Arduino 市面有幾款常常可以看到的版本,例如 Arduino UNO/Nano/MEGA2560...
相關產品的基本介紹,網路上有許多介紹,不妨上網搜尋一下~
至於使用那一個 Arduino 版本來學習,參考如下:

Arduino UNO - 網上範例最多,大部分範例均運用 Arduino Uno 為主
=========================================================
Digital I/O 數位輸入/輸出端共 14Pin( 0~13)(其中包含 6 組 PWM 端子)
Analog I/O 類比輸入/輸出端共  6Pin (A0~A5)。
支援 AREF 端子。
通信 UART Tx/Rx 端子
支援 USB 轉 TTL Tx/Rx 端子

Arduino Nano - 體積小,比 UNO 多了 A6/A7 Analog I/O 類比輸入端子
=========================================================
Digital I/O 數位輸入/輸出端共 14Pin( 0~13)(其中包含 6 組 PWM 端子)
Analog I/O 類比輸入/輸出端共  8Pin (A0~A7)。
支援 AREF 端子。
通信 UART Tx/Rx 端子
支援 USB 轉 TTL Tx/Rx 端子

Arduino MEGA2560 - 4 組 UART 通信接口,比其他版本多了 許多 I/O 端口
=========================================================
Digital I/O 數位輸入/輸出端共 54Pin(其中包含 15 組 PWM 端子)
Analog I/O 類比輸入/輸出端共  16Pin (A0~A15)
支援 AREF 端子。
通信 UART Tx/Rx 端子 4 組
支援 USB 轉 TTL Tx/Rx 端子

所以一般運用,個人比較建議使用 Arduino Nano,因為 體積小;
又有比較多的 I/O 端子可以運用,例如 :8 Input / 12 Output 的運用。

詳細 Arduino 硬體規格運用再請上網搜尋。
~~~~~~~~~~~~~~~~~~~~

如何控制 Arduino 來做運用,就需要下載/安裝 Arduino IDE 開發程式 (參考 https://www.arduino.cc/en/Main/Software) 及程式撰寫。

Arduino 程式架構可以分為二大類:
一。為 void setup ();宣告 Arduino 的初始化設定
二。為 void loop ();撰寫  Arduino 主程式開始的迴圈

一。為 void setup (),Arduino 的初始化設定,例如 :
1. Arduino 硬體狀態設定:
    pinMode (腳位代號, 輸出或輸入模式);    // 腳位設定為輸出腳或輸入腳
2. Arduino 的程式初始化設定:(設定程式一開始的狀態)
    digitalWrite (腳位代號, 輸出準位狀態設定);


二。為 void loop (),主程式開始的迴圈,例如:

    digitalWrite (腳位代號, HIGH);// 輸出狀態
    delay (10); // Delay 的延遲單位時間為 ms
// 所以 delay (10); 代表延遲 10ms
    digitalWrite (腳位代號, LOW);
    delay (20); // Delay 的延遲單位時間為 ms
// 所以 delay (20); 代表延遲 20ms

int PinNumber; 宣告 PinNumber 變數為

    for (int PinNumber = 2; PinNumber <= 9; PinNumber++)
    // PinNumber 代表 腳位代號;腳位由 第 2 腳開始到第 9 腳;
 
.......................


範例:LED 跑馬燈 (控制 D2 - D13 LED 亮或滅)
=======================================
// 定義 輸出 LED 腳位 號碼,由 D2-D13 腳位
int LEDPin[] = { 2, 3, 4, 5, 6, 7, 8, 9 ,10, 11, 12, 13};
/*
 * 詳細上列定義 LEDPin 陣列內容:
 * LEDPin[0] = 2; 第 D2 腳位
 * LEDPin[1] = 3; 第 D3 腳位
 * LEDPin[2] = 4; 第 D4 腳位
 * LEDPin[3] = 5; 第 D5 腳位
 * LEDPin[4] = 6; 第 D6 腳位
 * LEDPin[5] = 7; 第 D7 腳位
 * LEDPin[6] = 8; 第 D8 腳位
 * LEDPin[7] = 9; 第 D9 腳位
 */
int delayMs = 50;   // 設定延遲時間
int LED_Status = 1; // 設定 LED 亮燈方向。亮燈方向累加 = 1;亮燈方向累減 = 0
int LED_OnNumber = 0; // 設定亮燈的號碼,由 0 ~ 7。

void setup() {
  // put your setup code here, to run once:
    for (int LoopCount = 0; LoopCount <= 11; LoopCount++) {
         pinMode(LEDPin[LoopCount], OUTPUT);  // 設定 LEDPin[] 腳位為 輸出腳位
    }
    Serial.begin(9600);   // 設定 Serial Port 鮑率 (Baudrate) = 9600
}

void loop() {

  // put your main code here, to run repeatedly:
  for (int LoopCount = 0; LoopCount <= 11; LoopCount++) {
    digitalWrite(LEDPin[LoopCount], LoopCount == LED_OnNumber ? HIGH : LOW); 
  }

  if (LED_Status == 1 )   // 設定 LED 亮燈方向。亮燈方向累加 = 1
    LED_OnNumber++; 
  else if (LED_Status == 0 )    // 設定 LED 亮燈方向。亮燈方向累減 = 0
    LED_OnNumber--;   

  if (LED_OnNumber == 11)   // 亮燈號碼到最末號碼,則設定 LED 亮燈方向。亮燈方向累減 = 0
    LED_Status = 0;
  else if (LED_OnNumber == 0)   // 亮燈號碼到最初號碼,設定 LED 亮燈方向。亮燈方向累加 = 1
    LED_Status = 1;
 
  // 透過 Serial Monitor 將目前狀態傳送出來顯示
  Serial.print("LED_Status = ");
  Serial.print(LED_Status);
  Serial.print(", LED_OnNumber = ");
  Serial.print(LED_OnNumber);
  Serial.println("");
 
  delay(delayMs);   // 延遲一段 delayMs 設定的週期時間
 
}

=======================================
(程式範例結束)











2018-02-04

Messaging API 應用,雲端數據即時傳遞

Messaging API 應用 : 雲端數據即時傳遞
=================================
    日前完成 Arduino 雲端無線環境觀測站,基本架構就是將 感應 Sensor 數據信號透過無線 2.4G Wireless 模組傳遞到 2.4G Wireless 基地台;2.4G Wireless 基地台接收到 Sensor 數據,再將數據透過 W5100 Ethernet 模組轉存到本地資料庫 Local Database 或 雲端資料庫 Cloud Database,這些數據收集後的結果,都需要 “被動的” 透過 網路瀏覽器 Internet browser 或 手機 APP 瀏覽數據收集的結果。 (如下圖)



    上述 “被動的” 瀏覽查看數據的結果,感覺上總是覺得美中不足缺少了什麼?沒錯,就是缺少了 “主動通知” 的機制。於是,如何在現有的被動機制下,發展出主動的機制呢。。。接下來就是本篇的說明。

    有一天老闆突然要我們由南部出發,要去北部出差。接下來我們的行動是什麼呢?
1. 趕緊拿起書本與榔頭,開始準備 打造交通工具
2. 上網規劃行程與訂購車票?
3. ???

找對方法是很重要的~

    當然,有很多種方法可以達到老闆的要求目的與目標,在現今科技進步資訊爆炸的年代,我們怎麼站在巨人的肩膀上看世界。執行方法與對策有很多種,如何找到 “合適” 的方法就格外重要了。接下來介紹使用 IFTTT 的一種應用範例。

    什麼是 IFTTT,IFTTT 是一個新生的網絡服務平台,通過其他不同平台的條件來決定是否執行下一條命令。即對網絡服務通過其他網絡服務作出反應。 雲端應用 IFTTT 能達到整合應用的效果!所謂的 IFTTT 指的是「If This Then That」,意指你可以定義一個 Recipe(食譜),其中包含了 Trigger(觸發條件) Action(執行動作),當 Trigger 的條件成立時會執行 Action 的動作。




    運用前端的 感應 Sensor 上傳量測後的數據到 Cloud Database ThingSpeak 上, 在 ThingSpeak  WebHTTP 設定觸發條件。例如當 溫度低於設定值;或是煙霧 / 一氧化碳等感應器的量測數值高於設定值,ThingSpeak  WebHTTP 觸發條件成立後,將觸發內容傳送到 IFTTT 的 WebHooks 應用介面上,IFTTT 收到(觸發信號)後,經過應用程式處理後,轉發到 IFTTT Webhooks 設定的 (執行動作)上。例如:執行動作為,將信息內容轉發到 Line Notify 上,即如下列範例照片,在 Line Notify 上收到 感應 Sensor 的即時數據內容。透過上述的動作,完成異常訊息立即傳遞的機制了。

硬體架構與應用軟體的整合 


    所以,我們應用 IFTTT 的 WebHooks 功能。IFTTT 的詳細操作設定就不在這裡贅述,網路上有非常多且詳細的操作設定介紹。這裡在說明有什麼工具可以快速的完成我們的需求,我們就不需要大費周章的 “敲磚蓋樓” ,直接找到合適的應用來整合,這就是所謂的 “站在巨人的肩膀上看世界” 的道理~

IFTTT 的 Webhooks




ThingSpeak WebHTTP ( 觸發設定 )





IFTTT 的 Webhooks 設定





IFTTT 的 Webhooks 最終的 Action:將信息傳送到 Line Notify 上

 or 







2017-12-01

Arduino 雲端無線環境觀測站

Arduino 雲端無線環境觀測站
=======================
近日常常聽到  AI 人工智慧(Artificial Intelligence)vs. Cloud Database 雲端資料庫 vs. IOT ( Internet of Things ) 物聯網  的新聞與應用。
想想,好像還不錯耶~,弄個最近比較夯的應用試試。。。


雲端環境觀測站( Cloud  + IOT ):
Arduino + 2.4G Wireless Sensor + Arduino Ethernet Shield W5100 乙太網路擴充板 + NAS + Database Server + ThingSpeak(IOT)+ Android APP... = 雲端無線環境觀測站 (溫濕度 / 大氣壓力 / 煙霧,瓦斯,CO 一氧化碳 Sensor 感應器)

雲端環境觀測站 架構圖:

Part I :
無線 Sensor 感應器發射模組(無線傳輸發射 Sensor 狀態)遠端收集數據,透過無線方式傳輸資料到 無線 Sensor 感應器接收模組(無線傳輸接收 Sensor 狀態),透過 無線接收模組 內的 W5100 Ethernet 網路模組將數據存儲於 Local 本地端 NAS 內的 Database Server 中處理分析,及將數據透過 Internet 傳輸到 Internet 網際網路 的 Cloud 雲端 ThingSpeak(IOT)資料庫材料分析;手機可以透過 Android 安卓 APP 連上  Internet 網際網路 的 Cloud 雲端 ThingSpeak(IOT)資料庫做顯示分析。


應用實物照片如下:

無線 Sensor 感應器發射模組(無線傳輸發射 Sensor 狀態):


無線 Sensor 感應器發射模組(模組穿上衣服的狀態):



無線 Sensor 感應器接收模組(無線傳輸接收 Sensor 狀態):
 

顯示 Sensor 狀態:溫濕度


顯示 Sensor 狀態:煙霧,瓦斯,非可燃 CO 一氧化碳,可燃 CO 一氧化碳


顯示 Sensor 狀態:大氣壓力 (絕對壓力 / 相對壓力 )/ 海拔高度 / 溫度



運用 Arduino Ethernet Shield W5100 乙太網路擴充板 直接連結 Database Server
(以往論壇都是運用 W5100 連結 Web Server,透過 Web Server 的 PHP 語法再轉拋數據到資料庫。本次直接跨域 Web Server + PHP 直接連結 DataBase Server )



參考資料:http://www.arduinolibraries.info/libraries/my-sql-connector-arduino

/*
  MySQL Connector/Arduino Example : connect by hostname

*/

#include <Ethernet.h>
#include <MySQL_Connection.h>
#include <MySQL_Cursor.h>

byte mac_addr[] = { 0x12, 0x34, 0x56, 0x78, 0x9A, 0xBC };


// IP of the MySQL *server* here 資料庫 Server 位址

IPAddress server_addr(192,168,1,123);  
char user[] = "root";              // MySQL user login username 使用者名稱
char password[] = "123456";        // MySQL user login password 使用者密碼

// ****** Sample query ******

// char INSERT_SQL[] = "INSERT INTO 資料庫名稱.資料表名稱 (message) VALUES ('Hello, Arduino!')";
char INSERT_SQL[] = "INSERT INTO test_arduino.hello_arduino (message) VALUES ('Hello, Arduino!')";

EthernetClient client;

MySQL_Connection conn((Client *)&client);

void setup() {

  Serial.begin(115200);
  while (!Serial); // wait for serial port to connect
  Ethernet.begin(mac_addr);
  Serial.println("Connecting...");
  // conn.connect(資料庫位址, 資料庫 Port Number, 使用者名稱, 使用者密碼)
  if (conn.connect(server_addr, 3306, user, password)) {
    delay(1000);
  }
  else
    Serial.println("Connection failed.");
}


上傳 Cloud 雲端 ThingSpeak 資料庫:




NAS:Network Attached Storage(網路連接儲存設備)- DS111


顯示 Local Database Server 本地資料庫 狀態:




Cloud 雲端 ThingSpeak(IOT):Night Eagle's Weather Station ( 雲端無線環境觀測站 )

ThingSpeak:溫濕度狀態


ThingSpeak:煙霧,瓦斯,非可燃 CO 一氧化碳,可燃 CO 一氧化碳 狀態


ThingSpeak:大氣壓力 (絕對壓力 / 相對壓力 )






Part II:
上述 Database 資料庫再加上 PHP + Web Server 做 Local 本地資料分析;再加上 Messenger API 將及時訊息傳遞到社群軟體中(Line / FB / twitter... )......續待 

希望透過上述無線數據的接收與轉發,再透過 Ethernet & Internet 將資料儲存於資料庫後,做最終資料庫數據的分析與應用,以達到 IOT ( Internet of Things ) 物聯網  的思維應用。

目前一般工廠的應用狀況大概是,熟悉生產設備的熟悉生產設備;熟悉 IT 數據程式應用的熟悉 IT 領域;最大的問題應該是在,如何讓生產設備的數據轉化成 IT 可以處理的數據,接下來的就是如何運用這些數據,提供更具價值的 Action Plan。。。



< 上一篇