Messaggi random da un file .txt per progetto matrix7219 e esp8266

Ciao a tutti
ho creato con un esp8266 un sistema con il matrix7219 per scrivere messaggi e visionarli sulle 4 matrici, tramite un HTTP collegato al mio sito.
Tramite PHP ho creato un file testo dove ogni messaggio viene inserito con /n per andare a capo, l'ultimo messaggio viene letto tramite questo codice.

String getlastline(String str)
{
  String s="";
  int len=str.length();
  for (int i=len-2;i>=0;i--)
  {
    if (str[i]=='\n')
    {
      break;
    }
    else
    {
      s=s+str[i];
     
    }
  }
  String rs="";
  for (int i=s.length()-1;i>=0;i--)
  {
    rs=rs+s[i];
  }
  return rs;

}

String ricevimessaggio()
{
  String lastmessaggio="";
  if(WiFi.status()==WL_CONNECTED)
  {
    HTTPClient http;
    String url="http://www.cinesaibai.com/wp-content/CloKino/messaggio.txt";
    http.begin(url);
    http.addHeader("Content-Type","text/plain");
    int httpCode=http.GET();
    String messaggio=http.getString();
    lastmessaggio=getlastline(messaggio);
   // Serial.println("il messaggio nuovo è:");
   Serial.println(lastmessaggio);
    http.end();
  }
  else
  {
    lastmessaggio="";
  }
  return lastmessaggio;
    delay(3000);
}

Ora vorrei poter prendere i messaggi random dal file txt
Qualcuno mi può aiutare,Grazie

Ovvero leggerli di un file txt che risiede dove?
Scheda SD, filesystem interno dello esp?
Sai il numero di righe che compongono il file?
O è una cosa che può cambiare?

ciao grazie
le leggo da un file testo inserito sul mio sito, tramite esp8266 leggo l'ultima riga, visto che sono messaggi privati che vengono inseriti ogni tanto ,per non visionare solo l'ultimo messaggio, mi piacerebbe inserire un opzione che permette di trasmettere random i suddetti messaggi.
Ogni riga contiene un messaggio che finisce per /n.
Ho creato un PHP

<?php

$val = $_POST["messaggio"];

$fileContent=$val."\n";

$fileStatus=file_put_contents("messaggio.txt",$fileContent,FILE_APPEND);



?>

con il codice pubblicato prima riesco a leggere solo l'ultimo messaggio.
Spero di essere stato chiaro;-)
Grazie

cos'è? PHP? non lo conosco

ma lato arduino tu ricevi una stringa lunga lunga che contiene un certo numero di ritorni a capo, l'ultimo pezzo senza ritorno a capo, e vuoi poter prendere una sola "riga" di quella stringa , oltretutto in maniera casuale

giusto?

non mi sembra difficile, serve di sapere quanti ritorni a capo ci sono nella stringa, ma basta contarli....

giusto....
i ritorni aumentano, aumentando i messaggi.
Mi puoi aiutare a costruire il codice.
Grazie

Porta pazienza

Dopo cena non ho impegni...

Figurati...anzi molto gentile Buon appetito;-)

certo

prima cosa: io non uso oggetti String, mai (come la pubblicità: Denim, per l'uomo che non deve Stringare, Mai)

quindi faccio conto che tu passi una stringa di 'C' ad una funzione, che conta le righe (banalmente conta i ritorni a capo)

in tutti i miei codici stringa è sempre stringa di 'C' (ovvero char[])

int ritorniacapo(char * stringa)
{
   int conto = 0;

   // conta i ritorni a capo nella stringa passata come argomento
   while(* stringa)
   {
      if(* stringa == '\n')
      {
         conto++;
      }

      stringa++;
   }

   return conto;
}

è banale, conta i ritorni capo e da qui sa il numero delle righe

adesso serve una funzione che data una stringa di frasi separate da \n e un numero N intero restituisce un puntatore alla eNnesima riga, correttamente terminata

char * riga(char * stringa, int n)
{
   int attuale = 0;// contatore riga raggiunta
   bool ok = 0; // raggiunta la riga in cercata
   char * trovata = stringa; // puntatore alla riga trovata

   // scorro la stringa
   while(* stringa)
   {
      // potrebbe essere buona la prima,
      // quindi devo provare prima di proseguire
      if(n == attuale)
      {
         bool ok = 1;
      }

      if(* stringa == '\n')
      {
         // trovata fine riga
         // è quello che mi serve?
         if(bool)
         {
            // no, quello è passato
            // quindi posso uscire
            // dopo aver terminato la stringa
            * stringa = 0;
            return trovata;
         }

         else
         {
            // non è ancora passato, potrebbe essere questo
            // lo conto
            attuale++;
            // ma mi basta terminare il ciclo,
            // il test viene eseguito alla prima azione del ciclo successivo
         }
      }

      stringa++;
   }
}

mi perdonerà la moderazione se mi sono permesso di scrivere delle funzioni "apparentemente" complete
ma onnle ho compilate, in effetti non le ho nemmeno scritte con lo IDE

se mi mettevo a scrivere in pseudocodice ci mettevo di più ed ero meno esaustivo

le funzioni sono da intendersi solo come una fonte di ispirazione, non sono sicuro vadano

in buona sostanza prima scorro la stringa e conto i ritorni a capo

il numero di ritorni è pari al numero di righe meno 1 (se l'ultima riga non ha un ritorno a capo)

da qui ottenere un numero casuale che possa servire da "indice" della riga da prendere è una banalità

la seconda funzione, che ho commentato di più, serve per scorerre di nuovo la stringa, contando i ritorni a capo e restituire un puntatore a carattere che punta alla riga interessata, dopo averla terminata con uno 0

rimane da provarla.......

Visto che il file di testo ti arriva da un oggetto client, propongo un approccio alternativo.

Lanci il dado che restituisce un numero a caso tra 0 e la dimensione massima del file, leggi il buffer di client carattere per carattere incrementando un contatore. Se il contatore è maggiore del numero casuale aspetti il primo '\n' che arriva e da quel momento salvi i caratteri in un char array o dove preferisci fino al successivo '\n'.
La prima riga del file, siccome in questo modo non verrebbe mai fuori, potrebbe essere tipo un'intestazione o un commento.

Intanto grazie, in linea di massima ho capito,mi rimane difficile inserirlo nel mio codice, non conosco bene la differenza di char * vs String
per esempio

String ricevimessaggio()
{
  String lastmessaggio="";
  if(WiFi.status()==WL_CONNECTED)
  {
    HTTPClient http;
    String url="http://www.cinesaibai.com/messaggio.txt";
    http.begin(url);
    http.addHeader("Content-Type","text/plain");
    int httpCode=http.GET();
    String messaggio=http.getString();
    lastmessaggio=getlastline(messaggio);
   // Serial.println("il messaggio nuovo è:");
   Serial.println(lastmessaggio);
    http.end();
  }
  else
  {
    lastmessaggio="";
  }
  return lastmessaggio;
    delay(3000);
}

la richiesta è di String, come faccio a provare char quando il http.GET mi chiede un String?
Come faccio a provare la funzione per capire il ritorno con Serial.println();?

 String lastmessaggio=getlastline(messaggio);

qui mi ritorna l'ultimo messaggio inserito, come inserisco quello che mi hai scritto?
if (bool) mi da errore.
Credo che mi devi considerare più "Dummy":wink:

beh, non so che dirti....

la differenza tra stringa e String dovrebbe essere conosciuta,
un minimo di C serve di conoscerlo, mi sembra che sia scritto anche nel regolamento

comunque una ricerca minimale permette di sapere come "estrarre" una stringa da una String

e anche viceversa

comunque io, pur con tutta la buona volontà, non posso certo colmarti le lacune in 'C', oltre che impresa notevole sarebbe anche invisa alla moderazione

ti posso solo dire che se hai domande specifiche, alle quali non riesci a dare risposta con una buona ricerca e lettura della documentazione, io ci sono per dare aiuto

Ti ringrazio
tutto mi serve, io mi sono appassionato di Arduino e il suo mondo,
con un approccio tutto mio, sono riuscito a fare cose veramente incredibili solo con l'intuizione e gli errori.
Proverò ad approfondire ,visto che non chiedo quasi mai hai vari forum.
Se poi arrivo alla milionesima linea di codice che ho intuito... ti farò sapere.
Per ora grazie molto della tua disponibilità

>dbkreativ: senza andare troppo lontano, se ti studi sul reference di Arduino la classe "String" troverai anche il metodo che ti permette di passare da un oggetto String ad una stringa classica del 'C'. Il viceversa è banale.

Guglielmo

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