ESP32 sync и async webServer - подвиcания AJAX при частом обновлении

v258 Простота — это хорошо, но не в ущерб возможностям". Упрощение до такой степени, что часть сценариев использования становится невозможной — это уже не упрощение, а кастрация функциональности! вы хоть осознаете за что вы топите ?)))

а что если я хотел шахматную доску собрать из 64 esp ? что мне теперь делать, кто будет за это платить мне ?
а там еще и другие библиотеки не пойдут… а если я хотел скрытый способ сделать, лишнее условие для срабатывания чего то, а теперь все, магнит не использовать…

Бабосик, за что я топлю? За какую кастрацию? (хотя, кому-то она может и не помешала бы :sweat_smile: )

Ишо раз - датчик холла там был чисто для красоты, использовать его в реальных проектах - дураком быть, так что твой стон (тем более, что нихрена ты с этим датчиком не делал, ты про него и его “кастрацию” только сегодня узнал, да и то как узнал - ИИ подсказал) нифига не сексуальный :wink:

Дураки должны страдать - вот и страдай тогда :rofl:

у кого то да, а кто то мог через него получать доступ с крытым функциям! и добавлять в открытую это не то же самое!

вот вам самый простой довод, украли таймеры, нет таймеров, нет кучи библиотек которые на них работают, нет библиотек, нет софта, и esp32 на ядре 3 это метало лом))) который как stm, управление силовой электроникой и все, нечего толком на них не сделать, ну или сделать, но без оплаты, за сложности никто платить не будет, там же все просто, и за час сделать можно, потратив 6 месяце жизни)))

в общем кака и все тут!))))
а я придумал интересную систему подсчета, пойду испытывать)))) нет времени))))

Тебе-то что, болезный. Ты-то про него и знать не знал :wink:

Ишо раз - пока ты пользуешься продуктом БЕСПЛАТНО, права голоса у тебя НЕТУ. Не нравится - не используй :sweat_smile:

тут ты неправ, код нашего нового прибора уже разросся до 20 тысяч строк, а ещё там ИИ даже не прикручивался, в базу внешнюю данные тоже пока не льются, но код есть, это ещё порядка 2500 строк (база)

я знаю о своих правах, спс, одно из них это право не есть каку, и портить аппетит тем кто с удовольствием такое кушает))) а тем более пропагандирует, но у вас есть право не слышать меня, и кушать дальше)))

вам это принесло 3кк ?))) сколько времени потратили на обучение, и сколько денег в час это приносит ? что будите делать если вас пнут после реализации проекта ? и в поисках нового вы год без работы будите))) делать то все можно… только часто платить приходится за это только вам)))

как же ды задолбал со своим прибором, даже на озоне выпендрился успел, там публика попроще, схавает без понимания.


аналоговнет…

Не ешь. Ноешь о чем? :wink:

v258 я так понимаю вам скучно ?)))
бывает такое… еще бы тему восстановили бы что собрать… для вдохновения
предлагаю совместно запилить проект, новую систему счисления, как минимум в итоге будет новый алгоритм шифрования, а как макисимум будет упаковывать больше чем 255 значений в байт))) как вам ?

Проект? С тобой? А тебе можно доверять? Хорошая шутка, Бабосик :sweat_smile:

а почему нет ?)) может еще и примеры приведете почему незя доверять ?)))
я в магазин дошел, сейчас у меня второй раунд будет с ии и с адреналином раш, такой код сейчас заделаем с ним…
жаль никто не увидит его, потому что коммерческая тайна, но поверьте, он будет офигенный!)))

ну если совсем скучно как вариант можно какой то код писать… главное найти для чего))) так же обсудить как поднять бабла кодом))) на программировании мк, и самоделках))) или даже что то другое попытаться сделать…

Потому что ты балабол. Сначала свое портфолио покажи :wink:

я выполняю ТЗ за денежку, это и есть портфолио и проверка…
если у тебя требуют портфолио при собеседовании, бегите от таких работодателей…

я то думал вам реально делать нечего, сейчас что то необыное сделать предложите… а вы… еще меня балаболом называете)))

#include <Arduino.h>
#include <SPI.h>
#include <SD.h>
#include <vector>

// Пины для SD карты (стандартные для VSPI)
#define SD_CS   5
#define SD_SCK  18
#define SD_MISO 19
#define SD_MOSI 23

// Максимальный размер строки для чтения
#define MAX_LINE_LENGTH 256//постепенное чтение добавить лучше позже

// Структура для хранения информации о файлах
struct FileInfo {
String name;
String path;
size_t size;
};

// Глобальные переменные
std::vector<FileInfo> txtFiles;
bool sdCardAvailable = false;
File currentFile;

