PROBLEMA: comunicazione arduino arduino via ethernet - invio/ricezione numeri

Ciao a tutti, come da titolo ho un problema con l'invio ma soprattutto con la ricezione di numeri da unarduino all'altro via ethernet.

Vi spiego in breve il mio progetto:
vorrei realizzare un sistema con più arduini collegati insieme da una loro LAN dedicata. volendo essere più specifici ho:

  • una scheda sul tetto che funge da stazione meteo (funzionante)
  • una scheda in giardino che mi controlla il livello di alcuni serbatoi e lo stato di una pompa
  • una scheda in casa collegata ad uno schermo LCD dove, oltre a visualizzare alcuni parametri locali, vorrei visualizzare le informazioni delle altre schede.

A livello di rete è tutto ok, le schede si collegano fra di loro e i valori (la maggior parte sono numeri) che faccio trasmettere tramite un semplice (e forse errato) client.println() e ricevere con un client.read() arrivano e facendo un piccolo test sul monitor seriale vengono riportati pari pari alla trasmissione. Il PROBLEMA sorge nel momento in cui voglio convertire i caratteri ricevuti in variabili di tipo float, li alcuni caratteri si perdono per non parlare delle variabili di tipo boolean, quelle risultano sempre true!

Qualcuno può aiutarmi a risolvere questa falla in ricezione? Ringrazio in anticipo chiunque leggerà e risponderà a questo post.
GiaGiga

Supponiamo che tu spedisca la stringa "12.5789" e che la riceva correttamente.

Per trasformarla nel numero float corrispondente, devi usare la funzione atof():

atof("12.5789") resttuisce 12.5789

Nota che la funzione restituisce il numero anche se la stringa è preceduta da spazi o da caratteri.

quindi mi basterebbe inserire nel codice numero = atof(nomestringa); ?

NO, devi inserire in testa al programma la seguente riga:

#include <stdlib.h>

… dato che la atof() è una funzione che si trova li dentro.
Fa parte della AVR libc (… che l’IDE ti mette sempre a disposizione) e le funzioni della “stdlib” le trovi documentate QUI.

Guglielmo

ok grazie, ora provo e vi aggiorno

Chiedo scusa ma ho guardato la documentazione che mi hai linkato senza capirci molto, nello specifico non ho capito dove devo sostituire le mie variabili

Per lo meno con l'IDE 1.6.5, non è necessario inserire l'include.

cyberhs:
Per lo meno con l'IDE 1.6.5, non è necessario inserire l'include.

io uso la 1.6.7

cyberhs:
Per lo meno con l'IDE 1.6.5, non è necessario inserire l'include.

Sul fatto che l'IDE nasconda anche questa cosa non ci avevo fatto caso ...
... di sicuro la regola è che SI DEVE metere l'include e non farlo significa solo ... imparare a programmare in modo sbagliato ! Come poi ti allontanti dall'IDE te ne penti amaramente ... ::slight_smile:

Guglielmo

pablos:
Dopo 7 post dovresti chiederti ... agli utenti del forum cosa manca per aiutarmi?

:smiley: :smiley: :smiley: ... certi dubbi raramente vengono agli utenti :wink:

Guglielmo

facendo un piccolo test sul monitor seriale vengono riportati pari pari alla trasmissione. Il PROBLEMA sorge nel momento in cui voglio convertire i caratteri ricevuti in variabili di tipo float, li alcuni caratteri si perdono per non parlare delle variabili di tipo boolean, quelle risultano sempre true!

Quello che intendevo era:
Se a monitor seriale è tutto ok, forse sbagli il metodo di trattamento di quelle variabili, senza sketch come facciamo a vederlo?

ciao

AGGIORNAMENTO: il problema della conversione di una stringa in float è stato risolto col comando string.toFloat();

Come richiesto ecco il codice della scheda ricevente, in questo caso riceve lo stato di uninverter (acceso/spento) e il voltaggio di 3 batterie, allo stato attuale riesco a ricevere correttamente lo stato dell’inverter e di una sola batteria, nel momento in cui inserisco il codice per le altre non ricevo più la prima e in output ho fisso 0.00

String LanIn = "";    // string to hold input
#define PwrID 'P' // id di riconoscimento scheda PWR
#define PwrEND 'p' // chiusura paccheto variabili trasmesse PWR

#include <Ethernet.h>
#include <SPI.h>
#include <stdlib.h>

int ACcheck;
float Voltbatt1, Voltbatt2, Voltbatt3;

void setup()
{
  Serial.begin(9600); 

  // start the SPI library:
  SPI.begin();
  Serial.println("SPI ok");


  Ethernet.begin(mac, ip);
    Serial.println("ethernet ok");
  
  server.begin();
  server.available();
    Serial.println("server ok");
}


