Найти в Дзене
Project A.L.T.

Sunton ESP32-3248S035 после 2 месяцев использования

Оглавление
Sunton ESP32-3248S035 после 2 месяцев использования
Sunton ESP32-3248S035 после 2 месяцев использования

Введение

Ровно 2 месяца назад я написал обзор макетной платы Sunton ESP32-3248S035 TFT 3.5. Теперь настало время поделиться своими впечатлениями после 2 месяцев её интенсивного использования, а также отметить некоторые особенности разводки платы и указать возможные проблемы и способы их устранения при создании проектов для неё.

Соответствие выводов GPIO ESP32 выводам компонентов на плате

Для начала приведу здесь таблички соответствия распаянных выводов GPIO ESP32 пинам элементов на плате. Разумеется все это можно узнать и по схеме, но в таблице выглядит более наглядно.

Соответствие выводов GPIO ESP32 выводам компонентов на плате
Соответствие выводов GPIO ESP32 выводам компонентов на плате

Общий вид всех элементов на плате с обозначением всех подключенных контактов GPIO представлен на фотографии ниже:

Общий вид всех элементов на плате с обозначением всех подключенных контактов GPIO
Общий вид всех элементов на плате с обозначением всех подключенных контактов GPIO

Основные компоненты макетной платы

Далее рассмотрим основные компоненты макетной платы и нюансы их использования.

Фоторезистор

На плате распаян фоторезистор GT36516, подключенный к GPIO34 по следующей схеме:

Подключение фоторезистора
Подключение фоторезистора

Диапазон изменения сопротивления при различных условиях освещения колеблется в пределах 5 до 10 кОм. Падение напряжения от 75 до 230 мВ.

Считать показания с фоторезистора можно с помощью следующего кода:

void Setup()
{
pinMode(34, ANALOG); //переключить пин в аналоговый режим
}
void loop()
{
int analog_value = analogRead(34); //читаем аналоговое значение с фоторезистора
Serial.println(analog_value);//выводим на экран
delay(500);
}

Дисплей

Пин светодиодной подсветки дисплея подключен GPIO27, что позволяет регулировать подсветку экрана с помощью ШИМ сигнала в том числе и автоматически. Сделать это можно следующим образом:

byte bright_level=255;//значение яркости подсветки
void Setup()
{
pinMode(34, ANALOG); //переключить пин фоторезистора в аналоговый режим
pinMode(27,OUTPUT);//Переключаем пин подсветки на передачу данных
ledcSetup(0, 250, 8); //инициализируем управление подсветкой (канал 0-15, частота шим 250 Гц, разрешение 0-256)
ledcAttachPin(TFT_BACKLIGHT, 0); //подключаем пин подсветки к каналу 0
ledcWrite(0, bright_level); //устанавливаем значение подсветки по умолчанию 250
}
void loop()
{
int analog_value = analogRead(34); //читаем аналоговое значение с фоторезистора
Serial.println(analog_value);//выводим на экран
bright_level = map(analog_value, 0, 1088, 255, 20); //преобразовываем его в значение яркости подсветки
ledcWrite(0, bright_level); //устанавливаем значение подсветки
delay(500);
}

RGB светодиод

RGB светодиоду соответствуют следующие пины:

  • RED_PIN 4
  • GREEN_PIN 16
  • BLUE_PIN 17

Зажигать и гасить соответствующий цвет можно с помощью функции digitalWrite(), причем низкий сигнал означает зажечь светодиод, а высокий потушить. Например:

digitalWrite(RED_PIN,LOW); //зажечь красный цвет
digitalWrite(RED_PIN,HIGH); //потушить красный цвет

Также можно через ШИМ сигнал регулировать яркость каждого цвета по отдельности:

#define RED_PIN 4
#define GREEN_PIN 16
#define BLUE_PIN 17
void Setup ()
{
pinMode(RED_PIN,OUTPUT);//Переключаем пин красного на передачу данных
pinMode(GREEN_PIN,OUTPUT);//Переключаем пин зеленого на передачу данных
pinMode(BLUE_PIN,OUTPUT);//Переключаем пин синего на передачу данных
//Инициализируем каналы управления
ledcSetup(1, 2000, 8); //инициализируем управление светодиодами (канал 1, частота шим 2000 Гц, разрешение 0-256) красный
ledcSetup(2, 2000, 8);//инициализируем управление светодиодами (канал 2, частота шим 2000 Гц, разрешение 0-256) зеленый
ledcSetup(3, 2000, 8);//инициализируем управление светодиодами (канал 3, частота шим 2000 Гц, разрешение 0-256) синий
//Подключаем пины
ledcAttachPin(RED_PIN, 1); //подключаем пин красного к каналу 1
ledcAttachPin(GREEN_PIN, 2); //подключаем пин зеленого к каналу 2
ledcAttachPin(BLUE_PIN, 3); //подключаем пин синего к каналу 3
ledcWrite(1, 255); //гасим красный
ledcWrite(2, 255); //гасим зеленый
ledcWrite(3, 255); //гасим синий
}
void loop()
{
for byte ledn=1;ledn<=3;ledn++)
{
for (byte i=0;i<=255;i++)
{
ledcWrite(ledn, i); //плавно меняем яркость каждого светодиода по отдельности
delay(100);
}
}
}

