#include <Adafruit_SSD1306.h>
#include <Adafruit_GFX.h>
Adafruit_SSD1306 pm(128, 64, &Wire, -1);
volatile unsigned long lastMillis = 0;
unsigned long interval = 1000; // 1 second
char t[9] = {'0', '0', ':', '0', '0', ':', '0', '0', '\0'};
int h = 27, m = 30, s = 18;
int potpin = A0;
int led = 11;
int recvPin = 7; // 假设recv_pin连接到数字引脚7
void setup() {
pm.begin(SSD1306_SWITCHCAPVCC, 0x3C);
pinMode(led, OUTPUT);
pinMode(recvPin, INPUT);
pinMode(potpin, INPUT);
Serial.begin(9600);
// 设置定时器中断
// 假设你使用的是Arduino Uno或类似的板卡,定时器2是常用的
// 注意:这里的定时器设置取决于你的Arduino板卡型号
noInterrupts(); // 禁用全局中断
// 设置定时器2中断,每1秒触发一次
// (F_CPU / 8) / 1024 / 1000 是为了得到1秒的中断频率
// 请根据你的Arduino板卡调整这个值
if (millis() < 2000) {
// 初始化时确保不会立即触发中断
lastMillis = millis() + 2000;
}
attachInterrupt(digitalPinToInterrupt(2), updateClock, RISING); // 假设使用定时器2的中断
interrupts(); // 启用全局中断
}
void loop() {
// 主循环现在是空的,更新由定时器中断处理
}
// 定时器中断服务程序(ISR)的包装函数
void updateClock() {
if (millis() - lastMillis >= interval) {
lastMillis += interval;
updateTime();
updateDisplay();
}
}
void updateTime() {
s++;
if (s == 60) {
s = 0;
m++;
if (m == 60) {
m = 0;
h++;
if (h == 24) {
h = 0;
}
}
}
// 更新时间字符串t
t[0] = h / 10 + '0';
t[1] = h % 10 + '0';
t[3] = m / 10 + '0';
t[4] = m % 10 + '0';
t[6] = s / 10 + '0';
t[7] = s % 10 + '0';
}
void updateDisplay() {
pm.clearDisplay();
pm.setTextColor(WHITE);
pm.setCursor(0, 0);
pm.setTextSize(2);
pm.println("CLOCK");
pm.println(t);
pm.display();
int val = analogRead(potpin);
Serial.print("光亮度:");
Serial.println(val);
if (val >= 400) {
int in = digitalRead(recvPin);
if (in == LOW) { // 注意:digitalRead返回LOW或HIGH,不是0或1
Serial.println("有人");
// 这里可能不需要再次显示CLOCK,因为已经在上面显示过了
digitalWrite(led, HIGH);
delay(1000); // 延迟时间减少到1秒,避免长时间阻塞
digitalWrite(led, LOW);
} else {
Serial.println("没人");
}
}
// delay(500); // 这个delay在这里可能不是必需的,因为更新是由中断驱动的
}