// Функция для инициализации SD карты
bool initSDCard() {
SPI.begin(SD_SCK, SD_MISO, SD_MOSI, SD_CS);

if (!SD.begin(SD_CS)) {
Serial.println("Ошибка: SD карта не найдена!");
return false;
} Serial.println("SD карта успешно инициализирована");
return true;
}
// Функция для сканирования txt файлов на SD карте
void scanTxtFiles(const char* dirname = "/") {
txtFiles.clear();

File root = SD.open(dirname);
if (!root) {
Serial.println("Ошибка открытия корневой директории");
return;
}

File file = root.openNextFile();
while (file) {
String fileName = String(file.name());

// Проверяем, что это txt файл
if (fileName.endsWith(".txt") || fileName.endsWith(".TXT")) {
FileInfo info;
info.name = fileName;
info.path = String(dirname) + fileName;
info.size = file.size();
txtFiles.push_back(info);
}

file = root.openNextFile();
}

root.close();
}

// Функция для вывода списка txt файлов
void listTxtFiles() {
if (txtFiles.empty()) {
Serial.println("TXT файлы не найдены на SD карте");
return;
}

Serial.println("=== Доступные TXT файлы ===");
for (size_t i = 0; i < txtFiles.size(); i++) {
Serial.print(i + 1);
Serial.print(". ");
Serial.print(txtFiles[i].name);
Serial.print(" (");
Serial.print(txtFiles[i].size);
Serial.println(" байт)");
}
Serial.println("===========================");
Serial.println("Введите номер файла для чтения (или 'L' для обновления списка):");
}

// Функция для чтения и вывода содержимого файла
void readFileByNumber(int fileNumber) {
// Проверяем корректность номера
if (fileNumber < 1 || fileNumber > txtFiles.size()) {
Serial.print("Ошибка: неверный номер файла. Доступны номера от 1 до ");
Serial.println(txtFiles.size());
return;
}

int index = fileNumber - 1;
String filePath = txtFiles[index].path;

Serial.print("=== Чтение файла: ");
Serial.print(txtFiles[index].name);
Serial.println(" ===");

File file = SD.open(filePath);
if (!file) {
Serial.println("Ошибка открытия файла!");
return;
}

// Читаем файл построчно
size_t totalBytesRead = 0;
char lineBuffer[MAX_LINE_LENGTH];

while (file.available()) {
int bytesRead = file.readBytesUntil('\n', lineBuffer, MAX_LINE_LENGTH - 1);
lineBuffer[bytesRead] = '\0';

// Убираем символ возврата каретки если есть
if (bytesRead > 0 && lineBuffer[bytesRead - 1] == '\r') {
lineBuffer[bytesRead - 1] = '\0';
}

Serial.println(lineBuffer);
totalBytesRead += bytesRead + 1;  // +1 за символ новой строки

// Небольшая задержка для предотвращения переполнения буфера
delay(1);
}

file.close();

Serial.println("=== Конец файла ===");
Serial.print("Прочитано примерно ");
Serial.print(totalBytesRead);
Serial.println(" байт");
}

// Функция для обработки команд из COM порта
void processCommand(String command) {
command.trim();

if (command.length() == 0) {
return;
}

// Команда для вывода списка файлов
if (command.equalsIgnoreCase("L")) {
scanTxtFiles();
listTxtFiles();
return;
}

// Команда для вывода справки
if (command.equalsIgnoreCase("H") || command.equalsIgnoreCase("HELP")) {
printHelp();
return;
}

// Пробуем преобразовать команду в число
int fileNumber = command.toInt();
if (fileNumber > 0) {
readFileByNumber(fileNumber);
return;
}

Serial.println("Неизвестная команда. Введите 'H' для справки.");
}

void printHelp() {
Serial.println("=== СПРАВКА ===");
Serial.println("1,2,3... - открыть файл с указанным номером");
Serial.println("L        - обновить список файлов");
Serial.println("H        - показать эту справку");
Serial.println("===============");
}

void setup() {
Serial.begin(115200);

// Ждем инициализации Serial для плат с USB-UART
while (!Serial && millis() < 3000);

Serial.println("=== ESP32 File Reader ===");

// Инициализация SD карты
sdCardAvailable = initSDCard();

if (sdCardAvailable) {
// Сканируем txt файлы
scanTxtFiles();
listTxtFiles();
}

Serial.println("Введите команду (H для справки):");
}

void loop() {
static String inputBuffer = "";

// Проверяем наличие данных в COM порту
while (Serial.available()) {
char c = Serial.read();

if (c == '\n' || c == '\r') {
if (inputBuffer.length() > 0) {
processCommand(inputBuffer);
inputBuffer = "";
}
} else {
inputBuffer += c;
}
}

// Можно добавить другую логику в loop
delay(10);
}

воо начало положено, осталось доделать преобразование байт, и будет чтение документа только через компорт, а если флешку извлекут не фига не прочитают, купит кто такое ?))) а вообще вы бабки зарабатываете программированием мк ? или тут их не заработать)))

“Что значит имя? Роза пахнет розой, хоть розой назови её, хоть нет”(Вильям, понимаете ли, наш Шекспир)

Спойлер

Двойная цитата :slightly_smiling_face:

это же хобби, это расходы, как дорисуем выложим в открытый доступ

а как же бабки ?))) ладно с этим понятно допустим, откуда тогда брать бабки ?))) что бы заниматься хобби

в итоге победил, тормоза отсутствуют

получилось на круг среднее чуть меньше 1000 мс 3394373/3508

Я не подаю :wink:

Что вцелом почти неплохо :slight_smile:
И ошибки ни разу не сносил.