Подключение динамика

Порт P4 на плате служит для подключения динамика к усилителю на базе микросхемы 8002D. Вывод звука осуществляется c помощью внутреннего ЦАП ESP32 по протоколу I2S через порт GPIO26.

Усилитель по спецификации должен без проблем поддерживать динамики до 3Вт 4Ом, но на практике на максимальной громкости наблюдается просадка напряжения и ESP32 перезагружается. Экспериментальным путем выяснил, что если подключить динамик через резистор 10 Ом, проблема уходит, а громкость остается вполне достойной.

Разумеется можно подключить и более мощный Например  неплохо показал себя в тестах динамик 8Ω 2W 40x5 мм подключенный через 100Ом резистор.

Подпайка резистора 100Ом
Подпайка резистора 100Ом
Вид на плате
Вид на плате

Для вывода звука я предпочитаю использовать библиотеку ESP8266Audio. Пример вывода звука потокового вещания в Mp3 формате на внешний динамик смотрите ниже:

#include <Arduino.h>
#include <WiFi.h>
#include "AudioFileSourceICYStream.h"
#include "AudioFileSourceBuffer.h"
#include "AudioGeneratorMP3.h"
#include "AudioOutputI2S.h"


// Введите данные wifi:
#define STASSID "your-ssid"
#define STAPSK "your-password"

const char* ssid = STASSID;
const char* password = STAPSK;

// ссылка на онлайн вещание Русского радио
const char *URL="http://rusradio.hostingradio.ru/rusradio128.mp3";

//Инициализируем необходимы компоненты библиотеки
AudioGeneratorMP3 *mp3;
AudioFileSourceICYStream *file;
AudioFileSourceBuffer *buff;
AudioOutputI2S *out;

// функция вывода информации о тегах. Например можно вывести название трека или исполнителя
void MDCallback(void *cbData, const char *type, bool isUnicode, const char *string)
{
const char *ptr = reinterpret_cast(cbData);
(void) isUnicode; // Punt this ball for now
// Note that the type and string may be in PROGMEM, so copy them to RAM for printf
char s1[32], s2[64];
strncpy_P(s1, type, sizeof(s1));
s1[sizeof(s1)-1]=0;
strncpy_P(s2, string, sizeof(s2));
s2[sizeof(s2)-1]=0;
Serial.printf("METADATA(%s) '%s' = '%s'\n", ptr, s1, s2);
Serial.flush();
}

// функция вывода информации об ошибках
void StatusCallback(void *cbData, int code, const char *string)
{
const char *ptr = reinterpret_cast(cbData);
// Note that the string may be in PROGMEM, so copy it to RAM for printf
char s1[64];
strncpy_P(s1, string, sizeof(s1));
s1[sizeof(s1)-1]=0;
Serial.printf("STATUS(%s) '%d' = '%s'\n", ptr, code, s1);
Serial.flush();
}


void setup()
{
Serial.begin(115200); /\/Открываем серийный порт
delay(1000);
//подключаемся к wifi
Serial.println("Connecting to WiFi");

WiFi.disconnect();
WiFi.softAPdisconnect(true);
WiFi.mode(WIFI_STA);

WiFi.begin(ssid, password);

// пытаемся подключится пока не надоест
while (WiFi.status() != WL_CONNECTED) {
Serial.println("...Connecting to WiFi");
delay(1000);
}
Serial.println("Connected");

//Работаем с библиотекой
audioLogger = &Serial;//вывод логов в серийный порт
file = new AudioFileSourceICYStream(URL); //указываем URL стрима
file->RegisterMetadataCB(MDCallback, (void*)"ICY"); //указываем функцию обрабатывающую информацию о тегах
buff = new AudioFileSourceBuffer(file, 20480); //буфер для потокового вещания в байтах. Чем больше тем лучше. При слабой сети позволяет избежать заиканий звука
buff->RegisterStatusCB(StatusCallback, (void*)"buffer"); //назначаем функцию для вывода информации об ошибках заполнения буфера
out = new AudioOutputI2S(0,1); //Назначаем внутренний ЦАП ESP32 для вывода звука
mp3 = new AudioGeneratorMP3(); //инициализируем MP3 кодек
mp3->RegisterStatusCB(StatusCallback, (void*)"mp3"); //функция выводящая сообщения об ошибках кодека
mp3->begin(buff, out); //запускаем воспроизведение стрима
}


