Aiuto, mi scappa il tempo !

Sto cercando una funzione che ogni secondo intero faccia una certa cosa.

Ho provato questo scritto:

if ((millis % 1000) = 0) ecc.

Ma non funziona per contrasto nei tipi.

Allora ho definito unsigned long Tempo=1000;

ed ho riprovato:

if ((millis % Tempo) = 0) ecc.

Ma ancora segnala contrasto di tipi.

Arduino avrà certamente ragione, non lo discuto, ma che vuole ?

Cordiali saluti Andrea

ciao Enotria prova con questa ;) http://www.arduino.cc/playground/Code/Metro

Ti ringrazio molto, sei stato super veloce.

Ma io vorrei capire cosa non va nella mia funzione, come devo scriverla per renderla corretta.

Anche perché il problema della incompatibilità di variabili potrebbe ripresentarsi in altra forma o in altra occasione, quindi è meglio che io cerchi di capire dove sbaglio e perché.

Cordiali saluti Andrea

Millis è una funzione e come tale la devi usare con le parentesi, ovvero Millis().

Inoltre non farei mai un confronto per un istante preciso di tempo, ossia usare di uguaglianza: basta che il tuo sketch perda 1 ms per un loop oppure chissà cos’altro che perdi il tempo e salti 1 secondo. Farei piuttosto il classico confronto:

temp = millis() + 1000;
...
if ( millis() < temp ) {
 ....
}

In questo modo sei certo che se anche non ti scatta dopo 1000 ms esatti, a 1001, 1002 ecc… uscirai dal loop.

Centro ! :smiley: :smiley: :smiley:

Bestia che sono !
Mi ero dimenticato le parentesi ! :blush:

L’espressione corretta diventa quindi if (millis()%1000 < 1) Visual_Cont(); e funziona benissimo.
Il confronto per 1 invece che per 0 elimina il problema dell’istante preciso.

In questo modo Arduino riesce a fare oltre 5000 iterazioni al secondo andando a tutta birra, solo ad ogni secondo rallenta un attimo per far vedere sul display il conteggio progressivo.

Il tutto è per un misuratore di radioattività (Geiger) ed in queste condizioni, pur con una ottima sonda, si riescono a misurare oltre 99 mR/h, ben 100 volte di più degli strumenti progettati da una notissima rivista di elettronica.

Non male per ora !
Poi vedrò se riesco a limare qualche altro millesimo di secondo.

Un grazie a tutti ed un bonus per Leo72.

Cordiali saluti

Scusami la domanda cretina:
Dove trovi un radioattivitá cosi elevata?
Non Ti va in saturazione il tubo GM?
Ciao Uwe

Ciao Uwe, radioattività di questo valore sono frequenti nei minerali tipo Uraninite, Torbernite, Uranocircite, ecc. Basta un pezzo di roccia ad alto tenore di questi minerali per avere questi valori, purtroppo non ho ancora capito come si fa ad inserire una foto, altrimenti ti mostrerei quanto piccola può essere una roccia così radioattiva. :blush:

Ma ci vai molto vicino anche solo con la vecchia sveglia del nonno, con le sue belle lancette al Radio 226: prova a togliere il vetro di protezione e poi vedi quante radiazioni Alfa e Beta che arrivano !

Ad ogni modo, nel mio caso, il problema non è tanto il livello delle radiazioni, quanto la velocità con cui Arduino può contare gli impulsi che gli arrivano e questo dipende solo in parte dalla radioattività presente, ma ancora di più dalla sonda che usi. Per fare un esempio, se tu hai una emissione di 1 mR/h ora e la misuri con il contatore Geiger in scatola di montaggio di Nuova Elettronica, questi ti conta 1300 impulsi in un minuto, quindi sarebbe un lavoro di tutto riposo per Arduino. Ma se invece utilizzi uno strumento come quello che sto cercando di costruire, con una sonda scintillatrice moderna, gli impulsi al minuto rilevati sono oltre 100.000, eppure la sorgente è la stessa, la radioattività è la stessa. Ma i problemi di conteggio sono molto diversi !

Ecco quindi che se costruisci uno strumento come si deve, la sua velocità di conteggio deve essere proporzionata alle sonde che poi gli monti: se metti una sonda da poco, tutti i Santi aiutano, ma se cominci a montare delle sonde un po' più evolute, la velocità di conteggio deve aumentare di oltre mille volte, altrimenti . . . . . . . . . . . . altrimenti cominci a perdere colpi ! :D :D :D

Cordiali saluti

scusami, ma allora perchè non usare un interrupt per contare gli impulsi?

Perché non so come gestirli.

Tieni presente che io sono almeno 10 anni che non faccio più programmi ed anche allora facevo programmi gestionali per le aziende agricole, tutti altri problemi. Ho poi ripreso a programmare con Arduino pochi mesi fa e, per la verità, sono anche più che soddisfatto di quel poco che sto facendo.

Del resto a settanta anni non è facile mettersi a studiare ste robe: sono fantastiche, permettono soluzioni prima impensabili, ma l'è fadiga ! XD

Cordiali saluti

Ciao Enotria

Usare l' interrupt é facile. Scrivi una funzione che viene chiamata quando capita un interrupt. per esempio:

contacps() {cps++;}

definisci all inizio cps come unsigned long e metti nel setup:

attachInterrupt(0, contacps, RISING); http://arduino.cc/en/Reference/AttachInterrupt Il segnale dell'elettronica lo metti sul pin 2 ( quello é l' interrupt 0) controlla se funziona perchè alcune librerie usano anche loro dei interrupt. Non so cosa usa metro. Dopo un secondo leggi il valore di cps e lo metti a 0.

Ciao Uwe