智能小夜灯

光敏电阻测试

代码

void setup() {
  Serial.begin(9600);  //启动串口通讯
}
 
void loop() {   
  Serial.print("LDR Reading: ");  //通过串口监视器
  Serial.println(analogRead(A0)); //输出LDR读数 
  delay(10);
}

结果:环境亮度较亮时

在这里插入图片描述

环境亮度较暗时

在这里插入图片描述

人体感应模块测试

代码

int irSensorPin = 7 ;            // 连接红外传感器引脚
bool irSensorOutput;            // 红外传感器输出信号
 
void setup() {
  pinMode(irSensorPin, INPUT);
  Serial.begin(9600);
}
 
void loop(){
  irSensorOutput = digitalRead(irSensorPin);  // 读取红外传感器输出
  if (irSensorOutput == HIGH) {  // 如果红外传感器输出高电平
      Serial.println("IR Motion Sensor OUTPUT: HIGH.");
  } else {
      Serial.println("IR Motion Sensor OUTPUT: LOW.");
  }
  delay(100);
}

人体红外感应模块测试

结果

未感应到人时

在这里插入图片描述

感应到人时

在这里插入图片描述

RGB LED测试

#define rLedPin 6  //RGB-LED引脚R
#define gLedPin 5  //RGB-LED引脚G
#define bLedPin 3  //RGB-LED引脚B

int ledR  = 0; //R Led 亮度 (请勿改变数值)
int ledG  = 0; //G Led 亮度 (请勿改变数值)
int ledB  = 0; //B Led 亮度 (请勿改变数值)

 
//用户可以通过变量 maxRVal、maxGVal、maxBVal 自定义RGB-LED颜色
int maxRVal = 125;    //夜灯R LED最大亮度 (允许数值:0 - 255)
int maxGVal = 200;    //夜灯G LED最大亮度 (允许数值:0 - 255)
int maxBVal = 33;     //夜灯B LED最大亮度 (允许数值:0 - 255)
 
int minRVal = 39;   //夜灯呼吸时R LED最小亮度 (允许数值:0 - 255)
int minGVal = 95;   //夜灯呼吸时G LED最小亮度 (允许数值:0 - 255)
int minBVal = 11;   //夜灯呼吸时B LED最小亮度 (允许数值:0 - 255)
 
int breathStep = 1;        //呼吸起伏速度 数值越大 速度越快
int breathStepDelay = 18;  //呼吸起伏速度延迟 数值越大 起伏速度越慢

void setup() {
  //设置引脚为相应工作模式
  pinMode(rLedPin, OUTPUT);
  pinMode(gLedPin, OUTPUT);
  pinMode(bLedPin, OUTPUT);
    Serial.begin(9600); 
 
  //检测是否LED亮度参数符合程序要求(min数值小于等于 max数值)
  if (minRVal > maxRVal || minGVal > maxGVal || minBVal > maxBVal) {
    while(true){  //如果出现数值设置问题,持续闪烁红灯
      analogWrite(rLedPin, 255);
      delay(500);
      analogWrite(rLedPin, 0);
      delay(500);
      Serial.begin(9600); 
      Serial.println("Bad LED Settings!!!");
    }
  }
}
 
void loop() {
  //亮度先降低
  fadeDown(minRVal, minGVal, minBVal);
 
  //亮度再提高
  fadeUp(maxRVal, maxGVal, maxBVal);
  
}
 
void fadeUp(int rTopVal, int gTopVal, int bTopVal){
  while(ledR < rTopVal || ledG < gTopVal || ledB < bTopVal){
    if (ledR+breathStep < rTopVal ) {
      ledR+=breathStep ;
      analogWrite(rLedPin, ledR);
    } else {
      ledR = rTopVal ;
      analogWrite(rLedPin, ledR);
    }
    
    if (ledG + breathStep < gTopVal) {
      ledG+=breathStep;
      analogWrite(gLedPin, ledG);
    } else {
      ledG = gTopVal ;
      analogWrite(gLedPin, ledG);
    }
       
    if (ledB + breathStep < bTopVal) {
      ledB+=breathStep ;
      analogWrite(bLedPin, ledB);
    }  else {
      ledB = bTopVal ;
      analogWrite(bLedPin, ledB);
    }
    
    delay(breathStepDelay);
    
  
     
      Serial.print("rVal = "); Serial.println(ledR);
      Serial.print("gVal = "); Serial.println(ledG);  
      Serial.print("bVal = "); Serial.println(ledB);
      Serial.println("================");   
            
  }
}
 
