Problema al enviar datos por wifi con wifinina

Buenas

Tengo un problema al enviar datos por wifi con la librería WIFININA desde mi Arduino nano 33 iot. Lo primero decir que los envio a una raspberry y ahí abro un documento.TXT y guardo cada linea en este. Este seria el archivo php que lo realiza:

<?php
	$data = $_GET['data'];
	$archivo = fopen("Documento.txt",'a') or die("Se produjo un error al abrir el archivo");
	echo $data;
	fwrite($archivo, $data .PHP_EOL);
	fclose($archivo);
?>

La arduino lo que hace es leer un documento.txt que esta en una tarjeta micro SD, entonces empieza a leer linea a linea el documento y cada caracter de cada linea la almacena en un string llamado data. Cuanto se ha rellenado el string data con toda la linea correspondiente lo envia por WIFI a las raspi. El codigo seria el siguiente:

void leerSD(){
  //------------------------------------------------------------------------------
  //ABRIMOS LA SD Y LEEMOS SUS VALORES PARA ENVIARLOS POR WIFI
  //------------------------------------------------------------------------------
  archivo = SD.open("IMU.txt",FILE_READ);  
  if (archivo) {
    while (archivo.available()) {
      char caracter = archivo.read();
      if(caracter==10){   //ASCII de nueva de línea
        if (client.connect(server, 80)>0) {  // Conexion con el servidor
          client.print("GET /enviardata.php?data=");
          client.print(data);     
          client.println(" HTTP/1.0");
          client.println("User-Agent: Arduino 1.0");
          client.println();
          if (mySerial == true){
            Serial.println("Conectado");
          }
        } else {
          if (mySerial == true){
            Serial.println("Fallo en la conexion");
          }        
        }
        if (!client.connected()) {
          if (mySerial == true){
            Serial.println("Disconnected!");
          } 
        }
        client.stop();
        client.flush();
        data = "";           
      } else{
        data = data + caracter;
      } 
    }
    // close the file:
    archivo.close();
  } else {
    // if the file didn't open, print an error:    
    if (mySerial == true){
      Serial.println("error opening IMU.txt");
    } 
  }
}

He comprobado y hace bien toda la lectura de la microSD. Pero no envía los datos ni abre el documento.txt en la raspi.
También he probado y me crea el documento.txt cuando pongo solo:

client.print("GET /enviardata.php?");               
client.println(" HTTP/1.0");
client.println("User-Agent: Arduino 1.0");
client.println();

Por último he probado el php desde mi ordenador escribiendo en el navegador:
La IP/enviardata.php?data=“Hola mundo”
Y si me crea el documento txt en la raspi y aparece el Hola mundo

Muchas gracias por vuestra ayuda de antemano

Bueno he seguido haciendo pruebas y mas o menos se donde esta el problema.
He ejecutado el código creando una variable string en la que escribo "Hola", al poner eso en el client.print(variableHola) si que me escribe Hola en el documento.txt que esta en la raspi. Asique el problema debe estar en la variable String data, esta la formo uniendo cada elemento de cada linea que son chars y cuando llego al final de linea, inicializo la variable data="". Leí que para leer documento txt hacia falta usar cada carácter en un char ya que sino el string ocupa mucha memoria. En definitiva el problema debe estar ahí/ en como creo cada linea para enviarla en el string data pero no se muy bien que hacer para solucionarlo.

Yo no te he respondido porque al no ver como defines las variables debo imaginarme todo y como digo siempre cuando veo el código completo puedo responder, cuando es parcial me quita las ganas de hacerlo y debo estar recordando las normas y algunos se molestan.

