Letture Serial 1....Scritture Serial

Salve ho un problema come al solito

per farla breve ho u ESP8266 precaricato in STANDALONE, a cui ho detto di mandarmi una stringa sulla serial1.

Ad esempio "Pulsante 1 =" ed i valore del Pulsante che potrebbe essere all'infinito(per esagerare).

Ora mi ritrovo che leggo correttamente sulla Serial di Arduino la stringa. questo va bene se devo usare pochi valori del Pulsante...ad es... if(Pulsante==1){FAI QUESTO;}... if(Pulsante==5){FAI ALTRO;}...ect ect.

Ora però vorrei eliminare dalla Stringa che leggo sulla Serial, tutta la dicitura e mantener solo il valore finale.

E' possibile o devo riprogrammare l'ESP???

Se sull'ESP hai caricato il programma che invia la stringa composta come hai dichiarata e devi cambiare la stringa da inviare è necessario riprogrammare l'ESP per non inviare le informazioni non necessarie.
Se invece il caricare il canale di trasmissione con informazioni innutili non è un problema ma la sola valutazione di quanto è in arrivo allora creando un piccolo parser puoi scomporre la stringa in sottostringe da analizzare ovvero se le stringe sono:

Pulsante1=10
Pulsante2=13
Pulsante3=44
...
Pulsante999=2

Sapendo che la prima parte è sempre e comunque pulsante cerchi la posizione del carattere '=' e prelevi la parte di stringa compresa tra la fine della parola fissa Pulsante e la posizione del carattere '='. Stessa cosa per interpretare i valori, estrapoli quello che viene dopo il carattere '='.
Ho indicato stringhe ma per chiarezza non intendo la classe String ma array di caratteri da manipolare con le apposite funzioni c
Ho capito la tua esigenza oppure no?

Si TU hai capito la mia esigenza, ma IO con ho capito cosa mi hai detto :cry: :cry: .

In pratica su ESP ho detto di prendere una serie di CHAR, che contengono una scritta tra virgolette tipo"...ciao bello1=" ed un valore ..tipo Valore e concatenarle in una STRING.

