Код для поиска

ESP32 Урок 38/55 — Управление RGB-светодиодом с вашего мобильного телефона | Обучающий набор SunFounder для ESP32 IoT

ESP32 Урок 38/55 — Управление RGB-светодиодом с вашего мобильного телефона | Обучающий набор SunFounder для ESP32 IoT

В этом руководстве мы рассмотрим, как управлять RGB-светодиодом с помощью модуля ESP32 из учебного набора SunFounder ESP32. Отправляя команды с мобильного устройства, вы можете изменять цвет светодиода или полностью выключать его. Этот проект использует возможности ESP32, задействуя встроенные функции Wi-Fi и Bluetooth для бесшовного подключения и управления.

ESP32_RGB_led_wires
ESP32_rgb_pin

RGB-светодиод состоит из трех отдельных светодиодов: красного, зеленого и синего, которые можно смешивать для создания различных цветов. В этом проекте вы узнаете, как правильно подключить RGB-светодиод и запрограммировать ESP32 для реагирования на Bluetooth-команды. Руководство также проведет вас через необходимые компоненты кода для достижения этой функциональности (в видео на 02:15).

Объяснение аппаратного обеспечения

Основные компоненты для этого проекта включают микроконтроллер ESP32 и RGB-светодиод. ESP32 — это мощный модуль со встроенными Wi-Fi и Bluetooth, что делает его идеальным для IoT-приложений. В этом проекте он будет действовать как сервер для приема команд с мобильного устройства и соответствующего управления RGB-светодиодом.

RGB-светодиод имеет четыре вывода: один общий вывод (либо анод, либо катод) и три вывода для отдельных цветов. Общий вывод подключается либо к источнику питания, либо к земле, а остальные три вывода подключаются к GPIO-выводам ESP32 через резисторы для ограничения тока и защиты светодиодов. Эта схема позволяет точно контролировать яркость каждого цвета, создавая широкий диапазон цветов.

Детали из технического описания

Производитель SunFounder
Номер детали RGB LED
Тип общего вывода Общий анод / Общий катод
Прямое напряжение (В) 2.0 - 3.2 В
Максимальный прямой ток (А) 20 мА
Типичный ток (А) 15 мА
Цветовое разрешение 8 бит (0-255)
Корпус Выводной / SMD

 

  • Убедитесь в правильных значениях резисторов (обычно 220 Ом) для ограничения тока через каждый канал светодиода.
  • Проверьте конфигурацию общего вывода (анод или катод) перед подключением.
  • Используйте ШИМ для регулировки яркости и смешивания цветов, изменяя сигнал, отправляемый на каждый светодиод.
  • Будьте осторожны с подключением, чтобы избежать коротких замыканий; подключайте по одному выводу за раз.
  • После настройки проверьте каждый цвет отдельно, чтобы подтвердить правильность подключения.

Инструкции по подключению

ES32-38_RGB_LED-wiring

Чтобы подключить RGB-светодиод к ESP32, начните с размещения RGB-светодиода на макетной плате. Более длинный вывод является общим, который вы подключите либо к положительному напряжению (для общего анода), либо к земле (для общего катода). Если вы используете общий анод, подключите длинный вывод к контакту 3.3V на ESP32. Для общего катода подключите его к контакту GND.

Затем возьмите три резистора по 220 Ом и подключите один конец каждого резистора к соответствующим RGB-выводам светодиода. Подключите другие концы резисторов к GPIO-выводам ESP32: подключите красный вывод светодиода к GPIO 27, зеленый вывод к GPIO 26, а синий вывод к GPIO 25. Наконец, убедитесь, что общий вывод правильно подключен в зависимости от вашей конфигурации (анод или катод).

Примеры кода и пояснения

Код для этого проекта начинается с определения выводов, подключенных к RGB-светодиоду. Следующий фрагмент показывает, как объявляются выводы:

const int redPin = 27;
const int greenPin = 26;
const int bluePin = 25;

Здесь redPin, greenPin и bluePin назначаются конкретным номерам GPIO на ESP32 для каждого цветового канала RGB-светодиода.

В функции setup инициализируется Bluetooth и применяются настройки ШИМ. Этот фрагмент демонстрирует эту инициализацию:

void setup() {
  Serial.begin(115200);      // Инициализация последовательного порта
  setupBLE();                // Инициализация Bluetooth BLE

  ledcAttach(redPin, freq, resolution);
  ledcAttach(greenPin, freq, resolution);
  ledcAttach(bluePin, freq, resolution);
}

Этот код инициализирует последовательную связь и настраивает функциональность Bluetooth, одновременно подключая выводы RGB-светодиода к ШИМ-каналам для управления.

Наконец, функция loop проверяет полученные Bluetooth-сообщения и соответствующим образом изменяет цвет светодиода:

if (value == "red") {
  setColor(255, 0, 0); // Красный
  Serial.println("red");
}

В этом разделе, если полученное значение — "red", светодиод будет установлен на полную красную яркость с помощью функции setColor.

Для полного понимания кода рекомендуется посмотреть видеоурок, где полный код загружен ниже статьи.

Демонстрация / Что ожидать

После того как все подключено и код загружен, вы сможете управлять RGB-светодиодом с мобильного устройства через Bluetooth. Отправляя команды, такие как "red", "green", "blue" и т.д., вы увидите, как светодиод меняет цвет соответствующим образом. Если вы отправите "LED_off", RGB-светодиод выключится. Убедитесь, что вы проверили последовательный монитор на наличие отладочных сообщений, чтобы подтвердить, что команды принимаются правильно (в видео на 10:45).

