# include <SPI.h>
# include <Wire.h>
# include <Adafruit_GFX.h>
# include <Adafruit_SSD1306.h>
#define SCREEN_WIDTH 128 // OLED display width, in pixels
#define SCREEN_HEIGHT 64 // OLED display height, in pixels
#define OLED_RESET 4 // Reset pin # (or -1 if sharing Arduino reset pin)
Adafruit_SSD1306 display(SCREEN_WIDTH, SCREEN_HEIGHT, &Wire, OLED_RESET);
# include "RTClib.h"
RTC_DS3231 rtc; // Using DS3231 Real Time Clock
volatile unsigned int C1 = 0, C2 = 0, difference, i = 0;
volatile bool state = false; float Time = 0;
//======================================================================
void setup()
{
pinMode(8,OUTPUT);
Serial.begin(9600);
display.begin(SSD1306_SWITCHCAPVCC, 0x3C);
display.clearDisplay();
analogReference(INTERNAL);
//Timer 1: input capture interrupt (pin D8) & overflow interrupt
noInterrupts();
TCCR1A = 0; TCCR1B = 0; //reset Timer 1 control registers
TCNT1 = 0; //reset Timer 1 counter register
TCCR1B |= 0b11000101; //1024 prescaler, rising edge, noise canceler
TIMSK1 |= 0b00100001; //enable input capture & overflow interrupts
interrupts();
}
//======================================================================
ISR(TIMER1_CAPT_vect)
{
i++;
if(i = 1)
{
C1 = ICR1;
}
else if(i = 2)
{
C2 = ICR1;
difference = C2 - C1;
C1 = 0; C2 = 0; i = 0;
}
}
//-----------------------------
ISR(TIMER1_OVF_vect)
{
C1 = 0; C2 = 0; i = 0;
state = !state;
}
//======================================================================
void loop()
{
digitalWrite(2, state);
Time = float(difference)*64.0e-6;
display.setTextColor(WHITE); display.clearDisplay();
display.setTextSize(2);
display.setCursor(20,0); display.print("T I M E");
display.setCursor(10,18); display.print("---sec---");
display.setTextSize(3); display.setCursor(27,42);
display.print(Time);
display.display();
delay(200);
}