Go Down

Topic: Curiosità su aggiornamento valori sensori durante controllo remoto (Read 385 times) previous topic - next topic

simosere

Ciao ragazzi,
al momento,quando verifico i sensori collegati ad arduino mega da remoto, in pratica viene fatta una fotografia della situazione antecedente la chiamata, ovvero durante la chiamata arduino non rileva più nulla (non aggiorna il  display ad esempio cosi come i giri dell'anemometro) e non rileva cosa succede intorno a lui, salvo poi riaggiornarsi quando la chiamata finisce... faccio alcuni esempi:

un countdown che prima della chiamata si ferma a 50 secondi, dopo la fine della chiamata segna 50 meno i secondi della chiamata

il sensore che uso per temp/umidità e pressione è il bme 280 e questo mi si ferma alla lettura prima della chiamata e successivamente ad essa sistematicamente legge meno di quanto era prima, come se nei secondi della chiamata non leggesse più... ma invece di rimanere dello stesso valore dimiuisce.

durante il loop controllo e aggiorno delle variabili che mi danno l'andamento nel tempo della temperatura ( ogni 5 minuti)  e quindi questo perdere  decimali ad ogni chiamata da remoto non mi garba molto... mi sepreste dire il perchè succede questo e come ovviare?

pensavo durante la chiamata da remoto di lcontinuare tra un'aggiornamento e l'altro della pagina web la lettura del sensore di temperatura... è corretto? ovviamente al momento lo faccio solo nel loop che da quello che ho capito viene sospeso quando avvio la comunicazione da remoto.

grazie

uwefed

Ciao.
Senza informazioni sul hardware che usi per il collegamento da remoto e lo sketch che é caricato sul Arduino possiamo solo prendere conoscenza del Tua problema.
Ciao Uwe

simosere

Ciao uwe,
allego il codice in allegato, su questo pc l'unico modo che ho è con un file .txt

Ho già ricevuto innumerevoli commenti di come sia penoso il codice scritto e poco chiaro, ho aggiunto dei commenti che spero possano essere d'aiuto...

Uso un'esp 8266 per la connessione ad internet e come detto un'arduino mega.

Ciao e grazie

speedyant

Le variabili non inizializzate sono "indefinite"... Comunque evidentemente la gestione remota risulta bloccante per qualche motivo.

Devi accertarti che non sia una insita nel "concetto" e non un tuo problema...

simosere

Secondo me il fatto che arduino non si aggiorni più durante la chiamata è corretto per via del while che c'e' all'interno di void inviodati... quello che secondo me è  strano è che non leggendo di fatto il sensore in quei 10/15 secondi nel quale la pagina web si aggiorna, il bme280 perde dei decimali xome raffrendandosi...boh nn saprei... mi sarei aspettato che rimanesse dello stesso valore di inzio chiamata... proverò a inserire delle letture all'interno del ciclo while per vedere cosa succede e per imparare qualcosa di nuovo...

docdoc

133 kbyte di sorgente Arduino??? Ma chi l'ha scritto, Dante Alighieri? ;) Mi aspettavo che finisse con "..e uscimmo a riveder le stelle!".

Scherzi a parte, tralasciando il tuo problema (la cui causa mi pare legata appunto all'uso di while, ma sinveramente tremilaseicento righe sono troppe per me...), ti dò solo alcuni piccolissimi consigli.

Primo, va bene rendere autoesplicativi i nomi delle variabili, ma qui si esagera! Per dire, "tempoTotSvolgiTendaGRANDECENTRO" si può anche un poco ridurre, mantenendo comunque la leggibilità (tanto più se, come hai fatto, hai dei commenti che la descrivono).

Secondo, devi imparare a gestire gli array, non è possibile fare sbrodolate di decine e decine di variabili con nomi diversi (oltre che chilometrici) per tutte le possibili combinazioni! E questo vale pure per le #define, ad esempio se tu vuoi impostare i 47 pin inutilizzati creati un array di byte invece di 47 righe #define, ti basta definirli tutti con UNA sola riga:

Code: [Select]
const byte sensore[47] = {55,56,57,58,59,60,61,62,63,64,65,66,67,68,69,2,11,12,13,16,17,18,24,25, ...eccetera...};


A quel punto nel codice per inizializzare i pin invece di altre 47 righe ti basta fare un ciclo for, ossia DUE righe:

Code: [Select]
...
  //imposto i pin inutilizzati con pullup interna
  for (int i=0; i<47;++i)
    pinMode(sensore[i], INPUT_PULLUP);
...


Poi una cosa analoga per altre cose, come i flag di attivazione, srotolamento, arrotolamento, reset.

Per finire, quando hai un codice abbastanza grande, non dico di fare programmazione ad oggetti (che non sarebbe affatto male, ma tralasciamo..) ma dividilo almeno in file *.h nei quali metterai variabili e funzioni coerenti (ossia nello stesso file "cose" che riguardano e gestiscono una stessa funzionalità), che includerai nel modulo principale con #include.

Tutto questo serve non solo per rendere più "snello" il codice e quindi più facile da comprendere (soprattutto per le altre persone, come noi, che magari vogliono aiutarti ma di fronte a quasi 4.000 righe uno o si prende mezza giornata di ferie o rinuncia...;) ), ma anche per consentire a te stesso di fare debug, ossia tracciare la logica del programma ed identificare dove possa essere il problema.

Capisco che ora mettere mano a questo codice sia un calvario, per cui prendi questi spunti quantomeno per i prossimi progetti... ;)
Alex "docdoc"
- "Qualsiasi cosa, prima di rompersi, funzionava"

