¿Debería estar bien?
Pequeña explicación ... si una señal es anterior a la prueba en el pin 2, se llama al método readtemp () y se incrementa el contador ..
Cada segundo se llama la rutina de servicio de interrupción. En esta rutina, compruebo si se pasan dos segundos y, si es así, se calcula la frecuencia, el contador se configura a 0 .. En el bucle principal, compruebo si el indicador bData es verdadero y si es así, la temperatura se calcula y se envía en serie puerto a pc ..
#include <SPI.h>
#include <Ethernet.h>
#include <Math.h>
const byte interruptPinTemp = 2;
const byte interruptPinSlanost = 3;
//konstante
const double g = 4.85442486e-003;
const double h = 6.77300393e-004;
const double i = 2.65502731e-005;
const double j = 2.06782794e-006;
const double f = 1000.0;
volatile int cnt = 0;
volatile int cnt1 = 0;
int timer1_counter;
boolean bData = false;
volatile int dvesek = 1;
void setup() {
Serial.begin(9600);
noInterrupts();
pinMode(interruptPinTemp, INPUT_PULLUP);
pinMode(interruptPinSlanost, INPUT_PULLUP);
attachInterrupt(digitalPinToInterrupt(interruptPinTemp), readTemp, CHANGE);
TCCR1A = 0;
TCCR1B = 0;
timer1_counter = 34286; // preload timer 65536-16MHz/256/2Hz
TCNT1 = timer1_counter; // preload timer
TCCR1B |= (1 << CS12); // 256 prescaler
TIMSK1 |= (1 << TOIE1); // enable timer overflow interrupt
interrupts();
}
//Timer interrupt na 1 sekundo
ISR(TIMER1_OVF_vect) // interrupt service routine
{
TCNT1 = timer1_counter; // preload timer
if (dvesek++ == 2)
{
cnt1 = cnt / 2 ;
bData = true;
cnt = 0;
dvesek = 1;
}
}
void loop() {
// if bData is available... print it on serial port....
if (bData == true)
{
bData = false;
Serial.println(calcTemp(cnt1), 3);
}
}
void readTemp() {
cnt++;
}
//get temperature from measured frequency...
double calcTemp(double frekvenca)
{
double logRes = log(f / frekvenca);
return 1.0 / (g + (h * logRes) + (i * pow(logRes, 2.0)) + (j * pow(logRes, 3.0))) - 273.15;
}