Poi su Arduino mi scrive la STRING, che appare cosi...ciao bello1=valore(che può essere all'infinito per esagerare).....

Io vorrei eliminare ..."ciao bello1="... e mantenere solo il valore.

Per poi utilizzarlo su Arduino.

Dimmi se ho capito

dovrei su ESP mettere le char in un Array, e poi farmi rimandare ogni array.

Quindi su ciò che leggo in ARDUINO potrei prelevare solo L'array che mi serve.

Intendevi questo???

Allora se riprogrammi l'ESP cambi il protocollo di trasmissione e se a posto, ovvero invece di mandare

Pulsante1=10
Pulsante2=33
Pulsante3=7

invii solo il necessario Es.

1=10
2=33
3=7

In ricezione dividi numero del pulsante dal valore ad esempio eando la funzione strtok che al primo impatto non è semplicissima da capire ma in realtà è semplice, studiandola qualche minuto si capisce come usarla
Se invece, come hai richiesto nel primo post, NON vuoi riprogrammare l'ESP allora non ti resta che trattare le stringhe in arrivo per escludere tutte le informazioni che non ti servono (Nel tuo caso la stringa Pulsante che precede il numero)
Se non ho capito male il i tuoi invii sono sempre del tipo

Pulsante1=10
Pulsante2=33
Pulsante3=7

Quindi devi copiarti parte della stringa in arrivo dalla seriale in un altro array di char andando ad escludere la prima parte (Pulsante). Questo lo fai con la funzione strncpy, leggiti, anzi meglio, studiati anche questo che è proprio il tuo caso.
Alla fine avrai una stringa che conterrà solo solo il numero del pulsante, l'uguale e il valore.
A questo punto procederai come indicato in precedenza con la strtok per perarare numero del pulsante e valore e a usare le due informazioni per fare ciò che desideri.
Avendo a quel punto due strighe con numero del pulsante e valore puoi convertirli da array di char a numerico (interi, float, long dipende dai valori che possono assumere) con le funzoni apposite (Es. atoi, atof, ecc.).
Insomma se non hai ancora affrontato la manipolazione delle stringhe qui hai l'ocasione di imparare avendo messo un bel po' di carne al fuoco :slight_smile:

fabpolli

posso riprogrammare ESP questa parte me la sono imparata.

Farò alcune prove e mi studierò strtok ,strncpy, questo .

Non ce la farò subito,ma al momento ti ringrazio dei consigli.

In realtà è più difficile del previsto, (prove fatte senza modificare ESP in STANDALONE).

Il problema è che usando un Joystik Virtuale, nella stringa leggo ad esempio"PULS_1=106PULS_2=57"

Ricapitolando:

-Se uso un solo pulsante e ricopio la stringa in un array sembra funzionare(mi è bastato leggere L'array
escludendo le caselle"PULS_1="...quindi mi leggo il valore e me lo copio in una variabile.

-Ma usando un Joystik Virtuale mi ritrovo il"PULS_2=57", quindi se" PULS_1=ha meno di 3 cifre", il puntatore dell'array,mi legge comunque 3 postazioni.

Mi spiego meglio,ipotizzando che PULS_1= sia uguale ad 7.......ed escludendo PULS_1=, mi torna 7PU.

Usa la logica luke! quando i dati non sono fissi mai ipotizzare una lughezza determinata (2,3 cifre) perché il fallimento è dietro l'angolo.
Ti ho suggerito si usare la strtok per dividere la stringa cercando il carattere '=' se inviavi 1=12, 2=33, ecc. oppure la combinazione delle funzioni per escludere pulsante all'inizio della stringa, hai un altro carattere che si ripete che ti separa il pulsante dal suo indice? Se si usalo per separare la stringa completa in sottostighe da elaborare cercando l'uguale e eliminando eventuali parti non desiderata all'inizio o alla fine (Es. la stringa pulsante), pensaci hai un carattere a parte l'uguale con cui puoi suddividere la stringa?

Oddio, ma perché programmate dei protocolli di comunicazione che servono a dei PROGRAMMI come se fossero per un UMANO?

Ti basta buttare giù un semplice protocollino fatto così, ossia 3 byte:

Pnv

Il primo carattere "P" indica "Pulsante premuto" (in futuro puoi estendere questo protocollo per includere altri eventi), il byte successivo "n" contiene il numero pulsante (hai fino a 255 pulsanti definibili) e "v" il valore (anche questo in un byte se ti basta da 0 a 255, altrimenti ne prevedi due e puoi arrivare a 65535).

In questo modo in base al tipo di evento (in questo caso solo "P") la lunghezza del messaggio è nota e fissa, ed eviti tutte le palle legate a reinterpretare cose che sono chiare per un umano ma una seccatura per un programma...

Credo usi una libreria già pronta per simulare il joystick

Io consiglio strchr() (e/o eventualmente strrchr()) invece di strtok(), però serve prima capire come funzionano le stringhe C. Metti da parte tutti i progetti e investi un po' di tempo a fare esperimenti in questo senso.

Gia fatto.....infatti usavo la P se era al puntatore 0 per mettere a 0 una variabile.....poi usavo = per mettere ad 1 la variabile.

e con la variabile mi leggevo l'array di copia.

Ma col Joystik virtuale effettivamente non ho nulla che mi separa il VALORE del PULS_1 dalla dicitura PULS_2.

nessuna libreria

a parte su ESP per usare l'APP che ho scelto.

Su arduino mi torna solo una Stringa.

Puso:
Gia fatto.....infatti usavo la P se era al puntatore 0 per mettere a 0 una variabile.....poi usavo = per mettere ad 1 la variabile. e con la variabile mi leggevo l'array di copia.

Scusa ma non ho capito bene cosa intendi. Perché non posti il tuo codice, così vediamo di capire meglio?

isdigit()

CAVOLO supera i 9000 caratteri,come faccio a postare????

Questo è quello su ESP(funzionante)

#define BLYNK_PRINT Serial

#include <ESP8266WiFi.h>
#include <BlynkSimpleEsp8266.h>
BlynkTimer timer;

char auth[] = "xxxxxxx";
char ssid[] = "xxxxxxx";
char pass[] = "xxxxxxx";

byte virtual_pin0=0;
byte virtual_pin1=0;
byte virtual_pin2=0;
byte virtual_pin3=0;
byte virtual_pin4=0;
byte virtual_pin5=0;
byte virtual_pin6=0;
byte virtual_pin7=0;

byte virtual_pin10=0;
byte virtual_pin11=0;
byte virtual_pin12=0;
byte virtual_pin13=0;



char rx=0;
String RX="";

char rx_1=0;
String RX_1="";

void leggi_RX()
{
 if(Serial.available())
   {
    RX="";
    while(Serial.available())
         {          
          rx=Serial.read();
          RX.concat(rx);
          Virtual_Pin_0();
          Virtual_Pin_1();              
         } 
     virtual_pin_OFF(); 
     virtual_pin();
     virtual_pin_ON();               
    }
}

void Virtual_Pin_0()
{
 if(RX=="V10=0"){virtual_pin10=0;} 
 if(RX=="V11=0"){virtual_pin11=0;}   
 if(RX=="V12=0"){virtual_pin12=0;}    
 if(RX=="V13=0"){virtual_pin13=0;}      
    
} 
    
void Virtual_Pin_1()
{ 
 if(RX=="V10=1"){virtual_pin10=1;}       
 if(RX=="V11=1"){virtual_pin11=1;}  
 if(RX=="V12=1"){virtual_pin12=1;} 
 if(RX=="V13=1"){virtual_pin13=1;}      
  
} 

void virtual_pin_OFF()
{
 if(virtual_pin10==0){Blynk.virtualWrite(V10,"");} 
 if(virtual_pin11==0){Blynk.virtualWrite(V11,"");}
 if(virtual_pin12==0){Blynk.virtualWrite(V12,"");}
 if(virtual_pin13==0){Blynk.virtualWrite(V13,"");}
 
}
void virtual_pin()
{
 if(virtual_pin10==1){RX=" ";Blynk.virtualWrite(V10,RX);virtual_pin10=2;} 
 if(virtual_pin11==1){RX=" ";Blynk.virtualWrite(V11,RX);virtual_pin11=2;}
 if(virtual_pin12==1){RX=" ";Blynk.virtualWrite(V12,RX);virtual_pin12=2;}
 if(virtual_pin13==1){RX=" ";Blynk.virtualWrite(V13,RX);virtual_pin13=2;}
   
}
void virtual_pin_ON()
{
 if(virtual_pin10==2){leggi_RX();Blynk.virtualWrite(V10,RX);}  
 if(virtual_pin11==2){leggi_RX();Blynk.virtualWrite(V11,RX);} 
 if(virtual_pin12==2){leggi_RX();Blynk.virtualWrite(V12,RX);} 
 if(virtual_pin13==2){leggi_RX();Blynk.virtualWrite(V13,RX);}  
  
}

BLYNK_READ(V10){Blynk.virtualWrite(V10, RX);}
BLYNK_READ(V11){Blynk.virtualWrite(V11, RX);}
BLYNK_READ(V12){Blynk.virtualWrite(V12, RX);}
BLYNK_READ(V13){Blynk.virtualWrite(V13, RX);}

BLYNK_WRITE(V0){int pinValue=param.asInt();Serial.print("V0=");Serial.print(pinValue);}
BLYNK_WRITE(V1){int pinValue=param.asInt();Serial.print("V1=");Serial.print(pinValue);}
BLYNK_WRITE(V2){int pinValue=param.asInt();Serial.print("V2=");Serial.print(pinValue);}
BLYNK_WRITE(V3){int pinValue=param.asInt();Serial.print("V3=");Serial.print(pinValue);}
BLYNK_WRITE(V4){int pinValue=param.asInt();Serial.print("V4=");Serial.print(pinValue);}
BLYNK_WRITE(V5){int pinValue=param.asInt();Serial.print("V5=");Serial.print(pinValue);}
BLYNK_WRITE(V6){int pinValue=param.asInt();Serial.print("V6=");Serial.print(pinValue);}
BLYNK_WRITE(V7){int pinValue=param.asInt();Serial.print("V7=");Serial.print(pinValue);}

void setup()
{
 Serial.begin(9600);
 Blynk.begin(auth,ssid,pass);
}

void loop()
{ 
 leggi_RX();
 Blynk.run();
}

Questo è quello su ARDUINO(funzionante).

const byte R_SX(13);                                                 
const byte R_sx_A(24);
const byte R_sx_I(22);
const byte R_DX(12);
const byte R_dx_A(28);
const byte R_dx_I(26);
const byte Ruote[6]={R_SX,R_sx_A,R_sx_I,R_DX,R_dx_A,R_dx_I};         
byte Velocita=0;                                                      
unsigned long T_Avanti=0;
unsigned long T_Indietro=0;
unsigned long T_Sinistra=0;
unsigned long T_Destra=0;


char rx_2=0;
String RX_2="";
byte B_Acceso=0;
byte B_Velocita=0;
byte B_Muovi=0;
byte B_Automatico=0;

char rx_1=0;
String RX_1="";
char tx_1=0;
String TX_1="";

byte Leggi_virtual=0; 
unsigned long  Time_write_virtual=0;
unsigned long  Time_read_virtual=0;

byte virtual_pin0=0;
byte virtual_pin1=0;
byte virtual_pin2=0;
byte virtual_pin3=0;
byte virtual_pin4=0;
byte virtual_pin5=0;
byte virtual_pin6=0;
byte virtual_pin7=0;


byte virtual_pin10=0;
byte virtual_pin11=0;
byte virtual_pin12=0;
byte virtual_pin13=0;

#include <LiquidCrystal.h>
LiquidCrystal lcd(44,42,40,38,36,34);


#include <dht11.h>                                                    
dht11 DHT;                                                           
const byte DHT11_PIN (32);                                            
byte dht;                                                            
byte Temperatura=0;                                                  
byte TemperaturaMedia=0;                                             
byte Umidita=0;                                                       
byte UmiditaMedia=0;                                                  
boolean LettureDHT=0;                                                 
unsigned long TimeDHT=0;                                               
unsigned long TimeDHTmedia=0;                                         

byte DHT_LCD=0;
byte DHT_BLUETOOTH=0; 
byte DHT_ESP=0;

byte ESP_TemperaturaMedia=0;
byte ESP_UmiditaMedia=0;

#include <Wire.h>                                                     
#include "DS3231.h"                                                  
RTClib RTC;
unsigned long Tempo_Ora_Data_Temperatura1=0;
byte Anno=0;                                                       



#include <Servo.h>
Servo Servo_1;

boolean Servo_1_Pronto=0;
unsigned long Time_Servo=0;

char Dati_JOY[30]={};
byte Punta_JOY=0;

char Dati_JJx_1=0;
char Dati_Jx_1[10]={};
byte Punta_Jx_1=0;
byte Posizione_X=0;
byte JX=0;
String JX_1="";
String JY_1="";
char Dati_Jy_1[10]={};
byte Punta_Jy_1=0;
byte Posizione_Y=0;
byte JY=0;


void V_VELOCE()                                                       
{
 Velocita=3;                                                         
 digitalWrite(R_SX,HIGH);
 digitalWrite(R_DX,HIGH); 
}

void V_NORMALE()                                                      
{
 Velocita=2;                                                         
 analogWrite(R_SX,190);
 analogWrite(R_DX,190); 
}

void V_LENTO()                                                       
{
 Velocita=1;                                                        
 analogWrite(R_SX,150);
 analogWrite(R_DX,150); 
}

void D_FERMO()                                                       
 digitalWrite(R_sx_A,LOW);
 digitalWrite(R_dx_A,LOW);
 digitalWrite(R_sx_I,LOW);
 digitalWrite(R_dx_I,LOW);   
}

void D_AVANTI()                                                      
{
 digitalWrite(R_sx_A,HIGH);
 digitalWrite(R_dx_A,HIGH);
 digitalWrite(R_sx_I,LOW);
 digitalWrite(R_dx_I,LOW);   
}

void D_INDIETRO()                                                    
 digitalWrite(R_sx_A,LOW);
 digitalWrite(R_dx_A,LOW);
 digitalWrite(R_sx_I,HIGH);
 digitalWrite(R_dx_I,HIGH);
}

