datalogger non apre file per scrittura.

Buonasera a tutti,
Ho un modulo datalogger sul quale salvo dei dati ogni 2 minuti.
riga 503
Da quando ho però aggiunto un nuovo tipo di controllo su di una ventola,
riga 441 …riga 498,
da quello che sono riuscito a capire con il debug, non apre piu’ il file per la scrittura.
Ho provato ad uplodare uno codice più base … funziona.
Ora, il mio dubbio e’ che, con codice completo, utilizzo 82% della memoria.
A vostro avviso, potrebbe esser dovuto a questa condizione?
Scusate se non uso i termini corretti, spero di essere stato chiaro a sufficienza.
Grazie per eventuali spunti , e per non continuare a raccordare l’ angolo con la testa!!

arduinounoorchidario_new2.ino (18.4 KB)

Penso che sarebbe utile che tu postassi il link esatto al datalogger che hai, l’output della compilazione col codice completo e quello senza la nuova funzione, una descrizione più completa delle prove e relativi esiti (es. non ho capito se semplicemente commenti la chiamata alla funzione PID_Hum dal loop o togli del tutto anche la funzione, e se hai provato anche a verificare se la SD.begin() fallisce o meno ossia se ritorna true o false quando c’è la PID_Hum) e magari uno schemino o almeno l’elenco dei pin che hai collegato.
EDIT: ah, e anche se la ventola sul pin 5 l’hai aggiunta solo adesso o c’era pure prima, e se staccando quella ventola funziona il datalogger (è ininfluente la posizione di quel codice, per cui lascia solo la funzione datalogger).
E, anche se non credo ti possa dare problemi, occhio che hai due volte la #define di Hum_Fan (righe 19 e 20).

Buonasera e grazie a docdoc per i suggerimenti.
Rispondo alle domande esposte e allego i codici provati.

purtroppo non trovo il nome specifico del datalogger.
Posso mandare solo le specifiche e il link dell’acquisto

specifiche datalogger:
Modulo Micro SD Card:
Dimensioni: 45 * 25 * 6mm
Peso: 5 g
Compatibile: scheda Micro SD (≤2G), scheda Micro SDHC (≤32G)
Alimentazione: 4,5 V ~ 5,5 V.
Corrente elettrica: 0,2-200 mA
Interfaccia: SPI
6 pin: GND, VCC, MISO, MOSI, SCK, CS

quando ho provato il codice arduinounoorchidario_new2, ho tolto sia la funzione PID_Hum che la chiamata nel loop. Non funziona.

il codice arduinounoorchidario_old è con il vecchio controllo per Fan_Temp
riga 328 void Fan_Temp(). Funziona

il codice datalog_funzionante è una simulazione senza molto del codice presente in entrambi codici precedenti, solo per testare il datalogger. Funziona.

da quello che ho capito,e se ho capito bene, se non carica la SD.begin(), continua a boostrappare.
Comunque ho anche provato un if (!SD.begin(chipSelect)) {
Serial.println(“Card failed, or not present”);
// don’t do anything more:
return;
}
per vedere su seriale se SD.begin(),… viene caricato.

collegamenti;
MOSI - pin 11
MISO - pin 12
CLK - pin 13
CS - pin 4
SDA per sensore stemma seesaw,lcd e HTU21D sensore umidità e temperatura
SCL per sensore stemma seesaw,lcd e HTU21D sensore umidità e temperatura
le periferiche hanno indirizzi I2c diversi.
5v per realtimeclock, datalogger,sensore umidità terreno, lcd
3.3v per sensore HTU21D umidità e temperatura
Hum_Fan pin 5 analogwrite
Temp_Fan pin 10 analogWrite
Heater pin 8 uscita per ssr riscaldatore 12vdc
Humidifier pin 6 uscita per ssr umidificatore 24vdc
pump_soilmoiusture A2 uscita per minipompa acqua terreno 12vdc
alimentazione da convertitore dc/dc 12/7 su Vin

la ventola c’è sempre stata, come nel codice arduinounoorchidario_old.

Mi sembra che non sono uguali, sono simili ma una fà umidità e l’altra temperatura
19#define Hum_Fan 5 //output PWM fan umidita alta
20#define Temp_Fan 10 //PWM ventole raffredamento

spero di aver detto tutto….
ciao.

arduinounoorchidario_old.ino (14.1 KB)

datalog_funzionante.ino (1.61 KB)

eeehhhh…… qualcosa ho dimenticato….
l output di compilazione. lo allego.
scusate

output compilatore.txt (92.9 KB)

sunnybyte: purtroppo non trovo il nome specifico del datalogger. Posso mandare solo le specifiche e il link dell'acquisto https://www.amazon.it/gp/product/B082V53SVS/ref=ppx_yo_dt_b_asin_title_o03_s00?ie=UTF8&psc=1

Ah, ok, allora non è una shield datalogger, sono due modulini separati, uno per l'RTC (I2C) e l'altro per la SD (SPI).

il codice datalog_funzionante è una simulazione senza molto del codice presente in entrambi codici precedenti, solo per testare il datalogger. Funziona.

