Перейти к содержанию

Scanmatik 2 pro, установка Bluetooth модуля.


Рекомендуемые сообщения

У меня, наконец дошли руки до запуска блутуза. сначала проверил на прошивке что выложена здесь. все работает стабильно но подтупливает, особенно по сравнению с проводом. Решил что надо как-то распаралеллить нагрузку. В результате родилась следующая прошивка что принципиально другой режим обработки. результат порадовал! интерфейс стал заметно более отзывчивый.
#include <freertos/FreeRTOS.h>
#include <freertos/task.h>
#include <driver/uart.h>
#include <BluetoothSerial.h>
#define BAUD_RATE 115200 * 8
#define SIZE_BUFFER 512
#define SIZE_FIFO SIZE_BUFFER * 8
#define SAVE_MODE
//#define USE_PIN
#ifdef USE_PIN
const char* pin = "1234";
#endif
const String device_name = "SCANMATIK #A111788";
BluetoothSerial SerialBT;
uint8_t buffer[SIZE_BUFFER];
uint8_t bufferBT[SIZE_BUFFER];
unsigned int available=0;
unsigned int availableBT=0;
size_t bytesRead=0;
size_t bytesReadBT=0;
size_t bytesWrite=0;
size_t bytesWriteBT=0;
#ifdef SAVE_MODE
uint32_t min_delay = 1;
uint32_t max_delay = min_delay * 1024;
uint32_t cur_delay = min_delay;
uint32_t cur_delayBT = min_delay;
uint32_t critical_size = (SIZE_FIFO / 4) * 3;
#endif
// Поток для обработки данных из последовательного порта
void serial_reader_task(void* param) {
for (; {
available = Serial.available();
if (available > 0) {
bytesRead = Serial.readBytes(buffer, min(available, sizeof(buffer)));
bytesWrite = SerialBT.write(buffer, bytesRead);
#ifdef SAVE_MODE
if (cur_delay > min_delay) {
if (available >= critical_size) {
cur_delay = min_delay;
}
else {
cur_delay /= 2;
}
}
vTaskDelay(pdMS_TO_TICKS(cur_delay)); // пауза для минимизации нагрузки
#endif
}
#ifdef SAVE_MODE
else {
if (cur_delay < max_delay) {
cur_delay *= 2;
}
vTaskDelay(pdMS_TO_TICKS(cur_delay));
}
#endif
}
}
// Поток для обработки данных из Bluetooth
void bluetooth_reader_task(void* param) {
for (; {
availableBT = SerialBT.available();
if (availableBT > 0) {
// Чтение данных из Bluetooth
bytesReadBT = SerialBT.readBytes(bufferBT, min(availableBT, sizeof(bufferBT)));
bytesWriteBT = Serial.write(bufferBT, bytesReadBT);

#ifdef SAVE_MODE
if (cur_delayBT > min_delay) {
if (availableBT >= critical_size) {
cur_delayBT = min_delay;
}
else {
cur_delayBT /= 2;
}
}
vTaskDelay(pdMS_TO_TICKS(cur_delayBT)); // пауза для минимизации нагрузки
#endif
}
#ifdef SAVE_MODE
else {
if (cur_delayBT < max_delay) {
cur_delayBT *= 2;
}
vTaskDelay(pdMS_TO_TICKS(cur_delayBT));
}

#endif
}
}
void setup() {
Serial.setRxBufferSize(SIZE_FIFO);
Serial.setTxBufferSize(SIZE_FIFO);
Serial.begin(BAUD_RATE);
SerialBT.begin(device_name);
memset(buffer, 0, sizeof(buffer));
memset(bufferBT, 0, sizeof(bufferBT));

// setup UART from hardware (RTS/CTS)
uart_set_pin(UART_NUM_0, 1, 3, 22, 19); // UART, TX, RX, RTS, CTS
uart_set_hw_flow_ctrl(UART_NUM_0, UART_HW_FLOWCTRL_CTS_RTS, 64);
uart_set_mode(UART_NUM_0, UART_MODE_UART);

SerialBT.begin(device_name);
#ifdef USE_PIN
SerialBT.setPin(pin);
#endif

Serial.print("AT-AB -BypassMode-\n");
// Назначение задач на разные ядра
xTaskCreatePinnedToCore(serial_reader_task, "Serial Reader", 4096, NULL, 10, NULL, 0);
xTaskCreatePinnedToCore(bluetooth_reader_task, "Bluetooth Reader", 4096, NULL, 10, NULL, 1);
}
// Метод loop()
void loop() {}

8 часов назад, chipandtun сказал:

Добрый день. Подскажите купил Есп32, прошил, запаял в см2про, комп видит блютуз и подключается, привязал к проге сканматик, блютуз определяется, но при подключении к авто-- нет связи. В чем может быть проблема? 

У меня такое было при плохом контакте одного из 4 проводов UART TX, RX, RTS, CTS. можно попробовать отключить CTS или RTS. или оба сразу. например так

uart_set_pin(UART_NUM_0, 1, 3, 22, -1); // UART, TX, RX, RTS, CTS

uart_set_hw_flow_ctrl(UART_NUM_0, UART_HW_FLOWCTRL_RTS, 64);

редактор немного порезал код! вместо for(; { должно быть for (;;) {

Ссылка на комментарий
Поделиться на другие сайты

  • Ответов 113
  • Создана
  • Последний ответ

Топ авторов темы

Доработал прошивку до вполне вменяемого состояния. Беглое тестирование показало что почти не уступает оригинальной версии. Рекомендуется к использованию.

Спойлер

#include <freertos/FreeRTOS.h>

#include <freertos/task.h>

#include <driver/uart.h>

#include <BluetoothSerial.h>

 

#define BAUD_RATE 115200 * 8

#define SIZE_BUFFER 512

#define SIZE_FIFO SIZE_BUFFER * 8

 

//#define USE_PIN

#ifdef USE_PIN

const char* pin = "1234";

#endif

const String device_name = "SCANMATIK #A111788";

BluetoothSerial SerialBT;

uint8_t buffer[SIZE_BUFFER];

uint8_t bufferBT[SIZE_BUFFER];

unsigned int available=0;

unsigned int availableBT=0;

size_t bytesRead=0;

size_t bytesReadBT=0;

size_t bytesWrite=0;

size_t bytesWriteBT=0;

 

uint32_t min_delay = 1;

uint32_t max_delay = min_delay * 128;

uint32_t cur_delay = min_delay;

uint32_t cur_delayBT = min_delay;

uint32_t critical_size = SIZE_FIFO / 2;


 

// Поток для обработки данных из последовательного порта

void serial_reader_task(void* param) {

for (;;) {

available = Serial.available();

if (available > 0) {

bytesRead = Serial.readBytes(buffer, min(available, sizeof(buffer)));

bytesWrite = SerialBT.write(buffer, bytesRead);

if (cur_delay > min_delay) {

if (available >= critical_size) {

cur_delay = min_delay;

}

else {

cur_delay /= 2;

}

}

}

else {

if (cur_delay < max_delay) {

cur_delay *= 2;

}

}

if (available <= critical_size) {

vTaskDelay(pdMS_TO_TICKS(cur_delay)); // пауза для минимизации нагрузки

}

}

}

 

// Поток для обработки данных из Bluetooth

void bluetooth_reader_task(void* param) {

for (;;) {

availableBT = SerialBT.available();

if (availableBT > 0) {

bytesReadBT = SerialBT.readBytes(bufferBT, min(availableBT, sizeof(bufferBT)));

bytesWriteBT = Serial.write(bufferBT, bytesReadBT);

 

if (cur_delayBT > min_delay) {

if (availableBT >= critical_size) {

cur_delayBT = min_delay;

}

else {

cur_delayBT /= 2;

}

}

}

else {

if (cur_delayBT < max_delay) {

cur_delayBT *= 2;

}

}

if (availableBT <= critical_size) {

vTaskDelay(pdMS_TO_TICKS(cur_delayBT)); // пауза для минимизации нагрузки

}

}

}

 

void setup() {

Serial.setRxBufferSize(SIZE_FIFO);

Serial.setTxBufferSize(SIZE_FIFO);

Serial.begin(BAUD_RATE);

SerialBT.begin(device_name);

 

memset(buffer, 0, sizeof(buffer));

memset(bufferBT, 0, sizeof(bufferBT));

// setup UART from hardware (RTS/CTS)

uart_set_pin(UART_NUM_0, 1, 3, 22, 19); // UART, TX, RX, RTS, CTS

uart_set_hw_flow_ctrl(UART_NUM_0, UART_HW_FLOWCTRL_CTS_RTS, 64);

uart_set_mode(UART_NUM_0, UART_MODE_UART);

SerialBT.begin(device_name);

#ifdef USE_PIN

SerialBT.setPin(pin);

#endif

Serial.print("AT-AB -BypassMode-\n");

 

// Назначение задач на разные ядра

xTaskCreatePinnedToCore(serial_reader_task, "Serial Reader", 4096, NULL, 10, NULL, 0);

xTaskCreatePinnedToCore(bluetooth_reader_task, "Bluetooth Reader", 4096, NULL, 10, NULL, 1);

}

 

// Метод loop()

void loop() {}

 

Ссылка на комментарий
Поделиться на другие сайты

Только что, carmasteruser сказал:

Доработал прошивку до вполне вменяемого состояния. Беглое тестирование показало что почти не уступает оригинальной версии. Рекомендуется к использованию.

  Скрыть контент

#include <freertos/FreeRTOS.h>

#include <freertos/task.h>

#include <driver/uart.h>

#include <BluetoothSerial.h>

 

#define BAUD_RATE 115200 * 8

#define SIZE_BUFFER 512

#define SIZE_FIFO SIZE_BUFFER * 8

 

//#define USE_PIN

#ifdef USE_PIN

const char* pin = "1234";

#endif

const String device_name = "SCANMATIK #A111788";

BluetoothSerial SerialBT;

uint8_t buffer[SIZE_BUFFER];

uint8_t bufferBT[SIZE_BUFFER];

unsigned int available=0;

unsigned int availableBT=0;

size_t bytesRead=0;

size_t bytesReadBT=0;

size_t bytesWrite=0;

size_t bytesWriteBT=0;

 

uint32_t min_delay = 1;

uint32_t max_delay = min_delay * 128;

uint32_t cur_delay = min_delay;

uint32_t cur_delayBT = min_delay;

uint32_t critical_size = SIZE_FIFO / 2;


 

// Поток для обработки данных из последовательного порта

void serial_reader_task(void* param) {

for (;;) {

available = Serial.available();

if (available > 0) {

bytesRead = Serial.readBytes(buffer, min(available, sizeof(buffer)));

bytesWrite = SerialBT.write(buffer, bytesRead);

if (cur_delay > min_delay) {

if (available >= critical_size) {

cur_delay = min_delay;

}

else {

cur_delay /= 2;

}

}

}

else {

if (cur_delay < max_delay) {

cur_delay *= 2;

}

}

if (available <= critical_size) {

vTaskDelay(pdMS_TO_TICKS(cur_delay)); // пауза для минимизации нагрузки

}

}

}

 

// Поток для обработки данных из Bluetooth

void bluetooth_reader_task(void* param) {

for (;;) {

availableBT = SerialBT.available();

if (availableBT > 0) {

bytesReadBT = SerialBT.readBytes(bufferBT, min(availableBT, sizeof(bufferBT)));

bytesWriteBT = Serial.write(bufferBT, bytesReadBT);

 

if (cur_delayBT > min_delay) {

if (availableBT >= critical_size) {

cur_delayBT = min_delay;

}

else {

cur_delayBT /= 2;

}

}

}

else {

if (cur_delayBT < max_delay) {

cur_delayBT *= 2;

}

}

if (availableBT <= critical_size) {

vTaskDelay(pdMS_TO_TICKS(cur_delayBT)); // пауза для минимизации нагрузки

}

}

}

 

void setup() {

Serial.setRxBufferSize(SIZE_FIFO);

Serial.setTxBufferSize(SIZE_FIFO);

Serial.begin(BAUD_RATE);

SerialBT.begin(device_name);

 

memset(buffer, 0, sizeof(buffer));

memset(bufferBT, 0, sizeof(bufferBT));

// setup UART from hardware (RTS/CTS)

uart_set_pin(UART_NUM_0, 1, 3, 22, 19); // UART, TX, RX, RTS, CTS

uart_set_hw_flow_ctrl(UART_NUM_0, UART_HW_FLOWCTRL_CTS_RTS, 64);

uart_set_mode(UART_NUM_0, UART_MODE_UART);

SerialBT.begin(device_name);

#ifdef USE_PIN

SerialBT.setPin(pin);

#endif

Serial.print("AT-AB -BypassMode-\n");

 

// Назначение задач на разные ядра

xTaskCreatePinnedToCore(serial_reader_task, "Serial Reader", 4096, NULL, 10, NULL, 0);

xTaskCreatePinnedToCore(bluetooth_reader_task, "Bluetooth Reader", 4096, NULL, 10, NULL, 1);

}

 

// Метод loop()

void loop() {}

 

Отлично работает ранее выложенная прошивка

Ссылка на комментарий
Поделиться на другие сайты

1 годину назад, carmasteruser сказав:

Доработал прошивку до вполне вменяемого состояния. Беглое тестирование показало что почти не уступает оригинальной версии. Рекомендуется к использованию.

  Показати контент

#include <freertos/FreeRTOS.h>

#include <freertos/task.h>

#include <driver/uart.h>

#include <BluetoothSerial.h>

 

#define BAUD_RATE 115200 * 8

#define SIZE_BUFFER 512

#define SIZE_FIFO SIZE_BUFFER * 8

 

//#define USE_PIN

#ifdef USE_PIN

const char* pin = "1234";

#endif

const String device_name = "SCANMATIK #A111788";

BluetoothSerial SerialBT;

uint8_t buffer[SIZE_BUFFER];

uint8_t bufferBT[SIZE_BUFFER];

unsigned int available=0;

unsigned int availableBT=0;

size_t bytesRead=0;

size_t bytesReadBT=0;

size_t bytesWrite=0;

size_t bytesWriteBT=0;

 

uint32_t min_delay = 1;

uint32_t max_delay = min_delay * 128;

uint32_t cur_delay = min_delay;

uint32_t cur_delayBT = min_delay;

uint32_t critical_size = SIZE_FIFO / 2;


 

// Поток для обработки данных из последовательного порта

void serial_reader_task(void* param) {

for (;;) {

available = Serial.available();

if (available > 0) {

bytesRead = Serial.readBytes(buffer, min(available, sizeof(buffer)));

bytesWrite = SerialBT.write(buffer, bytesRead);

if (cur_delay > min_delay) {

if (available >= critical_size) {

cur_delay = min_delay;

}

else {

cur_delay /= 2;

}

}

}

else {

if (cur_delay < max_delay) {

cur_delay *= 2;

}

}

if (available <= critical_size) {

vTaskDelay(pdMS_TO_TICKS(cur_delay)); // пауза для минимизации нагрузки

}

}

}

 

// Поток для обработки данных из Bluetooth

void bluetooth_reader_task(void* param) {

for (;;) {

availableBT = SerialBT.available();

if (availableBT > 0) {

bytesReadBT = SerialBT.readBytes(bufferBT, min(availableBT, sizeof(bufferBT)));

bytesWriteBT = Serial.write(bufferBT, bytesReadBT);

 

if (cur_delayBT > min_delay) {

if (availableBT >= critical_size) {

cur_delayBT = min_delay;

}

else {

cur_delayBT /= 2;

}

}

}

else {

if (cur_delayBT < max_delay) {

cur_delayBT *= 2;

}

}

if (availableBT <= critical_size) {

vTaskDelay(pdMS_TO_TICKS(cur_delayBT)); // пауза для минимизации нагрузки

}

}

}

 

void setup() {

Serial.setRxBufferSize(SIZE_FIFO);

Serial.setTxBufferSize(SIZE_FIFO);

Serial.begin(BAUD_RATE);

SerialBT.begin(device_name);

 

memset(buffer, 0, sizeof(buffer));

memset(bufferBT, 0, sizeof(bufferBT));

// setup UART from hardware (RTS/CTS)

uart_set_pin(UART_NUM_0, 1, 3, 22, 19); // UART, TX, RX, RTS, CTS

uart_set_hw_flow_ctrl(UART_NUM_0, UART_HW_FLOWCTRL_CTS_RTS, 64);

uart_set_mode(UART_NUM_0, UART_MODE_UART);

SerialBT.begin(device_name);

#ifdef USE_PIN

SerialBT.setPin(pin);

#endif

Serial.print("AT-AB -BypassMode-\n");

 

// Назначение задач на разные ядра

xTaskCreatePinnedToCore(serial_reader_task, "Serial Reader", 4096, NULL, 10, NULL, 0);

xTaskCreatePinnedToCore(bluetooth_reader_task, "Bluetooth Reader", 4096, NULL, 10, NULL, 1);

}

 

// Метод loop()

void loop() {}

 

Спасибо, будем тестировать

Ссылка на комментарий
Поделиться на другие сайты

2 часа назад, Виктор V сказал:

Отлично работает ранее выложенная прошивка

этот вариант еще на порядок лучше

Ссылка на комментарий
Поделиться на другие сайты

9 часов назад, carmasteruser сказал:

этот вариант еще на порядок лучше

Чем лучше конкретнее 

Ссылка на комментарий
Поделиться на другие сайты

7 минут назад, Виктор V сказал:

Чем лучше конкретнее

Теорией.... пока что. Надо тестит на реальном блоке. Я тоже пытался с 2 ядрами делать скетч. Работало... но при прошивке подопытного эбу висло и уваливало.... 

На выходных попробую затестить... если лень не помешает 😄

Ссылка на комментарий
Поделиться на другие сайты

3 часа назад, Виктор V сказал:

Чем лучше конкретнее 

Предыдущая прошивка, например, долго думала при автоматическом выборе ЭБУ. Здесь же выбирает почти мгновенно. Там максимальная задержка была 1024 мсек, тут 128, Затупов практически нету и при этом проц не греется. Этой уже вполне можно пользоваться в рабочем режиме. Кому надо в бинарном виде - ловите. Заливать примерно так:
esptool.py write_flash \\
--flash_mode dio \\
--flash_freq 40m \\
--flash_size detect \\
0x1000 bootloader.bin \\
0x8000 partitions.bin \\
0x10000 app.bin \\
0x100000 data.bin

esp32.esp32.node32s.zip

Ссылка на комментарий
Поделиться на другие сайты

Пока перепаивал... проверил амперметром. Вообщем моя прошивка стандарт + смена имени блютуз потребляет в простое 70ма при передаче 140ма ваша с 2 ядрами 80ма в простое 155 при передаче. 2 ядра жрут на 10ма больше... не так уж и много, думал будет поболя. Если нет передачи секунд через 5 на обоих прошивках ток падает в 2 раза типо режим ожидания. Судя по потреблению тока все эти сейв моды и таймауты не нужны в коде. Все это реализованно в библиотеке и нормально работает.

Позже потестю на прошивке блока....

Кидайте скетч самой последней вашей... потестим.

Ссылка на комментарий
Поделиться на другие сайты

а температурный режим сравнили? сдается мне будет разница. и еще интересно сколько ваша прошивка посылает запросов чтобы считать 1 байт данных? в случае когда данных нету. самому лень считать. почему ваша прошивка работает сносно, хотя должна по идее быстро ставить на колени микроконтроллер?? потому что у него есть встроенные средства защиты от дурака и говнокодинга. в моем случае эта защита не нужна. потому что все сделано грамотно и разумно.  попробуйте код подобный вашему запустить на десктопе. вот тогда все тайное и станет явным. 

Ссылка на комментарий
Поделиться на другие сайты

Стандарт прошивка основанна на примере блютуз сериал из ардуино ide. Т.е самый минимум... 

Вы тоже используете туже библиотеку то есть у вас такой же говно код😀 

А если без шуток то я не пытаюсь что там оспорить обхаить.... наоборот. 

Давайте тестить. Теория это не то....

23 минуты назад, carmasteruser сказал:

температурный режим сравнили

Пока нет. Когда буду тестить на прошивка блока замерю.

Если физику помните то поймете что чем больше ток тем теплее...

55 минут назад, carmasteruser сказал:

еще интересно сколько ваша прошивка посылает запросов чтобы считать 1 байт

А куда гнатся? К линия и кан шина не такие уж и скоростные... чеще всего тормоит именно эбу авто.

Ссылка на комментарий
Поделиться на другие сайты

по моим данным потребление в холостом режиме прыгает 82 -73 ма. при длительном приеме через блютуз не превышает 160 ма. температура под нагрузкой 46-47.

Ссылка на комментарий
Поделиться на другие сайты

19 минут назад, carmasteruser сказал:

прыгает 82 -73 ма

Да. Еще я заметил что прыгает, на "моей" не прагало. 

Скинте вашу последню в личку я свою скину. 

Тестю на блоке edc16c39

Моя калибровки по к линии считала за 3.11 мин. По юсб 1.05 ваша читала 25 мин. Записывать еще не пробовал. 

Ссылка на комментарий
Поделиться на другие сайты

так я выложил все свои прошивки в этой теме. если надо прям файл ino приложил. 

sketch_aug5a_copy_20250808171846.zip

Ссылка на комментарий
Поделиться на другие сайты

Для публикации сообщений создайте учётную запись или авторизуйтесь

Вы должны быть пользователем, чтобы оставить комментарий

Создать аккаунт

Зарегистрируйте новый аккаунт в нашем сообществе. Это очень просто!

Регистрация нового пользователя

Войти

Уже есть аккаунт? Войти в систему.

Войти
  • Последние посетители   1 пользователь онлайн

×
  • Создать...