Sunton ESP32-3248S035 после 2 месяцев использования
Впечатления после 2 месяцев интенсивного использования, возможные проблемы и способы их устранения при создании проектов для неё.
Sunton ESP32-3248S035 после 2 месяцев использования
29.04.2024 в 20:06   1414 0
Версия для печати

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

Введение

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

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

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

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

Фоторезистор R21
GPIO 34

Аудиоусилитель

Аудиоусилитель 8002D U5 (IN+)
GPIO 26

RGB светодиод

Цвет Красный Зеленый Синий
GPIO 4 16 17

Дополнительная SPI Flash память

В версиях платы с емкостным сенсорным экраном она не распаяна, но посадочное место на плате имеется.

25Q32JVSlQ HOLD WP CLC DI DO CS
GPIO обозначение SD2 SD3 CLK SD1 SD0 CMD
GPIO 9 10 6 8 7 11

Дисплей

LCD SPI LED RST DC(RS) SCLK MOSI MISO CS
GPIO 27 EN(-1) 2 14 13 12 15

Сенсорная панель

Плата существует в 2 модификациях с резистивной и емкостной сенсорными панелями. Резистивная работает по SPI интерфейсу, а емкостная по I2C.

Резистивная SPI INT(IRQ) SCLK MOSI MISO CS
GPIO 36 14 13 12 33
Емкостная I2C INT(IRQ) SCL SDA RST
GPIO 21 32 33 25

Разъемы

P3 GND GPIO35 GPIO22 GPIO21
CN1 GND GPIO21 GPIO22 3V3
P1 VIN TX RX GND

Разъем P4 предназначен для подключения динамика к монофоническому усилителю 8002D/

P4 VO1 VO2

Общий вид всех элементов на плате с обозначением всех подключенных контактов 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Ом резистор.

Для вывода звука я предпочитаю использовать библиотеку 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 может стать отличным вариантом для вас.

Материал также доступен на моем канале: Яндекс Дзен и в группе ВК
Категория: Обзоры модулей | Добавил: :, (22.05.2023)
Просмотров: 1414 | Теги: ESP32, Sunton ESP32, Обзор | Рейтинг: 5.0/1
Поделиться:
Всего комментариев: 0
avatar