TCS3200 — це програмований датчик кольору RGB, який перетворює інтенсивність світла трьох основних кольорів (червоного, зеленого, синього) на прямокутний електричний сигнал із частотою, що змінюється пропорційно до яскравості. [1, 2, 3]
Основні характеристики та будова
Чіп: TCS3200 виробництва TAOS (сьогодні частина ams). [1, 2]
Підсвічування: модуль (найчастіше у виконанні GY-31) зазвичай містить 4 білі світлодіоди для освітлення об'єкта. [1, 2]
Принцип роботи: масив із 8х8 фотодіодів (частина з яких фільтрується червоним, зеленим, синім світлом, а частина залишається без фільтра). Фільтри перемикаються за допомогою керуючих виводів S2 і S3.
Масштабування частоти: виводи S0 і S1 дозволяють задавати коефіцієнт поділу вихідної частоти (наприклад, 2%, 20% або 100%), що зручно для підключення до мікроконтролерів на кшталт Arduino чи ESP32.
Відстань до об'єкта: найкраще працює на відстані до 1 см від досліджуваної поверхні. [1]
Застосування
Сортування предметів за кольором у робототехніці.
Лабораторні та навчальні пристрої для аналізу кольору.
Проєкти домашньої автоматизації на базі Arduino, ESP32 чи Raspberry Pi. [1, 2, 3]
Дивіться це відео для прикладу підключення датчика TCS3200 (GY-31) до мікроконтролера ESP32 та калібрування вимірювань:
7:11
TCS3200 (GY-31) with ESP32: Wiring + Calibration + Color ...
Переглядів: 1,4 тис. · 6 місяців тому
YouTube · Shilleh
Датчик кольору TCS3200 (та модулі на його основі, наприклад GY-31) працює в діапазоні напруги від 2.7 В до 5.5 В.
Основні параметри живлення
Номінальна напруга: найчастіше підключають до 5 В або 3.3 В прямо від плати Arduino чи ESP32.
Струм споживання: чіп споживає дуже мало (близько 1.4–2 мА), але 4 білі світлодіоди підсвічування на модулі сумарно споживають близько 30–50 мА.
Контакти для підключення
VCC (або VDD): Плюс живлення (+5В або +3.3В).
GND: Мінус живлення (земля).
LED (на деяких модулях): Керування підсвічуванням. Якщо з'єднати з GND або залишити пустим, світлодіоди горітимуть постійно. Якщо подати сигнал з мікроконтролера, підсвічування можна вимикати для економії енергії.
Важливе правило безпеки
При виборі напруги орієнтуйтеся на логіку вашого мікроконтролера:
Для Arduino Uno/Nano (5-вольтова логіка) — живіть від 5 В.
Для ESP32 / ESP8266 / Raspberry Pi Pico (3.3-вольтова логіка) — живіть від 3.3 В, щоб високий сигнал з виходу датчика (OUT) не пошкодив цифрові піни контролера.
Який мікроконтролер ви плануєте використовувати для цього датчика? Напишіть модель, і я підкажу, до якого саме виводу безпечно підключити живлення та логіку.
плати від LILYGO (наприклад, популярні серії TTGO T-Display, T-Display-S3 або T-Beam) побудовані на базі мікроконтролерів ESP32 чи ESP32-S3. Це означає, що вони працюють виключно на 3.3-вольтовій логіці. [1, 2]
Для безпечного та стабільного підключення датчика TCS3200 до плати LILYGO дотримуйтесь таких правил:
Схема живлення
VCC (датчика) ➔ 3V3 (на платі LILYGO): Датчик підтримує живлення від 2.7 В до 5.5 В. Підключивши його до піна 3.3V, ви гарантуєте, що вихідний сигнал з піна OUT датчика також матиме безпечний для ESP32 рівень 3.3 В.
GND (датчика) ➔ GND (на платі LILYGO): Спільна земля. [1, 2, 3]
Схема підключення логіки (GPIO)
Датчик TCS3200 потребує багато вільних контактів. Оскільки плати LILYGO часто мають інтегровані дисплеї, частина GPIO вже зайнята. Вам потрібно знайти 5 будь-яких вільних GPIO на гребінці вашої плати (наприклад, GPIO 2, 12, 13, 15, 17 — уточніть за розпиновкою (Pinout) конкретної моделі) і підключити їх так: [1, 2, 3]
S0 ➔ Вільний GPIO (Наприклад, GPIO 12)
S1 ➔ Вільний GPIO (Наприклад, GPIO 13)
S2 ➔ Вільний GPIO (Наприклад, GPIO 15)
S3 ➔ Вільний GPIO (Наприклад, GPIO 17)
OUT ➔ Вільний GPIO (Наприклад, GPIO 2) — важливо вибрати пін, який підтримує переривання (в ESP32 це майже всі).
LED ➔ Не підключайте (залиште пустим), щоб світлодіоди підсвічування світилися постійно. [1]
Базовий код для Arduino IDE (з виведенням у Serial)
Для плат ESP32 часто використовують пряме зчитування частоти через функцію pulseIn(). Нижче наведено базовий приклад без сторонніх бібліотек, адаптований під логіку ESP32: [1]
cpp
// Вкажіть ваші вільні GPIO відповідно до плати LILYGO
#define S0 12
#define S1 13
#define S2 15
#define S3 17
#define OUT 2
int redFrequency = 0;
int greenFrequency = 0;
int blueFrequency = 0;
void setup() {
Serial.begin(115200);
// Налаштування пінів
pinMode(S0, OUTPUT);
pinMode(S1, OUTPUT);
pinMode(S2, OUTPUT);
pinMode(S3, OUTPUT);
pinMode(OUT, INPUT);
// Масштабування частоти на 20% (оптимально для ESP32)
digitalWrite(S0, HIGH);
digitalWrite(S1, LOW);
}
void loop() {
// 1. Зчитування Червоного (Red) фільтра
digitalWrite(S2, LOW);
digitalWrite(S3, LOW);
redFrequency = pulseIn(OUT, LOW);
// 2. Зчитування Зеленого (Green) фільтра
digitalWrite(S2, HIGH);
digitalWrite(S3, HIGH);
greenFrequency = pulseIn(OUT, LOW);
// 3. Зчитування Синього (Blue) фільтра
digitalWrite(S2, LOW);
digitalWrite(S3, HIGH);
blueFrequency = pulseIn(OUT, LOW);
// Виведення результатів у монітор порту
Serial.print("R = "); Serial.print(redFrequency);
Serial.print(" | G = "); Serial.print(greenFrequency);
Serial.print(" | B = "); Serial.println(blueFrequency);
delay(500);
}
Будьте обачні, використовуючи код.
Примітка: значення, які повертає pulseIn, є тривалістю імпульсу (чим менше число, тим вища інтенсивність кольору).
Яка саме у вас модель плати LILYGO (з екраном T-Display, T-Watch чи інша)? Якщо ви плануєте виводити назву кольору чи графіку на вбудований дисплей плати, напишіть модель, і я допишу код для виведення інформації безпосередньо на екран.
#include <RadioLib.h>
#include <SPI.h>
#include <Wire.h>
#include <Adafruit_GFX.h>
#include <Adafruit_SSD1306.h>
// Піни TCS3200
#define S0 12
#define S1 13
#define S2 14
#define S3 15
#define sensorOut 2
// Піни LoRa (SX1276)
#define LORA_SCK 5
#define LORA_MISO 19
#define LORA_MOSI 27
#define LORA_CS 18
#define LORA_RST 23
#define LORA_DIO0 26
// Піни OLED-дисплея (I2C)
#define OLED_SDA 21
#define OLED_SCL 22
#define OLED_RST -1
#define SCREEN_WIDTH 128
#define SCREEN_HEIGHT 64
SX1276 radio = new Module(LORA_CS, LORA_DIO0, LORA_RST, RADIOLIB_NC);
Adafruit_SSD1306 display(SCREEN_WIDTH, SCREEN_HEIGHT, &Wire, OLED_RST);
// Змінні для збереження тривалості імпульсів кожного кольору
int redFrequency = 0;
int greenFrequency = 0;
int blueFrequency = 0;
String lastDetectedColor = "";
unsigned long lastSendTime = 0;
const unsigned long sendInterval = 3000; // Відправляти дані не частіше ніж раз на 3 секунди
// Зчитування тривалості імпульсу для обраного фільтра
int readColor(bool s2State, bool s3State) {
digitalWrite(S2, s2State);
digitalWrite(S3, s3State);
return pulseIn(sensorOut, LOW);
}
// Визначення назви кольору
String getDetectedColor() {
// Зчитування значень (чим менше значення pulseIn, тим яскравіший колір)
redFrequency = readColor(LOW, LOW); // Червоний фільтр
blueFrequency = readColor(LOW, HIGH); // Синій фільтр
greenFrequency = readColor(HIGH, HIGH); // Зелений фільтр
// 1. Перевірка на БІЛИЙ та ЧОРНИЙ (за рівнем загальної яскравості)
// Значення можуть потребувати калібрування під ваш датчик
if (redFrequency < 30 && greenFrequency < 30 && blueFrequency < 30) {
return "White";
}
if (redFrequency > 200 && greenFrequency > 200 && blueFrequency > 200) {
return "Black";
}
// 2. Визначення домінуючого кольору (найменше значення частоти)
if (redFrequency < greenFrequency && redFrequency < blueFrequency) {
return "Red";
}
if (blueFrequency < redFrequency && blueFrequency < greenFrequency) {
return "Blue";
}
if (greenFrequency < redFrequency && greenFrequency < blueFrequency) {
return "Green";
}
return "Unknown";
}
void setup() {
Serial.begin(115200);
// Налаштування пінів TCS3200
pinMode(S0, OUTPUT);
pinMode(S1, OUTPUT);
pinMode(S2, OUTPUT);
pinMode(S3, OUTPUT);
pinMode(sensorOut, INPUT);
// Встановлення масштабування частоти на 20% (S0 = HIGH, S1 = LOW)
digitalWrite(S0, HIGH);
digitalWrite(S1, LOW);
// Ініціалізація екрана
Wire.begin(OLED_SDA, OLED_SCL);
display.begin(SSD1306_SWITCHCAPVCC, 0x3C);
display.clearDisplay();
display.setTextColor(SSD1306_WHITE);
display.setTextSize(1);
display.setCursor(0, 0);
display.println(F("TCS3200 + LoRa"));
display.println(F("Initializing..."));
display.display();
// Ініціалізація SPI та LoRa
SPI.begin(LORA_SCK, LORA_MISO, LORA_MOSI, LORA_CS);
int state = radio.begin(868.0, 125.0, 9, 7, 0x12, 10, 8);
if (state != RADIOLIB_ERR_NONE) {
Serial.print(F("Помилка LoRa: "));
Serial.println(state);
display.clearDisplay();
display.setCursor(0, 0);
display.println(F("LoRa Init Error!"));
display.display();
while (true);
}
display.clearDisplay();
display.setCursor(0, 0);
display.println(F("Ready to detect!"));
display.display();
}
void loop() {
String currentColor = getDetectedColor();
// Відправляємо колір, якщо минув інтервал
if (millis() - lastSendTime >= sendInterval) {
lastSendTime = millis();
Serial.print(F("Визначено колір: "));
Serial.println(currentColor);
Serial.printf("R: %d | G: %d | B: %d\n", redFrequency, greenFrequency, blueFrequency);
// Відправка назви кольору через LoRa
int state = radio.transmit(currentColor);
// Оновлення OLED-дисплея
display.clearDisplay();
display.setTextSize(1);
display.setCursor(0, 0);
display.println(F("Color Detection"));
display.println(F("---------------------"));
display.setTextSize(2);
display.println(currentColor);
display.setTextSize(1);
if (state == RADIOLIB_ERR_NONE) {
display.println(F("LoRa TX: OK"));
} else {
display.println(F("LoRa TX: ERROR"));
}
display.display();
}
delay(100);
}