void loop()
{
EthernetClient client = server.available();
  if (client)
  {
    char c;
    Serial.println("Got a client");
    // an http request ends with a blank line
    boolean currentLineIsBlank = true;
    while (client.connected())
    {
      if (client.available())
      {
        c = client.read();
        Serial.print(c);

        char ver='0';
	int b;
        
        if (c==PwrID) // controllo che il primo carattere ricevuto provenga dalla scheda POWER
        {
          ver=c;
	  b=0;
        }

        while (ver==PwrID)
        {
          c = client.read();
          //Serial.print(c);  **NOTA**

          if (c=='a' || c=='s') // inizio ricezione stato inverter
          {
            if (c=='a')
            {
              ACcheck=true;
            }

            if (c=='s')
            {
              ACcheck=false;
            }

          }// fine ricezione stato inverter

          if (c != '\n' && c!=PwrEND && b==1) // ricezione voltaggio batt1
          { 
            LanIn += (char)c;
          }
          else 
          {
            Voltbatt1=LanIn.toFloat();
            Serial.println(Voltbatt1);
            LanIn = "";
          } // fine ricezione batt1

          /*if (c != '\n' && c!=PwrEND && b==2) // ricezione voltaggio batt2
          { 
            LanIn += (char)c;
          }
          else 
          {
            Voltbatt2=LanIn.toFloat();
            LanIn = "";
            b=3;
          } // fine ricezione batt2

         if (c != '\n' && c!=PwrEND && b==3) // ricezione voltaggio batt3
          { 
            LanIn += (char)c;
          }
          else 
          {
            Voltbatt3=LanIn.toFloat();
            //Serial.println(Voltbatt1);
            LanIn = "";
            b=0;
          } // fine ricezione batt3
          */

          if(c==PwrEND) //controllo che il pacchetto di dati sia finito, uscita while
          {
            ver='p';
          }
         
        }// Fine While PWR
        Serial.print("****");
        Serial.println(ACcheck);
        Serial.println(Voltbatt1); 
        Serial.println(Voltbatt2);
        Serial.println(Voltbatt3);
        
      }     
    }
    // give the web browser time to receive the data
    delay(1);
    // close the connection:
    client.stop();
    delay(3000); // delay inserito per rallentare il monitor seriale
  }
}// FINE

Sono sicuro che i dati arrivano in maniera corretta perchè togliendo il commento alla riga contrassegnata come NOTA e commentando dall’if dello stato inverter fino alla fine dell’if della ricezione del voltaggio della batteria 3 i dati vengono stampati su schermo in maniera corretta.

giagiga:
AGGIORNAMENTO: il problema della conversione di una stringa in float è stato risolto col comando string.toFloat();

Come richiesto ecco il codice della scheda ricevente, in questo caso riceve lo stato di uninverter (acceso/spento) e il voltaggio di 3 batterie, allo stato attuale riesco a ricevere correttamente lo stato dell’inverter e di una sola batteria, nel momento in cui inserisco il codice per le altre non ricevo più la prima e in output ho fisso 0.00

String LanIn = "";    // string to hold input

#define PwrID ‘P’ // id di riconoscimento scheda PWR
#define PwrEND ‘p’ // chiusura paccheto variabili trasmesse PWR

#include <Ethernet.h>
#include <SPI.h>
#include <stdlib.h>

int ACcheck;
float Voltbatt1, Voltbatt2, Voltbatt3;

void setup()
{
 Serial.begin(9600);

// start the SPI library:
 SPI.begin();
 Serial.println(“SPI ok”);

Ethernet.begin(mac, ip);
   Serial.println(“ethernet ok”);
 
 server.begin();
 server.available();
   Serial.println(“server ok”);
}

void loop()
{
EthernetClient client = server.available();
 if (client)
 {
   char c;
   Serial.println(“Got a client”);
   // an http request ends with a blank line
   boolean currentLineIsBlank = true;
   while (client.connected())
   {
     if (client.available())
     {
       c = client.read();
       Serial.print(c);

char ver=‘0’;
int b;
       
       if (c==PwrID) // controllo che il primo carattere ricevuto provenga dalla scheda POWER
       {
         ver=c;
 b=0;
       }

while (ver==PwrID)
       {
         c = client.read();
         //Serial.print(c);  NOTA

if (c==‘a’ || c==‘s’) // inizio ricezione stato inverter
         {
           if (c==‘a’)
           {
             ACcheck=true;
           }

if (c==‘s’)
           {
             ACcheck=false;
           }

}// fine ricezione stato inverter

if (c != ‘\n’ && c!=PwrEND && b==1) // ricezione voltaggio batt1
         {
           LanIn += (char)c;
         }
         else
         {
           Voltbatt1=LanIn.toFloat();
           Serial.println(Voltbatt1);
           LanIn = “”;
         } // fine ricezione batt1

/*if (c != ‘\n’ && c!=PwrEND && b==2) // ricezione voltaggio batt2
         {
           LanIn += (char)c;
         }
         else
         {
           Voltbatt2=LanIn.toFloat();
           LanIn = “”;
           b=3;
         } // fine ricezione batt2

if (c != ‘\n’ && c!=PwrEND && b==3) // ricezione voltaggio batt3
         {
           LanIn += (char)c;
         }
         else
         {
           Voltbatt3=LanIn.toFloat();
           //Serial.println(Voltbatt1);
           LanIn = “”;
           b=0;
         } // fine ricezione batt3
         */

if(c==PwrEND) //controllo che il pacchetto di dati sia finito, uscita while
         {
           ver=‘p’;
         }
       
       }// Fine While PWR
       Serial.print("****");
       Serial.println(ACcheck);
       Serial.println(Voltbatt1);
       Serial.println(Voltbatt2);
       Serial.println(Voltbatt3);
       
     }    
   }
   // give the web browser time to receive the data
   delay(1);
   // close the connection:
   client.stop();
   delay(3000); // delay inserito per rallentare il monitor seriale
 }
}// FINE