void loop()
{
static int lastms = 0;

if (mp3->isRunning()) { //если стрим запущен
if (millis()-lastms > 1000) {
lastms = millis();
Serial.printf("Running for %d ms...\n", lastms);
Serial.flush();
}
if (!mp3->loop()) mp3->stop(); //если возникают ошибки, то останавливаем воспроизведение
} else {
Serial.printf("MP3 done\n");
delay(1000);
}
}

Разъемы на плате

Несмотря на наличие двух дополнительных разъемов для подключения внешних устройств, не все так хорошо как кажется. Из 4 доступных контактов в разъемах 2 припаяны к одним и тем же выводам ESP32. Это GPIO21 и GPIO22. Кроме того на GPIO21 еще и висит контакт CTP_INT емкостного сенсорного экрана. По сути остается только один свободный контакт GPIO35 в разъеме P3, который можно использовать без каких либо ограничений.

Разъемы на плате
Разъемы на плате

Возможные ошибки при работе платы

Какой бы идеальной не казалась данная макетная плата, но проектировали ее люди. А людям иногда свойственно ошибаться. Далее перечислю некоторые проблемы некоторые проблемы с которыми вы можете столкнуться при создании ваших проектов.

Фантомные нажатия при подключении кнопки к контакту GPIO39

Данная ошибка присутствует на всех модулях ESP32 при работающем WiFi. Проявляется в периодическом возникновении высокого уровня сигнала на контакте GPIO39 при включенном WiFi.

Устраняется довольно просто. Достаточно лишь добавить в ваш проект следующий код:

void setup(){
WiFi.begin();
WiFi.setSleep(false);
}

Также такое может случаться и при использовании контакта GPIO36. Имеется и альтернативный способ устранения. Добаьте в ваш проект следующий код:

void setup() {
adc_power_acquire();

Пины работающие только на вход

Это не столько ошибка сколько предостережение. Выводы IO36, IO39, IO34 и IO35 в данной разводке платы могут работать только на чтение (pinMode(pin,INPUT). Использование их другим способом, как минимум, будет приводить к постоянным перезагрузкам ESP32.

Пины работающие только на вход
Пины работающие только на вход

Ошибка разводки внешней SPI Flash памяти

А это уже довольно серьезная ошибка проектирования. Согласно документации ESP32 подключение внешней SPI FLASH памяти осуществляется одним из следующих способов:

  • Если DI и DO подключены параллельно, то СS подключаются последовательно
  • Если DI и DO подключены последовательно, то CS подключаются последовательно

Фактически на плате все контакты подключены параллельно.И это приводит к некоторым занятным последствиям. При каждой записи флеш памяти данные пишутся не последовательно друг за другом, а попеременно на обе микросхемы. Поначалу вы не заметите практически никаких изменений, но после определенного количества перезаписей памяти (от 50 до 200) проявляются определенные проблемы:

  • Пин GPIO27 становится непригоден для использования. При обращении к нему ESP32 перезагружается
  • Перестает работать сенсорное управление
  • Очень сильно падает скорость записи во Flash память либо вообще прерывается с ошибкой
  • Необратимое повреждение внутренней флеш-памяти ESP32

Рецепт тут только один. Не использовать внешнюю флеш-память. Проблема актуальна для дисплеев с резистивной тач панелью, на которых память была уже изначально распаяна. Насчет версии с емкостным тачем данных пока нет.

Заключение

В заключение выражу личное мнение по поводу данного дисплея.

Что касается функциональности, Sunton ESP32-3248S035 в целом оправдал ожидания. Дисплей обладает ярким и четким экраном с довольно большим, по меркам портативных устройств, разрешением,. Радуют и широкие углы обзора, что делает его удобным для просмотра из различных позиций.

Одним из наиболее заметных преимуществ Sunton ESP32-3248S035 является его многофункциональность. Такие приятные мелочи как встроенный фоторезистор, RGB светодиод, встроенный аудиоусилитель и наличие нескольких разъемов для простого подключения дополнительных компонентов, делают его универсальным решением для множества проектов и сценариев использования. Возможностей ESP32, на котором построена плата, вполне хватает для реализации самых смелых фантазий. Ну и самое главное преимущество - компактность! Чаще всего для ардуинщиков это больная тема. Так что размеры платы практически не превышающие размеры самого дисплея - это, несомненно, огромный плюс.

Есть у него, конечно, и недостатки. Самый главный - это, конечно же, ошибка с разводкой дополнительной SPI Flash памяти. Также немного удручает количество дополнительных свободных пинов.

В целом, Sunton ESP32-3248S035 оказался надежным и качественным дисплеем, который полностью оправдал ожидания. Он предлагает яркий и четкий экран, удобную функциональность и гибкость в использовании. Если вам требуется надежный дисплей для вашего проекта, Sunton ESP32-3248S035 может стать отличным вариантом для вас.