Hai fatto bene, sempre fare test separando i problemi, facendo piccoli sketch di prova.

Per dire, io con un lettore SD ho avuto problemi con una scheda SD che invece in altro lettore funzionava. Il problema l'ho risolto riformattando in FAT32 la SD con il tool SD card formatter della SD Card association (sono l'ente dello standard) perché pare che alcuni lettori siano "schizzinosi" ossia se la card è formattata "a regola d'arte" va, altrimenti non funziona correttamente.

Ma intendi dire che questo funziona sia se è collegato solo il lettore SD, oppure lo hai provato mantenendo tutte le altre connessioni (e funziona)?

In pratica, se quello stesso codice con il solo modulo SD connesso funziona prova che non è guasto e che il suo cablaggio è ok. Ma se lo fai girare mantenendo invece tutte le stesse connessioni del resto del progetto cosa succede? Se continua a funzionare anche in quel modo potrebbe significare che c'è forse qualche problema software (librerie? configurazioni?), se invece non dovesse funzionare allora potrebbe essere qualche problema hardware (conflitti? cablaggi?). Difficile da dire.

da quello che ho capito,e se ho capito bene, se non carica la SD.begin(), continua a boostrappare.

No, restituisce "false" e prosegue.

Comunque ho anche provato un if (!SD.begin(chipSelect)) { Serial.println("Card failed, or not present"); // don't do anything more: return; } per vedere su seriale se SD.begin(),..... viene caricato.

Questo lo devi fare sempre perché ignorare il valore di ritorno dalla SD.begin() significa ignorare eventuale assenza della SD o errore di connessione per cui mantienilo! Ma quindi, intendi dire che non vedi mai sulla seriale la print "Card failed"?

collegamenti; MOSI - pin 11 MISO - pin 12 CLK - pin 13 CS - pin 4

Questi vanno bene, ma quindi è l'unico device SPI esatto?

Mi sembra che non sono uguali, sono simili ma una fà umidità e l'altra temperatura 19#define Hum_Fan 5 //output PWM fan umidita alta 20#define Temp_Fan 10 //PWM ventole raffredamento

Hai ragione, scusa, non so perché mi era sembrato che la riga fosse duplicata.

docdoc:
Ah, ok, allora non è una shield datalogger, sono due modulini separati, uno per l’RTC (I2C) e l’altro per la SD (SPI).
Hai fatto bene, sempre fare test separando i problemi, facendo piccoli sketch di prova.

Per dire, io con un lettore SD ho avuto problemi con una scheda SD che invece in altro lettore funzionava. Il problema l’ho risolto riformattando in FAT32 la SD con il tool SD card formatter della SD Card association (sono l’ente dello standard) perché pare che alcuni lettori siano “schizzinosi” ossia se la card è formattata “a regola d’arte” va, altrimenti non funziona correttamente.
Sunnybyte
Usando la stessa SD, formattata con il programma che consigli, con il codice chiamiamolo new, non scrive, con il codice od e di test, scrive. Ne deduco che non sia un problema di SD o formattazione.

Ma intendi dire che questo funziona sia se è collegato solo il lettore SD, oppure lo hai provato mantenendo tutte le altre connessioni (e funziona)?
Sunnybyte
Stessi collegamenti, ricarico solo i diversi codici sulla stessa circuiteria.

In pratica, se quello stesso codice con il solo modulo SD connesso funziona prova che non è guasto e che il suo cablaggio è ok. Ma se lo fai girare mantenendo invece tutte le stesse connessioni del resto del progetto cosa succede? Se continua a funzionare anche in quel modo potrebbe significare che c’è forse qualche problema software (librerie? configurazioni?), se invece non dovesse funzionare allora potrebbe essere qualche problema hardware (conflitti? cablaggi?). Difficile da dire.
Sunnybyte
Come dicevo prima, non credo sia hardware il problema, non cambia mai nulla.
Librerie, alla fine sono le stesse.
Cambia solo la funzione del controllo ventola. Non richiede librerie.

No, restituisce “false” e prosegue.Questo lo devi fare sempre perché ignorare il valore di ritorno dalla SD.begin() significa ignorare eventuale assenza della SD o errore di connessione per cui mantienilo!
Sunnybyte
Non sono sicuro… però mi pare che usando il dogwatch, se qualcosa manca o non viene caricato, bootstrappa di nuovo il codice.

Ma quindi, intendi dire che non vedi mai sulla seriale la print “Card failed”?
Sunnybyte
Mai visto il problema.

Questi vanno bene, ma quindi è l’unico device SPI esatto?
Sunnybyte
Si, il datalogger.

Hai ragione, scusa, non so perché mi era sembrato che la riga fosse duplicata.
Sunnybyte.
Grazie per l attenzione che stai dedicando.
P.S. aggiungo che la componentistica è montata su pcb, non credo che siano falsi contatti come, potrebbe essere su una scheda di prova.

Buongiorno, questa mattina avevo delle idee da provare in testa e mi sono messo.
Da quello che riesco a capire, mi sembra che l’istruzione FILE_WRITE non venga eseguita e di conseguenza anche Data.close().
Il motivo mi e’ ovviamente sconosciutissimo… roba da NASA X-files.
Non ho nemmeno capito perche’ resetti il contatore quando i minuti e secondi non sono == 0.
allego output seriale, con commenti, e codice di prova.
Se avete delle idee, sono piu’ che ben accette.
E’ sempre seccante arrendersi…… male che vada usero’ il codice vecchio senza PID.

output su seriale codice arduinounoorchidario_new2_DEBUG.txt (1.81 KB)

arduinounoorchidario_new2_DEBUG.ino (17.5 KB)

Se con il PID usi il controllo delle ventole in PWM che prima non usavi il mio sospetto è che ci sia un disturbo elettrico.

Ciao, grazie dello spunto, Come posso verificarlo? Credevo che un uscita PWM, fosse un uscita a prescindere dal tipo di controllo che utilizzi. Ho pensato anche a questo , tra le prove effettuate, visto che avevo cambiato la frequenza dei timer. Alla fine , anche mettendo le frequenze " standard" , il problema non si risolve. È balorda la cosa, non cambi librerie, non aggiungi nulla di cosi strano, a mio avviso.... boh. Il tempo darà soluzione, e le prove soprattutto!

Prova un semplice sketch che scriva sulla SD mentre uno o più segnali PWM sono attivi.

L'interferenza è dovuta al fatto che l'Arduino serve per prototipi e non è adeguatamente schermato. Figurati che il segnale lo si sente in una radio AM (e forse anche in una FM, non ricordo) ed è anche possibile modularlo.

Eeehhhh... qui siamo nel foregin affair... Scherzo, ti posso dire che queste prove le ho già fatte. Di base è sempre stata un uscita pwm, solo che prima era gestita ... base base... dal setpoint confrontato con il valore attuale ed un valore di correzione ( cofactor). Poi... volevo qualcosa di più controllato. Allora ho provato , più volte, ad aggiungere un PID. con i suoi relativi parametri. Non so se questo sia il problema onestamente. Di fatto compila e non da errori, le librerie sono le stesse dei due codici. Per qualche motivo uno non è digerito... meglio è digerito ma espulso male. Provo a prendermi un break, lunedì disturbero i guru sul lavoro. Cosa che cerco sempre di evitare, non mi piace avere le cose risolte, meglio inculcarsele nella testa. Grazie mille per aver dato un occhiata. Buona serata.

Qui ti avvisa già dove sta il problema :

Le variabili globali usano 1693 byte (82%) di memoria dinamica, lasciando altri 355 byte liberi per le variabili locali. Il massimo è 2048 byte.
Poca memoria disponibile, potrebbero presentarsi problemi di stabilità

Per cui comincia togliere le String, cerca di ridurre l'uso dei float, usa la macro F() per tutte le strighe costanti, metti tutti i byte pioggia, fiamma, goccia, etc in PROGMEM e forse riesci a svangarla, altrimenti ti ci vuole un micro più carrozzato.

Ciao, Ale.

ilguargua: Qui ti avvisa già dove sta il problema ...

Una mattina, mi son svegliato….. no. questa e' un altra canzone..comunque, mi sono svegliato e grazie ai consigli di Ale, mi sono munito di vanga e scopa. Ho ripulito tutto, alleggerito e lucidato fino ad ottenere 68% di spazio utilizzato. Ho dovuto modificare il file CPP e H del display per leggere i customchar dalla rom. https://github.com/johnrickman/LiquidCrystal_I2C/issues/28 Pare che funzioni. Nel primo post avevo espresso qualche dubbio sulle risorse in esaurimento. Sempre utile comunque il forum!!! Grazie a tutti.

>sunnybyte: ... potresti riguardare i tuoi post dovo averli inviati? ... era un disastro incomprensibile, tag QUOTE aperti e mai chiusi, stessa cosa per i tag CODE, tua risposa infilata nel QUOTE mai chiuso, ecc. ecc.

Rileggeteli i post dopo averli inviati e SISTEMATELI (cosa che ora ho fatto io ...) !!! Grazie :)

Guglielmo

Scusa Guglielmo, pensavo di fare cosa buona invece ho fatto una porcheria. Hai fatto bene ad avvisare. Mi limitero' ad rispondere normalmente. Almeno evito casini. ciao.

... ma no, basta che poi rileggi il post e lo correggi con il "Quick Edit" che ti permette di vedere bene i TAG e di metterli anche a mano ;)

Guglielmo

sunnybyte: Pare che funzioni. Nel primo post avevo espresso qualche dubbio sulle risorse in esaurimento. Sempre utile comunque il forum!!! Grazie a tutti.

Bene! Sono contento che hai risolto, e saluta gli orchi da parte mia... :grin:

Ciao, Ale.

Le string sembrano una porcheria persino sugli ESP8266 che di memoria ne hanno molta di più.

Gli orchi ringraziano con un abbraccio!!!

Ma quella a sinistra l'ho vista dal vivo in Messico, cresceva su un albero dove partiva il ramo! Forse era una parente.