ancora una volta scusatemi se vi chiedo aiuto, ma spero che visto che non sono molto esperto di queste cose potreste darmi una mano (potreste anche dire: perché allora non lasci stare?? ]:))
dovrei registrare il numero di impulsi provenienti da un misuratore di gas. Provo a spiegarmi meglio: lo strumento (SMC-PFM7) manda un impulso per ogni 0,1 NL di gas che passa dallo strumento. Volevo prendere il segnale con un ingresso digitale ma lo strumento manda un impulso (credo a 24VDC), ma quando è in quiescenza è a 1V. (allego una parte del foglio di istruzioni).
Uso questo sketch:
///////variabili
unsigned long contatore = 0;
int stato; // dove registrare la pulsazione
int oldStato;
const int sensoreCO2 = 4; // sensore contatore
//// e nel loop:
stato = digitalRead(sensoreCO2);
if (stato != oldStato){
contatore ++;
stato = oldStato;
}
lo sketch funzione bene se collegato a un pulsante, ma la variabile non si incrementa con lo strumento attaccato. Ho fatto un partitore di tensione con una R1 da 4,7K e una R2 da 1K.
Qualcuno ha qualche consiglio?
Grazie infinite, e scusate la mia poca dimestichezza con queste cose.
Il flussostato è il PFM710-C6-E. Forse nel post precedente ho fatto un po di confusione.
ho collegato il + e - a un alimentatore da 24VDC, il cavo bianco (che manda il segnale analogico (è quello 1-5V)) è su un pin analogico che mi misura il flusso istantaneo. Su questo non ho problemi.
il cavo nero, che dovrebbe mandare l'impulso della portata accumulata l'ho collegato al pin 4 digitale, mettendo un partitore di tensione con R1 4,7K e R2 1K ( la tensione in uscita dovrebbe essere quella pilotata dall'alimentazione tramite in transistor? con il tester non riesco misurare la tensione perché è troppo veloce (50 ms) e mi segna 8 - 10V per impulso). Il - dell'alimentatore l'ho messo in comune con il GND di Arduino.
Brunello:
Non e' che nello sketch che usi hai dei ritardi, mi provi a vedere se usando gli interrupt legge correttamente ...
DEVE usare interrupt ... altrimenti NON ha alcuna garanzia che quando ci sarà il breve impulso il programma stia passando proprio per l'istruzione della lettura della porta ... e non facendo qualche altra cosa che non vediamo/sappiamo ...
... purtroppo non vediamo cosa fa all'interno del loop() e non sappiamo se c'è un qualche cosa che magari lo impegna per T > 50 msec., nel qual caso ... quando vai a leggere il pin magari è già tornato a riposo ...
credo che il problema era nel codice. Usando attachinterrupt mi è anche più semplice visto che con il codice che avevo fatto io ogni cambiamento di stato mi incrementava la variabile di 1, e quindi dovevo dividere la variabile contatore per 2. Ho fatto delle prove: al massimo della portata manda un impulso ogni 500 ms circa, quindi credo che non ci sia il probema che mi salti qualche impulso?
Vi ringrazio ancora infinitamente, senza di voi sarei spacciato.
GiacomoSam:
Ho fatto delle prove: al massimo della portata manda un impulso ogni 500 ms circa, quindi credo che non ci sia il probema che mi salti qualche impulso?
Usando gli interrupt ? ... tranquillo anche se ne mandava 1 ogni millisecondo di durata 100 ns non lo perdevi
L'interrupt INTERROMPE qualsiasi cosa la MCU stia facendo e fa eseguire l'apposita routine ... dopo di che riprende da dove aveva lasciato