Salve a tutti,
ho preso dalla rete e personalizzato uno sketch che legge dal sensore temperatura e umidità e tramite una pagina asp le scrive in una tabella Sql.
Lo sketch in sede di verifica è OK, e quando alimento Arduino UNO è pure OK.
Ma ad un certo punto, per un evento a me sconosciuto perchè si blocca e me ne accorgo dalla data di scrittura dei valori nella tabella SQL.
Lo sketch è il seguente:
#include <DHT22.h>
#define DHT22_PIN 2
#include <SPI.h>
#include <WiFi.h>
DHT22 myDHT22(DHT22_PIN);
char ssid[] = "mioSSID";
char pass[] = "Password";
int keyIndex = 0;
int status = WL_IDLE_STATUS;
IPAddress server(IP);
WiFiClient client;
void setup(void)
{
Serial.begin(9600);
// check for the presence of the shield:
if (WiFi.status() == WL_NO_SHIELD) {
Serial.println("WiFi Shield non Presente");
// don't continue:
while(true);
}
// attempt to connect to Wifi network:
while ( status != WL_CONNECTED) {
//Serial.print("Mi connetto alla Rete (SSID): ");
//Serial.println(ssid);
// Connect to WPA/WPA2 network. Change this line if using open or WEP network:
status = WiFi.begin(ssid, pass);
// wait 3 second for connection:
delay(3000);
}
//Serial.println("Connesso alla Rete WiFi");
printWifiStatus();
}
void loop(void)
{
DHT22_ERROR_t errorCode;
//delay(1000); //Rileva ogni 5 secondi
//Serial.println();
//Serial.println("Rilevo Dati dal Sensore...");
errorCode = myDHT22.readData();
switch(errorCode)
{
case DHT_ERROR_NONE:
float Temperatura= myDHT22.getTemperatureC();
float Umidita= myDHT22.getHumidity();
//Serial.print("Temperatura: ");
//Serial.print(Temperatura);
//Serial.print("C - Umidita': ");
//Serial.print(Umidita);
//Serial.println("%");
//Serial.println();
char buffer[5];
String t = dtostrf(Temperatura, 1, 5, buffer);
String u = dtostrf(Umidita, 1, 5, buffer);
//Serial.println(t + " " + u);
if (client.connect(server, 80)) {
//Serial.println("Scrivo i Dati nel Server SQL");
client.println("GET /Arduino/CaricaTU.asp?Temperatura=" + t + "&Umidita=" + u + " HTTP/1.1");
client.println("Host: hostname");
client.println("Connection: close");
client.println();
//Serial.println("Scrittura avvenuta con Successo");
//while (client.available()) {
//char c = client.read();
//Serial.write(c);
//}
//Ripeti ogni 15 minuti
//delay(900000);
delay(2000);
}
}
}
void printWifiStatus() {
// print the SSID of the network you're attached to:
//Serial.print("SSID: ");
//Serial.println(WiFi.SSID());
// print your WiFi shield's IP address:
IPAddress ip = WiFi.localIP();
//Serial.print("Indirizzo IP: ");
//Serial.println(ip);
// print the received signal strength:
long rssi = WiFi.RSSI();
//Serial.print("Potenza del Segnale:");
//Serial.print(rssi);
//Serial.println(" dBm");
}
Stamane ho commentato tutte le istruzioni "serial.print..." ma dopo 24 cicli/scritture si è fermato.
E' come se si saturasse qualcosa, non saprei.
Chi mi può aiutare gentilmente a capirne di più?
Il codice devi racchiuderlo nei tag code, vedi sezione 7 del regolamento, spiega bene come fare ( pulsante </> ).
Altrimenti parte del codice può essere visualizzata male o mancare perchè interpretato come attributo del testo stesso.
Per favore edita il tuo post, e aggiungi i tag code
Ragazzi, qualche aggiornamento.
Ho provato a capire di più sol monitor seriale e a quanto pare lui continua a visualizzare i valori di temperatura e umidità rilevati dal sensore.
La parte di codice che mi sembra va in blocco è quella relativa alla chiamata della pagina asp per mezzo della quale passo col get i valori per poi scriverli nella tabella Sql.
Avete qualche idea?
@crileone: Ti è stato già detto che il codice, in conformità al REGOLAMENTO, punto 7, DEVE essere racchiuso tra i tag CODE (... sono quelli che in edit inserisce il bottone fatto così: </>, tutto a sinistra) quindi, edita il tuo post precedente e sistemalo. Grazie.
Ciao a tutti ragazzi,
ho risolto il problema alla fine.
Devo purtroppo smentire @uwefed in quanto non era un problema di RAM esaurita.
L'arduino continuava a funzionare ma si bloccava la parte che chiama la pagina web e scrive in un tabella Sql i valori di Temp e Umid.
Mi sono accordo di aver lasciato, dimenticato, l'istruzione che inizializzava il monitor seriale senza farne uso.
Questa: " Serial.begin(9600);".
Evidentemente Arduino attende qualcosa verso questa porta e a un certo punto andava in stallo.
Dopo averla commentata il tutto ha funzionato e anche con stabilità dato che ormai è da una settimana acceso e che scrive in tabella.
Inoltre volevo fare presente, tra l'altro non è la prima volta, che alcuni signori che in questo forum vantano tanti post e quindi tanta esperienza dovrebbero considerare l'utilizzo di un linguaggio più umano e meno imperativo.
Per esempio il signor @Guglielmo è con me sempre abbastanza indisponente e il suo ruolo sembra più da maestrino che detta o ricorda alcune regole piuttosto di aiutare chi come me può averne bisogno.
Vi ricordo che lo scopo di questo forum e in generale di tutta la cultura collaborativa e partecipativa è proprio quello di guidare, consigliare e formare la gente che vuole farsi certe esperienze.
Anche questo forum ha questo scopo e io sono molto deluso dal comportamento di alcuni.
Capisco che ci sono delle regole e che io non le avevo applicate quando ho pubblicato lo sketch ma questo non legittima nessuno a usare imperativi che non consento.
Infine il problema me lo sono risolto da solo, alla faccia dello strumento di aiuto.
Grazie a tutti e ricordatevi di essere più buoni ora che è Natale.
crileone:
Per esempio il signor @Guglielmo è con me sempre abbastanza indisponente e il suo ruolo sembra più da maestrino che detta o ricorda alcune regole piuttosto di aiutare chi come me può averne bisogno.
Mi spiace per te ma ... il forum ha delle REGOLE di comportamento che vanno rispettate, i moderatori sono presenti per far rispettare queste regole, quindi ... indisponete o meno è mio compito farle rispettare.
Se poi ti si può aiutare dipende ovviamente dall'argomento del thread ... non siamo mica onniscienti !
Anche tu però, scrivi dai delle soluzioni che non sono vere.
Questa: " Serial.begin(9600);".
Evidentemente Arduino attende qualcosa verso questa porta e a un certo punto andava in stallo.
Non è assolutamente così, il begin inizializza il pin 0 e 1 da utilizzarsi come seriale, non attende nulla se non viene specificato da altre linee di codice.
a meno che tu non abbia utilizzato nel circuito i suddetti pin 0 e 1 e inizializzando la seriale hai creato un conflitto, ma questo non lo sappiamo dato che non ci sono schemi.
Devo purtroppo smentire @uwefed in quanto non era un problema di RAM esaurita.
Aveva ragione, lo hai dimostrato con questo
Mi sono accordo di aver lasciato, dimenticato, l'istruzione che inizializzava il monitor seriale senza farne uso.
Questa: " Serial.begin(9600);".
e non hai risolto il problema
usare
Usa la macro F() nelle stampe .print("testo") che diventa .print(F("testo"));
è un buon consiglio, significa che sei al limite di RAM e ti basterà aggiungere qualche variabile o anche un solo print che si bloccherà nuovamente.
rinnovo il suggerimento anch'io usa la macro F sia con il serial.print che con il client.print
pablos:
Anche tu però, scrivi dai delle soluzioni che non sono vere.
Non è assolutamente così
Esatto, la serial.print semplicemente inizializza l'UART a livello hardware e il buffer della seriale, ovvero ben 64 byte di ram, non aspetta nulla dalla seriale e l'eventuale lettura, con la serial.read, della UART è sotto interrupt, non è bloccante a meno di non creare appositamente del codice che non fa avanzare il programma se non si riceve nulla.
Va da se che se il problema era proprio la ram che esaurisce, altamente probabile, il recuperare 64 byte può essere sia la soluzione definitiva che una soluzione temporanea, ovvero il sistema andrà nuovamente in blocco, dipende da come viene usata la ram dinamica.
crileone:
Vi ricordo che lo scopo di questo forum e in generale di tutta la cultura collaborativa e partecipativa è proprio quello di guidare, consigliare e formare la gente che vuole farsi certe esperienze.
...
Infine il problema me lo sono risolto da solo, alla faccia dello strumento di aiuto.
Lo scopo, come dici giustamente anche tu, è quello di guidare, consigliare eccetera, non quello di "risolvere i malfunzionamenti". Non è un servizio di assistenza tecnica a pagamento, quindi è totalmente fuori luogo dire che te lo sei risolto da solo alla faccia dello strumento di aiuto.
Può capitare (e talvolta capita) che venga posto un quesito che rimane senza soluzione o che la soluzione sia trovata dalla stessa persona che aveva posto il quesito. Tutto questo è coerente con la prima delle tue frasi che ho citato.