void D_SINISTRA()                                                    
{
 digitalWrite(R_sx_A,HIGH);
 digitalWrite(R_dx_A,LOW);
 digitalWrite(R_sx_I,LOW);
 digitalWrite(R_dx_I,HIGH);
}

void D_DESTRA()                                                      
{                                                         
 digitalWrite(R_sx_A,LOW);
 digitalWrite(R_dx_A,HIGH);
 digitalWrite(R_sx_I,HIGH);
 digitalWrite(R_dx_I,LOW);
} 




void LCD_TEMPERATURA() 
{
 dht = DHT.read(DHT11_PIN);                                           

  
 if(millis()-TimeDHT>=1000)                                           
impostato 
   {                                                                  

    Temperatura=(DHT.temperature); 
    Umidita=(DHT.humidity); 
    TimeDHT=millis();                                                

   }
 if((Temperatura!=TemperaturaMedia)||(Umidita!=UmiditaMedia))        

  
   {
    if(millis()-TimeDHTmedia>=500)                                    

      {                                                               

       TemperaturaMedia=(DHT.temperature); 
       UmiditaMedia=(DHT.humidity);  
       TimeDHTmedia=millis();                                        

       
      

       Temperatura==TemperaturaMedia && Umidita==UmiditaMedia?LettureDHT=1:LettureDHT=0;  
      }
   }
 
 if(LettureDHT==1)                                                   
scrivi sul Display 
   {
    DHT_LCD=1;
    DHT_BLUETOOTH=1;
    DHT_ESP=1;
   }
}



void LETTURE_DHT()
{ 
 if(DHT_LCD==1)
   {   
    lcd.setCursor(0,0);
    lcd.print(" Gradi     ");
    lcd.print(TemperaturaMedia);
    lcd.print(" C ");
    lcd.setCursor(0,1);
    lcd.print(" Umidita'  ");
    lcd.print(UmiditaMedia);
    lcd.print(" % "); 
    DHT_LCD=0;   
   }
      
 if(DHT_BLUETOOTH==1)
   {   
    Serial2.print("*T"+String(TemperaturaMedia)+"*");
    Serial2.print("*U"+String(UmiditaMedia)+"*");
    DHT_BLUETOOTH=0;
   }   
      
 if(DHT_ESP==1)
   {   
    if(millis()-Time_write_virtual>=1000)
      {
       
          Leggi_virtual++;
          if(Leggi_virtual==1){TX_1="V10=1";}
          if(Leggi_virtual==2){TX_1=TemperaturaMedia;}
          if(Leggi_virtual==3){TX_1="V10=0";}
          if(Leggi_virtual==4){TX_1="V11=1";}
          if(Leggi_virtual==5){TX_1=UmiditaMedia;}
          if(Leggi_virtual==6){TX_1="V11=0";}
          Serial1.println(TX_1);
          Time_write_virtual=millis();    
         
      }
    if(Leggi_virtual>6)
      {
       Leggi_virtual=0;
       DHT_ESP=0;
      }
   }
}





