Nombre de red y contraseña de la wifi que crea: ArduinoBlocks_AP y 0123456789.
#include <WiFi.h>
#include <WebServer.h>
#include "FS.h"
#include "SD.h"
#include "SPI.h"
const int chipSelect = SS;//10;
const char espwifi_ap_ssid[]="ArduinoBlocks_AP";
const char espwifi_ap_pass[]="0123456789";
IPAddress espwifi_ap_ip(192,168,2,1);
IPAddress espwifi_ap_sn(255,255,255,0);
IPAddress espwifi_ap_gw(192,168,2,1);
WebServer http_server;
File sd_file;
void espwifi_ap_setup(){
  if(espwifi_ap_pass!=""){
    WiFi.softAP(espwifi_ap_ssid, espwifi_ap_pass);
  }
  else{
    WiFi.softAP(espwifi_ap_ssid);
  }
  WiFi.softAPConfig(espwifi_ap_ip, espwifi_ap_gw, espwifi_ap_sn);
  delay(100);
}
String fnc_sd_content_esp32ks(String _f)
{
  String cont="";
  sd_file = SD.open(String("/")+_f, FILE_READ);
  if(sd_file)
  {
    while(sd_file.available())
    {
      cont += sd_file.readStringUntil('\n');
    }
    sd_file.close();
  }
  return cont;
}
void http_server_on_abrir()
{
  http_server.send(200,String("text/html"),fnc_sd_content_esp32ks(String("archivo_01.csv")));
}
void http_server_on_descargar()
{
  http_server.send(200,String("text/csv"),fnc_sd_content_esp32ks(String("archivo_01.csv")));
}
void _http_server_on__NOTFOUND__(){
  http_server.send(200,String("text/html"),String("CODIGO NO VALIDO"));
}
void http_server_on_(){
  http_server.send(200,String("text/html"),String("Conectado Servidor Web ESP32"));
}
//-----------------------------------------funciones servidor Web---FIN
//-----------------------------------------funciones comunicacion SD
void readFile(fs::FS &fs, const char * path)  //funcion para leer un archivo
{
Serial.println("READFILE.....");
  Serial.printf("Reading file: %s\n", path);
  File file = fs.open(path);
  if(!file){
    Serial.println("Failed to open file for reading");
    return;
  }
  Serial.print("Read from file: ");
  while(file.available())
  {
    Serial.write(file.read());
  }
  file.close();
}
void writeFile(fs::FS &fs, const char * path, const char * message)  //funcion para escribir en un archivo, borra lo anterior. Escribe solo texto
{
  File file = fs.open(path, FILE_WRITE);
  if(!file){
    Serial.println("Failed to open file for writing");
    return;
  }
  if(file.print(message))
  {
  } 
  else 
  {
    Serial.println("Write failed");
  }
  file.close();
}
void incor_datoln(fs::FS &fs, const char * path, const char * message) //funcion para añadir datos a un archivo en una linea nueva, escribe solo texto
{
  File file = fs.open(path, FILE_APPEND);
  if(!file){
    Serial.println("Failed to open file for appending");
    return;
  }
  if(file.println(message))
  {
  } else {
    Serial.println("Append failed");
  }
  file.close();
}
void incor_dato(fs::FS &fs, const char * path, const char * message) //funcion para añadir datos a un archivo en una linea nueva, escribe solo texto
{
  File file = fs.open(path, FILE_APPEND);
  if(!file){
    Serial.print("Failed to open file for appending");
    return;
  }
  if(file.print(message)){
  } else {
    Serial.println("Append failed");
  }
  file.close();
}
void incor_numln(fs::FS &fs, const char * path, int message) //funcion para añadir datos a un archivo en una linea nueva, escribe variables
{
  File file = fs.open(path, FILE_APPEND);
  if(!file){
    Serial.println("Failed to open file for appending");
    return;
  }
  if(file.println(message))
  {
  } else {
    Serial.println("Append failed");
  }
  file.close();
}
void incor_num(fs::FS &fs, const char * path, int message) //funcion para añadir datos a un archivo en una linea nueva, escribe variables
{
  File file = fs.open(path, FILE_APPEND);
  if(!file){
    Serial.print("Failed to open file for appending");
    return;
  }
  if(file.print(message)){
  } else {
    Serial.println("Append failed");
  }
  file.close();
}
//-----------------------------------------funciones comunicacion SD---FIN
void setup()
{
Serial.begin(115200);
Serial.flush();
while(Serial.available()>0)Serial.read();
digitalWrite(2, LOW);
//espwifi_setup();
espwifi_ap_setup();
http_server.begin(80);
Serial.println(WiFi.localIP().toString());
http_server.on("/abrir",HTTP_GET,http_server_on_abrir);
http_server.on("/descargar",HTTP_GET,http_server_on_descargar);
http_server.onNotFound(_http_server_on__NOTFOUND__);
http_server.on("/",HTTP_GET,http_server_on_);
  delay(2000);
  if(!SD.begin(SS)){
    Serial.println("Card Mount Failed");
    return;
  }
  uint8_t cardType = SD.cardType();
  if(cardType == CARD_NONE){
    Serial.println("No SD card attached");
    return;
  }
  writeFile(SD, "/archivo_01.csv", "NUMERO;TEMPERATURA;HUMEDAD");
  incor_datoln(SD, "/archivo_01.csv", "");
  delay(2000);
  readFile(SD, "/archivo_01.csv");
  delay(2000);
}
unsigned long tiempo;
int x=1;
int temperatura;
int humedad;
int numero;
void loop()
{
  http_server.handleClient();
if((millis()-tiempo)>=800)
{
  tiempo=millis();
  if(x<=5)
  {
    temperatura=42+2*x;
    humedad=75+x;
  }
  if(x>5)
  {
    temperatura=70-2*x;
    humedad=90-2*x;
  }
  numero=numero+1;
  incor_num(SD, "/archivo_01.csv", numero);
  incor_dato(SD, "/archivo_01.csv", ";");
  incor_num(SD, "/archivo_01.csv", temperatura);
  incor_dato(SD, "/archivo_01.csv", ";");
  incor_num(SD, "/archivo_01.csv", humedad);
  incor_datoln(SD, "/archivo_01.csv", ";");
  x=x+1;
  if(x>10)
  {
    x=1;
    readFile(SD, "/archivo_01.csv");
  }
}
delay(1000);
}
