Cara Memprogram Sensor Jarak Laser TOF10120 l Pada ESP32

Cara Memprogram Sensor Jarak Laser TOF10120 l Pada ESP32

Sensor jarak laser TOF10120 adalah sebuah modul sensor yang menggunakan teknologi Time of Flight (ToF) untuk mengukur jarak antara sensor dan objek di depannya dengan sangat akurat dan cepat.Berikut adalah code untuk memprogramnya :

#include <Arduino.h>

#include <Wire.h>

unsigned char ok_flag;
unsigned char fail_flag;
 
unsigned short lenth_val = 0;
unsigned char i2c_rx_buf[16];
unsigned char dirsend_flag = 0;


void SensorRead(unsigned char addr, unsigned char* datbuf, unsigned char cnt) {
  unsigned short result = 0;
  // step 1: instruct sensor to read echoes
  Wire.beginTransmission(82);  // transmit to device #82 (0x52)
  // the address specified in the datasheet is 164 (0xa4)
  // but i2c adressing uses the high 7 bits so it's 82
  Wire.write(byte(addr));  // sets distance data address (addr)
  Wire.endTransmission();  // stop transmitting
  // step 2: wait for readings to happen
  delay(1);  // datasheet suggests at least 30uS
  // step 3: request reading from sensor
  Wire.requestFrom(82, cnt);  // request cnt bytes from slave device #82 (0x52)
  // step 5: receive reading from sensor
  if (cnt <= Wire.available()) {  // if two bytes were received
    *datbuf++ = Wire.read();      // receive high byte (overwrites previous reading)
    *datbuf++ = Wire.read();      // receive low byte as lower 8 bits
  }
}
 
int ReadDistance() {
  SensorRead(0x00, i2c_rx_buf, 2);
  lenth_val = i2c_rx_buf[0];
  lenth_val = lenth_val << 8;
  lenth_val |= i2c_rx_buf[1];
  delay(300);
  return lenth_val;
}


void setup()
{
Serial.begin(9600);
 Wire.begin();
  Serial.begin(9600, SERIAL_8N1);

}
void loop(){
  int jarak_laser = ReadDistance();
  Serial.print(jarak_laser);
  Serial.println(" mm");


}

Berikut ini adalah penjelasan dari kode di atas :

1. Import Library

#include <Arduino.h>
#include <Wire.h>
  • Arduino.h: library dasar Arduino.
  • Wire.h: library untuk komunikasi I2C.

2. Variabel Global

unsigned char ok_flag;
unsigned char fail_flag;

unsigned short lenth_val = 0;
unsigned char i2c_rx_buf[16];
unsigned char dirsend_flag = 0;
  • Variabel untuk flag (tidak digunakan di kode ini secara eksplisit).
  • lenth_val: untuk menyimpan nilai jarak yang dibaca.
  • i2c_rx_buf: buffer untuk menyimpan data yang diterima dari sensor.
  • dirsend_flag: flag (tidak digunakan di kode ini).

3. Fungsi SensorRead

void SensorRead(unsigned char addr, unsigned char* datbuf, unsigned char cnt) {
  unsigned short result = 0;

  // Step 1: Kirim perintah ke sensor
  Wire.beginTransmission(82);  // Alamat I2C sensor (82 decimal = 0x52)
  Wire.write(byte(addr));      // Kirim alamat register yang ingin dibaca (biasanya 0x00 untuk jarak)
  Wire.endTransmission();      // Akhiri komunikasi pengiriman data
  
  // Step 2: Tunggu sejenak (sensor memproses data)
  delay(1);                   // Delay 1 ms (datasheet menyarankan minimal 30 µs)
  
  // Step 3: Minta data dari sensor
  Wire.requestFrom(82, cnt);  // Minta cnt byte dari device dengan alamat 0x52
  
  // Step 4: Terima data dari sensor
  if (cnt <= Wire.available()) {
    *datbuf++ = Wire.read();  // Baca byte pertama (high byte)
    *datbuf++ = Wire.read();  // Baca byte kedua (low byte)
  }
}
  • Fungsi ini bertugas mengirim perintah baca jarak ke sensor lewat I2C, lalu membaca hasilnya ke buffer datbuf.
  • addr biasanya alamat register untuk data jarak.
  • cnt adalah jumlah byte data yang ingin dibaca (di sini 2 byte).

4. Fungsi ReadDistance

int ReadDistance() {
  SensorRead(0x00, i2c_rx_buf, 2);  // Baca 2 byte dari register 0x00 sensor
  lenth_val = i2c_rx_buf[0];        // Ambil byte pertama (high byte)
  lenth_val = lenth_val << 8;       // Geser 8 bit ke kiri (jadi posisi high byte)
  lenth_val |= i2c_rx_buf[1];       // Gabungkan dengan byte kedua (low byte)
  delay(300);                       // Delay 300 ms (untuk pembacaan berikutnya)
  return lenth_val;                 // Kembalikan nilai jarak dalam mm
}
  • Fungsi ini memanggil SensorRead untuk membaca 2 byte data jarak.
  • Data yang diterima disusun menjadi angka 16-bit (short) dengan menggabungkan high byte dan low byte.
  • Mengembalikan nilai jarak dalam satuan milimeter.

5. Setup

void setup()
{
  Serial.begin(9600);
  Wire.begin();
  Serial.begin(9600, SERIAL_8N1);
}
  • Inisialisasi komunikasi serial pada baud rate 9600.
  • Memulai komunikasi I2C dengan Wire.begin().
  • (Panggilan Serial.begin(9600) dua kali, bisa dihapus salah satu, cukup satu saja sudah cukup.)

6. Loop Utama

void loop(){
  int jarak_laser = ReadDistance();  // Baca jarak dari sensor
  Serial.print(jarak_laser);
  Serial.println(" mm");              // Tampilkan jarak dalam mm ke serial monitor
}
  • Membaca jarak dari sensor secara berulang-ulang.
  • Menampilkan hasil pembacaan jarak dalam satuan milimeter ke Serial Monitor.

Kode ini membaca data jarak dari sensor I2C dengan alamat 0x52 (biasanya sensor jarak laser seperti TOF10120 atau sensor jarak lain yang kompatibel). Data jarak diambil dari register 0x00, berupa 2 byte, kemudian dikonversi jadi angka jarak dalam milimeter dan ditampilkan lewat Serial Monitor.

untuk diskusi bisa kontak dibawah ini :

Sosial media :

Apa itu ESP32?