Archivos de alojamiento en el servidor web ESP32 desde la tarjeta MicroSD


En este post vamos a construir un servidor web ESP32 para servir archivos desde una tarjeta microSD usando un módulo de tarjeta microSD, el cual se comunicara usando el protocolo SPI sirviendo sus archivos HTML, CSS, JavaScript, imágenes y otros activos guardados en la tarjeta microSD. Esto puede ser especialmente útil si sus archivos son demasiado grandes para caber en el sistema de archivos (SPIFFS), o también puede ser más conveniente según su proyecto. Para construir el servidor web, usaremos la biblioteca ESPAsyncWebServer.

Archivos de alojamiento del servidor web ESP32 desde la tarjeta MicroSD

Descripción del proyecto

Para mostrarle cómo crear un servidor web con archivos de una tarjeta microSD, crearemos una página HTML simple que muestra texto formateado con CSS. También serviremos un favicon. La siguiente imagen muestra la página web que serviremos:

Servidor web ESP32 con archivos desde tarjeta microSD
  • El servidor web se construye utilizando la biblioteca ESPAsyncWebServer ;
  • Los archivos HTML, CSS y favicon se guardan en la tarjeta microSD;
  • La tarjeta microSD se comunica con el ESP32 a través del protocolo de comunicación SPI;
  • Cuando el cliente realiza una solicitud al ESP32, este sirve los archivos guardados en la tarjeta microSD;
Servidor web ESP32 con archivos de tarjeta microSD Cómo funciona

Módulo de tarjeta MicroSD

Existen diferentes módulos de tarjetas microSD compatibles con el ESP32. Estamos utilizando el módulo de tarjeta microSD que se muestra en la siguiente figura el cual se comunica mediante el protocolo de comunicación SPI. Puede usar cualquier otro módulo de tarjeta microSD con una interfaz SPI.

Módulo de tarjeta microSD para ESP32 ESP8266 Arduino SPI

Asignación de pines del módulo de la tarjeta MicroSD

El módulo de la tarjeta microSD se comunica mediante el protocolo de comunicación SPI. Usaremos los pines SPI ESP32 predeterminados como se muestra en la siguiente tabla:

módulo de tarjeta microSDESP32
3V33,3 V
CSGPIO5
MOSIGPIO23
CLKGPIO18
MISOGPIO19
TIERRATIERRA

Preparación de la tarjeta MicroSD

Antes de continuar , asegúrese de formatear su tarjeta microSD como FAT32 . Siga las siguientes instrucciones para formatear su tarjeta microSD o use una herramienta de software como SD Card Formater (compatible con Windows y Mac OS).

1.  Inserte la tarjeta microSD en su computadora. Vaya a  Mi PC  y haga clic derecho en la tarjeta SD. Seleccione  Formato  como se muestra en la figura a continuación.

Preparación de la tarjeta MicroSD Formato de tarjeta microSD

2.  Aparece una nueva ventana. Seleccione  FAT32 , presione  Iniciar  para iniciar el proceso de formateo y siga las instrucciones en pantalla.

Preparación de la tarjeta MicroSD Formato de tarjeta microSD

Después de formatear la tarjeta microSD, puede pegar allí los archivos utilizados para construir el servidor web, moveremos los ficheros index.html,estilo.css, y favicon.png a allí. Siga la siguiente sección para obtener sus archivos.

Archivo HTML

Crea un archivo llamado index.html con el siguiente contenido:

<!DOCTYPE HTML><html>
<head>
  <meta name="viewport" content="width=device-width, initial-scale=1">
  <link rel="stylesheet" type="text/css" href="style.css">
  <link rel="icon"  type="image/png" href="favicon.png">
  <title>ESP Web Server</title>
</head>
<body>
  <h1>Hello World!</h1>
  <p>This page was built with files from a microSD card.</p>
</body>
</html>

Archivo CSS

Crea un archivo llamado style.css con el siguiente contenido:

html {
    font-family: Arial; 
    text-align: center;
}
body {
    max-width: 400px; 
    margin:0px auto;
}

