Реализовать webaudio -UART как espruino

Серж17

✩✩✩✩✩✩✩
4 Авг 2025
4
0
Данный проект позволит отказаться от дисплеев в большинстве мелких поделок.
Ведь все можно будет делать с дисплея смартфона, управлять считывать сихранять накапливать, обрабатывать, передавать в МК обратно по блютуз дальше или еще дальше ,в сеть.
Так можно значительно расширить функционал устройст без дисплея или с примитивной индикацией, выведя его на новый уровень сервиса.
Накопилось много неиспользуемых старых смартфонов которые можно снова запустить.


Они там не выложили модуль приёмника в открытый доступ.
Ну вообще смысл такой что можно через JavaScript любого смартфона с сайта загружает выгружать данные в микроконтроллер считывать передавать информацию. Причём в микроконтроллер дополнительно ничего загружать не надо никакой обработки, используется его стандартныеrx tx
 

Вложения

Изменено:

Серж17

✩✩✩✩✩✩✩
4 Авг 2025
4
0
развивая идею....

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

Ниже два файла, один передает кодированное аудио другой принимает и декодирует.
скрипт приема
https://github.com/espruino/Espruin...4dad1ae89b70fffb9893/core/serial_web_audio.js

Скрипт передачи: https://espruino.github.io/EspruinoOrion/serial_to_audio.js
Что остается...:
написать веб морду на которой несколько настроек касаемых этих криптов, типа скорости приема передачи, инвертирование или нет и т.д...

раздел страницы передатчика:
поле ввода данных на передачу - строковое.
Поле ввода на передачу в виде чисел разделенных пробелом
десятичных, двоичных шестнадцетиричных.
Кнопка загрузки внешнего файла.

Раздел страницы приемника.
Отображение хода загрузки, пустьчтото мигает или крутится или какой-то отчет, прогресс...

4 поля принятых данных DEC HEX BIN ascii
у формы ascii, рядом радиокнопки koi win DOS unicode
для перекодировки.
Кнопка сохранения файла возле каждого поля.
у формы HEX две кнопки, одна сохраняет файл как двоичный, другая как HEX файл.
У всех остальных сохраняется как текст.

В помощь энтузиасту...
Для теста надо в винде в качестве устройства записи включить аудиомикшер ,чтобы браузер слышал сам себя. Иначе придется проверять с другого устройства.
Если звук передается на монитор телек по HDMI, то выставить по умолчанию вывод звука hidifinition audio или что там у вас выводит на линейные выходы...
Для чувствительности стоит поиграться громкостью по выходу и входу.
Это осциллограф и одновременно тест входа, вдруг пригодлится для настройки
https://labs.thygate.com/online-2ch-oscilloscope-and-function-generator/
Если не запустится сразу,(не будет звука при снятии галочки mute audio) то надо открыть сраничку через предудущий раздел автора
(это какой-т баг...)

Еще один показометр микрофонного входа: https://webaudioapi.com/samples/microphone/

Вроде пока все.
 

Серж17

✩✩✩✩✩✩✩
4 Авг 2025
4
0
Еще немоного посмотрел....
И оказалось что авторы не используют какой либо математический анализ спектра чтобы детектировать сигнал.
Они просто детектируют нижние значения аудио АЦП и фиксируют это как 0 ,верхние значение фиксируют как единицу.
Накладывая это на временное окно в 9600 бод , фактически происходит автовыборка и декодирование словаа и пакетов..
Остался примитивный HTML
 

wizard suleiman

✩✩✩✩✩✩✩
13 Окт 2023
60
3
выложу тут еще раз код сохранения файлов на sd карту, с помощью wifi, может будет полезно...
не помню уже для esp8266 или esp32,(версия ядра не более 2.0.17) а может на любых платах идет...

C++:
#include <WiFi.h>
#include <ESPAsyncWebServer.h>
#include <SD.h>
#include <SPI.h>

const char* ssid = "ESP32-Access-Point"; // Имя точки доступа
const char* password = "123456789"; // Пароль точки доступа

AsyncWebServer server(80); // Создание асинхронного веб-сервера на порту 80

void setup() {
Serial.begin(115200); // Инициализация последовательного порта
// Инициализация точки доступа
WiFi.softAP(ssid, password);
Serial.println("Access Point started");
// Получение IP-адреса
IPAddress myIP = WiFi.softAPIP();
Serial.print("ESP32 AP IP address: ");
Serial.println(myIP); // Вывод IP-адреса в последовательный порт
 
// Инициализация SD-карты
if (!SD.begin()) { Serial.println("Ошибка инициализации SD-карты!"); return; }
Serial.println("SD-карта инициализирована успешно.");
// Установка обработчика для корневого URL
server.on("/", HTTP_GET, [](AsyncWebServerRequest *request){
String html = "<html><body>";
html += "<h1>Upload MP3 File</h1>";
html += "<form action=\"/upload\" method=\"POST\" enctype=\"multipart/form-data\">";
html += "<input type=\"file\" name=\"file\">";
html += "<input type=\"submit\" value=\"Upload\">";
html += "</form>";
html += "</body></html>";
request->send(200, "text/html", html); // Отправка HTML-страницы
});
// Установка обработчика для загрузки файла
server.on("/upload", HTTP_POST, [](AsyncWebServerRequest *request){
// Обработка загрузки файла
}, handleFileUpload);
// Запуск сервера
server.begin();
Serial.println("HTTP server started");
}

void loop() {
// Обработка клиентов не требуется, так как используется асинхронный сервер
}
void handleFileUpload(AsyncWebServerRequest *request, String filename, size_t index, uint8_t *data, size_t len, bool final) {
static File file; // Объявляем переменную file как статическую, чтобы она сохраняла свое значение между вызовами
if (!index) {
Serial.printf("Upload Start: %s\n", filename.c_str());
// Открываем файл для записи на SD-карту
file = SD.open("/" + filename, FILE_WRITE);
if (!file) {
Serial.println("Не удалось открыть файл для записи");
request->send(500, "text/plain", "Не удалось открыть файл для записи");
return;
} else {
Serial.printf("Файл %s успешно открыт для записи.\n", filename.c_str());
}
}
// Записываем данные в файл
if (len) {
file.write(data, len);
Serial.printf("Записано %d байт в файл %s\n", len, filename.c_str());
}
if (final) {
file.close();
Serial.printf("Файл %s успешно загружен\n", filename.c_str());
request->send(200, "text/plain", "Файл загружен успешно");
}
}
дописать загрузку на телефон еще реально легко, удачи)))