Go Down

Topic: [Risolto]Progetto stazione meteo.Problema con codice ma non capisco dove sbaglio (Read 2256 times) previous topic - next topic

tarroste

Ciao,

Ho un problema (penso) con il codice del mio progetto ma non capisco dove non funziona. Cerco di spiegare il + dettagliatamente possibile.

Il progetto è una stazione meteo e include i seguenti componenti:
  • Arduino UNO r3
  • DHT22 sensore Temperatura e umidità dell'aria
  • SEN92355P sensore umidità del suolo
  • DS18S20 sensore temperatura al suolo
  • Adafruit TSL2561 sensore di luminosità
  • Adafruit datalogger shield (RTC + SDcard): scheda preassemblata munita di batteria per il clock
  • (+ resistenze di pullup e pulldown per i sensori dove richiesto)


Tutto il codice l'ho scaricato dai vari esempi che ho trovato dai siti dei sensori e anche da arduino.cc. Ho solo messo tutto insieme (e qui ci sarà l'errore che non vedo!!!).

  • Ho fatto un circuito con Arduino e tutti i sensori. Ho messo insieme il codice necessario per acuisire i dati dai sensori e visualizzare tutto sulla serial window. Funziona: tutti i sensori restituiscono i dati attesi.
  • Successivamente ho rimosso il circuito e testato la shield RTC+SD (sempre con batteria) usando il codice a disposizione sul sito adafruit. Ha funzionato, leggo l'orario e lo scrivo in un file insieme ad altri caratteri da me aggiunti.
  • Infine monto tutto insieme. La shield ha una sezione per la prototipazione, quindi creo il circuito saldando i componenti (e relative resistenze pullup e pulldown dove necessario). Unisco il codice con l'obiettivo di leggere i dati dai sensori e registrarli sulla SD.

E qui il compilatore di Arduino mi dà un warning sulla memoria disponibile:
Lo sketch usa 24.938 byte (77%) dello spazio disponibile per i programmi. Il massimo è 32.256 byte.
Le variabili globali usano 1.793 byte (87%) di memoria dinamica, lasciando altri 255 byte liberi per le variabili locali. Il massimo è 2.048 byte.
Poca memoria disponibile, potrebbero presentarsi problemi di stabilità.



Però una volta eseguito, sulla serial window, mostra i dati e poi la scritta "error opening dati.log" che è nel mio codice, indicando che il file non è in qualche modo "raggiungibile/scrivibile".

Come ulteriore test ho eseguito il codice precedente con i soli sensori, lasciando però tutto collegato (cioè il progetto completo come detto al punto 3). Funziona e a video mostra i dati.
Poi, ho caricato solo il codice per scrivere su SD lasciando tutto collegato. E funziona, scrive sulla SD.

Quindi, credo che il codice finale (in allegato) manda qualcosa in "conflitto" ma non riesco a capire cosa non va. Forse è una mia svista, ma non ne vengo a capo.

Potete aiutarmi?
Grazie!

SukkoPera

Innanzitutto ciò che colleghi o meno all'Arduino non ha effetti di per sé sulla RAM utilizzata, questa dipende solo dal codice che ci carichi sopra. Se i sensori non li gestisci in software, che siano collegati o meno non fa differenza.

Ogni libreria richiede una fetta di RAM (e di flash) per essere utilizzata, ed evidentemente la libreria SD non ne trova abbastanza per funzionare, del resto il compilatore ti sta avvisando che lavori in condizioni precarie:

Quote
Poca memoria disponibile, potrebbero presentarsi problemi di stabilità.
Comunque nel tuo caso puoi liberare un po' di RAM racchiudendo tutte le stringhe che stampi nella macro F(), tipo:

Code: [Select]
Serial.println("Light Sensor Test");

diventa:

Code: [Select]
Serial.println(F("Light Sensor Test"));

Prova intanto a fare questo e vedi se la situazione migliora.
"Code is read much more often than it is written, so plan accordingly. Design for readability."

Guida rapida a ESP8266: https://goo.gl/kzh62E

tarroste

Ciao SukkoPera,
non conoscevo la macro F() e mi sono subito informato... effettivamente funziona benissimo  :)

al momento non ho con me il progetto, ma ho compilato il codice ed ora mi torna:
Lo sketch usa 25.496 byte (79%) dello spazio disponibile per i programmi. Il massimo è 32.256 byte.
Le variabili globali usano 1.266 byte (61%) di memoria dinamica, lasciando altri 782 byte liberi per le variabili locali. Il massimo è 2.048 byte.


Spero che sia solo un problema di memoria come hai ipotizzato.
Appena riesco, carico lo sketch e posto i risultati.
Intanto ti ringrazio per la risposta.

tarroste

Ciao a tutti,

Aggiorno lo stato di questo post, come RISOLTO.  ;)

La soluzione è quella presentata da SukkoPera (che ringrazio).
In sostanza: la memoria libera disponibile una volta caricato lo sketch, probabilmente non era sufficiente all'esecuzione corretta di tutti i comandi e quindi sulla seriale mi mostrava l'errore.
Utilizzando la macro F() su tutti i serial.print di solo testo, la memoria utilizzata è diventata sufficiente e ora il programma vede e scrive sulla SD.

Il prossimo passo sarà "formattare il testo" in modo da avere i dati in tabella.

Aggiungo un particolare OT: mi è successo che dopo aver caricato lo sketch con la modifica F(), Arduino è andato in "blocco". Ho risolto, dopo alcuni tentativi, con la procedura di "sblocco" trovata qui nel forum: http://playground.arduino.cc/Italiano/Pobleminoti#blocco

@moderatore: come si fa a mettere la dicitura [risolto] nel titolo del post?

Maurotec

Quote
@moderatore: come si fa a mettere la dicitura [risolto] nel titolo del post?
Nel tuo post iniziali devi entrare in modifica (in basso a destra) e poi nel titolo aggiungi [Risolto].

Ciao.

Go Up