Pendahuluan
Sensor TSL2561 berguna untuk mengukur level ambient light. Perhitungan dalam satuan lux dengan 16-bit resolution, dihubungkan melalui Inter-Integrated Circuit (I2C or IIC)
Salah satu contoh aplikasi dari sensor TSL2561, adalah untuk automatic keyboard illumination.
I2C adalah serial communication bus yang mendukung multiple devices dalam line yang sama. Device menggunakan 7-bit addressing. Diperlukan dua line untuk I2C interface: clock
(CLK) dan serial data (SDA).

Pada modul ini kita akan mengatur LED level berdasarkan ambient light-level data
dari TSL2561 module— Jika ambient light tinggi, kita atur rendah pada LED, dan sebaliknya.
Component
- TSL2561 module
- LED
- 330 ohm resistor
Diagram

Code
Seperti biasa, kita akan tambahkan beberapa config pada platformio.ini
Seleain config untuk external library path, kita tambahkan CONFIG_I2CDEV_TIMEOUT yang diperlukan oleh TSL2561 library.
monitor_speed = 115200 lib_extra_dirs = ../../esp-idf-lib/components build_flags = -DCONFIG_I2CDEV_TIMEOUT=100000
Buka file main.c, tambahkan code berikut
//bagian import library
#include <stdio.h>
#include <string.h>
#include <freertos/FreeRTOS.h>
#include <freertos/task.h>
#include <tsl2561.h>
#include "driver/ledc.h"
#define SDA_GPIO 21
#define SCL_GPIO 22
#define ADDR TSL2561_I2C_ADDR_FLOAT
static tsl2561_t light_sensor;
#define LEDC_GPIO 18
static ledc_channel_config_t ledc_channel;
//bagian init hardware
static void init_hw(void)
{
i2cdev_init();
memset(&light_sensor, 0, sizeof(tsl2561_t));
light_sensor.i2c_dev.timeout_ticks = 0xffff / portTICK_PERIOD_MS;
tsl2561_init_desc(&light_sensor, ADDR, 0, SDA_GPIO, SCL_GPIO);
tsl2561_init(&light_sensor);
ledc_timer_config_t ledc_timer = {
.duty_resolution = LEDC_TIMER_10_BIT,
.freq_hz = 1000,
.speed_mode = LEDC_HIGH_SPEED_MODE,
.timer_num = LEDC_TIMER_0,
.clk_cfg = LEDC_AUTO_CLK,
};
ledc_timer_config(&ledc_timer);
ledc_channel.channel = LEDC_CHANNEL_0;
ledc_channel.duty = 0;
ledc_channel.gpio_num = LEDC_GPIO;
ledc_channel.speed_mode = LEDC_HIGH_SPEED_MODE;
ledc_channel.hpoint = 0;
ledc_channel.timer_sel = LEDC_TIMER_0;
ledc_channel_config(&ledc_channel);
}
//bagian set led
static void set_led(uint32_t lux)
{
uint32_t duty = 1023;
if (lux > 50)
{
duty = 0;
}
else if (lux > 20)
{
duty /= 2;
}
ledc_set_duty(ledc_channel.speed_mode, ledc_channel.channel, duty);
ledc_update_duty(ledc_channel.speed_mode, ledc_channel.channel);
}
//bagian main app
void app_main()
{
init_hw();
uint32_t lux;
while (1)
{
vTaskDelay(500 / portTICK_PERIOD_MS);
if (tsl2561_read_lux(&light_sensor, &lux) == ESP_OK)
{
printf("Lux: %u\n", lux);
set_led(lux);
}
}
}
Penjelasan Code
Bagian Import Library
File header tsl2561.h berisi fungsi-fungsi yang digunakan untuk TSL2561 sensor. Kita gunakan GPIO21 sebagai I2C data pin dan GPIO22 sebagai I2C clock.
I2C address didefinsikan sebagai TSL2561_I2C_ADDR_FLOAT dan sensor diakse melalui variable dengan type tsl2561_t.
Perhatian Sensor TSL2561 sensor dapat memiliki 3 alamat I2C yang berbeda. Ditentukan oleh status dari ADDR-SEL pin pada sensor, dan dapat dihubungkan ke VCC, GND, atau left float.
Bagian Init Hardware
Inisialisasi TSL2561 memerlukan beberapa tahap. Pertama, inisialisasi I2C bus menggunakan fungsi i2cdev_init dan set timeout_ticks field ke 0xffff dalam ms. Kemudian, panggil tsl2561_init_desc dan tsl2561_init functions untuk inisialisasi TSL2561 sensor. FUngsi tsl2561_init_desc memerlukan input sensor address dan I2C pins.
Berikutnya, untuk mengontrol brightness, kita inisialisasi LED pin sebagai PWM output (ledc_channel_config_t).
Bagian Set Led
Pada set led kita ubah LED brightness berdasarkan lux parameter. Untuk lux levels lebih besar dari 50, kita set duty variable ke 0 agar led padam.
Jika lux level lebih besar dari 20, kita bagi dua nilai duty, selain itu full duty untuk full brightness. Silakan bereksperimen dengan lux value diatas, dibandingkan dengan kondisi ambient light lingkungan Anda untuk mendapatkan hasil terbaik.
Bagian Main App
while loop dimana kita membaca secara periodik dari light sensor dan mengatur LED brightness. Fungsi tsl2561_read_lux akan mengisi nilai parameter lux ketika dipanggil.
Sampai disini kita sudah berhasil mendeteksi tingkat cahaya pada lingkungan menggunakan sensor TSL2561.