#include <SPI.h>
#include <Wire.h>
#include <Adafruit_GFX.h>
#include <Adafruit_SSD1306.h>
// OLED FeatherWing buttons map to different pins depending on board.
// The I2C (Wire) bus may also be different.
#define WIRE Wire
Adafruit_SSD1306 display = Adafruit_SSD1306(128, 64, &WIRE);
int CLK = 2;//CLK->D2
int DT = 3;//DT->D3
const int interrupt0 = 0;// Interrupt 0 在 pin 2 上
int count = 5;//计数值
int lastCLK = 0;//CLK历史值
void setup() {
display.begin(SSD1306_SWITCHCAPVCC, 0x3C); // Address 0x3C for 128x32
display.display();
delay(1000);
pinMode(CLK, INPUT);
pinMode(DT, INPUT);
attachInterrupt(interrupt0, ClockChanged, CHANGE);
pinMode(4, INPUT);
pinMode(5, OUTPUT);
}
void loop() {
digitalRead(4);
int sensorVal = digitalRead(4);
if (sensorVal == HIGH){
delay(2000);
digitalWrite(5, HIGH);
delay(5);
digitalWrite(5, LOW);
delay(10);
digitalWrite(5, HIGH);
delay(count);
digitalWrite(5, LOW);
}
else{
digitalWrite(5, LOW);
}
display.clearDisplay();
display.display();
display.setTextSize(4);
display.setTextColor(SSD1306_WHITE);
display.setCursor(40,18);
display.print(count);
display.setCursor(0,0);
display.display(); // actually display all of the above
display.setTextSize(2);
display.setTextColor(SSD1306_WHITE);
display.setCursor(90,25);
display.print("ms");
display.setCursor(0,0);
display.display(); // actually display all of the above
}
void ClockChanged()
{
int clkValue = digitalRead(CLK);//读取CLK引脚的电平
int dtValue = digitalRead(DT);//读取DT引脚的电平
if (lastCLK != clkValue)
{
lastCLK = clkValue;
count += (clkValue != dtValue ? 1 : -1);//CLK和DT不一致时+1,否则-1
Serial.print("count:");
Serial.println(count);
}
}
Loading
ssd1306
ssd1306