/*
* xpt2046.h
*
* Created on: jan 12, 2019
* Author: karawin
* adapted from https://github.com/loboris/ESP32_SPI_MASTER_NODMA_EXAMPLE
*/
#define LOG_LOCAL_LEVEL ESP_LOG_VERBOSE
#include "freertos/FreeRTOS.h"
#include "freertos/task.h"
#include "esp_intr_alloc.h"
#include <string.h>
#include "xpt2046.h"
#include "esp_log.h"
#ifdef KaRadio32
#include "gpio.h"
#include "vs1053.h"
#include "eeprom.h"
#include "interface.h"
#endif
#define TAG "XPT2046"
static spi_device_handle_t t_handle = NULL; // SPI handle of the spi touch interface.
static spi_host_device_t spiNo;
static gpio_num_t csPin;
static bool haveTouchOn = false;
static bool inCalibrate = false;
static uint32_t tp_calx = 0x1100BC5; //17828805
static uint32_t tp_caly = 0x2490ed2;
static int width = 320;
static int height = 240;
xTaskHandle handleTaskLcd;
// ============= Touch panel functions =========================================
void saveCalibration(uint32_t x, uint32_t y)
{
g_device->tp_calx = x ;
g_device->tp_caly = y ;
saveDeviceSettings(g_device);
ESP_LOGI(TAG, "Calibration saved: X:%x, Y:%x",x,y);
}
void getCalibration()
{
if (g_device->tp_calx != 0) tp_calx = g_device->tp_calx;
if (g_device->tp_caly != 0) tp_caly = g_device->tp_caly;
ESP_LOGI(TAG, "Calibration read: X:%x, Y:%x",tp_calx,tp_caly);
}
void setTouchSize(int w, int h) {width = w; height = h; }
void getTouchSize(int* w, int* h) {*w=width; *h=height; }
bool haveTouch() {return haveTouchOn;}
void getTaskLcd(xTaskHandle* hdt){handleTaskLcd = *hdt;}
void xpt_init()
{
gpio_get_touch(&csPin);
gpio_get_spi_bus((uint8_t*)&spiNo,NULL,NULL,NULL);
if ((csPin != GPIO_NONE) )
{
haveTouchOn = true;
gpio_config_t gpioConfig;
gpioConfig.mode = GPIO_MODE_OUTPUT;
gpioConfig.pull_up_en = GPIO_PULLUP_ENABLE;
gpioConfig.intr_type = GPIO_INTR_DISABLE;
gpioConfig.pin_bit_mask = ((uint64_t)(((uint64_t)1)<<csPin));
ESP_ERROR_CHECK(gpio_config(&gpioConfig));
gpio_set_level(csPin, 1);
ESP_LOGI(TAG, "Touch cs: %d init done",csPin);
if (t_handle==NULL)
{
spi_device_interface_config_t dev_config={
.clock_speed_hz = 2000000,
.command_bits = 0,
.spics_io_num = -1,
.cs_ena_posttrans = 1,
.mode = 0,
.flags = SPI_DEVICE_NO_DUMMY,
.queue_size = 1,
};
ESP_ERROR_CHECK(spi_bus_add_device(spiNo, &dev_config, &t_handle));
ESP_LOGI(TAG, "... Added touch spi bus cs: %d, Speed= %d.",csPin,dev_config.clock_speed_hz);
}
//init tp_calx & tp_caly
getCalibration();
}
}
uint16_t IRAM_ATTR xpt_get_data(uint8_t addressbyte){
uint16_t result;
uint8_t datas[3] = {0};
datas[0] = addressbyte;
esp_err_t ret;
spi_transaction_t t = {
.length = 8 * 3, // Len is in bytes, transaction length is in bits.
.cmd = addressbyte,
.tx_buffer = &datas, // Data
.flags = SPI_TRANS_USE_RXDATA,
};
ret = spi_device_transmit(t_handle, &t); //Transmit!
if (ret != ESP_OK) ESP_LOGE(TAG,"err: %d, xpt_get_data(%d), read: %d",ret,addressbyte,(uint16_t)*t.rx_data);
result = (t.rx_data[1] << 8 | t.rx_data[2]) >> 3;
return result;
}
//-----------------------------------------------
static int IRAM_ATTR tp_get_data(uint8_t type, int samples)
{
int n, result, val = 0;
uint32_t i = 0;
uint32_t vbuf[18];
uint32_t minval, maxval, dif;
vTaskSuspend(handleTaskLcd);
taskYIELD();
if (samples < 3) samples = 1;
if (samples > 18) samples = 18;
gpio_set_level(csPin, 0);
// one dummy read
result = xpt_get_data(type);
// gpio_set_level(csPin, 1);
// read data
while (i < 10) {
minval = 5000;
maxval = 0;
// get values
// gpio_set_level(csPin, 0);
for (n=0;n<samples;n++) {
result = xpt_get_data(type);
if ((result < 0)||(result >4096)) {vbuf[n] = 5000; continue;}//break;
vbuf[n] = result;
if (result < minval) minval = result;
if (result > maxval) maxval = result;
}
if (result < 0) break;
dif = maxval - minval;
if (dif < 50) break;
i++;
}
gpio_set_level(csPin, 1);
vTaskResume(handleTaskLcd);
if ((result < 0)||(result >4096)) return -1;
if (samples > 2) {
// remove one min value
for (n = 0; n < samples; n++) {
if (vbuf[n] == minval) {
vbuf[n] = 5000;
break;
}
}
// remove one max value
for (n = 0; n < samples; n++) {
if (vbuf[n] == maxval) {
vbuf[n] = 5000;
break;
}
}
for (n = 0; n < samples; n++) {
if (vbuf[n] < 5000) val += vbuf[n];
}
val /= (samples-2);
}
else val = vbuf[0];
return val;
}
//=============================================
bool IRAM_ATTR xpt_read_touch(int *x, int* y, uint8_t raw)
{
if (inCalibrate) return false;
int result = -1;
int32_t X=0, Y=0, tmp;
*x = 0;
*y = 0;
result = tp_get_data(0xB0, 4);
if (result > 50) {
// tp pressed
result = tp_get_data(0xD0, 15);
if (result >= 0) {
X = result;
result = tp_get_data(0x90, 15);
if (result >= 0) Y = result;
}
}
if (result <= 50) return false;
if (raw) {
*x = X;
*y = Y;
return true;
}
int xleft = (tp_calx >> 16) & 0x3FFF;
int xright = tp_calx & 0x3FFF;
int ytop = (tp_caly >> 16) & 0x3FFF;
int ybottom = tp_caly & 0x3FFF;
ESP_LOGV(TAG, "xleft:%d,xright:%d,ytop:%d,ybottom:%d,tp_calx:%d,tp_caly:%d,X:%d,Y:%d",xleft,xright,ytop,ybottom,tp_calx,tp_caly,X,Y);
// ESP_LOGW(TAG, "X:%d,Y:%d",X,Y);
if (((xright - xleft) != 0) && ((ybottom - ytop) != 0)) {
X = ((X - xleft) * height) / (xright - xleft);
Y = ((Y - ytop) * width) / (ybottom - ytop);
}
else return false;
//ESP_LOGI(TAG, "X:%d,Y:%d",X,Y);
if (X < 0) X = 0;
if (X > height-1) X = height-1;
if (Y < 0) Y = 0;
if (Y > width-1) Y = width-1;
switch (getRotat()) {
case 0: //90%
tmp = X;
X = width-Y-1;
Y = tmp;
break;
case 1: // 270%
tmp = X;
X = Y;
Y = height-tmp - 1;
break;
default:;
}
ESP_LOGD(TAG, "Rotate: %d, X:%d,Y:%d",getRotat(),X,Y);
*x = X;
*y = Y;
return true;
}
bool xpt_touched()
{
int result = -1;
result = tp_get_data(0xB0, 4);
if (result > 50) return true; else return false;
}
bool xpt_read_calibrate(int* x, int* y)
{
int result = -1;
result = tp_get_data(0xB0, 4);
if (result > 50) {
// tp pressed
result = tp_get_data(0xD0, 10);
if (result >= 0) {
*x = result;
result = tp_get_data(0x90, 10);
if (result >= 0) *y = result;
}
}
if (result <= 50) return false;
ESP_LOGI(TAG, "X:%d,Y:%d",*x,*y);
vTaskDelay(10);
return true;
}
void userMsg(int val)
{
if (getRotat()==val)
kprintf("Touch the top right corner\n");
else
kprintf("Touch the bottom left corner\n");
}
void xpt_calibrate()
{
int xl,yt,xr,yb;
if (!haveTouchOn)
{
kprintf("No Touch screen detected\n");
return;
}
inCalibrate = true;
kprintf("INSTRUCTIONS:\n");
userMsg(0);
while (!(xpt_read_calibrate(&xl, &yt)))vTaskDelay(1);
kprintf("Ok\n");
vTaskDelay(10);
while (xpt_touched());
userMsg(1);
while (!(xpt_read_calibrate(&xr, &yb)))vTaskDelay(1);
kprintf("Ok\n");
while (xpt_touched());
ESP_LOGD(TAG, "xl:%x, yt:%x, xr:%x, yb:%x",xl,yt,xr,yb);
kprintf("Done\n");
tp_calx = xl<<16 | xr;
tp_caly = yt<<16 | yb;
saveCalibration(tp_calx, tp_caly);
inCalibrate = false;
}
у меня тача нет проверить не могу, но из этого куска кода с сайта автора, по-моему предлагается тапнуть в правом верхнем и левом нижнем углу экрана, после чего координаты записываются в память.
void userMsg(int val)
{
if (getRotat()==val)
kprintf("Touch the top right corner\n");
else
kprintf("Touch the bottom left corner\n");
}
у меня тача нет проверить не могу, но из этого куска кода с сайта автора, по-моему предлагается тапнуть в правом верхнем и левом нижнем углу экрана, после чего координаты записываются в память.
спасибо большое, ссылка на телефоне работает, даже делать ничего не пришлось, ну краме того что отрезать динамик от колыбельни, с двумя мелодиями, которые всех раздражают
Мдя... Действительно ничего сложного... Все, спасибо!!! Разобрался. Проект движется к логическому завершению. Определился, что будет два энкодера и пульт.
Но! Вопросы все равно есть. В качестве ЦАПа платка на 1502. При переходе со станции с битрейтом 64 кБ\с на станцию с битрейтом 128 или выше идет треск, зацикливание звука, секунды 2-3. Потом типа отлипает и начинает играть нормально. Это первое. Второе, можно ли увеличить как-то число кликов на энкодере? Пока не приловчился, чувствую себя взломщиком сейфов прислушивающимся к щелчкам сейфа. :)
Ну и экранчик, до сих пор не придумал, что выписать с Китая.
А еще, подскажите пожалуйста, как мне экспортировать плейлист с веб-морды? Захожу в карадио с планшета, редактировать список могу, экспортировать нет. Что сделать?
(не претендую на истину в последней инстанции) У меня так же VS1003 начиная с версии 1,5 появилось бульканье или басовитый писк (как то так) я откатился до версии 1,3 и все нормально стало со звуком.
у кого есть возможность-проверьте такой момент:связка wroover+vs1053+ir.При регулировании громкости пультом на станциях с битрейдом 320 наблюдаюся затыки?Именно если держать кнопку увеличения или уменьшения на пульте постоянно.
Получил плату TTGO Tm, прошил Karadio, сконфигурировал два энкодера, второй на переключение станций. Все работает очень даже прилично при минимуме телодвижений. Жду пульт. Жаль памяти маловато, при слабом сигнале wifi есть затыки звука. Ну и с AAC никак.
Поделитесь, кто-нибудь увеличивал spram на этой плате, если да, то есть ли улучшения?
gergreko, не поделитесь конфигом и фоткой на какие пины енкодеры подключали? Буду очень признателен! magaz@me.com
Ловите на почте. Отправил два варианта. Себе оставил тот, где кнопка на энкодере для регулировки громкости, а второй энкодер для выбора станций только крутитлка:
Залил последнюю прошивку со своим конфингом. В итоге звук есть, но громкость и прочие настройки vs1053 не регулируется из веб интерфейса. vs1053 взял рабочую, которая стояла в karadio, там через веб всё работало. Напряжение питания 5 вольт в норме. В чём может быть причина?
Получил плату TTGO Tm, прошил Karadio, сконфигурировал два энкодера, второй на переключение станций. Все работает очень даже прилично при минимуме телодвижений. Жду пульт. Жаль памяти маловато, при слабом сигнале wifi есть затыки звука. Ну и с AAC никак.
Поделитесь, кто-нибудь увеличивал spram на этой плате, если да, то есть ли улучшения?
Пришлите и мне пожалуйста данные для подключения энкодеров к данной плате.
Здравия желаю. Возникла подребнос изменить экран на 1602 у ранее успешно собраный проект с экраном OLED SSD1306 .
Собственно, что нужно почитать, изменить для этого? У мамы плохое зрение, поэтому и нужна эта замена с выведением названия радиостанции.
Ткните носом, не могу найти. Где-то был проект KaRadio32 с управлением по тачу на экране.
с тачем карадио32 как раз таки есть, а вот 1602 - https://github.com/karawin/karadio-addons/tree/master/karadio_IIC_lcd16x2
либо https://github.com/karawin/karadio-addons/tree/master/karadiolcd16x2
Я правильно понимаю, что мне нужно добавить аддон экрана 1602 и пересобрать файл для прошивки, а потом подключившись к нужным выводам?
аддон - это плюсом еще один контроллер (в вашем случае - ардуина) со своей прошивкой. К нему подключается экран. С "базой" аддон соединяется по уарту
Принял, спасибо!
Всем привет!
Вопрос.
Какое радио посоветуете сделать только на 8266 и УНЧ.
Спасибо!
с тачем карадио32 как раз таки есть, а вот 1602 - https://github.com/karawin/karadio-addons/tree/master/karadio_IIC_lcd16x2
либо https://github.com/karawin/karadio-addons/tree/master/karadiolcd16x2
Был проект с SD-картой на которой хранилсь иконки станций, мелодии будильников и еще что-то.
А в этом проекте чет я не вижу зон куда и для чего тыкать в экран. Как он по тачу управляется?
https://github.com/schreibfaul1/ESP32-MiniWebRadio
Это который с иконками
В карадио - верх / низ экрана - громкость, правый / левый края - станции
https://github.com/schreibfaul1/ESP32-MiniWebRadio
Это который с иконками
В карадио - верх / низ экрана - громкость, правый / левый края - станции
Спасибо, это то что искал.
В карадио - верх / низ экрана - громкость, правый / левый края - станции
Чет не срабатывает. На таче выводы T_CLK, T_CS, T_DIN, T_DO, T_IRQ. Какой куда цыплять? В файле конфигурации реч идет только об одном GPIO для тача.
На таче выводы T_CLK, T_CS, T_DIN, T_DO, T_IRQ. Какой куда цыплять? В файле конфигурации реч идет только об одном GPIO для тача.
про файл конфигурации читаем на сайте автора
Другими выводами являются ------- соответственно
t_clk, ----- clk
t_din, ----- mosi
t_do ----- miso
T_IRQ is not used.
читаем строки, ищем схему, смотрим схему - подключаем по схеме
создаем Bin файл из CSV, заливаем по нужному адресу.
На таче выводы T_CLK, T_CS, T_DIN, T_DO, T_IRQ. Какой куда цыплять? В файле конфигурации реч идет только об одном GPIO для тача.
про файл конфигурации читаем на сайте автора
Другими выводами являются ------- соответственно
t_clk, ----- clk
t_din, ----- mosi
t_do ----- miso
T_IRQ is not used.
читаем строки, ищем схему, смотрим схему - подключаем по схеме
создаем Bin файл из CSV, заливаем по нужному адресу.
Спасибо
Тач заработал, только почему-то при нажатии в верху экрана, громкость уменьшается, внизу-увеличивается, хотя логичнее было бы наоборот
sys.cali попробуйте
ShAlex13
логично предположить, что изображение на экране развернуто на 180 .
ShAlex13
логично предположить, что изображение на экране развернуто на 180 .
Лево-право не перепутается тогда?
[quote=pilnikov]
sys.cali попробуйте
так вообще пропала регулировка изменений станций
вниз уменьшает громкость, все остальное увеличивает
Лево-право не перепутается тогда?
у меня тача нет проверить не могу, но из этого куска кода с сайта автора, по-моему предлагается тапнуть в правом верхнем и левом нижнем углу экрана, после чего координаты записываются в память.
у меня тача нет проверить не могу, но из этого куска кода с сайта автора, по-моему предлагается тапнуть в правом верхнем и левом нижнем углу экрана, после чего координаты записываются в память.
Разобрался, все работает как надо.
Тема стухла?
WiFi и Bluetooh одновременно, похоже, не осилить на этой платке для наших целей
спасибо большое, ссылка на телефоне работает, даже делать ничего не пришлось, ну краме того что отрезать динамик от колыбельни, с двумя мелодиями, которые всех раздражают
.
Онлайн генератор csv-bin чет не работает, пишет: Ошибка генерации bin файла. Попробуйте еще раз. Иногда выкидывает: Не верный формат.
P.S. Разобрался, сам в одной строчке косячнул. Все ОК
Добрый день!
Сегодня онлайн генератор не работает. Пробовал на немодифицированных csv файлах, все время "Ошибка генерации bin файла. Попробуйте еще раз."
Добрый день!
Сегодня онлайн генератор не работает.
Та же ерунда. никто не знает - когда починят? Или искать альтернативные способы? Подскажете?
Добрый день!
Сегодня онлайн генератор не работает.
Та же ерунда. никто не знает - когда починят? Или искать альтернативные способы? Подскажете?
Добрый день!
Сегодня онлайн генератор не работает.
Та же ерунда. никто не знает - когда починят? Или искать альтернативные способы? Подскажете?
Качайете вот это https://yadi.sk/d/Q638YQZCF09hQA
и сами по инструкции генерируете файл bin. esp-idf можно не устанавливать. Файл делается Питоном
Мдя... Действительно ничего сложного... Все, спасибо!!! Разобрался. Проект движется к логическому завершению. Определился, что будет два энкодера и пульт.
Но! Вопросы все равно есть. В качестве ЦАПа платка на 1502. При переходе со станции с битрейтом 64 кБ\с на станцию с битрейтом 128 или выше идет треск, зацикливание звука, секунды 2-3. Потом типа отлипает и начинает играть нормально. Это первое. Второе, можно ли увеличить как-то число кликов на энкодере? Пока не приловчился, чувствую себя взломщиком сейфов прислушивающимся к щелчкам сейфа. :)
Ну и экранчик, до сих пор не придумал, что выписать с Китая.
Парни, есть у кого сборка TTGO TM под енкодер? Родное управление кривое да и рулить громкостью нет необходимости.
А еще, подскажите пожалуйста, как мне экспортировать плейлист с веб-морды? Захожу в карадио с планшета, редактировать список могу, экспортировать нет. Что сделать?
Добрый день. Собрал КаРадио32, ST7735, VS1003,энкодер ардуино, все работает но при добавлении громкости прорывается писк.
Что это,как убрать.
У всех с громкостью нормально на TTGO TM? У меня тиховато чет, до блюпупа и вайфая не дотягивает значительно.
(не претендую на истину в последней инстанции) У меня так же VS1003 начиная с версии 1,5 появилось бульканье или басовитый писк (как то так) я откатился до версии 1,3 и все нормально стало со звуком.
У меня версия 1,9R5 интересно это у всех так ?
Я грешил на сам энкодер.
Есть у кого плей-лист столичный под karadio? Чёт замаялся искать в сети.
у кого есть возможность-проверьте такой момент:связка wroover+vs1053+ir.При регулировании громкости пультом на станциях с битрейдом 320 наблюдаюся затыки?Именно если держать кнопку увеличения или уменьшения на пульте постоянно.
Получил плату TTGO Tm, прошил Karadio, сконфигурировал два энкодера, второй на переключение станций. Все работает очень даже прилично при минимуме телодвижений. Жду пульт. Жаль памяти маловато, при слабом сигнале wifi есть затыки звука. Ну и с AAC никак.
Поделитесь, кто-нибудь увеличивал spram на этой плате, если да, то есть ли улучшения?
https://m.facebook.com/gennady.morozov.39?_ft_=
Ну и с паяльником надо дружить
Посоветуйте. Подсветка дисплея 128*160,потребляет 40 милиампер(если не врет прибор).
Можно поцепить сразу на 4 ногу, не выгорит порт????
gergreko, не поделитесь конфигом и фоткой на какие пины енкодеры подключали? Буду очень признателен! magaz@me.com
gergreko, не поделитесь конфигом и фоткой на какие пины енкодеры подключали? Буду очень признателен! magaz@me.com
Ловите на почте. Отправил два варианта. Себе оставил тот, где кнопка на энкодере для регулировки громкости, а второй энкодер для выбора станций только крутитлка:
Спасибо. А паяльника мы флюсом задобрим)
To Basia:
https://www.drive2.ru/b/481751570539610911/
Список станций.
Добрый день!
Сегодня онлайн генератор не работает. Пробовал на немодифицированных csv файлах, все время "Ошибка генерации bin файла. Попробуйте еще раз."
Какой онлайн генератор, проясните, пожалуйста.
Спасибо.
Конвертер конфигураций csv в bin http://totel.kusto.com.ru:18888/karadio/
Добрый день, кто-нибудь может поделиться ссылкой на все размеры и расстояния платы TTGO Zero?
Может у кого-то было подобное и может подсказать..
Плата WROOM32 и синяя vs1053
Подключение такое:
P_MISO,data,u8,19
P_MOSI,data,u8,23
P_CLK,data,u8,18
P_XCS,data,u8,32
P_RST,data,u8,12
P_XDCS,data,u8,33
P_DREQ,data,u8,34
Залил последнюю прошивку со своим конфингом. В итоге звук есть, но громкость и прочие настройки vs1053 не регулируется из веб интерфейса. vs1053 взял рабочую, которая стояла в karadio, там через веб всё работало. Напряжение питания 5 вольт в норме. В чём может быть причина?
Получил плату TTGO Tm, прошил Karadio, сконфигурировал два энкодера, второй на переключение станций. Все работает очень даже прилично при минимуме телодвижений. Жду пульт. Жаль памяти маловато, при слабом сигнале wifi есть затыки звука. Ну и с AAC никак.
Поделитесь, кто-нибудь увеличивал spram на этой плате, если да, то есть ли улучшения?
Пришлите и мне пожалуйста данные для подключения энкодеров к данной плате.