Временные метки видео

  • 00:00 Начало
  • 1:59 Что такое RGB LED?
  • 6:01 Объяснение RGB-цвета
  • 10:01 Страница документации
  • 11:19 Объяснение подключения
  • 13:34 Выбор платы ESP32 и COM-порта в Arduino IDE
  • 15:15 Код Arduino
  • 18:02 Демонстрация управления RGB LED с помощью телефона

Изображения

ESP32_rgb_pin
ESP32_rgb_pin
ESP32_RGB_led_wires
ESP32_RGB_led_wires
ES32-38_RGB_LED-wiring
ES32-38_RGB_LED-wiring
839-ESP32 Tutorial 38/55- Arduino code for controlling RGB LED using bluetooth app
Язык: C++
#include "BLEDevice.h"
#include "BLEServer.h"
#include "BLEUtils.h"
#include "BLE2902.h"

// Define RGB LED pins
const int redPin = 27;
const int greenPin = 26;
const int bluePin = 25;

// Define PWM frequency and resolution
const int freq = 5000;
const int resolution = 8;

// Define the Bluetooth device name
const char *bleName = "ESP32_Bluetooth";

// Define the received text and the time of the last message
String receivedText = "";
unsigned long lastMessageTime = 0;

// Define the UUIDs of the service and characteristics
#define SERVICE_UUID "8785d8b3-9d23-473b-aee5-3fabe2ba9583"
#define CHARACTERISTIC_UUID_RX "b2bcd13b-aab6-4660-92ae-40abf6941fce"
#define CHARACTERISTIC_UUID_TX "4219d86a-d701-4fd2-bd84-04db50f70fe2"

// Define the Bluetooth characteristic
BLECharacteristic *pCharacteristic;

void setup() {
  Serial.begin(115200);      // Initialize the serial port
  setupBLE();                // Initialize the Bluetooth BLE

  ledcAttach(redPin, freq, resolution);
  ledcAttach(greenPin, freq, resolution);
  ledcAttach(bluePin, freq, resolution);
}

void loop() {
  // When the received text is not empty and the time since the last message is over 1 second
  // Send a notification and print the received text
  if (receivedText.length() > 0 && millis() - lastMessageTime > 1000) {
    Serial.print("Received message: ");
    Serial.println(receivedText);
    pCharacteristic->setValue(receivedText.c_str());
    pCharacteristic->notify();
    receivedText = "";
  }

  // Read data from the serial port and send it to BLE characteristic
  if (Serial.available() > 0) {
    String str = Serial.readStringUntil('\n');
    const char *newValue = str.c_str();
    pCharacteristic->setValue(newValue);
    pCharacteristic->notify();
  }
}

// Define the BLE server callbacks
class MyServerCallbacks : public BLEServerCallbacks {
  // Print the connection message when a client is connected
  void onConnect(BLEServer *pServer) {
    Serial.println("Connected");
  }
  // Print the disconnection message when a client is disconnected
  void onDisconnect(BLEServer *pServer) {
    Serial.println("Disconnected");
  }
};

// Define the BLE characteristic callbacks
class MyCharacteristicCallbacks : public BLECharacteristicCallbacks {
  void onWrite(BLECharacteristic *pCharacteristic) {
    std::string value = std::string(pCharacteristic->getValue().c_str());
    if (value == "led_off") {
      setColor(0, 0, 0); // turn the RGB LED off
      Serial.println("RGB LED turned off");
    } else if (value == "red") {
      setColor(255, 0, 0); // Red
      Serial.println("red");
    }
    else if (value == "green") {
      setColor(0, 255, 0); // green
      Serial.println("green");
    }
    else if (value == "blue") {
      setColor(0, 0, 255); // blue
      Serial.println("blue");
    }
    else if (value == "yellow") {
      setColor(255, 150, 0); // yellow
      Serial.println("yellow");
    }
    else if (value == "purple") {
      setColor(80, 0, 80); // purple
      Serial.println("purple");
    }
  }
};

// Initialize the Bluetooth BLE
void setupBLE() {
  BLEDevice::init(bleName);                        // Initialize the BLE device
  BLEServer *pServer = BLEDevice::createServer();  // Create the BLE server
  // Print the error message if the BLE server creation fails
  if (pServer == nullptr) {
    Serial.println("Error creating BLE server");
    return;
  }
  pServer->setCallbacks(new MyServerCallbacks());  // Set the BLE server callbacks

  // Create the BLE service
  BLEService *pService = pServer->createService(SERVICE_UUID);
  // Print the error message if the BLE service creation fails
  if (pService == nullptr) {
    Serial.println("Error creating BLE service");
    return;
  }
  // Create the BLE characteristic for sending notifications
  pCharacteristic = pService->createCharacteristic(CHARACTERISTIC_UUID_TX, BLECharacteristic::PROPERTY_NOTIFY);
  pCharacteristic->addDescriptor(new BLE2902());  // Add the descriptor
  // Create the BLE characteristic for receiving data
  BLECharacteristic *pCharacteristicRX = pService->createCharacteristic(CHARACTERISTIC_UUID_RX, BLECharacteristic::PROPERTY_WRITE);
  pCharacteristicRX->setCallbacks(new MyCharacteristicCallbacks());  // Set the BLE characteristic callbacks
  pService->start();                                                 // Start the BLE service
  pServer->getAdvertising()->start();                                // Start advertising
  Serial.println("Waiting for a client connection...");              // Wait for a client connection
}

void setColor(int red, int green, int blue) {
  // For common-anode RGB LEDs, use 255 minus the color value
  ledcWrite(redPin, red);
  ledcWrite(greenPin, green);
  ledcWrite(bluePin, blue);
}

Ресурсы и ссылки

Файлы📁

Нет доступных файлов.