SHA256
434 lines
5.0 KiB
Markdown
434 lines
5.0 KiB
Markdown
# ESP32-WiFi-BME
|
|
|
|
API modular para adquisición ADC continua usando DMA en ESP32-S3 y transmisión binaria mediante WebSocket utilizando FreeRTOS.
|
|
|
|
---
|
|
|
|
# Arquitectura General
|
|
|
|
```text
|
|
ADC -> DMA -> RingBuffer -> WebSocket
|
|
```
|
|
|
|
El proyecto está dividido en APIs modulares independientes:
|
|
|
|
- `ADCconf`
|
|
- `WiFiConf`
|
|
- `WebSocketHandler`
|
|
|
|
Cada API encapsula una funcionalidad específica para facilitar integración, mantenimiento y reutilización.
|
|
|
|
---
|
|
|
|
# ADCconf API
|
|
|
|
API encargada de configurar y manejar el ADC continuo utilizando DMA mediante la API ESP-IDF.
|
|
|
|
## Características
|
|
|
|
- ADC continuo
|
|
- DMA
|
|
- Parseo automático de muestras
|
|
- Callback mediante interrupciones
|
|
- Conversión de datos crudos a `uint16_t`
|
|
|
|
---
|
|
|
|
## Configuración
|
|
|
|
### Inclusión
|
|
|
|
```cpp
|
|
#include "ADCconf.h"
|
|
```
|
|
|
|
---
|
|
|
|
### Definición de buffers
|
|
|
|
```cpp
|
|
#define MS_BLOQUE 10
|
|
|
|
adc_channel_t CHANNEL = ADC_CHANNEL_3;
|
|
|
|
const uint32_t HZ_ADC = 1000;
|
|
|
|
const uint32_t MUESTRAS_BLOQUE =
|
|
(HZ_ADC * MS_BLOQUE) / 1000;
|
|
|
|
uint8_t dma_buffer[
|
|
MUESTRAS_BLOQUE *
|
|
SOC_ADC_DIGI_RESULT_BYTES
|
|
] = {0};
|
|
|
|
uint16_t samples_buffer[
|
|
MUESTRAS_BLOQUE
|
|
] = {0};
|
|
```
|
|
|
|
---
|
|
|
|
### Crear objeto ADC
|
|
|
|
```cpp
|
|
ADC_BME adc1_3;
|
|
```
|
|
|
|
---
|
|
|
|
### Configuración ADC
|
|
|
|
```cpp
|
|
adc1_3.config(
|
|
MUESTRAS_BLOQUE,
|
|
CHANNEL,
|
|
HZ_ADC,
|
|
dma_buffer
|
|
);
|
|
```
|
|
|
|
---
|
|
|
|
### Inicializar ADC
|
|
|
|
```cpp
|
|
adc1_3.setup();
|
|
```
|
|
|
|
---
|
|
|
|
### Lectura de muestras
|
|
|
|
```cpp
|
|
uint32_t count =
|
|
adc1_3.read(samples_buffer);
|
|
```
|
|
|
|
La función retorna:
|
|
|
|
- `0` si no existen datos disponibles
|
|
- cantidad de muestras válidas si existen datos DMA
|
|
|
|
---
|
|
|
|
## Flujo Interno
|
|
|
|
```text
|
|
ADC HW
|
|
↓
|
|
DMA Buffer
|
|
↓
|
|
adc_continuous_read()
|
|
↓
|
|
adc_continuous_parse_data()
|
|
↓
|
|
samples_buffer[]
|
|
```
|
|
|
|
---
|
|
|
|
# WiFiConf API
|
|
|
|
API modular para configuración WiFi en modo STA.
|
|
|
|
---
|
|
|
|
## Características
|
|
|
|
- Configuración IP estática
|
|
- Manejo de eventos WiFi
|
|
- Reconexión automática
|
|
- Encapsulación de configuración de red
|
|
|
|
---
|
|
|
|
## Inclusión
|
|
|
|
```cpp
|
|
#include "WiFiConf.h"
|
|
```
|
|
|
|
---
|
|
|
|
## Crear objeto WiFi
|
|
|
|
```cpp
|
|
wifi_conf sta_esp32;
|
|
```
|
|
|
|
---
|
|
|
|
## Configuración de red
|
|
|
|
```cpp
|
|
const char* SSID = "MiRed";
|
|
const char* PASSWD = "password";
|
|
|
|
IPAddress local_ip(192,168,0,220);
|
|
IPAddress gateway(192,168,0,1);
|
|
IPAddress subnet(255,255,255,0);
|
|
|
|
IPAddress dns1(192,168,0,1);
|
|
IPAddress dns2(1,1,1,1);
|
|
```
|
|
|
|
---
|
|
|
|
## Conexión WiFi
|
|
|
|
```cpp
|
|
sta_esp32.conectar(
|
|
SSID,
|
|
PASSWD,
|
|
local_ip,
|
|
gateway,
|
|
subnet,
|
|
dns1,
|
|
dns2
|
|
);
|
|
```
|
|
|
|
---
|
|
|
|
## Eventos Implementados
|
|
|
|
La API maneja automáticamente:
|
|
|
|
- conexión WiFi
|
|
- desconexión
|
|
- reconexión
|
|
- obtención de IP
|
|
|
|
---
|
|
|
|
# WebSocketHandler API
|
|
|
|
API encargada de manejar eventos WebSocket.
|
|
|
|
---
|
|
|
|
## Características
|
|
|
|
- detección de clientes
|
|
- conexión/desconexión
|
|
- recepción de mensajes
|
|
- manejo de bandera global de conexión
|
|
|
|
---
|
|
|
|
## Inclusión
|
|
|
|
```cpp
|
|
#include "WebSocketHandler.h"
|
|
```
|
|
|
|
---
|
|
|
|
## Crear servidor WebSocket
|
|
|
|
```cpp
|
|
WebSocketsServer webSocket(81);
|
|
```
|
|
|
|
---
|
|
|
|
## Inicialización
|
|
|
|
```cpp
|
|
webSocket.begin();
|
|
webSocket.onEvent(webSocketEvent);
|
|
```
|
|
|
|
---
|
|
|
|
## Loop principal
|
|
|
|
```cpp
|
|
webSocket.loop();
|
|
```
|
|
|
|
---
|
|
|
|
## Transmisión BIN
|
|
|
|
```cpp
|
|
webSocket.broadcastBIN(
|
|
(uint8_t*)buffer,
|
|
size
|
|
);
|
|
```
|
|
|
|
---
|
|
|
|
## Handler de eventos
|
|
|
|
```cpp
|
|
void webSocketEvent(
|
|
uint8_t num,
|
|
WStype_t type,
|
|
uint8_t * payload,
|
|
size_t length
|
|
);
|
|
```
|
|
|
|
---
|
|
|
|
## Eventos soportados
|
|
|
|
### Cliente conectado
|
|
|
|
```cpp
|
|
WStype_CONNECTED
|
|
```
|
|
|
|
---
|
|
|
|
### Cliente desconectado
|
|
|
|
```cpp
|
|
WStype_DISCONNECTED
|
|
```
|
|
|
|
---
|
|
|
|
### Mensajes recibidos
|
|
|
|
```cpp
|
|
WStype_TEXT
|
|
```
|
|
|
|
---
|
|
|
|
# Integración con FreeRTOS
|
|
|
|
El sistema utiliza multitarea mediante FreeRTOS.
|
|
|
|
---
|
|
|
|
## ADCTask
|
|
|
|
Responsable de:
|
|
|
|
- adquisición ADC
|
|
- lectura DMA
|
|
- inserción en RingBuffer
|
|
|
|
---
|
|
|
|
## WebSocketTask
|
|
|
|
Responsable de:
|
|
|
|
- `webSocket.loop()`
|
|
- transmisión BIN
|
|
- extracción del RingBuffer
|
|
|
|
---
|
|
|
|
# RingBuffer
|
|
|
|
Se utiliza `xRingbuffer` para desacoplar:
|
|
|
|
```text
|
|
Adquisición ADC
|
|
```
|
|
|
|
de:
|
|
|
|
```text
|
|
Transmisión WebSocket
|
|
```
|
|
|
|
---
|
|
|
|
## Creación
|
|
|
|
```cpp
|
|
RingbufHandle_t bufferHandle =
|
|
xRingbufferCreate(
|
|
SIZE_BUFFER,
|
|
RINGBUF_TYPE_NOSPLIT
|
|
);
|
|
```
|
|
|
|
---
|
|
|
|
## Inserción
|
|
|
|
```cpp
|
|
xRingbufferSend(
|
|
bufferHandle,
|
|
samples_buffer,
|
|
count * sizeof(uint16_t),
|
|
pdMS_TO_TICKS(1000)
|
|
);
|
|
```
|
|
|
|
---
|
|
|
|
## Recepción
|
|
|
|
```cpp
|
|
uint16_t* receivedMessage =
|
|
(uint16_t*)xRingbufferReceive(
|
|
bufferHandle,
|
|
&receivedMessageSize,
|
|
pdMS_TO_TICKS(1000)
|
|
);
|
|
```
|
|
|
|
---
|
|
|
|
# Cliente Python
|
|
|
|
Ejemplo de recepción de datos binarios.
|
|
|
|
```python
|
|
from websocket import create_connection
|
|
import struct
|
|
|
|
ws = create_connection(
|
|
"ws://192.168.0.220:81"
|
|
)
|
|
|
|
while True:
|
|
|
|
data = ws.recv()
|
|
|
|
if isinstance(data, bytes):
|
|
|
|
samples = struct.unpack(
|
|
f"<{len(data)//2}H",
|
|
data
|
|
)
|
|
|
|
print(samples)
|
|
```
|
|
|
|
---
|
|
|
|
# Compilación
|
|
|
|
El proyecto esta construido en PlatformIO, para compilar el poryecto es importante instalar sus herramientas en el sistema.
|
|
|
|
|
|
# Dependencias
|
|
|
|
```ini
|
|
lib_deps =
|
|
links2004/WebSockets
|
|
```
|
|
|
|
---
|
|
|
|
# Hardware Compatible
|
|
|
|
- ESP32-S3 DevKitC-1
|
|
- ESP32-S3 N8
|
|
|
|
---
|
|
|
|
# Autor
|
|
|
|
Sebastian Mariano Flores
|