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.
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.
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
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...
Perdonami,,,e ti ringrazio ancora davvero...
Un aiuto prezioso
cicho2004:
Perdonami,,,e ti ringrazio ancora davvero...
Un aiuto prezioso
Perdonarti de che ? Figurati, è un piacere essere d'aiuto.