icono de favoritos

También serviremos un favicon. Es una imagen png de 15×15 píxeles. Puede usar el mismo favicon que el nuestro, o su propio ícono, o ningún favicon.

Puede hacer clic en el siguiente enlace para descargar el favicon:

  • Descargar archivo favicon.png

Copiar archivos a la tarjeta MicroSD

Después de tener todos los archivos preparados, abra el directorio de la tarjeta microSD y pegue los archivos.

Carpeta de tarjeta microSD con archivos para construir servidor web

Piezas necesarias

Placa de pruebas de cableado del módulo de tarjeta microSD ESP32

Para este cometido necesitamos las siguientes partes:

  • ESP32  
  • Módulo de tarjeta microSD
  • Tarjeta micro SD
  • Tablero de circuitos
  • Cables puente

Diagrama esquemático

Conecte el módulo de la tarjeta microSD al ESP32 como se muestra en el siguiente diagrama esquemático, donde como vemos alimentamos desde el ESP32 al lector de tarjetas y usaremos los pines SPI del ESP32 predeterminados ( GPIOS 5,23,18 Y 19) tal y como se ha expuesto en la sección anterior.

Diagrama de cableado del módulo de tarjeta microSD ESP32

Código

Copie el siguiente código en su IDE de Arduino.

/*
  Rui Santos
  Complete project details at https://RandomNerdTutorials.com/esp32-web-server-microsd-card/
  
  Permission is hereby granted, free of charge, to any person obtaining a copy
  of this software and associated documentation files.
  
  The above copyright notice and this permission notice shall be included in all
  copies or substantial portions of the Software.
*/

#include <Arduino.h>
#include <WiFi.h>
#include <AsyncTCP.h>
#include <ESPAsyncWebServer.h>
#include "FS.h"
#include "SD.h"
#include "SPI.h"

// Replace with your network credentials
const char* ssid = "REPLACE_WITH_YOUR_SSID";
const char* password = "REPLACE_WITH_YOUR_PASSWORD";

// Create AsyncWebServer object on port 80
AsyncWebServer server(80);

void initSDCard(){
  if(!SD.begin()){
    Serial.println("Card Mount Failed");
    return;
  }
  uint8_t cardType = SD.cardType();

  if(cardType == CARD_NONE){
    Serial.println("No SD card attached");
    return;
  }

  Serial.print("SD Card Type: ");
  if(cardType == CARD_MMC){
    Serial.println("MMC");
  } else if(cardType == CARD_SD){
    Serial.println("SDSC");
  } else if(cardType == CARD_SDHC){
    Serial.println("SDHC");
  } else {
    Serial.println("UNKNOWN");
  }
  uint64_t cardSize = SD.cardSize() / (1024 * 1024);
  Serial.printf("SD Card Size: %lluMB\n", cardSize);
}

void initWiFi() {
  WiFi.mode(WIFI_STA);
  WiFi.begin(ssid, password);
  Serial.print("Connecting to WiFi ..");
  while (WiFi.status() != WL_CONNECTED) {
    Serial.print('.');
    delay(1000);
  }
  Serial.println(WiFi.localIP());
}

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

  server.on("/", HTTP_GET, [](AsyncWebServerRequest *request){
    request->send(SD, "/index.html", "text/html");
  });

  server.serveStatic("/", SD, "/");

  server.begin();
}

void loop() {
  
}

Obviamente debe insertar sus credenciales de red en las siguientes variables y el código debería funcionar de inmediato:

// Replace with your network credentials
const char* ssid = "REPLACE_WITH_YOUR_SSID";
const char* password = "REPLACE_WITH_YOUR_PASSWORD";

Cómo funciona el código

Primero, asegúrese de incluir las bibliotecas FS.h,SD.h y SPI. h para poder comunicarse con la tarjeta microSD y manejar archivos.

#include "FS.h"
#include "SD.h"
#include "SPI.h"

Inicializar tarjeta MicroSD

losinitSDCard() es la función que inicializa la tarjeta microSD en los pines SPI predeterminados.

void initSDCard(){
  if(!SD.begin()){
    Serial.println("Card Mount Failed");
    return;
  }
  uint8_t cardType = SD.cardType();

  if(cardType == CARD_NONE){
    Serial.println("No SD card attached");
    return;
  }
  Serial.print("SD Card Type: ");
  if(cardType == CARD_MMC){
    Serial.println("MMC");
  } else if(cardType == CARD_SD){
    Serial.println("SDSC");
  } else if(cardType == CARD_SDHC){
    Serial.println("SDHC");
  } else {
    Serial.println("UNKNOWN");
  }
  uint64_t cardSize = SD.cardSize() / (1024 * 1024);
  Serial.printf("SD Card Size: %lluMB\n", cardSize);
}

Luego, debe llamar a esta función en la configuración():

initSDCard();

Servir archivos desde la tarjeta microSD

Cuando accede a la dirección IP ESP32 en la raíz (/) URL, envíe el archivo HTML guardado en la tarjeta microSD.

server.on("/", HTTP_GET, [](AsyncWebServerRequest *request){
  request->send(SD, "/index.html", "text/html");
});

El primer argumento de la función de enviar() es el sistema de archivos donde se guardan los archivos. En este caso, se guarda en la tarjeta SD. El segundo argumento es la ruta donde se encuentra el archivo.(/index.html). El tercer argumento se refiere al tipo de contenido (texto/html).

Cuando el archivo HTML se cargue en su navegador, solicitará los archivos CSS y favicon. Estos son archivos estáticos guardados en el mismo directorio . Podemos agregar la siguiente línea para servir archivos estáticos en un directorio cuando lo solicite la URL raíz. Sirve los archivos CSS y favicon automáticamente.

server.serveStatic("/", SD, "/");

Si su servidor web necesita manejar más rutas, puede agregarlas a la configuración(). No olvide configurar SD como primer argumento de la función enviar(). De esta forma, buscará los archivos en la tarjeta microSD.

Es tan simple como esto. Esto se puede aplicar a cualquier otro proyecto de servidor web.

Demostración

Después de cargar el código, abra el monitor en serie a una velocidad de transmisión de 115200. Presione el botón RST integrado.

Debería obtener algo similar en el Serial Monitor: la dirección IP ESP32 e información sobre la tarjeta microSD.

Servidor web con archivos de la tarjeta MicroSD Dirección IP del monitor serie

Abra un navegador en su red local y pegue la dirección IP ESP32. Cargará la siguiente página web con los archivos guardados en la tarjeta microSD. Observe el icono de favoritos en la barra de título del navegador web.

Servidor web ESP32 con archivos desde tarjeta microSD

Medidas eléctricas para 6 canales (hardware)


El medidor de energía ESP32 de 6 canales expandible puede leer 6 canales de corriente y 2 canales de voltaje a la vez. Utiliza transformadores de corriente y un transformador de CA para medir el voltaje y alimentar la(s) placa(s)/ESP32. La placa principal incluye un convertidor reductor para alimentar la electrónica y la placa de desarrollo ESP32, que se conecta directamente a la placa. Se pueden apilar hasta 6 placas adicionales encima de la placa principal para permitirle monitorear hasta 42 canales actuales en resolución de 16 bits, en tiempo real, ¡todo a la vez!

El uso de esta placa puede ser bien Monofásico (Split norteamericano monofásico 120V/240V 60Hz – red y/o circuitos individuales o Monofásico europeo 240V 50Hz debiéndose proporcionar transformador AC-AC 9V o 12V con al menos 500mA de salida) o Trifásico: se recomienda medir los 3 voltajes con 3 transformadores de voltaje. Esto se puede hacer usando una placa principal con 1 placa adicional pudiendose usar un solo medidor para medir trifásico, pero la potencia (vataje) no se calculará correctamente. La potencia se puede calcular en el software, pero el factor de potencia deberá estimarse ((voltaje*corriente)*power_factor)).

Características:

  • Muestras de 6 canales de corriente y 1 canal de voltaje (ampliable a 2 voltajes)
  • Las placas complementarias (hasta 6) pueden expandir el medidor hasta 42 canales de corriente y 8 canales de voltaje
  • Utiliza 2  Microchip ATM90E32AS – 3 canales de corriente y 1 voltaje por IC
  • Para cada canal, el medidor también puede calcular lo siguiente:
    • Poder activo
    • Poder reactivo
    • Poder aparente
    • Factor de potencia
    • Frecuencia
    • La temperatura
  • Utiliza abrazaderas de transformador de corriente estándar para probar la corriente
  • Resistencias de carga de 22 ohmios por canal de corriente
  • Incluye convertidor reductor incorporado para alimentar ESP32 y electrónica
  • 2 interrupciones IRQ y 1 salida de advertencia conectada a ESP32
  • Salidas de cruce por cero
  • Salidas de pulso de energía por IC (4 por IC x2)
  • Interfaz SPI
  • Error de medición IC: 0,1%
  • Rango dinámico IC: 6000:1
  • Selección de ganancia actual: hasta 4x
  • Deriva de referencia de voltaje típica (ppm/°C): 6
  • Resolución ADC (bits): 16

Lo que necesitará:

  • Transformadores de corriente (cualquier combinación de los siguientes, o cualquier transformador de corriente que no supere los 720 mV RMS o la salida de 33 mA)
    • SCT-006 20A/25mA Micro (apertura de 6 mm – conectores de 3,5 mm)
    • SCT-010 80A/26.6mA Mini (apertura 10mm – conectores 3.5mm)
    • SCT-013-000 100A/50mA (apertura 13mm – conectores 3.5mm)
    • SCT-016 120A/40mA (apertura 16mm – conectores 3.5mm)
    • Magnelab SCT-0750-100 (conectores de tornillo: debe cortar la conexión de la resistencia de carga en la parte posterior de la placa, ya que tienen una resistencia de carga incorporada).
    • SCT-024 200A/100mA (apertura 24mm – salida terminal)
    • También se pueden usar otros, siempre que estén clasificados para la cantidad de energía que desea medir y tengan una salida de corriente de no más de 720 mV RMS, o 33 mA en la salida máxima.
  • Transformador de CA (NO CC):
    • América del Norte: Jameco Reliapro 120V a 9V AC-AC o 12v. El pin positivo debe ser de 2,5 mm (algunos son de 2,1)
    • Europa: 240 V a 9 V o 12 V CA-CA al menos 500 mA
  • ESP32 (elija uno):
    • NodoMCU 32s
    • Espressif DevKitC
    • DevKitC-32U si necesita una mejor recepción wifi (no olvide la antena )
    • Cualquier otra cosa con los mismos pines que el anterior, que generalmente son 19 pines por lado con 3v3 en la parte superior izquierda y CLK en la parte inferior derecha
  • Software (elija uno):
    • La versión personalizada de EmonESP y la biblioteca Arduino ATM90E32
    • La versión actual de ESPHome. Los detalles sobre la integración con Home Assistant se encuentran aquí. 
    • Bibliotecas para CircuitPython y MicroPython

Configuración del medidor

Diagrama del medidor de energía ESP32 de 6 canales expandible
Diagrama posterior del medidor de energía ESP32 de 6 canales expandible

Conectando el ESP32

El medidor de energía ESP32 de 6 canales expandible está hecho para que una placa de desarrollo ESP32 se pueda conectar directamente al medidor. Consulte la lista anterior para conocer las placas de desarrollo ESP32 compatibles. Siempre inserte el ESP32 con el pin 3V3 en la parte superior izquierda del medidor . Los pines inferiores se utilizan para conectar la señal de voltaje (del enchufe de alimentación) a las placas adicionales. Si el ESP32 se inserta en los pines inferiores, lo más probable es que haga un cortocircuito en el ESP32.

Comunicarse con el ESP32

El medidor de energía ESP32 de 6 canales expandible utiliza SPI para comunicarse con el ESP32. Cada placa utiliza 2 pines CS.