void USA_ESP8266()
{
 LEGGI_DA_ESP8266();
 delay(50); 
 
 if(RX_1=="V0=0"){virtual_pin0=0;}
 if(RX_1=="V0=1"){virtual_pin0=1;}
 if(RX_1=="V0=2"){virtual_pin0=2;}
 if(RX_1=="V0=3"){virtual_pin0=3;}
  
 if(RX_1=="V1=1"){virtual_pin1=1;}
 if(RX_1=="V1=0"){virtual_pin1=0;}
 
 if(RX_1=="V2=1"){virtual_pin2=1;}
 if(RX_1=="V2=0"){virtual_pin2=0;}
 
 if(RX_1=="V3=1"){virtual_pin3=1;}
 if(RX_1=="V3=0"){virtual_pin3=0;}
  
 if(RX_1=="V4=1"){virtual_pin4=1;}
 if(RX_1=="V4=0"){virtual_pin4=0;} 
 
 if(RX_1=="V5=1"){} 
 if(RX_1=="V6=1"){} 
 if(RX_1=="V7=1"){} 
 if(RX_1=="V8=1"){}
 if(RX_1=="V9=1"){} 
 
 if(virtual_pin0==0){D_FERMO();}
 if(virtual_pin0==1){V_LENTO();}
 if(virtual_pin0==2){V_NORMALE();}
 if(virtual_pin0==3){V_VELOCE();}
 
 if(virtual_pin1==1){D_AVANTI();Serial.println("D_AVANTI");}
 if(virtual_pin1==0){D_FERMO();virtual_pin1=2;}
 
 if(virtual_pin2==1){D_DESTRA();Serial.println("D_DESTRA");}
 if(virtual_pin2==0){D_FERMO();virtual_pin2=2;}
 
 if(virtual_pin3==1){D_INDIETRO();Serial.println("D_INDIETRO");}
 if(virtual_pin3==0){D_FERMO();virtual_pin3=2;}
  
 if(virtual_pin4==1){D_SINISTRA();Serial.println("D_SINISTRA");}
 if(virtual_pin4==0){D_FERMO();virtual_pin4=2;} 
 
 if(virtual_pin5==1){} 
 if(virtual_pin5==0){}
  
 if(virtual_pin6==1){} 
 if(virtual_pin6==0){}
 
 if(virtual_pin7==1){} 
 if(virtual_pin7==0){} 
 
 if(virtual_pin8==1){} 
 if(virtual_pin8==0){}
 
 if(virtual_pin9==1){}
 if(virtual_pin9==1){} 

  
} 