simosere


Quote
Capisco che ora mettere mano a questo codice sia un calvario, per cui prendi questi spunti quantomeno per i prossimi progetti... ;)
Ciao Doc Doc,

eh si, tutte sante verità considerando però che questo è stato il mio primo progetto partendo non da zero ma da -10... e onestamente parliamo di  4000 righe sudate e sofferte per arrivare ad oggi con un codice funzionante da almeno 3 anni e che ancora oggi mi piace ottimizzare o (peggiorare) direte voi aggiungendo delle nuove righe... 

Parecchie volte sono stato tentato di rifarlo da capo ma purtoppo non ho il tempo di studiare e mi sono avvicinato ad Arduino e alla programmazione troppo tardi e per quanto mi affiscini non ho il tempo di dedicarmici se non per diletto il sabato pomeriggio con i figli che mi ronzano intorno e che mi toccano tutta la breadboard... mi ci sarei dovuto avvicinate 15/20 anni fa...

grazie cmq per il modo gentile con il quale mi hai detto la solita cosa già detta da molti e che alla fine è sempre quella :D

questo WE proverò a mettere una pezza facendo qualche prova e chissà se magari tra qualche anno( se non cambio casa nel frattempo) con mio figlio riscriviamo tutto il codice da capo!!! :P


ciaooo

simosere

ho fatto una prova facile facile e non ha dato esito positivo...  ho messo la lettura del sensore temp appena entro nel while di inviodati al centro e alla fine...  e notavo  anche che mi perde decimali anche solo quando accendo il wifi e l'esp si collega ad esso....  l'ordine di grandezza che mi perse oscilla da 0,02 a 0,07 gradi.... so anche però che la precisione del BME è +o- 1 grado... mi sa che sto pretendendo troppo... 

mi chiedevo se poteva essere un problema di libreria... al momento uso questa: Seeed_BME280.h", nel WE provo a usarne un'altra...

speedyant

Se anche con il test semplice, ci sono "blocchi" allora avevo ragione: "Devi accertarti che non sia una  cosa insita nel "concetto" e non un tuo problema..."

gpb01

Ma veramente tu credi di poter apprezzare i centesimi di grado con un BME280 ? ? ? :o :o :o

Ti va bene se misuri +/- mezzo grado, il resto sono fluttuazioni interne al chip (... che dovresti ignorare visto che NON ha senso leggere con una precisione superiore a quella indicata nel DS) e la libreria NON ha nulla a che vedere ... i dati sono digitali e non è che cambia molto leggerli con una libreria o con un altra eh !

Guglielmo
Search is Your friend ... or I am Your enemy !

simosere

Infatti Guglielmo credo proprio di stare a pretendere troppo dal sensore....


gpb01

Infatti Guglielmo credo proprio di stare a pretendere troppo dal sensore....
... no, guarda, non stai pretendendo troppo, stai commettendo un errore così grave che, quando facevo fisica, se facevo una cosa del genere all'esame, mi cacciavano direttamente via ! :smiley-confuse:

Come pretendi di misurare i centimetri se hai una stecca graduata in decimetri? O pesare i grammi con una bilancia che indica solo i chili? Al massimo leggerai i decimetri o i chili, il resto è solo ERRORE matematico ;)

La stessa cosa si applica a qualsiasi misura :)

Guglielmo
Search is Your friend ... or I am Your enemy !

speedyant


simosere

Concordo con te....ho rivisto ieri il datasheet del sensore e mi si è accesa la lampadina...  :smiley-confuse:

maubarzi

E' un po' che non lavoro con il BME280 per cui la memoria può perdere colpi, ma tu quante volte lo leggi ad ogni giro di loop?
Non è che ad ogni bme280.getTemperature() viene interrogato il sensore?
Un accesso così costante potrebbe leggermente surriscaldarlo.

In alcuni punti ho visto cose tipo:

Code: [Select]

void estateinverno() { // con tenda SX e CENTRO chiuse setto la variavile Set_Time in funzione della temp esterna
  if (reset_timerGRANDESX == true || reset_timerGRANDECENTRO == true) {
    if (bme280.getTemperature() - 2 <= 14.00) {
      Set_Time = 1;
    }
    if (bme280.getTemperature() - 2 >= 14.01 && bme280.getTemperature() - 2 <= 18.00) {
      Set_Time = 2;
    }
    if (bme280.getTemperature() - 2 >= 18.01 && bme280.getTemperature() - 2 <= 21.00) {
      Set_Time = 3;
    }
    if (bme280.getTemperature() - 2 >= 21.01 && bme280.getTemperature() - 2 <= 25.00) {
      Set_Time = 4;
    }
    if (bme280.getTemperature() - 2 >= 25.01) {
      Set_Time = 5;
    }
  }
}


Il mio consiglio è di fare una sola lettura dentro al loop e magari anche cadenzata con millis per non farla proprio ad ogni giro e poi tutti i test farli su una variabile dove hai memorizzato la lettura.

Ok, stiamo parlando di decimi che sono sotto la precisione del sensore, però potrebbero essere significativi comunque di un potenziale problema.

Diciamo che il consiglio sarebbe valido a prescindere.
Questo sarebbe da fare di prassi un po' su tutto.

Poi avrei anche qualche altro consiglio sul come ristrutturare il codice, ma visto che sono le solite cose che ti hanno ripetuto in tanti, non infierisco ulteriormente.

Maurizio
Nessuna buona azione resterà impunita!

Preistoria -> medioevo -> rinascimento -> risorgimento -> rincoglionimento!

Go Up