void fadeDown(int rBottomVal, int gBottomVal, int bBottomVal){
  while(ledR > rBottomVal || ledG > gBottomVal || ledB > bBottomVal){
    if (ledR-breathStep > rBottomVal) {
      ledR-=breathStep;
      analogWrite(rLedPin, ledR);
    } else {
      ledR = rBottomVal;
      analogWrite(rLedPin, ledR);
    }
    
    if (ledG-breathStep > gBottomVal) {
      ledG-=breathStep ;
      analogWrite(gLedPin, ledG);
    } else {
      ledG = gBottomVal;
      analogWrite(gLedPin, ledG);
    } 
    
    if (ledB-breathStep > bBottomVal) {
      ledB-=breathStep ;
      analogWrite(bLedPin, ledB);
    } else {
      ledB = bBottomVal;
      analogWrite(bLedPin, ledB);
    }
    
      delay(breathStepDelay);     
      Serial.print("rVal = "); Serial.println(ledR);
      Serial.print("gVal = "); Serial.println(ledG);  
      Serial.print("bVal = "); Serial.println(ledB);
      Serial.println("================");        
    
  }
}

结果

在这里插入图片描述
在这里插入图片描述

综合测试

#include "U8glib.h"                         //引入Oled头文件
U8GLIB_SH1106_128X64 u8g(U8G_I2C_OPT_NONE); //设置通讯方式为IIC通讯
#define rLedPin 6  //RGB-LED引脚R
#define gLedPin 5  //RGB-LED引脚G
#define bLedPin 3  //RGB-LED引脚B
#define irSensorPin 8  //红外人体感应模块信号输出
#define lightSensorPin A0  //光敏电阻分压电路信号输出
 
int ledR  = 0; //R Led 亮度 (请勿改变数值)
int ledG  = 0; //G Led 亮度 (请勿改变数值)
int ledB  = 0; //B Led 亮度 (请勿改变数值)
 
bool irReading;    //红外人体感应模块输出
int lightReading;  //光敏电阻分压电路信号输出
 
//用户可以通过变量 maxRVal、maxGVal、maxBVal 自定义RGB-LED颜色
int maxRVal = 125;    //夜灯R LED最大亮度 (允许数值:0 - 255)
int maxGVal = 200;    //夜灯G LED最大亮度 (允许数值:0 - 255)
int maxBVal = 33;     //夜灯B LED最大亮度 (允许数值:0 - 255)
 
int minRVal = 39;   //夜灯呼吸时R LED最小亮度 (允许数值:0 - 255)
int minGVal = 95;   //夜灯呼吸时G LED最小亮度 (允许数值:0 - 255)
int minBVal = 11;   //夜灯呼吸时B LED最小亮度 (允许数值:0 - 255)
 
int breathStep = 1;        //呼吸起伏速度 数值越大 速度越快
int breathStepDelay = 18;  //呼吸起伏速度延迟 数值越大 起伏速度越慢
bool breatheOnOff = 0;     //小夜灯呼吸状态 
                           //breatheOnOff = 1 开启呼吸灯模式 
                           //breatheOnOff = 0 关闭呼吸灯模式
                           
bool onOffState;   //小夜灯开关状态                        
bool debugOn = 1;  
/*
 * Arduino在控制LED亮度变化时,对于时间的要求很苛刻。
 * 每一次Arduino通过串口监视器输出信息时都会让Arduino短暂停顿
 * 这些短暂停顿会影响小夜灯的渐明渐暗效果。
 * 因此建议在程序开发时令debugOn = 1,以便于观察Arduino
 * 的工作状态并作出必要的修改。
 * 但是在正常工作时,建议将debugOn = 0, 从而确保Arduino
 * 的最佳工作效果。
 * 
*/
 
void setup() {
  //设置引脚为相应工作模式
  pinMode(rLedPin, OUTPUT);
  pinMode(gLedPin, OUTPUT);
  pinMode(bLedPin, OUTPUT);
  pinMode(irSensorPin, INPUT);
  if(debugOn){
    Serial.begin(9600); 
    Serial.println("Welcome to Taichi-Maker RGB Led Night-Light.");
    dis_play();
  }
  //检测是否LED亮度参数符合程序要求(min数值小于等于 max数值)
  if (minRVal > maxRVal || minGVal > maxGVal || minBVal > maxBVal) {
    while(true){  //如果出现数值设置问题,持续闪烁红灯
      analogWrite(rLedPin, 255);
      delay(500);
      analogWrite(rLedPin, 0);
      delay(500);
      Serial.begin(9600); 
      Serial.println("Bad LED Settings!!!");
    }
  }
}
 
