La prima dichiara una variabile intera
La seconda ti fa rileggere il reference
La terza non mi è chiara nemmeno a me
EDIT tra l'altro non trovo traccia delle print che dici di fare....
String(LU1ORAON) = message.substring(3, 5); // creo una sottostringa con il valore di ora ON
LU1ORAON = message.substring(3, 5);
la prima riga è quella che converte la sottostringa message.substring(3, 5) in una variabile intera, nello specifico nella variabile int LU1ORAON.
Ripeto se faccio una stampa seriale di LU1ORAON io la vedo piena, se dico al bot di fare un reply = LU1ORAON; il valore contiene esattamente quello che mi aspetto.
Non capisco per miei limiti, perchè poi LU1ORAON si azzera quando viene usata nella funzione accesnsioni().
PS: questa riga LU1ORAON = message.substring(3, 5); è un tentativo maldestro di capire cosa succedeva. L'ide compila anche con questa riga e la serial stampa il valore.
Se sei sicuro....
Vorrà dire che l'errore è da qualche altra parte
Magari nei pezzi di codice che hai omesso, ricontrollali....
droidprova:
L'ide compila anche con questa riga e la serial stampa il valore.
OCCHIO. Non parlo del pezzo del codice in questione.
Anche se compila, un pezzo di codice potrebbe essere corretto sintatticamente ma poi non fa quel che ti aspetti. Quindi non dare per scontato "compila=funziona"
String(LU1ORAON) = message.substring(3, 5); // creo una sottostringa con il valore di ora ON
Questa riga non ha alcun senso pratico. Stai costruendo un oggetto String temporaneo senza nome, che costruisci sul valore di LU1ORAON e a cui poi assegni la substring. Peccato che sia appunto senza nome e che quindo vada perso subito.
La riga successiva è più sensata, ma non so bene cosa succeda assegnando una substring ad un intero... O la converti o rendi LU1ORAON String.
dunque ho costruito un oggetto String temporaneo, per questo il valore si perde quando cambio funzione? Pensa sukko che ero convinto di aver capito il reference
...
Come faccio quindi ha trasformare la substring nell' intero LU1ORAON e passarlo ad altra funzione?
Grazie
Il vecchio e glorioso atoi()?
Che cominci anche ad abituarti a usare le stringhe di 'C' invece degli oggetti stringa?
Che ti sono stati sconsigliati, ma sembra che non ci credi che non vanno usati...
Standardoil:
Il vecchio e glorioso atoi()?
Che cominci anche ad abituarti a usare le stringhe di 'C' invece degli oggetti stringa?
Che ti sono stati sconsigliati, ma sembra che non ci credi che non vanno usati...
No, è che ho cominciato... Sicuramente riprendo anche il discorso Char se non ho difficoltà a credere che sia migliore. Non metto assolutamente in dubbio la vostra esperienza.
droidprova:
...ero convinto di aver capito il reference![]()
...
A proposito: quale parte di "rileggere il reference" non ti era chiara?
droidprova:
... riprendo anche il discorso Char se non ho difficoltà a credere che sia migliore ...
No, vedo che NON ti è chiara una cosa; qui non stiamo facendo a "chi è più bello", e non c'è un "migliore" tra le stringhe classiche del 'C' (string ... tutto in minuscolo) e la classe String (S maiuscola) del C++, il problema di cui sembri NON renderti conto è che, come avrò scritto qualche centinanio di volte su questo forum, NON sei su un PC dove c'è un sistema operativo ed un "garbage collector", sei su una piccola MCU con solo 2KBytes di SRAM, dove devi fare tutto tu e dove usare la classe "String", a causa dell'allocazione e riallocazione dinamica della memoria, porta quasi sempre ... a grossi problemi e sicuri mal di testa !!!
Per cui, ribadisco il concetto che ti ha detto più volte Standardoil ... impara ad usare le stringhe classiche del 'C' ... ovvero semplici array di char terminati dal carattere null (0x00) e le funzioni che trovi nella libreria standard (... che, oltretutto, è automaticamente inclusa dal IDE) AVR libc ed, in particolare, quanto è in <string.h>.
Guglielmo
Per lo op
Io quello che stai facendo tu lo ho già fatto per la mia inganneressa preferita
Cronotermostato programmabile da telegram con log delle temperature e trasferimento file ( di puro testo) tra PC e unità remota via bot di telegram
E non ho messo una Stringa che sia una
Credimi che ci ho messo di meno a reinventare il client telegram che evitare i casini della Classe String
Ok grazie
Dunque ieri sera ho cominciato ad approfondire le stringhe di C, e grazie alle vostre dritte ho provato uno sketch dedicato:
char stringa[13] = "LU19930-1230";
int LU1ORAON = 0;
int LU1MINON = 0;
int LU1ORAOFF = 0;
int LU1MINOFF = 0;
char comando[4] = {0};
char tmp[11];
void setup() {
Serial.begin(9600);
}
void loop() {
/* leggo la stringa da seriale e la inserisco nell' array stringa "trovi esempi LU19930-1230" */
stampa();
strncpy(comando, stringa, 3); // In comando è presente la stringa LU1
if (strcmp(comando, "LU1") == 0) { // Se comando è uguale a LU1 faccio qualcosa
strncpy(tmp, stringa + 3, 2);
LU1ORAON = atoi(tmp); // Passo il puntatore al 3 carattere di stringa, e prelevo 2 caratteri, tmp= 99
//Serial.println(LU1ORAON);
strncpy(tmp, stringa + 5, 2); // tmp=30
LU1MINON = atoi(tmp);
//Serial.println(LU1MINON);
strncpy(tmp, stringa + 8, 2); // tmp=12
LU1ORAOFF = atoi(tmp);
//Serial.println(LU1ORAOFF);
strncpy(tmp, stringa + 10, 2); // tmp=30
LU1MINOFF = atoi(tmp);
//Serial.println(LU1MINOFF);
}
}
void stampa() {
Serial.println(LU1ORAON);
Serial.println(LU1MINON);
Serial.println(LU1ORAOFF);
Serial.println(LU1MINOFF);
delay(4000);
}
funziona alla grande e ottengo come stampa:
99 // ho messo 99 perchè in una prova con 08 il monitor stampava solo 8 allora volevo verificare ...
30
12
30
Ho un problema però, la funzione di invio e ricezione bot, di cui incollo il codice adopera come variabile
una stringa di nome message, per cui non capisco come faccio ad abbinare questa stringa al char stringa[13] del nuovo metodo:
#include <ESP8266TelegramBOT.h> // libreria telegram
.....
// funzione invio e ricezione messaggi dal/al bot
void Bot_ReplyMessages() {
for (int i = 1; i < bot.message[0][0].toInt() + 1; i++) {
String chatID = bot.message[i][4];
String message = bot.message[i][5];
message.toUpperCase(); // rendo maiuscola tutta la stringa per evitare errori di sintassi
String reply;
if (message == "ON") { // accende il carico
digitalWrite(rele, HIGH);
state = true;
reply = "acceso";
}
else if (message == "OFF") { // spegne il carico
digitalWrite(rele, LOW);
state = false;
reply = "spento";
man = false;
aut = false;
}
else if (message == "STATO") { // chiede al sistema se il carico è acceso o spento
if (state == true) {
reply = "Carico acceso";
}
if (state == false) {
reply = "Carico spento";
}
}
else if (message == "TEMP") { // chiede la temperatura
reply = String(t_read) + " °C";
}
......// qui devo inserire le comparazioni con i comandi
else { // caso comando errato
reply = "command unknown";
}
bot.sendMessage(bot.message[i][4], reply, "");
}
bot.message[0][0] = ""; // reset messaggi
}
Quella libreria è interamente basata sulla classe String (... io l'ho abbandonata perché erano più i crash del ESP che altro e, salvo non l'abbiano corretta ... te ne accorgerai presto se la usi intensivamente), comunque, se ben ricordo (il C++ NON è il mio forte ... io uso essenzialmente ANSI C
) ... se una funzione si aspetta un elemento "String", puoi passargli una stringa classica del 'C' (char array) così come ad una variabile di tipo String, puoi assegnare una stringa classica del 'C' (char array).
Guglielmo
Capito Guglielmo, tu usi una libreria più aggiornata per Telegram? Se si mi passeresti il link?
Grazie
NO, non lo uso più, troppi crash sia su ESP che su MKR1000 ...
... però proprio Standardoil ha scritto lui dei moduli per il colloquio con Telegram ... leggi QUI e ... visto che sta partecipando a questo thread, magari ti può dire qualche cosa di più ... ![]()
Guglielmo
char s[N];
String str;
Da char[] a String:
str = s;
Da String a char[]:
strncpy (s, str.c_str(), N);
Se basta un puntatore, si può recuperare semplicemente quello con c_str().
NB: strncpy() non è 100% sicuro, vedasi strlcpy() o forzare sempre l'ultimo byte a \0.
ok provo. Grazie sukko!
gpb01:
NO, non lo uso più, troppi crash sia su ESP che su MKR1000 ...
... però proprio Standardoil ha scritto lui dei moduli per il colloquio con Telegram ... leggi QUI e ... visto che sta partecipando a questo thread, magari ti può dire qualche cosa di più ...Guglielmo
Lo avevi poi provato?
Oltre ai validi consigli, ti do' un piccolissimo consiglio, invece di:
strncpy(comando, stringa, 3); // In comando è presente la stringa LU1
if (strcmp(comando, "LU1") == 0) { // Se comando è uguale a LU1 faccio qualcosa
eviti una variabile ed una istruzione in più se usi la strncmp():
if (strncmp(stringa, "LU1", 3) == 0) { // Se comando è uguale a LU1 faccio qualcosa
Ovviamente il tuo codice non è sbagliato, funziona allo stesso modo, ma è solo per farti conoscere anche la strncmp() ![]()