Sono sicuro che i dati arrivano in maniera corretta perchè togliendo il commento alla riga contrassegnata come **NOTA** e commentando dall'if dello stato inverter fino alla fine dell'if della ricezione del voltaggio della batteria 3 i dati vengono stampati su schermo in maniera corretta.

Ho tentato di sistemare un po le cose ma adesso come risultato ho che lo stato dell’inverter mi arriva correttamente, mentre continuo ad avere problemi sulla ricezione del voltaggio delle batterie: il primo viene ricevuto e stampato correttamente, il secondo è fisso a 0.00 (in trasmissione il voltaggio è 12.7), mentre il terzo risultato è sempre uguale al primo come se venisse stampata la stessa variabile. La cosa strana è che se scollego tutto dalla scheda TX e lascio attaccata la batteria3 vedo in ricezione il voltaggio sia sulla 3 che sulla 1, così ho pensato che fosse un problema di pin difettati sulla scheda ma ho già testato ciò e ho potuto escludere ciò. Ci sto riflettendo ormai da giorni su come risolvere questo problema, qualcuno può aiutarmi? Grazie.

sicuro che la trasmissione sia corretta?
intendo non quando gliela dai in pasto al tx ma effettivamente correttamente spedita dal sistema tx.
usa un analizzatore pacchetti di rete tipo wireshark.

su starting electronics trovi 18 lezioni sulla trasmissioni network e u server web...

eventualmente se vuoi duplichiamo il sistema e ti do una mano.
ciao.

elpapais:
sicuro che la trasmissione sia corretta?
intendo non quando gliela dai in pasto al tx ma effettivamente correttamente spedita dal sistema tx.
usa un analizzatore pacchetti di rete tipo wireshark.

su starting electronics trovi 18 lezioni sulla trasmissioni network e u server web...

eventualmente se vuoi duplichiamo il sistema e ti do una mano.
ciao.

Ciao, sarei più che felice di ricevere il tuo aiuto.
Ho verificato più volte la trasmissione anche fuori da questo software facendo stampare su schermo ogni singolo carattere che riceve e arriva tutto ciò che trasmetto con un semplice:

POWERclient.println(LanID);
POWERclient.println(ACcheck); // se true l'invert è acceso
POWERclient.println(Voltbatt1);
POWERclient.println(Voltbatt2);
POWERclient.println(Voltbatt3);
POWERclient.println(LanBreak); // carattere di controllo fine pacchetto 'p'
POWERclient.println(LanBreak); // carattere di controllo fine pacchetto 'p'
POWERclient.stop();

monta l'esempio ethernet chat...
uno lo configuri come server (quello che ha il display)
gli altri li configuri come client che anziche inviare "hello world" inviano il dato oppure: "livello acqua = " varAcqua, "Velocita vento = " VelVar; ecc ecc
nel serve fai la manipolazione di cio che ricevi.
Oppure puoi usare il server/client telnet...
preleva la variabile subito dopo i vari "serial.print" che stampano sulla seriale.

Se non riesci mettiamoci in contatto.
ciau

Buonasera a tutti, non mi sono dimenticato di voi e del post solamente ho messo il tutto in stand by per un po a causa di alcuni problemi di salute ancora non risolti del tutto che mi hanno visto lontano da casa. Vi ringrazio per la pazienza.

elpapais:
monta l'esempio ethernet chat...
uno lo configuri come server (quello che ha il display)
gli altri li configuri come client che anziche inviare "hello world" inviano il dato oppure: "livello acqua = " varAcqua, "Velocita vento = " VelVar; ecc ecc
nel serve fai la manipolazione di cio che ricevi.
Oppure puoi usare il server/client telnet...
preleva la variabile subito dopo i vari "serial.print" che stampano sulla seriale.

Se non riesci mettiamoci in contatto.
ciau

Ciao, finalmente riesco a tornare a lavoro. come da te suggerito vorrei provare col sistema chat server ma non riesco a configurarlo, mi puoi aiutare?

up