La placa principal utiliza los siguientes pines SPI:

  • CLK – 18
  • miso – 19
  • MOSI – 23
  • CS1 – 5 (CT1-CT3 y voltaje 1)
  • CS2 – 4 (CT4-CT6 y voltaje 2)

Placas complementarios

Las placas adicionales (hasta 6) pueden expandir el medidor de energía principal hasta 42 canales de corriente y 8 canales de voltaje. Las placas complementarias se conectan directamente a la placa principal como se ve aquí.

La placa adicional permite seleccionar el pin CS en función de la configuración del puente en la parte inferior de la placa. Esto es para que se puedan usar varias placas complementarias, hasta un máximo de 6. NO seleccione más de un pin CS por banco. Los pines CS pueden ser:

  • CT1-CT3 (CS):
    • Para v1.3 y anteriores:
      • 0
      • 2 (*asegúrese de que no se utilice un LED integrado para IO2 en el ESP32)
      • 12 (*hará que ESP32 no arranque si se usa)
      • 13
      • 14
      • 15
    • Para v1.4 y superior:
      • 0
      • 27
      • 35 (no usar, no funcionará correctamente)
      • 13
      • 14
      • 15
    • Para v1.4 rev1 y superior:
      • 35 se cambia a 2 (puede evitar que se programe el ESP32; si es así, desconecte el puente)
  • CT4-CT6 (CS2):
    • dieciséis
    • 17
    • 21
    • 22
    • 25
    • 26

Calibración de sensores de corriente y voltaje (transformador de CA)

Valores de calibración comunes
  • Transformadores de corriente:
    • 20A/25mA SCT-006: 11143
    • 30A/1V SCT-013-030: 8650
    • 50A/1V SCT-013-050: 15420
    • 80A/26,6mA SCT-010: 41660
    • 100A/50mA SCT-013-000: 27518
    • 120A/40mA: SCT-016: 41787
    • 200A/100mA SCT-024: 27518
  • Transformadores de CA
    • Transformador Jameco 9VAC 157041:
      • Para versiones de contador:
        • v1.3 o superior: 7305
        • v1.2: 42620

Medición de potencia y otros valores de medición

El medidor de energía ESP32 de 6 canales expandible utiliza 2 circuitos integrados ATM90E32AS. Cada IC tiene 3 canales de voltaje y 3 canales de corriente. Para que los datos de medición de potencia se calculen internamente, cada canal de corriente debe tener un voltaje de referencia. Si el voltaje está desfasado con la corriente, entonces la corriente y la potencia se leerán como negativas, lo que afectará el factor de potencia y los cálculos de potencia. Si tiene una configuración dividida monofásica o bifásica, la solución es dar la vuelta al transformador de corriente en el cable.

v1.1 del medidor usó 1 de los canales de voltaje para cada IC. Esto significa que los datos de potencia y medición tendrían que calcularse en el software, o los canales de voltaje tendrían que mapearse a través de registros cambiantes en el IC para obtener datos de potencia y medición de CT2, CT3, CT5, CT6.

v1.2 y v1.3 tienen JP8-JP11 en la parte posterior de la placa, lo que permitiría conectar todos los canales de voltaje, lo que permitiría calcular la potencia y otros valores de medición. La mayor parte de v1.3 vino soldada.

v1.4 eliminó JP8-JP11 y tiene canales de voltaje conectados internamente en la pcb.

Medición de circuitos de dos polos (240 V)

Para aplicaciones monofásicas divididas, los circuitos de dos polos tienen 2 cables activos que totalizan 240 V (generalmente rojo y negro en los edificios más nuevos). En la mayoría de los casos, ambos polos se usan por igual, pero en otros puede haber componentes electrónicos en el aparato que usan solo 1 polo. Hay 3 opciones diferentes para medir estos circuitos:

  • Monitoree 1 fase con 1 CT y duplique la salida de corriente en el software (menos preciso) Vea los detalles sobre cómo hacer esto en ESPHome aquí .
  • Use 2 CT para monitorear cada cable vivo en el circuito (si está monitoreando 1 voltaje, deben estar en direcciones opuestas entre sí)
  • Si tiene suficiente cable y el CT es lo suficientemente grande, pase ambos cables calientes a través de 1 CT en direcciones opuestas

