#include <U8g2lib.h> // 导入U8g2库,用于驱动OLED显示屏
#include <Wire.h> // 导入Wire库,用于I2C通信
#include <DHT.h> // 导入DHT库,用于读取温湿度传感器数据
volatile int light; // 定义变量light,用于存储光传感器的读取值
volatile int red; // 定义变量red,用于存储红外传感器的读取值
U8G2_SSD1306_128X64_NONAME_1_HW_I2C u8g2(U8G2_R0, U8X8_PIN_NONE); // 定义OLED显示对象
DHT dht5(5, 22); // 定义DHT传感器对象,连接在GPIO 5,DHT22类型
// 页面1显示函数:显示温湿度数据
void page1() {
u8g2.setFont(u8g2_font_timR14_tf); // 设置显示字体
u8g2.setFontPosTop(); // 设置字体的起始位置
u8g2.setCursor(0,0); // 设置光标位置为(0, 0)
u8g2.print(String("TEM:") + String(dht5.readTemperature())); // 显示温度
u8g2.setCursor(0,30); // 设置光标位置为(0, 30)
u8g2.print(String("HUM:") + String(dht5.readHumidity())); // 显示湿度
}
// 中断函数:在GPIO 2引脚触发上升沿时改变GPIO 3的电平状态
void attachInterrupt_fun_RISING_2() {
digitalWrite(3,(!digitalRead(3))); // 改变GPIO 3的电平(HIGH->LOW 或 LOW->HIGH)
}
void setup(){
light = 0; // 初始化光传感器读取值为0
red = 0; // 初始化红外传感器读取值为0
u8g2.setI2CAddress(0x3C*2); // 设置OLED显示屏的I2C地址
u8g2.begin(); // 初始化显示屏
dht5.begin(); // 初始化DHT传感器
u8g2.enableUTF8Print(); // 启用UTF-8打印支持
pinMode(A0, INPUT); // 设置A0引脚为输入模式(用于读取光传感器)
pinMode(4, INPUT); // 设置GPIO 4引脚为输入模式(用于读取红外传感器)
pinMode(3, OUTPUT); // 设置GPIO 3引脚为输出模式(用于控制某个外部设备)
pinMode(2, INPUT_PULLUP); // 设置GPIO 2引脚为输入并启用上拉电阻(用于外部中断)
}
void loop(){
light = analogRead(A0); // 读取光传感器的模拟值并存储到light变量
red = digitalRead(4); // 读取红外传感器的数字值并存储到red变量
u8g2.firstPage(); // 刷新OLED显示屏的第一页
do
{
page1(); // 调用page1函数,更新OLED显示内容
} while(u8g2.nextPage()); // 刷新所有页面
if (light > 400) { // 如果光传感器值大于400
if (red == 1) { // 如果红外传感器的值为1
digitalWrite(3,HIGH); // 将GPIO 3引脚设置为高电平(激活外部设备)
delay(5000); // 延时5000毫秒(5秒)
} else {
digitalWrite(3,LOW); // 否则,将GPIO 3引脚设置为低电平(关闭外部设备)
}
attachInterrupt(digitalPinToInterrupt(2),attachInterrupt_fun_RISING_2,RISING); // 为GPIO 2设置上升沿中断
} else {
attachInterrupt(digitalPinToInterrupt(2),attachInterrupt_fun_RISING_2,RISING); // 在光传感器值小于400时,继续监听GPIO 2上的上升沿中断
}
}