Problema con le stringhe...

Gent.mi …

Ho un piccolo problema con il terzetto Arduino UNO R3 - SIM900 - DHT11.
Ho realizzato un piccolo sketch per inviare i dati rilevati da DHT11 per sms…

Il risultato è che ciclicamente mi ripete il valore letto…

Lo sketch :

#include "SIM900.h"
#include "SoftwareSerial.h"
#include "sms.h"
#include "string.h"
#include <dht11.h>

SMSGSM sms;
dht11 DHT;
#define DHT11_PIN 4

char numphone[20];
boolean started = false;

void setup() {
    pinMode(pin, INPUT);
    //Serial Connection
    Serial.begin(9600);
     if (gsm.begin(2400)){
        Serial.println("\nstatus=READY");
        started=true;
    }    
    else{
        Serial.println("\nstatus=IDLE");
    }
    if(started){
         if (sms.SendSMS("numphone", "ATTIVO"))
        Serial.println("\nSMS sent OK");
    }
    Serial.print("DHT TEST PROGRAM \n");
    Serial.println("LIBRARY VERSION: ");
    Serial.println(DHT11LIB_VERSION);
    Serial.println();
}

void loop() {
  int chk;
  char value_str[5];
  char *messtemp = "La temperatura e' :";
  char *mess;  
  
  Serial.print("DHT11, \t");
  chk = DHT.read(DHT11_PIN);    // READ DATA
  switch (chk){
    case DHTLIB_OK:  
                Serial.print("OK,\t"); 
                break;
    case DHTLIB_ERROR_CHECKSUM: 
                Serial.print("Checksum error,\t"); 
                break;
    case DHTLIB_ERROR_TIMEOUT: 
                Serial.print("Time out error,\t"); 
                break;
    default: 
                Serial.print("Unknown error,\t"); 
                break;
  }
 // DISPLAT DATA
  Serial.print(DHT.humidity,1);
  Serial.print(",\t\t\t");
  Serial.println(DHT.temperature,1);
  
  chk = DHT.temperature;
  itoa(chk,value_str,10);
  
  mess = strcat(messtemp,value_str) ;
  sms.SendSMS("numphone",mess); 
  Serial.println(mess);
  delay (1000);
}

Il risultato è :

“La temperatura è : 22”
“La temperatura è : 2222”
“La temperatura è : 222222”
“La temperatura è : 22222222”

…ecc…

Ciao.
non so se il prob e' questo,
hai definito:

char value_str[5];

ma questo e' un array....

prova a mettere:

char value_str;

oppure: lo gestisci come erray

itoa(chk,value_str[1],10);

mess = strcat(messtemp,value_str[1]) ;

sms.SendSMS("numphone",mess);

Scusa l'espressione ma... hai scritto una schifezza. :grin:

Quando dichiari char *messtemp = "La temperatura e' :";
crei una zona di memoria di 20 caratteri, ovvero la frase (19 charatteri) più il carattere fine stringa '\0' all'ultimo posto.
Poi accodi a sta roba un valore ma di spazio al fondo non c'e' nè. la strcat scrive partendo da 20 carattere, si perde il fine stringa e poi inizia a scrivere in memoria NON allocata. E' strano che non si inchioda.
Meglio usi la snprintf e scrivi:

char mess[35];  // dichiaro uno spazio adeguato a contenere tutta la frase
...
itoa(chk,value_str,10);
snprintf(mess,35,"La temperatura e' : %s",value_str);
/////mess = strcat(messtemp,value_str) ;
sms.SendSMS("numphone",mess); 
Serial.println(mess);
...

Ed elimini quel messtemp.

diodo157:
Ciao.
non so se il prob e' questo,
hai definito:

char value_str[5];

ma questo e' un array....

prova a mettere:

char value_str;

oppure: lo gestisci come erray

itoa(chk,value_str[1],10);

mess = strcat(messtemp,value_str[1]) ;

sms.SendSMS("numphone",mess);

In quel caso mi dà errore di compilazione sui parametri della strcat...

nid69ita:
Scusa l'espressione ma... hai scritto una schifezza. :grin:

Quando dichiari char *messtemp = "La temperatura e' :";
crei una zona di memoria di 20 caratteri, ovvero la frase (19 charatteri) più il carattere fine stringa '\0' all'ultimo posto.
Poi accodi a sta roba un valore ma di spazio al fondo non c'e' nè. la strcat scrive partendo da 20 carattere, si perde il fine stringa e poi inizia a scrivere in memoria NON allocata. E' strano che non si inchioda.
Meglio usi la snprintf e scrivi:

char mess[35];  // dichiaro uno spazio adeguato a contenere tutta la frase

...
itoa(chk,value_str,10);
snprintf(mess,35,"La temperatura e' : %s",value_str);
/////mess = strcat(messtemp,value_str) ;
sms.SendSMS("numphone",mess);
Serial.println(mess);
...



Ed elimini quel messtemp.

ti ringrazio :slight_smile:

Usando il metodo del char *messtemp = "La temperatura e' :";
dovevi lasciare un pò di spazi per il valore della temperatura e poi usare strcpy() ovvero string copy

char *messtemp = "La temperatura e' :        ";
...
itoa(chk,value_str,10);
strcpy(messtemp+20,value_str);
/////mess = strcat(messtemp,value_str) ;
sms.SendSMS("numphone",mess); 
Serial.println(mess);

nid69ita:
Usando il metodo del char *messtemp = "La temperatura e' :";
dovevi lasciare un pò di spazi per il valore della temperatura e poi usare strcpy() ovvero string copy

char *messtemp = "La temperatura e' :        ";

...
itoa(chk,value_str,10);
strcpy(messtemp+20,value_str);
/////mess = strcat(messtemp,value_str) ;
sms.SendSMS("numphone",mess);
Serial.println(mess);

Ti ringrazio ancora per il chiarimento....
Ho paura di dover riprendere in mano il K&R...
perchè sono passati troppi anni ... e mi intorto anche su queste semplici cose... :stuck_out_tongue: :stuck_out_tongue:

Perdonami,,,e ti ringrazio ancora davvero...
Un aiuto prezioso :wink: :wink:

cicho2004:
Perdonami,,,e ti ringrazio ancora davvero...
Un aiuto prezioso :wink: :wink:

Perdonarti de che ? Figurati, è un piacere essere d'aiuto. :slight_smile: