Grazie di nuovo :chessygrin:.
Ho dato un'occhiata a come usarla, ma credo che non faccia al caso mio perché non riesco a inserirla "a interrupt".
Mi spiego meglio: la rilevazione dei giri deve essere asincrona rispetto al resto del programma, perchè il task principale è quello di "accendere luci" e non posso bloccare in attesa di input.
Ecco qualche estratto (setup, loop e funzione interrupt).
[CODE]void setup() {
//Setup Seriale : per leggere via USB cosa succede
Serial.begin(9600);
while (!Serial) {
; // wait for serial port to connect. Needed for Leonardo only
}
//Imposto ingressi e uscite
pinMode(H2O_IN, INPUT);
pinMode(OIL_IN, INPUT);
pinMode(RPM_IN, INPUT);
pinMode(FAULT, OUTPUT);
pinMode(OIL_G, OUTPUT);
pinMode(OIL_R, OUTPUT);
pinMode(RPM_Y, OUTPUT);
pinMode(RPM_R, OUTPUT);
pinMode(H2O_G, OUTPUT);
pinMode(H2O_R, OUTPUT);
//Mi assicuro che non ci sia pullup sugli ingressi analogici
digitalWrite(H2O_IN,LOW);
digitalWrite(OIL_IN,LOW);
// Attach interrupt
attachInterrupt(1, rpm_count, RISING);
}
void loop() {
resetLed(); // Tutti a LOW
H2O_TEMP = analogRead(H2O_IN); //Leggo sensore temperatura acqua
delay(50); //Per evitare Jitter sul pin di fianco
OIL_PRES = analogRead(OIL_IN); //Leggo sensore pressione olio
updateRPM(); //Aggiorno la media delle ultime 5 letture
//Accendo e spengo i led di output
updatedisplay();
delay(50);
}
void updateRPM() {
noInterrupts(); //precauzionale: così time non cambia valore durante il calcolo di RPM
if(time > 0)
{
//Medio 5 letture per normalizzare la lettura
rpm_array[0] = rpm_array[1];
rpm_array[1] = rpm_array[2];
rpm_array[2] = rpm_array[3];
rpm_array[3] = rpm_array[4];
rpm_array[4] = 60*(1000000/time); //time è il periodo in micros(): qui lo converto in frequenza e in minuti
//Media delle ultime 5 letture
RPM = (rpm_array[0] + rpm_array[1] + rpm_array[2] + rpm_array[3] + rpm_array[4]) / 5;
}
interrupts();
}
//RPM interrupt function
void rpm_count() {
time = (micros() - time_last);
time_last = micros();
}
[/CODE]
miley:
Ho dato un'occhiata a come usarla, ma credo che non faccia al caso mio perché non riesco a inserirla "a interrupt".
Mi spiego meglio: la rilevazione dei giri deve essere asincrona rispetto al resto del programma, perchè il task principale è quello di "accendere luci" e non posso bloccare in attesa di input.
Ecco qualche estratto (setup, loop e funzione interrupt).
[CODE]void setup() {
//Setup Seriale : per leggere via USB cosa succede
Serial.begin(9600);
while (!Serial) {
; // wait for serial port to connect. Needed for Leonardo only
}
//Imposto ingressi e uscite
pinMode(H2O_IN, INPUT);
pinMode(OIL_IN, INPUT);
pinMode(RPM_IN, INPUT);
pinMode(FAULT, OUTPUT);
pinMode(OIL_G, OUTPUT);
pinMode(OIL_R, OUTPUT);
pinMode(RPM_Y, OUTPUT);
pinMode(RPM_R, OUTPUT);
pinMode(H2O_G, OUTPUT);
pinMode(H2O_R, OUTPUT);
//Mi assicuro che non ci sia pullup sugli ingressi analogici
digitalWrite(H2O_IN,LOW);
digitalWrite(OIL_IN,LOW);
// Attach interrupt
attachInterrupt(1, rpm_count, RISING);
}
void loop() {
resetLed(); // Tutti a LOW
H2O_TEMP = analogRead(H2O_IN); //Leggo sensore temperatura acqua
delay(50); //Per evitare Jitter sul pin di fianco
OIL_PRES = analogRead(OIL_IN); //Leggo sensore pressione olio
updateRPM(); //Aggiorno la media delle ultime 5 letture
//Accendo e spengo i led di output
updatedisplay();
delay(50);
}
void updateRPM() {
noInterrupts(); //precauzionale: così time non cambia valore durante il calcolo di RPM
if(time > 0)
{
//Medio 5 letture per normalizzare la lettura
rpm_array[0] = rpm_array[1];
rpm_array[1] = rpm_array[2];
rpm_array[2] = rpm_array[3];
rpm_array[3] = rpm_array[4];
rpm_array[4] = 60*(1000000/time); //time è il periodo in micros(): qui lo converto in frequenza e in minuti
//Media delle ultime 5 letture
RPM = (rpm_array[0] + rpm_array[1] + rpm_array[2] + rpm_array[3] + rpm_array[4]) / 5;
}
interrupts();
}
//RPM interrupt function
void rpm_count() {
time = (micros() - time_last);
time_last = micros();
}
[/CODE]
miley:
La Gatta : 2003 NBFL 1.8 Sport http://www.mx5italia.com/showthread.php?19520-La-Gatta
Team Ciocapiàt pResident Evil
Team Ciocapiàt pResident Evil
Bisso Ha scritto:se poi si arriva a fare il solito discorso: "ne vale la pena?" non se ne viene più fuori...
l'importante è pensare bene a cosa si fa, a cosa si vuole fare e a cosa si vuole ottenere...