> For the complete documentation index, see [llms.txt](https://docs.aic-eec.com/llms.txt). Markdown versions of documentation pages are available by appending `.md` to page URLs; this page is available as [Markdown](https://docs.aic-eec.com/embedded-systems/resources/basic-hardware-and-firmware/interfacing-and-communication/lab-i2c-protocol.md).

# LAB: I2C Protocol

## จุดประสงค์

1. เพื่อศึกษาการอ่านค่าข้อมูล sensor ที่ส่งข้อมูลผ่านสาย I2C
2. เพื่อศึกษาการส่งข้อมูลระหว่าง Microcontroller ไปยัง Microcontroller โดยทั้งสองใช้การสื่อสารกันผ่าน I2C interface

## LAB1: Basic I2C Communication

&#x20;   การทดลองนี้เป็นการเขียนโปรแกรมลงบอร์ด M5Stack ให้ค้นหา Address I2C ของ sensor ที่เชื่อมต่อกับบอร์ด M5Stack&#x20;

### อุปกรณ์ทดลอง

<table><thead><tr><th width="374">Components</th><th>Quantity</th></tr></thead><tbody><tr><td><a href="https://docs.m5stack.com/#/en/app/demo-board">M5Stack Demo Board</a></td><td>1</td></tr><tr><td><a href="http://www.qdkingst.com/en">Logic Analyzer (รุ่น LA1016 or LA2016) </a></td><td>1</td></tr></tbody></table>

![อุปกรณ์การทดลอง](/files/a5NBwjD9GhwUUq0LSjgj)

### โปรแกรม

1. Arduino IDE
2. โปรแกรม KingstVIS

### ตั้งค่าโปรแกรม KingstVIS&#x20;

* เชื่อมต่อ logic Analyzer กับ คอมพิวเตอร์&#x20;
* เปิดโปรแกรม Kingst VIS&#x20;
* ไปที่ Analyzers >> คลิ๊ก icon add(+) >> เลือก I2C&#x20;

![เลือกประเภท protocol ที่ต้องการวิเคราะห์](/files/-MI37KOB41mUkhwzsGLP)

* ไปที่ Analyzers >> คลิ๊ก icon setting >> Edit  ตั้งค่าตามรูปด้านล่าง >> OK

![ตั้งค่า channel สำหรับวิเคราะห์ การส่งข้อมูลของ I2C โปรโตคอล  ](/files/-MIYd12XgBHjwvBxJq7d)

* ไปที่ Analyzers อีกครั้ง >> คลิ๊ก icon setting >> Display Format >>  Dec เพื่อให้  decoder เป็นข้อมูลชุดตัว แบบเลขฐาน 10 (DEC)

![ตั้งค่า Display Format ](/files/-MIYfWGOfi7C0NhexQVy)

* ไปที่ Channel 0  เลือกกด Indicates "rising edge trigger"

![ตั้งค่า Trigger Indicates "rising edge trigger"](/files/-MIYgB6tHst-TXbrwy0w)

### PIN Connect

การต่อวงจร: บอร์ด M5Stack ต่อกับ เซนเซอร์ [DHT12 ](https://pdf1.alldatasheet.com/datasheet-pdf/view/1222805/ETC1/DHT12.html)และ [BMP280](https://m5stack.oss-cn-shenzhen.aliyuncs.com/resource/docs/datasheet/hat/BMP280-DS001-11_en.pdf)

<table><thead><tr><th width="149" align="center">M5Stack</th><th align="center">Sensor BMP280</th><th align="center">Sensor DHT12</th></tr></thead><tbody><tr><td align="center">I2C (21D)</td><td align="center">SDA</td><td align="center">SDA</td></tr><tr><td align="center">I2C (22C)</td><td align="center">SCL</td><td align="center">SCL</td></tr><tr><td align="center">GND</td><td align="center">GND</td><td align="center">GND</td></tr></tbody></table>

ตัวอย่างวงจร

![การเชื่อมต่อวงจรเซนเซอร์ DHT12 และ BH280 กับบอร์ด M5Stack ](/files/-MIbT2VHlAtx1wimw2LD)

### **Code**&#x20;

M5Stack scan I2C address

```arduino
// Code I2C scanner
#include <Wire.h>

void setup() {
  Wire.begin();

  Serial.begin(115200);
  while (!Serial); // Leonardo: wait for serial monitor
  Serial.println("\nI2C Scanner");
}

void loop() {
  int nDevices = 0;

  Serial.println("Scanning...");

  for (byte address = 1; address < 127; ++address) {
    // The i2c_scanner uses the return value of
    // the Write.endTransmisstion to see if
    // a device did acknowledge to the address.
    Wire.beginTransmission(address);
    byte error = Wire.endTransmission();

    if (error == 0) {
      Serial.print("I2C device found at address 0x");
      if (address < 16) {
        Serial.print("0");
      }
      Serial.print(address, HEX);
      Serial.println("  !");

      ++nDevices;
    } else if (error == 4) {
      Serial.print("Unknown error at address 0x");
      if (address < 16) {
        Serial.print("0");
      }
      Serial.println(address, HEX);
    }
  }
  if (nDevices == 0) {
    Serial.println("No I2C devices found\n");
  } else {
    Serial.println("done\n");
  }
  delay(5000); // Wait 5 seconds for next scan
}
```

* การเขียนโปรแกรม scan หา Address ของเซนเซอร์นั้นใช้เพื่อทดสอบว่าเซนเซอร์ที่เชื่อมต่อนั้นอยู่ในเครือข่าย I2C ของบอร์ด Microcontroller  แล้ว
* เราสามารถหาค่า address ของเซนเซอร์ได้จาก datasheet ของเซนเซอร์ หรือ จาก code การทดลองนี้ ถ้าต้องการหาค่า I2C address ของ เซนเซอร์ตัวใดให้เชื่อมต่อเพียงเซนเซอร์ที่ต้องการหาและถอดวงจรเซนเซอร์ที่ไม่ต้องการออก

### บันทึกผลการทดลอง

1. หา I2C Address  ของทั้งสอง sensor และ I2C Address ของ M5Stack แล้วเติมลงในตารางด้านล่าง

|            Devices            | I2C Address |
| :---------------------------: | :---------: |
|  AIR PRESSURE Sensor (BMP280) |    .....    |
| Temp, Humidity Sensor (DHT12) |    .....    |
|            M5Stack            |    .....    |

2\. บันทึกภาพวงจรการทดลองและภาพผลที่แสดงบน Serial monitor ผลการ Scan หาค่า I2C Address ของเซนเซอร์

3\. อธิบายว่าเพราะอะไรเราต้องรู้ค่า I2C Address ของอุปกรณ์ เมื่อเราต้องการใช้งานโปรโตคอล I2C

## LAB2: M5Stack อ่านค่า DHT12 Sensor &#x20;

&#x20;    ทดลองให้ M5Stack อ่านค่า DHT12 Sensor การทดลองนี้เป็นการเขียนโปรแกรมลงบอร์ด M5Stack ให้อ่านค่า DHT12 sensor และใช้ logic analyzer แสดงค่า sensor เมื่อ M5Stack ส่งคำสั่งอ่านค่า DHT12 sensor

### อุปกรณ์ทดลอง

<table><thead><tr><th width="374">Components</th><th>Quantity</th></tr></thead><tbody><tr><td><a href="https://docs.m5stack.com/#/en/app/demo-board">M5Stack Demo Board</a></td><td>1</td></tr><tr><td><a href="http://www.qdkingst.com/en">Logic Analyzer (รุ่น LA1016 or LA2016) </a></td><td>1</td></tr></tbody></table>

![อุปกรณ์การทดลอง](/files/a5NBwjD9GhwUUq0LSjgj)

### โปรแกรม

1. Arduino IDE
2. โปรแกรม KingstVIS

### ตั้งค่าโปรแกรม KingstVIS&#x20;

*"ใช้แบบเดิม"*

### PIN Connect

การต่อวงจร: บอร์ด M5Stack ต่อกับเซนเซอร์ DHT12 และ Logic analyzer

|  M5Stack  | Sensor DHT12 | Logic Analyzer |
| :-------: | :----------: | :------------: |
| I2C (21D) |      SDA     |    Channel 0   |
| I2C (22C) |      SCL     |    Channel 1   |
|    GND    |      GND     |       GND      |

![การเชื่อมต่อ DHT12 Sensor และ Logic analyzer กับบอร์ด M5Stack](/files/-MIbI9ulp-eIQFxhqCS8)

{% hint style="danger" %}
ติดตั้งไลบรารี่ DHT12 สำหรับเขียนโปรแกรม Arduino IDE อ่านค่า DHT12 sensor&#x20;

* เปิดโปรแกรม Arduino IDE&#x20;
* ไปที่ Sketch >> Include Library >>Manage Libraries...
* พิมพ์ ค้นหา DHT12 >> เลือก DHT12 sensor library >> Install
* หลังจากติดตั้งเรียบร้อยให้ปิดโปรแกรมแล้วเปิดใหม่&#x20;
  {% endhint %}

สร้างไฟล์แล้วเขียนโปรแกรมตาม code ด้านล่าง แล้ว upload code ลง M5Stack&#x20;

### Code

M5Stack read data DHT12 Sensor

```arduino
//#include <M5Stack.h>
#include "DHT12.h"
#include <Wire.h> //The DHT12 uses I2C comunication.

DHT12 dht12; //Preset scale CELSIUS and ID 0x5c.

void setup() {
//    M5.begin();
  Serial.begin(115200);
  Wire.begin();
//    M5.Lcd.setCursor(80, 0, 4);
//    M5.Lcd.print("TEMPERATURE");
 
}

void loop() {
 
    float tmp = dht12.readTemperature();
    float hum = dht12.readHumidity();
//    M5.Lcd.setCursor(30, 100, 4); //display via moniter
//    M5.Lcd.printf("Temp: %2.1f  Humi: %2.0f%%", tmp, hum); //display via moniter
    Serial.printf("Temp: %2.1f  Humi: %2.0f%% \n", tmp, hum); //display via serial monitor
    delay(100);
}
```

### บันทึกผลการทดลอง

1. บันทึกผลการทดลองที่ Logic analyzer แสดง เทียบกับ Serial monitor และอธิบายว่าข้อมูลที่ได้เป็นอย่างไร

## LAB3: MCU to MCU communication

&#x20;      การทดลองนี้เป็นการเขียนโปรแกรมลงบอร์ด M5Stack ให้ทำหน้าที่เป็น Master อ่านข้อความจาก Arduino UNO ที่ทำหน้าที่เป็น Slave ผ่าน I2C bus

### อุปกรณ์ทดลอง

<table><thead><tr><th width="374">Components</th><th>Quantity</th></tr></thead><tbody><tr><td><a href="https://docs.m5stack.com/#/en/app/demo-board">M5Stack Demo Board</a></td><td>1</td></tr><tr><td><a href="http://www.qdkingst.com/en">Logic Analyzer (รุ่น LA1016 or LA2016) </a></td><td>1</td></tr><tr><td>Arduino UNO</td><td>1</td></tr></tbody></table>

![อุปกรณ์การทดลอง](/files/-MI7ykoGlh7U3utnXOB7)

### ตั้งค่าโปรแกรม KingstVIS&#x20;

* เชื่อมต่อ logic Analyzer กับ คอมพิวเตอร์&#x20;
* เปิดโปรแกรม Kingst VIS&#x20;
* ไปที่ Analyzers >> คลิ๊ก icon add(+) >> เลือก I2C&#x20;

![เลือกประเภท protocol ที่ต้องการวิเคราะห์](/files/-MI37KOB41mUkhwzsGLP)

* ไปที่ Analyzers >> คลิ๊ก icon setting >> Edit  ตั้งค่าตามรูปด้านล่าง >> OK

![ตั้งค่า channel สำหรับวิเคราะห์ การส่งข้อมูลของ I2C โปรโตคอล  ](/files/-MIYd12XgBHjwvBxJq7d)

* ไปที่ Analyzers อีกครั้ง >> คลิ๊ก icon setting >> Display Format >>  ASCII เพื่อให้  decoded เป็นข้อมูลชุด แบบตัวอักษร (ASCII)

![ตั้งค่า Display Format](/files/-MIbxHjOeCZZikMNs99R)

* ไปที่ Channel 0  เลือกกด Indicates "rising edge trigger"

![ตั้งค่า Trigger Indicates "rising edge trigger"](/files/-MIYgB6tHst-TXbrwy0w)

### PIN Connect

การต่อวงจร: บอร์ด M5Stack ต่อกับบอร์ด Arduino UNO และ Logic Analyzer&#x20;

|    M5Stack    |  Arduino UNO  | Logic Analyzer |
| :-----------: | :-----------: | :------------: |
| SDA (pin 21D) | SDA  (pin A4) |    Channel 0   |
| SCL (pin 22C) | SCL ( pin A5) |    Channel 1   |
|      GND      |      GND      |       GND      |

ตัวอย่างวงจร

![การต่อวงจร I2C Pin ของบอร์ด Arduino UNO และ Logic Analyzer กับบอร์ด M5Stack ](/files/-MIbjhf9sPDWTSLVxJVt)

### Code: M5Stack is a master reader

```arduino
// Wire Master Reader

#include <Wire.h>
int i =0;
void setup() {
  Wire.begin();        // join i2c bus (address optional for master)
  Serial.begin(115200);  // start serial for output
}

void loop() {
  if(i==0){
  Wire.requestFrom(8, 6);    // request 6 bytes from slave device #8

  while (Wire.available()) { // slave may send less than requested
    char c = Wire.read(); // receive a byte as character
    Serial.print(c);   
  
    // print the character
 }
 i++;
  }

  delay(500);
}
```

### Code: Arduino UNO is a slave&#x20;

```arduino
// Wire Slave Sender

#include <Wire.h>

void setup() {
  Wire.begin(8);        // join i2c bus with address #8
  Wire.onRequest(requestEvent); // register event
}

void loop() {
  delay(100);
}

// function that executes whenever data is requested by master
// this function is registered as an event, see setup()
void requestEvent() {
  Wire.write("hello "); // respond with message of 6 bytes
  // as expected by master
   
}
```

### บันทึกผลการทดลอง

1. บันทึกผล Serial monitor แสดงข้อความที่บอร์ด M5Stack (Master) ได้รับ และข้อความบนโปรแกรม KingstVIS ของ logic analyzer
2. อธิบายผลการทดลองที่ logic analyzer แสดงเทียบกับ serial monitor ของ M5Stack ที่ทำหน้าที่เป็น master


---

# Agent Instructions
This documentation is published with GitBook. GitBook is the documentation platform designed so that both humans and AI agents can read, navigate, and reason over technical content effectively. Learn more at gitbook.com.

## Querying This Documentation
If you need additional information that is not directly available in this page, you can query the documentation dynamically by asking a question.

Perform an HTTP GET request on the current page URL with the `ask` query parameter, and the optional `goal` query parameter:

```
GET https://docs.aic-eec.com/embedded-systems/resources/basic-hardware-and-firmware/interfacing-and-communication/lab-i2c-protocol.md?ask=<question>&goal=<endgoal>
```

`ask` is the immediate question: it should be specific, self-contained, and written in natural language.
`goal` is optional and describes the broader end goal you are ultimately trying to accomplish on behalf of the user. GitBook uses it to tailor the answer towards what is most useful for that goal.

The response will contain a direct answer to the question and relevant excerpts and sources from the documentation.

Use this mechanism when the answer is not explicitly present in the current page, you need clarification or additional context, or you want to retrieve related documentation sections.
