• Система автоматизации с открытым исходным кодом на базе esp8266/esp32 микроконтроллеров и приложения IoT Manager. Наша группа в Telegram

ESP32 wi-fi микрофон

Передача голоса по нажатию кнопки, воспроизведение после отпускания.Частота дискретизации 8kHz. Сейчас используется один буфер по максимуму.Использование двойного буфера и передача по заполнении первого приводит к тому, что на этапе передачи первого буфера пока второй заполняется данными с АЦП.Первый не успевает улететь по wi'fi и в лутшем случае данные перезатираются.
Использовалось два буфера по 16 кило.Есть вариант использовать кодек G711 это уменьшит количество передаваемых данных в 2 раза.Кольцевой буфер тоже не помог.Но как насчет потоковой передачи?Не хочется использовать PSRAM. Вроде поток данных для wi-fi не очень большой.Wi'fi камера на esp32 выдает картинку около 15кило при 800x600 10fps.Может работа АЦП с прерываниями 8000 рас в секунду тормозят передачу по wi'fi?
 
Код:
 void IRAM_ATTR onTimer() {
    portENTER_CRITICAL_ISR(&timerMux);
    adc_Buffer[bufN][bufferPointer++] = (adc1_get_raw(ADC1_CHANNEL_0)-1400)*6;
    bufferPointer &= ADC_BUF_MASK;
    if(bufferPointer == 0) bufN = bufN ? 0:1;
    portEXIT_CRITICAL_ISR(&timerMux);
   }

Далее примерно так но пишет error, eсли передавать весь размер буфера.Если половину успевает, но выпадают слова :

Код:
void loop() {
     ready_buf = bufN ? 0:1;
     int button_state = digitalRead(BUTTON);
     if (ready_buf != sent_buf and button_state == LOW){
        if (end_of_pac_flag == 0){
           portENTER_CRITICAL_ISR(&timerMux);
          bufferPointer = 0;
          portEXIT_CRITICAL_ISR(&timerMux);
        }
        end_of_pac_flag = 1;
        uint8_t *buf = (uint8_t*)adc_Buffer[ready_buf];
        size_t size = sizeof(adc_Buffer[ready_buf]);
        bytecounter += size;
        size_t offset = 0;
        size_t ret = 0;
        Serial.println("start send buf");
        while (1)
       {
          if(bufN==ready_buf)Serial.println("error");
           ret = client.write(buf + offset, size);
           offset += ret;
           size -= ret;
           if (ADC_BUF_SIZE == offset)
           {
              break;
           }  
       }
        sent_buf = ready_buf;
     }
     
    if(end_of_pac_flag == 1 and button_state == HIGH){
       client.print("\r\n\r\n");//end of message
       end_of_pac_flag = 0;
    }
     
}
 

enjoynering

Well-known member
На сколько мне известно на Wi'fi камере как раз и стоит PSRAM для железного кольцевого буфера.
 
Да должно и без нее успевать работать.8kHz 16 бит 1 семпл АЦП - это поток 128 килобит это смешной поток чтобы не успевать его передавать.Думаю работа АЦП с прерываниями сильно тормозит работу.Нужно замерить скорость передачи с АЦП и без все станет на свои места.
 
Сверху Снизу