2016年10月2日 星期日

使用Arduino 掃描I2C裝置的位址

#Arduino #Arduino UNO #Arduino MEGA2560 #Arduino DUE #I2C #IIC #I2C LCD #1602 LCD #LCD

這裏我先用一張圖來解釋Arduino 專案的發展需要的工具
我們常常到購物網買一些Arduino的sensor。。。由於Sensor 百花齊放,做的人沒有提供資料,賣的人也不清楚,技術資料轉來轉去,大家一片混亂,拿I2C界面LCD來講,明明範例的位置是0x27,但是我們照着寫就是動不了,差半天才知道LCD模組的位置不同,現在我就提供大家一個方法I2C address Scan 程式有了它就不用再傷腦了。

完整的程式碼如下:

// I2C Scanner
// Written by Nick Gammon http://gammon.com.au/i2c
// Date: 20th April 2011
// 2016-09-30
//中文註解李進衛
//IIC 位址掃描程式
//適用於Arduino UNO,DUE,MEGA2560
// 技術參考網址 http://playground.arduino.cc/Main/I2cScanner
// 作者網址(他有詳細說明I2C通信格式與原理) : http://gammon.com.au/i2c

#include

void setup() {
  Serial.begin (115200);

  // Leonardo: wait for serial port to connect
  while (!Serial)
    {
    }

  Serial.println ();
  Serial.println ("I2C scanner. Scanning ...");
  byte count = 0;
 
  Wire.begin();
  for (byte i = 8; i < 120; i++) //地址掃描
  {
    Wire.beginTransmission (i); //對裝置發出I2C位址函數解釋請參考: https://www.arduino.cc/en/Reference/WireBeginTransmission
    if (Wire.endTransmission () == 0) //假如裝置有ACK 就顯示其位址資訊藉由RS232傳送出來
// 函數解釋請參考: https://www.arduino.cc/en/Reference/WireEndTransmission
      {
      Serial.print ("Found address: ");
      Serial.print (i, DEC);
      Serial.print (" (0x");
      Serial.print (i, HEX);
      Serial.println (")");
      count++;
      delay (1);  // maybe unneeded?
      } // end of good response
  } // end of for loop
  Serial.println ("Done.");
  Serial.print ("Found ");
  Serial.print (count, DEC);
  Serial.println (" device(s).");
}  // end of setup

void loop() {}


WEMOS D1 MINI ESP8266 製作 NTP + 網路斷線自動重置裝置

我的同事建議我將 NTP 加上網路斷線偵測可以重新reset的功能