2023年7月8日 星期六

ESP32 I2C Bus Scanner – BMP180 section

Fundamental:

II2C communication protocol uses two wires to share information. One is used for the clock signal (SCL) and the other is used to send and receive data (SDA). The ESP32 supports I2C communication through its two I2C bus interfaces that can serve as I2C master or slave, depending on the user’s configuration.  Accordingly to the ESP32 datasheet, the I2C interfaces of the ESP32 supports:

1. Standard mode (100 Kbit/s) 
2. Fast mode (400 Kbit/s) 
3. Up to 5 MHz, yet constrained by SDA pull-up strength 
4. 7-bit/10-bit addressing mode 
5. Dual addressing mode. Users can program command registers to control I²C interfaces, so      that they have more flexibility

BMP180 general description 

The BMP180 is the function compatible successor of the BMP085, a new generation of high precision digital pressure sensors for consumer applications. The ultra-low power, low voltage electronics of the BMP180 is optimized for use in mobile phones, PDAs, GPS navigation devices and outdoor equipment. With a low altitude noise of merely 0.25m at fast conversion time, 
the BMP180 offers superior performance. The I2C interface allows for easy system integration with a microcontroller. The BMP180 is based on piezo-resistive technology for EMC robustness, high accuracy and linearity as well as long term stability. Robert Bosch is the world market leader for pressure sensors in automotive applications. Based on the experience of over 400 million pressure sensors in the field, the BMP180 continues a new generation of micro-machined pressure sensors.

Purpose:

We’ll take a look at the I2C communication protocol with the ESP32 using Arduino IDE 2. This very simple sketch scans the I2C-bus for devices. If a device is found, it is reported to the Arduino serial monitor and to driver bmp180 of I2C Bus for some information.

Circuit:

ESP32 Code Introduce:
#include <Wire.h>
#include <Adafruit_BMP085.h>
//--------- Flag structure --------------------------------------
typedef struct _vFlag
{
  uint8_t BTFlag = 0;
  uint8_t DC_Flag = 0;
  uint8_t CANFlag = 0;
  uint8_t I2C_Flag = 0;
  uint8_t BMP180Flag = 0;
  uint8_t JSONFlag = 0;
  uint8_t Radar_L_Flag = 0;
  uint8_t Radar_R_Flag = 0;
  uint8_t sensor_Flag = 0;
  uint8_t sensor1_Flag = 0;
  uint8_t initial_Flag = 0;
  uint8_t Tone_Flag = -1;
  uint8_t IR_RECV_Flag=0;
  uint8_t IR_SEND_Flag=0;
  uint8_t FunctionFlag = 3;
  uint8_t SendFlag = 0;
  uint8_t BMPCnt = 0;
} vFlag;
vFlag *flag_Ptr;
vFlag flag;

//-----   BMP085  ------------------
Adafruit_BMP085 bmp;

//----------uart--------------
#define LINE_BUFFER_LENGTH 64
//--------- uart structure --------------------------------------
typedef struct _vUart
{
  char c;
  int lineIndex = 0;
  int line1Index = 0;
  int BTlineIndex = 0;
  bool lineIsComment;
  bool lineSemiColon;
  //char *line;
  char line[128];
  //char line1[128];
  char BTline[20];
  //char R_line[20];
  //char L_line[20];
  String inputString;
  String BTinputString;
  String S1inputString;
  int V[16];
  char ctemp[30];
  char I2C_Data[80];
  int DC_Spped = 50;
  float Voltage[16];
  int Buffer[128];
  int StartCnt = 0;
  int ReadCnt = 0;
  int sensorValue = 0;
} vUart;
vUart *Uart_Ptr;
vUart Uart;