void LCD_ORARIO_TEMPERATURA()
{
 
 delay(50); 
 if(millis()-Tempo_Ora_Data_Temperatura1>=5000)                      
   {
    lcd.clear();                                                      
    LCD_ORA();                                                        
    LCD_DATA();                                                         
    if(millis()-Tempo_Ora_Data_Temperatura1>=10000)                   
      {
       lcd.clear();                                                  
       LCD_TEMPERATURA();                                              
       Tempo_Ora_Data_Temperatura1=millis();                          
      } 
   }
}


void loop() 
{
  LCD_ORARIO_TEMPERATURA();
  LETTURE_DHT();
  USA_BLUETOOTH(); 
  USA_ESP8266();
  MUOVI_SERVO();
}

Puso:
Ma col Joystik virtuale effettivamente non ho nulla che mi separa il VALORE del PULS_1 dalla dicitura PULS_2.

Anche il povero '_' è un carattere :wink:

Ovviamente su quello Postato per ESP ed ARDUINO mancano alcuni pezzi se superavo i 9000 caratteri.

Questo è il pezzo a cui sto lavorando(ovviamente NON funzionante ed Incasinato).

void MUOVI_SERVO()
{ 
 if(Serial1.available())
   {
    JX_1="";
    JY_1="";
    while(Serial1.available())
         {
          Dati_JOY[Punta_JOY]=Serial1.read();
          Dati_Jx_1[Punta_Jx_1]=Dati_JOY[Punta_JOY]; 
          
             
          Dati_JJx_1=Dati_JOY[Punta_JOY];
          
          
          if((Dati_Jx_1[Punta_Jx_1]="V")&&(Punta_JOY==2)){JX=0;}
          
          if((Dati_Jx_1[Punta_Jx_1]="=")&&(Punta_JOY==2)){JX=1;}
          
          if(JX==1)
            {
             Punta_JOY++;
             Punta_Jx_1=Punta_JOY;
             JX=2;
            }
          if(JX=2)
            {
             Dati_Jx_1[Punta_Jx_1]=Serial1.read();
             JX_1.concat(Dati_Jx_1);
             
             Serial.println(JX_1);
            
             if(Dati_Jx_1[ Punta_Jx_1]="V"){JX=0;}
             }  
          
          Punta_JOY++;    
    
          
           
         }
         
        }
 if(!Serial1.available()){Punta_JOY=0;JX=0;JY=0;}

 
Posizione_X= Serial.read();

Posizione_Y=0;