Medición de un segundo voltaje

Los orificios etiquetados como VA2 al lado del enchufe de alimentación en la placa principal del medidor y en la parte inferior derecha de la placa adicional son para medir un segundo voltaje. Para hacer esto debes:

  • Corte (con un cuchillo) JP12 y JP13 en la parte posterior de la placa para v1.3+, o JP7 para versiones anteriores
  • Use un segundo transformador de CA, idealmente uno idéntico al primario
  • Enchufe el segundo transformador de CA a un tomacorriente en la fase opuesta al primario
  • Suelde en un cabezal de clavija, un conector de tornillo de 3,5 mm (2,54 mm para v1.3 y anteriores) o un conector flexible estilo CC en VA2+ y VA2- (junto al conector principal de alimentación/voltaje)

Cuando se cortan los puentes de voltaje, la referencia de voltaje para CT4-CT6 será de VA2. Esto significa que los transformadores de corriente para CT4-CT6 deben conectarse a circuitos que estén en la misma fase que VA2, y CT1-CT3 deben conectarse a circuitos que estén en fase con el voltaje primario. Si un CT no está en fase con el voltaje, sus lecturas de corriente y potencia serán negativas. Si, por ejemplo, tiene 4 circuitos en fase con el primario y 2 en fase con VA2, puede invertir el transformador de corriente en el cable para ponerlo en fase con el voltaje (suponiendo que se divide en monofásico o bifásico)

Para tableros complementarios, el voltaje principal provendrá del tablero principal. La medición de voltaje secundario opcional (también pines VA2), estará en fase con CT4-CT6.

Medición de electricidad trifásica

Lo que necesitará para medir las 3 fases correctamente:

  • Placa principal de 6 canales (v1.4 y superior)
  • Tablero adicional de 6 canales
  • 3 transformadores de tensión, uno para cada fase. Estos pueden ser de pared, de tipo enchufable (si tiene un tomacorriente conectado a cada fase) o transformadores independientes conectados directamente a los disyuntores. Deben bajar el voltaje a entre 9 y 14 V CA. El primero que se conecta a la placa principal también alimenta el ESP32 y la electrónica, por lo que debe generar al menos 500 mA.
  • Cabeceras soldadas a los terminales VA2 en la placa principal y la placa complementaria
  • JP12 y JP13 cortados en la placa principal y las placas complementarias Similar a lo anterior para medir un segundo voltaje, una vez que se cortan JP12 y JP13:
  • CT1-CT3 en la placa principal y CT1-CT3 en la placa adicional estarán en fase con la primera fase
  • CT3-CT4 en el tablero principal con la 2da fase
  • CT3-CT4 en la placa adicional con la 3.ª fase.

Los transformadores deben calibrarse individualmente para una mayor precisión.

Como alternativa, puede utilizar 2 placas complementarias y conectar 1 transformador a cada placa:

  • Ubique los pines más inferiores (es decir, aquellos en los que el ESP32 no se conecta), marcados como «VA-» y «VA+» para cada placa adicional. Estos normalmente proporcionan la referencia de voltaje a la placa adicional desde la placa principal.
  • Corta estos alfileres
  • Suelde un conector, o los cables de un transformador, en los orificios inferiores derechos marcados como «VA2» en las placas complementarias. La polaridad no importa (si obtiene lecturas de corriente negativas, invierta el CT en el cable)
  • No corte JP12 y JP13

En los sistemas trifásicos, un transformador de corriente que está conectado a una fase que no está en fase con la referencia de voltaje siempre dará como resultado una potencia activa y un factor de potencia cercanos a cero.

A continuación podemos ver un video que resume tanto la electrónica necesaria como las opciones de configuración posibles que veremos en un segundo post.


Fuente: https://github.com/CircuitSetup/Expandable-6-Channel-ESP32-Energy-Meter