miércoles, 6 de marzo de 2024

ESP32, punto de acceso, servidor web y SD

Crea 4 solicitudes para el servidor web: Número IP (192.168.2.1), abrir, descargar y "nofound".
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);

}