#include <TimerOne.h>
#include <Wire.h>
#include <RTClib.h>
RTC_DS1307 RTC;
bool Buzzer = 0; //蜂鸣器
uint8_t Light, Light_Low = 50; //光照值
uint8_t key, time; //键码,时间
uint8_t KeyNum(void);//按键检测
void setup() {
// put your setup code here, to run once:
OLED_Init(); //OLED屏幕配置
Timer1.initialize(1000000);//1秒定时
Timer1.attachInterrupt(Timer1_Fun);
Wire.begin();//DS1307相关配置
RTC.begin();
RTC.adjust(DateTime(__DATE__, __TIME__));
pinMode(4, INPUT); //红外感应模块
pinMode(5, OUTPUT); //蜂鸣器
pinMode(6, INPUT); //3个按键
pinMode(7, INPUT);
pinMode(8, INPUT); pinMode(9, OUTPUT); //LED灯
digitalWrite(9, HIGH);//默认熄灯
OLED_ShowString(1, 1, " - -");
OLED_ShowString(2, 1, " : :");
OLED_ShowString(3, 1, "People:");
OLED_ShowString(4, 1, "Light: %");
}
void loop() {
// put your main code here, to run repeatedly:
/* 获取当前时间 */
DateTime now = RTC.now();
OLED_ShowNum(1, 1, now.year(), 4);
OLED_ShowNum(1, 6, now.month(), 2);
OLED_ShowNum(1, 9, now.day(), 2);
OLED_ShowNum(2, 1, now.hour(), 2);
OLED_ShowNum(2, 4, now.minute(), 2);
OLED_ShowNum(2, 7, now.second(), 2);
/* 检测是否有人 */
if (digitalRead(4))
{
OLED_ShowString(3, 8, "Yes");
if (Light < Light_Low)
{ time = 10;
digitalWrite(9, LOW);
}
}
else
OLED_ShowString(3, 8, "No ");
/* 测量光照 */
Light = 100 - (float)analogRead(A0) / 1010 * 100;
OLED_ShowNum(4, 7, Light, 3);
/* 按键进入设置 */
key = KeyNum();
if (key == 1)
{
OLED_Clear();
OLED_ShowString(1, 1, " Setting");
OLED_ShowString(3, 1, "Light: %");
while (1)
{
OLED_ShowNum(3, 7, Light_Low, 3);
key = KeyNum();
if (key == 1) //按键1退出
{
OLED_Clear();
OLED_ShowString(1, 1, " - -"); OLED_ShowString(2, 1, " : :");
OLED_ShowString(3, 1, "People:");
OLED_ShowString(4, 1, "Light: %");
break;
}
else if (key == 2) //按键2阈值加
Light_Low++;
else if (key == 3) //按键3阈值减
Light_Low--;
}
}
delay(1);
/* 蜂鸣器控制 */
if (digitalRead(4))
Buzzer = !Buzzer;
digitalWrite(5, Buzzer);
}
void Timer1_Fun(void)
{
if (time > 0)
time--;
if (time == 0)
digitalWrite(9, HIGH);
} uint8_t KeyNum(void)
{
uint8_t keynum = 0;
if (digitalRead(6))
{
delay(20);
while (digitalRead(6));
delay(20);
keynum = 1;
}
else if (digitalRead(7))
{
delay(20);
while (digitalRead(7));
delay(20);
keynum = 2;
}
if (digitalRead(8))
{
delay(20);
while (digitalRead(8));
delay(20);
keynum = 3;
}
return keynum;
}