byte mySerial = true;//en caso de estar disponible el puerto serial poner a false
int boton_guardar = 2;//asignamos al boton guardar el pin digital 2
int led_v_int = 5; //designamos el led verde que indica que hemos activado la interrupcion en el pin digital 5
int volatile interrup = 0;// para la interrupcion con un boton debemos definir una variable que esta cambiara para que active el guardado de datos en la SD
int volatile accAvailable=0;
int volatile gyrAvailable=0;
String data="";
void leerSD(){
  //------------------------------------------------------------------------------
  //ABRIMOS LA SD Y LEEMOS SUS VALORES PARA ENVIARLOS POR WIFI
  //------------------------------------------------------------------------------
  archivo = SD.open("IMU.txt",FILE_READ);  
  if (archivo) {
    while (archivo.available()) {
      char caracter = archivo.read();
      if(caracter==10){   //ASCII de nueva de línea
        if (client.connect(server, 80)>0) {  // Conexion con el servidor
          client.print("GET /enviardata.php?data=");
          client.print(data);    
          client.println(" HTTP/1.0");
          client.println("User-Agent: Arduino 1.0");
          client.println();
          if (mySerial == true){
            Serial.println("Conectado");
          }
        } else {
          if (mySerial == true){
            Serial.println("Fallo en la conexion");
          }        
        }
        if (!client.connected()) {
          if (mySerial == true){
            Serial.println("Disconnected!");
          }
        }
        client.stop();
        client.flush();
        data = "";          
      } else{
        data = data + caracter;
      }
    }
    // close the file:
    archivo.close();
  } else {
    // if the file didn't open, print an error:    
    if (mySerial == true){
      Serial.println("error opening IMU.txt");
    }
  }
}
void setupWIFI() {
  // check for the WiFi module:
  if (WiFi.status() == WL_NO_MODULE) {
    if (mySerial == true){
      Serial.println("Communication with WiFi module failed!");
    }
    // don't continue
    while (true);
  }

  String fv = WiFi.firmwareVersion();
  if (fv < WIFI_FIRMWARE_LATEST_VERSION) {
    if (mySerial == true){
      Serial.println("Please upgrade the firmware");
    }    
  }

  // attempt to connect to Wifi network:
  while (status != WL_CONNECTED) {
    if (mySerial == true){
      Serial.print("Attempting to connect to SSID: ");
      Serial.println(ssid);
    }
    // Connect to WPA/WPA2 network. Change this line if using open or WEP network:
    status = WiFi.begin(ssid, pass);

    // wait 10 seconds for connection:
    delay(10000);
  }
  if (mySerial == true){
    Serial.println("Connected to wifi");
  }
  printWifiStatus();

  Serial.println("\nStarting connection to server...");
  // if you get a connection, report back via serial:
  if (client.connect(server, 80)) {
    if (mySerial == true){
      Serial.println("connected to server");
    }
  }
}
void printWifiStatus() {
  // print the SSID of the network you're attached to:
  if (mySerial == true){
    Serial.print("SSID: ");
    Serial.println(WiFi.SSID());
  }

  // print your board's IP address:
  IPAddress ip = WiFi.localIP();
  if (mySerial == true){
    Serial.print("IP Address: ");
    Serial.println(ip);
  }

  // print the received signal strength:
  long rssi = WiFi.RSSI();
  if (mySerial == true){
    Serial.print("signal strength (RSSI):");
    Serial.print(rssi);
    Serial.println(" dBm");
  }
}

Perdona surbyte el resto del código funciona por eso solo había enviado esa parte

Ahora si lo comprendo.

que tal esto ?

       char charBuffer[data.length()+1];
       data.toCharArray(charBuffer, data.length()+1);

      if (client.connect(server, 80)>0) {  // Conexion con el servidor
          client.print("GET /enviardata.php?data=");
          client.print(charBuffer);    
          client.println(" HTTP/1.0");
          client.println("User-Agent: Arduino 1.0");
          client.println();
          if (mySerial == true){
            Serial.println("Conectado");
          }
        } else {
          if (mySerial == true){
            Serial.println("Fallo en la conexion");
          }        
        }

Hola Surbyte gracias por la respuesta pero la he probado y sigue sin hacer nada

Buenas ya lo he conseguido, el problema es que guardaba muchos caracteres ocultos al leer la sd y desbordaba al método GET. Haciendo esto se ha solucionado:

while (archivo.available()) {
      char caracter = archivo.read();
      if(caracter=='\r'){
        while (archivo.read() != '\n'); // Descartar el resto hasta llegar a la siguiente línea
        if (client.connect(server, 80)>0) {  // Conexion con el servidor
          client.print("GET /enviardata.php?data=");
          client.print(data);
          client.println(" HTTP/1.0");
          client.println("User-Agent: Arduino 1.0");
          client.println();
          if (mySerial == true){
            Serial.println("Conectado");
          }
        } else {
          if (mySerial == true){
            Serial.println("Fallo en la conexion");
          }        
        }
        if (!client.connected()) {
          if (mySerial == true){
            Serial.println("Disconnected!");
          }
        }
        client.stop();
        client.flush();
        data = "";          
      } else{
        data = data + caracter;
      }
    }

Ese el problema con los Strings, hay que tenerlos controlados.

This topic was automatically closed 120 days after the last reply. New replies are no longer allowed.