void loop() {
  
  irReading = digitalRead(irSensorPin);      //读取红外人体感应模块
  lightReading = analogRead(lightSensorPin); //读取光敏电阻分压电路信号输出
  
  if(irReading == HIGH && lightReading >= 880){ //如感应到人且亮度达到需照明程度
    if (onOffState == 0) fadeUp(maxRVal, maxGVal, maxBVal);    //点亮小夜灯照明                          
    onOffState = 1;     //告知Arduino小夜灯被点亮了                                             
    if (breatheOnOff == 1)ledBreathe();  
  } else {                                   //如未感应到人且亮度未达到需照明程度  
    if (onOffState == 1) fadeDown(0, 0, 0);                    //保持小夜灯熄灭                        
    onOffState = 0;     //告知Arduino小夜灯被熄灭了
  }
  
  //通过串口监视器实时输出各个传感器检测的数据结果
  //可用于调试小夜灯工作参数使用
  if(debugOn){
    Serial.println("");
    Serial.println("===========================");
    Serial.print("irReading = "); Serial.println(irReading);
    Serial.print("lightReading = "); Serial.println(lightReading);
    Serial.println("===========================");
    delay(50);
  }
}
 
void fadeUp(int rTopVal, int gTopVal, int bTopVal){
  while(ledR < rTopVal || ledG < gTopVal || ledB < bTopVal){
    if (ledR+breathStep < rTopVal ) {
      ledR+=breathStep ;
      analogWrite(rLedPin, ledR);
    } else {
      ledR = rTopVal ;
      analogWrite(rLedPin, ledR);
    }
    
    if (ledG + breathStep < gTopVal) {
      ledG+=breathStep;
      analogWrite(gLedPin, ledG);
    } else {
      ledG = gTopVal ;
      analogWrite(gLedPin, ledG);
    }
       
    if (ledB + breathStep < bTopVal) {
      ledB+=breathStep ;
      analogWrite(bLedPin, ledB);
    }  else {
      ledB = bTopVal ;
      analogWrite(bLedPin, ledB);
    }
    
    delay(breathStepDelay);
    
    if (debugOn){
      Serial.println("================"); 
      Serial.print("rVal = "); Serial.println(ledR);
      Serial.print("gVal = "); Serial.println(ledG);  
      Serial.print("bVal = "); Serial.println(ledB);
      dis_play();
      Serial.println("================");   
    }         
  }
}
 
void fadeDown(int rBottomVal, int gBottomVal, int bBottomVal){
  while(ledR > rBottomVal || ledG > gBottomVal || ledB > bBottomVal){
    if (ledR-breathStep > rBottomVal) {
      ledR-=breathStep;
      analogWrite(rLedPin, ledR);
    } else {
      ledR = rBottomVal;
      analogWrite(rLedPin, ledR);
    }
    
    if (ledG-breathStep > gBottomVal) {
      ledG-=breathStep ;
      analogWrite(gLedPin, ledG);
    } else {
      ledG = gBottomVal;
      analogWrite(gLedPin, ledG);
    } 
    
    if (ledB-breathStep > bBottomVal) {
      ledB-=breathStep ;
      analogWrite(bLedPin, ledB);
    } else {
      ledB = bBottomVal;
      analogWrite(bLedPin, ledB);
    }
    
    delay(breathStepDelay);    
    
    if (debugOn){
      Serial.println("================"); 
      Serial.print("rVal = "); Serial.println(ledR);
      Serial.print("gVal = "); Serial.println(ledG);  
      Serial.print("bVal = "); Serial.println(ledB);
      dis_play();
      Serial.println("================");        
    }
  }
}
 
void ledBreathe(){
  //亮度先降低
  fadeDown(minRVal, minGVal, minBVal);
 
  //亮度再提高
  fadeUp(maxRVal, maxGVal, maxBVal);
}
void dis_play()    //OLED数据显示子函数
{
  u8g.firstPage(); //  OLED首页
  do
  {
    char buffer1[1]; //定义字符buffer1
        //  将int转为char显示出来
    itoa(irReading, buffer1, 10);        //10:10进制显示
    u8g.setFont(u8g_font_gdr10r); //设置字体
    u8g.drawStr(0, 40, "iR:"); 
    u8g.drawStr(20, 40,buffer1); 
    char buffer2[1];  //定义字符buffer2
    //  将int转为char显示出来
    itoa(lightReading, buffer2, 10);        //10:10进制显示
    u8g.setFont(u8g_font_gdr10r); //设置字体
    u8g.drawStr(40, 40, "lR:"); 
    u8g.drawStr(60, 40, buffer2); 
  } while (u8g.nextPage());      
}
  • 0
    点赞
  • 6
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值