//-------------------------------------------------
void setup()
{
  Serial.begin(9600);
  Serial.println(F("init"));

  Wire.begin(); //--i2c scanner
  //-------bmp180----------------------
  if (!bmp.begin())
  {
     Serial.println(F("Could not find a valid BMP085 sensor, check wiring!"));
     //while (1);
  }
  else{
    Serial.println(F("find a valid BMP085 sensor"));
  }

}
//-----------------------------------------
void loop()
{
  Serial.print(F("Main at core:"));
  Serial.println(xPortGetCoreID());
  while(1)
  {
    while (Serial.available() > 0)
    {
      Uart.c = Serial.read();

      if ((Uart.c == '\n') || (Uart.c == '\r'))
      { // End of line reached
        if (Uart.lineIndex > 0)
        { // Line is complete. Then execute!
          Uart.line[Uart.lineIndex] = '\0'; // Terminate string
          //Serial.println( F("Debug") );
          //Serial.println( Uart.inputString );
          processCommand(Uart.line); // do something with the command
          //傳輸給藍芽
         
          Uart.lineIndex = 0;
          Uart.inputString = "";
        }
        else
        {
          // Empty or comment line. Skip block.
        }
        Uart.lineIsComment = false;
        Uart.lineSemiColon = false;
        Serial.println(F("ok>"));
      }
      else
      {
        //Serial.println( c );
        if ((Uart.lineIsComment) || (Uart.lineSemiColon))
        {
          if (Uart.c == ')')
            Uart.lineIsComment = false; // End of comment. Resume line.
        }
        else
        {
          if (Uart.c == '/')
          { // Block delete not supported. Ignore character.
          }
          else if (Uart.c == '~')
          { // Enable comments flag and ignore all characters until ')' or EOL.
            Uart.lineIsComment = true;
          }
          else if (Uart.c == ';')
          {
            Uart.lineSemiColon = true;
          }
          else if (Uart.lineIndex >= LINE_BUFFER_LENGTH - 1)
          {
            Serial.println("ERROR - lineBuffer overflow");
            Uart.lineIsComment = false;
            Uart.lineSemiColon = false;
          }
          else if (Uart.c >= 'a' && Uart.c <= 'z')
          { // Upcase lowercase
            Uart.line[Uart.lineIndex] = Uart.c - 'a' + 'A';
            Uart.lineIndex = Uart.lineIndex + 1;
            Uart.inputString += (char)(Uart.c - 'a' + 'A');
          }
          else
          {
            Uart.line[Uart.lineIndex] = Uart.c;
            Uart.lineIndex = Uart.lineIndex + 1;
            Uart.inputString += Uart.c;
          }
        }
      }
    } //while (Serial.available() > 0)
    if(flag.I2C_Flag == 1)
    {
      vI2C_0_Task();
    }
    if(flag.BMP180Flag == 1)
    {
      vBMPTask();
    }

  }
}
//----------------------------------------
void processCommand(char *data)
{
  int len, xlen, ylen, zlen, alen;
  int tempDIO;
  String stemp;

  len = Uart.inputString.length();
  //---------------------------------------
  if (strstr(data, "VER") != NULL)
  {
    Serial.println(F("ESP32_20230626"));
  }
 

  //-------------- I2C --------------------
  if (strstr(data, "I2C_SCAN") != NULL)
  {
    flag.I2C_Flag = 1;
    Serial.println(F("I2C_SCAN"));

  }

  if (strstr(data, "I2C_SCAN_OFF")!= NULL)
  {
    flag.I2C_Flag = 0;
    Serial.println(F("I2C_SCAN_OFF"));
  }
  //
  if (strstr(data, "BMP180_ON")!= NULL)
  {
    flag.BMP180Flag = 1;
    flag.BMPCnt = 0;
    Serial.println(F("BMP180_ON"));
  }
  if (strstr(data, "BMP180_OFF")!= NULL)
  {
    flag.BMP180Flag = 0;
    Serial.println(F("BMP180_OFF"));
  }
}
//-----------------------------------------
void vI2C_0_Task()
{
  byte count = 0;

  Serial.println(F("I2C scanner. Scanning ..."));
  for (byte i = 1; i < 127; i++) //---scan address
  {
    Wire.beginTransmission(i);
    if (Wire.endTransmission() == 0)
    {
      Serial.print("Found_address:" + String(count + 1) + "_");
      Serial.print(i, DEC);
      Serial.print("_(0x");
      Serial.print(i, HEX);
      Serial.println(F(")"));
      count++;
      delay(5);
    }
    else
    {
      continue;
    }
  }
  Serial.println(F("Done."));
  Serial.print(F("Found: "));
  Serial.print(count, DEC);
  Serial.println(F(" device(s)."));
  flag.I2C_Flag = 0;
}
//-------------------------------------------
void vBMPTask()
{
  Serial.print(F("Temperature = "));
  Serial.print(bmp.readTemperature());
  Serial.println(" *C");
  Serial.print(F("Pressure = "));
  Serial.print(bmp.readPressure());
  Serial.println(" Pa");
  Serial.print(F("Approx altitude = "));
  Serial.print(bmp.readAltitude(1013.25));
  Serial.println(" m");
  flag.BMP180Flag = 0;
}
YouTube :



沒有留言:

張貼留言