精华内容
下载资源
问答
  • 我的项目是Arduino闹钟。我很想知道我是否可以只使用Arduino板和RTC制作功能闹钟。起初,这些数字只出现在串口显示器上,因为我很难让液晶显示器点亮。我想在这个过程中一步一步走,这样我才能完全理解发生了什么。 ...
  • 将3D打印的外壳与Arduino闹钟对齐!
  • 制作的一个闹钟,只有在灯亮起并且使用Arduino Nano按下按钮时才会停止。 硬件组件: Arduino Nano R3× 1 ISD1829× 1 Seeed Grove - RTC× 1 LDR,5 Mohm× 1 按钮开关,按下按钮× 1 软件应用程序和在线服务: ...
  • Arduino闹钟代码嵌入式LINUX综合试验 广大,完美实现闹钟功能,完美注释,你值得拥有, 基于arduino lenardo开发板 1602液晶显示器 DS1302时钟模块, PM35 温度传感器 4个key按键,有源蜂鸣器一个,杜邦若条
  • <p>Time t(y_int, m_int,d_int, h_int, m1_int, 0, Time::kSunday); 报错:'kSunday is not a member of 'Time' 该怎么改正</p>
  • 时间管理是我们日常生活中的关键,因此需要创建Arduino数字闹钟来帮助进行正确的时间管理。
  • Arduino闹钟mixly程序

    2021-06-12 16:03:02
    自动响铃,1分钟后自动关闭
  • Arduino闹钟-项目开发

    2021-03-30 15:31:08
    使用Arduino UNO,蜂鸣器,DS1307 rtc和USB端口的闹钟
  • arduino通过红外遥控器结合蜂鸣器器制作一个定时小闹钟,程序注释清晰且功能有趣
  • Arduino Mega 跳线 10k电位器 Wire 可选的 拨动开关 工具 烙铁 胶枪 第2步:将所有东西接线 现在是时候把所有的东西都用这个图表来表示了。当你确定一切正常工作,那么你可以热胶合跳线,以确保没有任何动作 第3步:...
  • Arduino综合项目】小闹钟

    万次阅读 多人点赞 2016-06-30 11:32:00
    在额济纳支教这一年,给孩子们上了很多Arduino开发的课,也带他们完成了几个Arduino综合项目,下面陆续把这些小项目放上来,欢迎围观~~~非科班出身,C语言学的不好,望各路大神批评指点。 功能介绍 本项目主要是...
    1670644-d6b5c974927d3d38.jpg
    小闹钟项目

    在额济纳支教这一年,给孩子们上了很多Arduino开发的课,也带他们完成了几个Arduino综合项目,下面陆续把这些小项目放上来,欢迎围观~~~非科班出身,C语言学的不好,望各路大神批评指点。

    功能介绍

    本项目主要是实现基本的闹钟功能:

    1. LCD屏幕实时显示当前时间(年、月、日、星期、时、分、秒)以及闹钟的开关;
    2. 通过4*4键盘可以设置初始时间及闹钟时间;
    3. 通过键盘,还可以查看当前设置的闹钟时间;
    4. 当闹钟时间到了,蜂鸣器便会响起,同时LED亮起,可以通过键盘关闭闹钟。

    准备材料

    • Arduino UNO *1
    • LCD 1602A *1
    • LCD1602液晶屏转接板(PCF8574AT) *1
    • 4*4 矩阵键盘 *1
    • RTC I2C时钟模块(DS1307)
    • 蜂鸣器 *1
    • LED灯 *1
    • 面包板 *1
    • 跳线若干
    • 电烙铁、松香、焊锡等
    就不给出购买链接了,这些材料在某宝上随便一搜就有~
    

    模块接线

    • 键盘与Arduino

      R1-C4 -> 2-9


      1670644-542dbca2eafe07d6.jpg
      键盘与Arduino接线示意图
    • LCD 1602与转接板

    如下图把转接板与LCD1602焊接在一起就行了,或者也可以插在面包板上。


    1670644-87eed5e498f4d87c.jpg
    LCD 1602与转接板焊接图
    • 转接板与Arduino

    PCF8574TArduino
    GND->GND
    VCC->5V
    SDA->A4
    SCL->A5
    • DS1307时钟模块与Arduino

    DS1307Arduino
    GND->GND
    VCC->5V
    SDA->AREF上一个口
    SCL->AREF上两个口
    1670644-aee2e8d66798fddc.jpg
    DS1307时钟模块与Arduino接线示意图
    • 蜂鸣器、LED灯与Arduino

    蜂鸣器、LED灯Arduino
    负极->GND
    正极->10

    第三方库

    #include <LiquidCrystal_I2C.h> 
    #include "RTClib.h"
    #include <Keypad.h>
    #include <SCoop.h>
    

    下载地址:

    源程序

    /*-----( Import needed libraries )-----*/
    #include <Wire.h>
    #include <LCD.h> 
    #include <LiquidCrystal_I2C.h> 
    #include "RTClib.h"
    #include <Keypad.h>
    #include <SCoop.h>
    void formatPrint( int hour, int minute, int second);
    String show_s(int a,int b,int c,int d);
    void menu();
    char set_time();
    char input_show(int x);
    char set_time_year();
    char set_time_month();
    char set_time_day();
    char set_time_hour();
    char set_time_minute();
    char set_time_second();
    
    char set_clock();
    char set_clock_hour();
    char set_clock_minute();
    char set_clock_second();
    LiquidCrystal_I2C lcd(0x3F,2,1,0,4,5,6,7); // 0x27 is the I2C bus address for an unmodified backpack 
    
    char y[4];  //存储year的数值
    int i=0;//循环计数
    /**初始时间**/
    int py; //year
    int pmo; //month
    int pd;  //day
    int ph;   //hour
    int pmi;  //minute
    int ps;  //second
    /**闹钟时间**/
    //int cy = 2015; //year
    //int cmo = 5; //month
    //int cd = 21;  //day
    int ch = 00;   //hour
    int cmi = 00;  //minute
    int cs = 00;  //second
    char daysOfTheWeek[7][12] = {"Sun", "Mon", "Tue", "Wed", "Thu", "Fri", "Sat"};
    int menu_flag = 0;
    int show_flag = 1;    //1是显示,-1是不显示
    int switch_flag = 1;    //1是开,-1是关
    
    
    
    const byte ROWS = 4; //four rows
    const byte COLS = 4; //three columns
    char keys[ROWS][COLS] = {
      {'0','1','2','3'},
      {'4','5','6','7'},
      {'8','9','A','B'},
      {'C','D','E','F'}
    };
    byte rowPins[ROWS] = {2, 3, 4, 5}; //connect to the row pinouts of the keypad
    byte colPins[COLS] = {6, 7, 8, 9}; //connect to the column pinouts of the keypad
    //initializes an instance of the Keypad class
    Keypad keypad = Keypad( makeKeymap(keys), rowPins, colPins, ROWS, COLS );
    
    /*-----( Declare objects )-----*/
    RTC_DS1307 rtc;    // Create a RealTimeClock object
    defineTask(Task1) 
    void Task1::setup() { 
      Serial.begin(9600);
      pinMode(10,OUTPUT);
      } 
    void Task1::loop() { 
    
      char key = keypad.getKey();
      if (key == 'F'){
        show_flag = -show_flag;
        menu();
        show_flag = 1;
      }else if(key == 'C'){
        switch_flag = -switch_flag;
        noTone(10); 
      }else if(key == 'D'){
        show_flag = -show_flag;
          lcd.clear();
          lcd.noBlink();
          lcd.setCursor(3,0);
          lcd.print("Alarm Clock"); 
          formatPrint(ch, cmi, cs);
          if(keypad.waitForKey())
            show_flag = -show_flag;
        }
    
       DateTime nowClock = rtc.now();  // Read data from the RTC Chip
    
       if(nowClock.hour() == ch && nowClock.minute() == cmi && nowClock.second() == cs && switch_flag == 1)
        {    
                 tone(10, 31); 
                 key = keypad.getKey();  
                 if(key == 'C'){
                    switch_flag = -switch_flag;
                    noTone(10); 
                  }     
        }
    }
    
    void setup()   /****** SETUP: RUNS ONCE ******/
    {
      Serial.begin(9600); // Set up for Serial Monitor to be able to see this work
      /*----( These lines allow code to work also on Arduino DUE )----- */
    
    
      // Put these "//" in front of the line you do NOT want to use
      // following line sets the RTC to the date & time this sketch was compiled
    //     rtc.adjust(DateTime(F(__DATE__), F(__TIME__)));
      // This line sets the RTC with an explicit date & time, for example to set
      // May 21, 2015 at 6pm you would call: (use 24 hour time)
      #ifdef AVR
      Wire.begin();
    #else
      Wire1.begin(); // Shield I2C pins connect to alt I2C bus on Arduino Due
    #endif
    
      rtc.begin(); // Start the RTC library code
      rtc.adjust(DateTime(2015, 5, 21, 18, 0, 0));
      lcd.begin (16,2); // for 16 x 2 LCD module 
      lcd.setBacklightPin(3,POSITIVE); 
      lcd.setBacklight(HIGH); 
      mySCoop.start(); 
    }
    
    
    void loop()   /****** LOOP: RUNS CONSTANTLY ******/
    { 
      switch(show_flag){
        case 1:{
                  DateTime now = rtc.now();  // Read data from the RTC Chip
                  //lcd.home (); // set cursor to 0,0   
                  lcd.noBlink();
                  lcd.setCursor(1,0);
                  lcd.print(show_s(now.year(),now.month(),now.day(),1)+' ' +daysOfTheWeek[now.dayOfTheWeek()]); 
                  lcd.setCursor (4,1); // go to start of 2nd line 
                  if(switch_flag == 1)
                      lcd.print(String(show_s(now.hour(),now.minute(),now.second(),0)+"   o")); 
                  else
                      lcd.print(String(show_s(now.hour(),now.minute(),now.second(),0)+"   x"));   
                  break;
          }
          case -1:{
                  break;
            }
      }
      
      yield();  //本函数必须放在主线的loop循环体中 
    
    }//--(end main loop )---
    
    //显示日期和时间的字符拼合及补零函数
    String show_s(int a,int b,int c,int d){
     String s1,s2,s3;
      if(a<10)
        s1 = String('0'+String(a));
      else
        s1 = String(a);
      if(b<10)
        s2 = String('0'+String(b));
      else
        s2 = String(b);
      if(c<10)
        s3 = String('0'+String(c));
      else
        s3 = String(c);
      if(d==1)
        return String(s1+'/'+s2+'/'+s3);
      else
        return String(s1+':'+s2+':'+s3);
      }
    
    
    //菜单函数
    void menu(){
      rmenu:
      char m1,m2;
      lcd.clear();
      lcd.noBlink();
      lcd.setCursor(0,0);
      lcd.print("1.Set_Time"); 
      lcd.setCursor (0,1); // go to start of 2nd line 
      lcd.print("2.Set_Clock"); 
        int f = keypad.waitForKey();
        switch(f){
          case '1':lcd.clear();
                   lcd.home();
                   lcd.print("<<<<Set_Time>>>>"); 
                   m1 = set_time();
                   if(m1 == '#')
                       goto rmenu;
                   break;
    
          case '2':lcd.clear();
                   lcd.home();
                   lcd.print("<<<<Set_Clock>>>>"); 
                   m2 = set_clock();
                   if(m2 == '#')
                       goto rmenu;
                   break;
          default: show_flag = -show_flag; 
                   break;
          }
      lcd.clear();
     
      
      }
    
    /**---设置初始时间---**/
    char set_time(){
     char t1,t2,t3,t4,t5,t6;
     styear:
      t1 = set_time_year();
      if(t1 == '#')
        return '#';
      Serial.println(py);
     stmonth:
      t2 = set_time_month();
      if(t2 == '#')
        goto styear;
      Serial.println(pmo);
     stday:
      t3 = set_time_day();
      if(t3 == '#')
        goto stmonth;
      Serial.println(pd);
     sthour:
      t4 = set_time_hour();
      if(t4 == '#')
        goto stday;
      Serial.println(ph);
     stminute:
      t5 = set_time_minute();
      if(t5 == '#')
        goto sthour;
      Serial.println(pmi);
      t6 = set_time_second();
      if(t6 == '#')
        goto stminute;
      Serial.println(ps);
      rtc.adjust(DateTime(py, pmo, pd, ph, pmi, ps));
      lcd.clear();
      lcd.setCursor (1,0);
      lcd.print("Press any key!"); 
      lcd.setCursor (3,1);
      lcd.print("Success!"); 
      keypad.waitForKey();
      show_flag = -show_flag;
    }
    
    char set_time_year(){
       char k1;
       lcd.clear();
       lcd.home();
       lcd.print("<<<<Set_Time>>>>"); 
       lcd.setCursor (2,1);
       lcd.blink(); 
       lcd.print("Year:"); 
       for(i=0;i<4;i++){
         tYear:
         y[i] = input_show(i+7);
         Serial.println(y[i]);
         if(y[i]=='*')
            i = i-2;
         else if(y[i]=='#')
            return '#';
         if(i == 3)
            while(1){
              k1 = keypad.waitForKey();
              if( k1 == 'B'){  //确定
                  py = (int(y[0])-48)*1000+(int(y[1])-48)*100+(int(y[2])-48)*10+(int(y[3])-48);
                  break;
              }else if( k1 == 'A'){//取消
                  lcd.setCursor(i+7,1);
                  lcd.print(" ");
                  lcd.setCursor(i+7,1);
                  goto tYear;
              }
            }
       }
      }
    
    char set_time_month(){
       char k1;
       lcd.clear();
       lcd.home();
       lcd.print("<<<<Set_Time>>>>"); 
       lcd.setCursor (1,1);
       lcd.blink(); 
       lcd.print("Month:"); 
       for(i=0;i<2;i++){
        tMonth:
         y[i] = input_show(i+7);
         if(y[i]=='*')
            i = i-2;
         else if(y[i]=='#')
            return '#';
         if(i == 1){
            while(1){
              k1 = keypad.waitForKey();
              if( k1 == 'B'){  //确定
                  pmo = (int(y[0])-48)*10+(int(y[1])-48);
                  break;
              }else if( k1 == 'A'){//取消
                  lcd.setCursor(i+7,1);
                  lcd.print(" ");
                  lcd.setCursor(i+7,1);
                  goto tMonth;
              }
            }
       }  
      }
        if(pmo > 12 || pmo < 1){
         Serial.print("error");
         lcd.clear();
         lcd.setCursor (5,1);
         lcd.print("ERROR!");
         keypad.waitForKey();
         set_time_month();
         }  
    }
    
    char set_time_day(){
       char k1;
       lcd.clear();
       lcd.home();
       lcd.print("<<<<Set_Time>>>>"); 
       lcd.setCursor (3,1);
       lcd.blink(); 
       lcd.print("Day:"); 
       for(i=0;i<2;i++){
        tDay:
         y[i] = input_show(i+7);
         if(y[i]=='*')
            i = i-2;
         else if(y[i]=='#')
            return '#';
         if(i == 1){
            while(1){
              k1 = keypad.waitForKey();
              if( k1 == 'B'){  //确定
                  pd = (int(y[0])-48)*10+(int(y[1])-48);
                  break;
              }else if( k1 == 'A'){//取消
                  lcd.setCursor(i+7,1);
                  lcd.print(" ");
                  lcd.setCursor(i+7,1);
                  goto tDay;
              }
            }
       }  
      }
        if(pd > 31 || pd < 1){
         Serial.print("error");
         lcd.clear();
         lcd.setCursor (5,1);
         lcd.print("ERROR!");
         keypad.waitForKey();
         set_time_day();
         }  
    }
    
    char set_time_hour(){
       char k1;
       lcd.clear();
       lcd.home();
       lcd.print("<<<<Set_Time>>>>"); 
       lcd.setCursor (2,1);
       lcd.blink(); 
       lcd.print("Hour:"); 
       for(i=0;i<2;i++){
        tHour:
         y[i] = input_show(i+7);
         if(y[i]=='*')
            i = i-2;
         else if(y[i]=='#')
            return '#';
         if(i == 1){
            while(1){
              k1 = keypad.waitForKey();
              if( k1 == 'B'){  //确定
                  ph = (int(y[0])-48)*10+(int(y[1])-48);
                  break;
              }else if( k1 == 'A'){//取消
                  lcd.setCursor(i+7,1);
                  lcd.print(" ");
                  lcd.setCursor(i+7,1);
                  goto tHour;
              }
            }
       }  
      }
        if(ph > 24 || ph < 0){
         Serial.print("error");
         lcd.clear();
         lcd.setCursor (5,1);
         lcd.print("ERROR!");
         keypad.waitForKey();
         set_time_hour();
         }  
    }
    
    char set_time_minute(){
       char k1;
       lcd.clear();
       lcd.home();
       lcd.print("<<<<Set_Time>>>>"); 
       lcd.setCursor (0,1);
       lcd.blink(); 
       lcd.print("Minute:"); 
       for(i=0;i<2;i++){
        tMinute:
         y[i] = input_show(i+7);
         if(y[i]=='*')
            i = i-2;
         else if(y[i]=='#')
            return '#';
         if(i == 1){
            while(1){
              k1 = keypad.waitForKey();
              if( k1 == 'B'){  //确定
                  pmi = (int(y[0])-48)*10+(int(y[1])-48);
                  break;
              }else if( k1 == 'A'){//取消
                  lcd.setCursor(i+7,1);
                  lcd.print(" ");
                  lcd.setCursor(i+7,1);
                  goto tMinute;
              }
            }
       }  
      }
        if(pmi > 60 || pmi < 0){
         Serial.print("error");
         lcd.clear();
         lcd.setCursor (5,1);
         lcd.print("ERROR!");
         keypad.waitForKey();
         set_time_minute();
         }  
    }
    
    char set_time_second(){
       char k1;
       lcd.clear();
       lcd.home();
       lcd.print("<<<<Set_Time>>>>"); 
       lcd.setCursor (0,1);
       lcd.blink(); 
       lcd.print("Second:"); 
       for(i=0;i<2;i++){
        tSecond:
         y[i] = input_show(i+7);
         if(y[i]=='*')
            i = i-2;
         else if(y[i]=='#')
            return '#';
         if(i == 1){
            while(1){
              k1 = keypad.waitForKey();
              if( k1 == 'B'){  //确定
                  ps = (int(y[0])-48)*10+(int(y[1])-48);
                  break;
              }else if( k1 == 'A'){//取消
                  lcd.setCursor(i+7,1);
                  lcd.print(" ");
                  lcd.setCursor(i+7,1);
                  goto tSecond;
              }
            }
       }  
      }
        if(ps > 60 || ps < 0){
         Serial.print("error");
         lcd.clear();
         lcd.setCursor (5,1);
         lcd.print("ERROR!");
         keypad.waitForKey();
         set_time_second();
         }  
    }
    /**---设置初始时间结束---**/
    
    
    /**---设置闹钟时间---**/
    char set_clock(){
    char c1,c2,c3;
    schour:
      c1 = set_clock_hour();
      if(c1 == '#')
        return '#';
      Serial.println(ch);
    scminute:
      c2 = set_clock_minute();
      if(c2 == '#')
        goto schour;
      Serial.println(cmi);
      c3 = set_clock_second();
      if(c3 == '#')
        goto scminute;
      Serial.println(cs);
      lcd.clear();
      lcd.setCursor (1,0);
      lcd.print("Press any key!"); 
      lcd.setCursor (3,1);
      lcd.print("Success!"); 
      keypad.waitForKey();
      show_flag = -show_flag;
    }
    
    char set_clock_hour(){
       char k1;
       lcd.clear();
       lcd.home();
       lcd.print("<<<<Set_Clock>>>"); 
       lcd.setCursor (2,1);
       lcd.blink(); 
       lcd.print("Hour:"); 
       for(i=0;i<2;i++){
        cHour:
         y[i] = input_show(i+7);
         if(y[i]=='*')
            i = i-2;
         else if(y[i]=='#')
            return '#';
         if(i == 1){
            while(1){
              k1 = keypad.waitForKey();
              if( k1 == 'B'){  //确定
                  ch = (int(y[0])-48)*10+(int(y[1])-48);
                  break;
              }else if( k1 == 'A'){//取消
                  lcd.setCursor(i+7,1);
                  lcd.print(" ");
                  lcd.setCursor(i+7,1);
                  goto cHour;
              }
            }
       }  
      }
        if(ch > 24 || ch < 0){
         Serial.print("error");
         lcd.clear();
         lcd.setCursor (5,1);
         lcd.print("ERROR!");
         keypad.waitForKey();
         set_clock_hour();
         }  
    }
    
    char set_clock_minute(){
       char k1;
       lcd.clear();
       lcd.home();
       lcd.print("<<<<Set_Clock>>>"); 
       lcd.setCursor (0,1);
       lcd.blink(); 
       lcd.print("Minute:"); 
       for(i=0;i<2;i++){
        cMinute:
         y[i] = input_show(i+7);
         if(y[i]=='*')
            i = i-2;
         else if(y[i]=='#')
            return '#';
         if(i == 1){
            while(1){
              k1 = keypad.waitForKey();
              if( k1 == 'B'){  //确定
                  cmi = (int(y[0])-48)*10+(int(y[1])-48);
                  break;
              }else if( k1 == 'A'){//取消
                  lcd.setCursor(i+7,1);
                  lcd.print(" ");
                  lcd.setCursor(i+7,1);
                  goto cMinute;
              }
            }
       }  
      }
        if(cmi > 60 || cmi < 0){
         Serial.print("error");
         lcd.clear();
         lcd.setCursor (5,1);
         lcd.print("ERROR!");
         keypad.waitForKey();
         set_clock_minute();
         }  
    }
    
    char set_clock_second(){
       char k1;
       lcd.clear();
       lcd.home();
       lcd.print("<<<<Set_Clock>>>"); 
       lcd.setCursor (0,1);
       lcd.blink(); 
       lcd.print("Second:"); 
       for(i=0;i<2;i++){
        cSecond:
         y[i] = input_show(i+7);
         if(y[i]=='*')
            i = i-2;
         else if(y[i]=='#')
            return '#';
         if(i == 1){
            while(1){
              k1 = keypad.waitForKey();
              if( k1 == 'B'){  //确定
                  cs = (int(y[0])-48)*10+(int(y[1])-48);
                  break;
              }else if( k1 == 'A'){//取消
                  lcd.setCursor(i+7,1);
                  lcd.print(" ");
                  lcd.setCursor(i+7,1);
                  goto cSecond;
              }
            }
       }  
      }
        if(cs > 60 || cs < 0){
         Serial.print("error");
         lcd.clear();
         lcd.setCursor (5,1);
         lcd.print("ERROR!");
         keypad.waitForKey();
         set_clock_second();
         }  
    }
    /**---设置闹钟时间结束---**/
    
    char input_show(int x){
       char k = keypad.waitForKey();
       if(k == 'A'){  //"取消"
            if(x-1>6){
              lcd.setCursor(x-1,1);
              lcd.print(" ");
              lcd.setCursor(x-1,1);
              return '*';
            }else{ 
                return '#';
            }
        }else if( k >= '0' && k <= '9'){
             lcd.setCursor(x,1);
             lcd.print(k);
            Serial.println(i);
             return k;
        }else{
          i = i-1;
          Serial.println(i);
          }
      }
    
    void formatPrint(  int hour, int minute, int second){
         lcd.noBlink();
         lcd.setCursor (4,1); // go to start of 2nd line 
         if(hour<10){
          lcd.print(0);
          lcd.setCursor (5,1); // go to start of 2nd line 
          lcd.print(hour);
         }else
          lcd.print(hour);
         lcd.setCursor(6,1);
         lcd.print(":");
         lcd.setCursor(7,1);
         if(minute<10){
          lcd.print(0);
          lcd.setCursor (8,1); // go to start of 2nd line 
          lcd.print(minute);
         }else
          lcd.print(minute);
           lcd.setCursor(9,1);
           lcd.print(":");
           lcd.setCursor(10,1);
         if(second<10){
          lcd.print(0);
          lcd.setCursor(11,1); // go to start of 2nd line 
          lcd.print(second);
         }else
          lcd.print(second);
    }
    
    

    源程序下载地址https://github.com/wwwxmu/ArduinoClock/tree/master

    演示视频

    http://v.qq.com/page/h/l/2/h0310pa7xl2.html

    写在最后

    1. 每个模块不不清楚怎么用的可以参考我之前写的基础教程;
    2. LCD的I2C地址要先确定好(见http://www.jianshu.com/p/eee98fb5e68f
    3. 实在是想不出其他办法了,才在程序里用了goto语句,接受各路大神批评指正!
    展开全文
  • Arduino智能闹钟设计(8x8矩阵键盘+LCD显示)

    千次阅读 多人点赞 2021-05-25 19:38:33
    Arduino智能闹钟设计(8x8矩阵键盘+LCD显示+蜂鸣器歌曲) 作者:STCode(公众号同名) 1.效果描述: 本设计基于Arduino Nano控制器,主要功能为定时闹钟和环境温湿度显示,使用者可以通过8x8矩阵键盘设置闹钟的时钟...

    公众号二维码_副本.png

    Arduino智能闹钟设计(8x8矩阵键盘+LCD显示+蜂鸣器歌曲)

    作者:STCode(公众号同名)

    1.效果描述:

    本设计基于Arduino Nano控制器,主要功能为定时闹钟和环境温湿度显示,使用者可以通过8x8矩阵键盘设置闹钟的时钟和分钟,可以开启和关闭闹钟,闹钟的铃声由蜂鸣器发出,设置的铃声为欢乐颂歌曲,在播放歌曲的同时RGB灯也会根据节奏闪烁。设备可通过矩阵键盘按钮查看当前环境的温湿度,设备的信息均通过一块lcd1602液晶显示屏显示,是一个非常值得尝试的小创意。

    image.png

    Arduino智能闹钟设计(8x8矩阵键盘+LCD显示+蜂鸣器歌曲)

    2.使用元器件

    1)Arduino Nano控制器

    2)8x8矩阵键盘

    3)DHT11温湿度传感器

    4)IIC lcd1602液晶显示屏

    5)蜂鸣器

    6)DS1302时钟模块

    7)共阴RGB灯

    8)控制器扩展板一块

    9)杜邦线若干

    3.电路连接

    image.png

    4.源代码

    #include <DHT.h>                     //定义<DHT.h>头文件
    #include <Keypad.h>   //矩阵键盘头文件
    #include <DS1302.h>   //DS1302头文件
    #include <Wire.h>     //Wire头文件
    #include <LiquidCrystal_I2C.h> //引用I2C通讯的LCD1602库
    
    #define DHTPIN A0                     //湿度传感器OUT接A0号口
    #define DHTTYPE DHT11                //定义DHT11传感器
    DHT dht(DHTPIN,DHTTYPE);             //定义湿度传感器OUT与A0号口连接并且读取温湿度传感器的数值
    const byte ROWS = 4; //四行
    const byte COLS = 4; //四列
    //定义键盘上的按键标识
    char hexaKeys[ROWS][COLS] = {        //按键值
      {'1','2','3','A'},
      {'4','5','6','B'},
      {'7','8','9','C'},
      {'*','0','#','D'}
    };
    byte rowPins[ROWS] = {5, 6, 7, 8}; //连接到行扫描的输入输出端口
    byte colPins[COLS] = {9, 10, 11, 12}; //连接到列扫描的输入输出端口
     
    //定义Keypad类的实例
    Keypad customKeypad = Keypad( makeKeymap(hexaKeys), rowPins, colPins, ROWS, COLS);
    
    DS1302 rtc(2,3,4); //对应DS1302的RST,DAT,CLK
    LiquidCrystal_I2C lcd(0x27,16,2);//设置LCD1602设备地址,一般为0x3F、0x20、0x27,可以查看硬件手册
    char buf1[50];  //定义字符1
    char buf2[50];  //定义字符2
    int alarm_hour = 0;           //闹钟时钟变量
    int alarm_min = 0;            //闹钟分钟变量
    bool adjust_alarm_flag = 0;   //调节闹钟标志位
    bool alarm_flag = 0;           //使能闹钟标志位
    bool led_flag = 0;             //led状态标志位
    int r_led = A1;                 //RGB灯引脚
    int g_led = A2;
    int b_led = A3;
    int length;                    //定义音乐数组长度
    int tonepin=0;                 //蜂鸣器接0号口(需要在程序下载进去之后再接0号)
    bool play_song_flag = 0;       //使能歌曲播放标志位
    #define NTC0 -1                 //C调各频率
    #define NTC1 262
    #define NTC2 294
    #define NTC3 330
    #define NTC4 350
    #define NTC5 393
    #define NTC6 441
    #define NTC7 495
    #define NTCL5 196
    
    #define HALF 0.5            //节拍
    #define QUARTER 0.25
    #define EIGHTH 0.25
    #define SIXTEENTH 0.625
    int tune[]=                  //音频数组
    {
      NTC3,NTC3,NTC4,NTC5,
      NTC5,NTC4,NTC3,NTC2,
      NTC1,NTC1,NTC2,NTC3,
      NTC3,NTC2,NTC2,
      NTC3,NTC3,NTC4,NTC5,
      NTC5,NTC4,NTC3,NTC2,
      NTC1,NTC1,NTC2,NTC3,
      NTC2,NTC1,NTC1,
      NTC2,NTC2,NTC3,NTC1,
      NTC2,NTC3,NTC4,NTC3,NTC1,
      NTC2,NTC3,NTC4,NTC3,NTC2,
      NTC1,NTC2,NTCL5,NTC3,
      NTC3,NTC3,NTC4,NTC5,
      NTC5,NTC4,NTC3,NTC2,
      NTC1,NTC1,NTC2,NTC3,
      NTC2,NTC1,NTC1
    };
    float durt[]=                //节拍数组
    {
      1,1,1,1,
      1,1,1,1,
      1,1,1,1,
      1+0.5,0.5,1+1,
      1,1,1,1,
      1,1,1,1,
      1,1,1,1,
      1+0.5,0.5,1+1,
      1,1,1,1,
      1,0.5,0.5,1,1,
      1,0.5,0.5,1,1,
      1,1,1,1,
      1,1,1,1,
      1,1,1,1,
      1,1,1,1,
      1+0.5,0.5,1+1,
    };
    void initRTCTime(void)//初始化RTC时钟
    {
      rtc.writeProtect(false);   //关闭写保护
      rtc.halt(false);           //清除时钟停止标志
      Time tt(2021, 5, 25, 2, 5, 30, 3); //创建时间对象,参数3为星期数据,周日为1,周一为2以此类推
      rtc.time(tt);//向DS1302设置时间数据
    }
    
    void printTime()//打印时间数据
    {
      Time tim = rtc.time(); //从DS1302获取时间数据
      //snprintf(buf1, sizeof(buf1), "%04d-%02d-%02d",tim.yr, tim.mon, tim.date);   //字符1为年月日数据
      snprintf(buf2, sizeof(buf2), "%02d:%02d:%02d",tim.hr, tim.min, tim.sec);    //字符2为时分秒数据
      //Serial.println(buf1);   //串口打印数据
      //Serial.println(buf2);
      if ((tim.hr == alarm_hour) && (tim.min == alarm_min) && (tim.sec == 0) && alarm_flag == 1)   //判断是否放歌
      {
        tim.sec = 1;
        play_song();      //放歌
      }
    }
    
    
    void setup()
    {
      //Serial.begin(9600);
      dht.begin();                   //湿度传感器初始化
      lcd.init();           // 初始化LCD
      lcd.backlight();      //设置LCD背景等亮
      initRTCTime();
      //新模块上电需要设置一次当前时间,
      //下载完成后需屏蔽此函数再次下载,否则每次上电都会初始化时间数据
      pinMode(r_led,OUTPUT);
      pinMode(g_led,OUTPUT);
      pinMode(b_led,OUTPUT);
      pinMode(tonepin,OUTPUT);
      digitalWrite(r_led,1);
      digitalWrite(g_led,1);
      digitalWrite(b_led,1);
      length=sizeof(tune)/sizeof(tune[0]);     //计算音频数组长度
    }
     
    void loop()
    {
    
      printTime();    //打印时间子函数
      lcd_display();  //lcd显示子函数
    }
    
    void play_song()       //放歌函数
    {
      
      for(int x=0;x<length;x++)
      {
      if(play_song_flag == 1)
      {
        play_song_flag = 0;
        noTone(tonepin);
        digitalWrite(r_led,1);     //RGB灯闪烁
        digitalWrite(g_led,1);
        digitalWrite(b_led,1);
        lcd.setCursor(0,0);
        lcd.print("               ");
        break;
      }
        tone(tonepin,tune[x]);
        digitalWrite(r_led,random(0,2));
        digitalWrite(g_led,random(0,2));
        digitalWrite(b_led,random(0,2));
      for(int i = 0;i < 30*durt[x];i++)
      {
        contral_song();
        delay(1);
      }
       
        noTone(tonepin);
      }
        digitalWrite(r_led,1);
        digitalWrite(g_led,1);
        digitalWrite(b_led,1);
        lcd.setCursor(0,0);
        lcd.print("               ");
    }
    
    void print_temp_humi()                 //输出温湿度函数
    {
      float HH = dht.readHumidity();
      float TT = dht.readTemperature();
      lcd.setCursor(0,1);
      lcd.print("                ");
      lcd.setCursor(0,1);
      lcd.print("T:");
      lcd.setCursor(2,1);
      lcd.print(TT);
      lcd.setCursor(7,1);
      lcd.print("C");
      lcd.setCursor(9,1);
      lcd.print("H:");
      lcd.setCursor(11,1);
      lcd.print(HH);  
    }
    
    void lcd_display()               //lcd显示函数
    {
          //lcd.setCursor(0,0);  //设置显示位置
        //lcd.print(buf1);     //输出字符
        lcd.setCursor(0,0);
        lcd.print(buf2);      
        char customKey = customKeypad.getKey();
     
        if (customKey)
        {
          //Serial.println(customKey);
        if(customKey == '1')
        {
        adjust_alarm_flag = 1;
        }
        if(customKey == '4')
        {
        adjust_alarm_flag = 0;
        }
        if(adjust_alarm_flag == 1)
        {
        
        switch(customKey)
        { 
          case '2':alarm_hour++;break;
          case '5':alarm_hour--;break;
          case '3':alarm_min++;break;
          case '6':alarm_min--;break;
          defalt:break;
        }
        alarm_hour = constrain(alarm_hour,0,24);
        alarm_min = constrain(alarm_min,0,60);
        lcd.setCursor(0,1);
        lcd.print("                ");
        lcd.setCursor(0,1);
        lcd.print(alarm_hour / 10);  
        lcd.setCursor(1,1);
        lcd.print(alarm_hour % 10);  
        lcd.setCursor(2,1);
        lcd.print(":");
        lcd.setCursor(3,1);
        lcd.print(alarm_min / 10);
        lcd.setCursor(4,1);
        lcd.print(alarm_min % 10);
        }
        
        if(customKey == 'A')
        {
        alarm_flag = 1;
        lcd.setCursor(5,1);
        lcd.print("                ");
        lcd.setCursor(7,1);
        lcd.print("Clock On ");
        }
        
        else if(customKey == 'B')
        {
        alarm_flag = 0;
        lcd.setCursor(5,1);
        lcd.print("                ");
        lcd.setCursor(7,1);
        lcd.print("Clock Off");
        }
        else if(customKey == 'D')
        {
        print_temp_humi();
        }
        }
      
    }
    
     void contral_song()             //控制歌曲子函数
    {
      lcd.setCursor(0,0);
      lcd.print("Clock rang");
      char customKey = customKeypad.getKey();
      if(customKey != NULL)
      {
        play_song_flag = 1;
      }
    }
    

    更多创意作品及源码获取欢迎关注公众号:STCode

    展开全文
  • 待填

    待填

    展开全文
  • Arduino + LCD键盘闹钟。 使用迈克尔·马戈利斯(Michael Margolis)出色的时间库来完成计时。 在Arduino上运行有一些限制。 时区和夏时制未实现! 可以使用运行提供的setTime.pl脚本的相当准确的时钟,从(最好是...
  • 本人最近在学习arduino,利用空闲时间制作一些小程序来自娱自乐,也和大家一起交流分享 本次arduino遥控器控制全彩灯珠主要是用到两个名为Timer库和IRremote库,你可以在...

    本人最近在学习arduino,利用空闲时间制作一些小程序来自娱自乐,也和大家一起交流分享

    本次arduino遥控器控制全彩灯珠主要是用到两个名为Timer库和IRremote库,你可以在https://download.csdn.net/download/m0_37738838/10645108下载到这两个库文件及下面提到的源码案例。

    #include "Timer.h"        //计时器头文件
    Timer t;                //计时器对象
    int PIN_RECV = 2;      //红外接收
    int buzzer_pin=8;     //蜂鸣器的pin
    boolean buzzer_state=true;       //蜂鸣器状态
    boolean hours_state=false;      //小时设置
    boolean minutes_state=false;   //分钟设置
    #include <IRremote.h>        //红外头文件
    IRrecv irrecv(PIN_RECV);   //pin设置为接收
    decode_results results;  //解码结果
    long hours=0;   //默认0小时
    long minutes=600000; //默认十分钟
    long Ttime;    //定时总时间
    int a=1;  //count方法传入个数
    void setup()
    {
        Serial.begin(9600);
        irrecv.enableIRIn();           //开启红外
        pinMode(buzzer_pin,OUTPUT);   //设置蜂鸣器的pin为输出模式
    }
    void loop()
    {
        t.update();         //必须在loop中调用,它会服务于计时器相关的事件
        if (irrecv.decode(&results)) {
          Serial.print(results.value,HEX);
         switch(results.value)
        {
            //2
          case 0xFF629D:
          setTime();//进入闹钟模式
            break;
        }
        irrecv.resume();
      }
    }
    void callbackfun(){
      boolean state = true;
      while(state){
            for(int i=0;i<80;i++)//输出一个频率的声音
            {
                digitalWrite(buzzer_pin,HIGH);//发声音
                delay(1);//延时1ms
                digitalWrite(buzzer_pin,LOW);
                delay(1);
            }
             for(int i=0;i<100;i++)//输出另一个频率的声音,这里的100与前面的80一样,用来控制频率,可以自己调节
            {
              digitalWrite(buzzer_pin,HIGH);
              delay(2);
              digitalWrite(buzzer_pin,LOW);
              delay(2);
            }
            if (irrecv.decode(&results)) {
              if(results.value==0xFF9867) {
                state=false;
              }
            }
    }
    }
    void  setTime(){            //unsigned long 0-4,294,967,295
      boolean settime_state = true; //定时状态
    
       while(settime_state){
              if (irrecv.decode(&results)) {
                     switch(results.value){
                        //*
                      case 0xFF6897:Hours();break;
                        //#
                      case 0xFFB04F:Minutes();break;
                        //OK
                      case 0xFF38C7:StarClock();settime_state = false;break;
                    }
              irrecv.resume();
        }
       }
    }
    void Hours(){   //小时
      Serial.println(111);
      boolean hours_state = true; 
      while(hours_state){
            if (irrecv.decode(&results)) {
              switch(results.value){
                   //1
                case 0xFFA25D:hours=3600000;break;
                  //2 
                case 0xFF629D:hours=7200000;break;
                  //3
                case 0xFFE21D:hours=10800000;break;
                  //4
                case 0xFF22DD:hours=14400000;break;
                  //5
                case 0xFF02FD:hours=18000000;break;
                  //6
                case 0xFFC23D:hours=21600000;break;
                  //7
                case 0xFFE01F:hours=25200000;break;
                  //8
                case 0xFFA857:hours=28800000;break;
                  //9
                case 0xFF906F:hours=32400000;break;
                  //0
               case 0xFF9867:hours=0;break;
               //OK
               case 0xFF38C7:hours_state = false;break;
              }
        irrecv.resume();
         }
      }
        Serial.println(333);
    }
    void Minutes(){    //分钟
      boolean minutes_state = true; 
    
      while(minutes_state){
         if (irrecv.decode(&results)) {
              switch(results.value){
                      //1
                    case 0xFFA25D:count(1);break;
                      //2 
                    case 0xFF629D:count(2);break;
                      //3
                    case 0xFFE21D:count(3);break;
                      //4
                    case 0xFF22DD:count(4);break;
                      //5
                    case 0xFF02FD:count(5);break;
                      //6
                    case 0xFFC23D:count(6);break;
                      //7
                    case 0xFFE01F:count(7);break;
                      //8
                    case 0xFFA857:count(8);break;
                      //9
                    case 0xFF906F:count(9);break;
                      //0
                   case 0xFF9867:count(0);break;
                    //OK
                   case 0xFF38C7:minutes_state = false;a=1;break;
              }
        irrecv.resume();
         }
      }
    }
    void StarClock(){       //开始定时
      Ttime = hours+minutes;
     t.after(Ttime,callbackfun);   //1000mm=1s   60000=1min;
     Serial.println(Ttime);
     Serial.println(666);
    
    }
    void count(int num){
      Serial.println(num);
      if(a==1){minutes = 60000 * num;a++;}    
      else if(a==2){int shi =minutes*10 ;int ge = 6000*num; minutes = shi + ge;a++;}  
      Serial.println(minutes);
    }
    
    
    

    我的红外接收引脚是D2,蜂鸣器信号引脚是D8。要准备好一个红外接收模块,一个红外遥控器,一个蜂鸣器以及一张arduino板。

    使用定时闹钟时,先按下遥控器2,进入闹钟设置功能,按下*键则设置时钟时间,将我们要设置的时间0~9遥控输入,按下OK键表示确定,接下来设置分钟时间,按下#键后将我们要设置的时间0~9遥控输入,按下OK键表示确定,最后确认按下OK,这样arduino开始执行我们的定时闹钟的程序啦

    当然因为我们的遥控器版本不一样,所以大家首先先将自己的遥控器编码输出来,修改一下红外接收部分的代码便可用啦,如果我们想在更好玩一点,可以在蜂鸣器上花点心思,通过音乐的节拍来设计蜂鸣器的声响,这样就更有意思了

    展开全文
  • 用杜邦线把ds1302转接板和液晶屏连在一起,液晶屏插在面包板上没反应只有蓝光是怎么回事呀</p>
  • 目录前言1,关于arduino2,代码3,总结 前言 相关arduino 全部分类: https://blog.csdn.net/freewebsys/category_8799254.html 本文的原文连接是: https://blog.csdn.net/freewebsys/article/details/104528199 ...
  • 最近拿到实时时钟模块DS3231,可能很多人不知道这个芯片,这个芯片号称(数据手册)年误差可以做到小于两分钟的高精度时钟芯片...* 两个日历闹钟 * 可编程方波输出 * IIC总线接口 * 备份电池输入 * 温度输出(注意:温
  • 基于Arduino的多功能数字时钟

    万次阅读 多人点赞 2017-05-08 22:07:57
    5. 自定义闹钟 6. 显示温度 7. 自定义报警温度 8. 按键功能:按选择键进入设置时间功能;同时按 + - 键进入闹钟和报警温度设置功能; 9. 再按选择键光标跳动,光标跳到哪当前的参数即可通过加减键修改。
  • Arduino U8glib 数字闹钟及温度计(不需时钟模块) 前言 最近想用Arduino制作一个数字闹钟,但因为没有独立的时钟模块造成时间误差太大让我困扰,但还是想了一个办法,让程序自动校正时间,于是不需要时钟模块,...
  • 使用Arduino Mega 2560,5054 LED灯条,DS3231 RTC,IRFZ44N MOSFET晶体管和铝型材制作大型数字挂钟。 硬件组件: 功率MOSFET N沟道× 1 Arduino Mega 2560和Genuino Mega 2560× 1 Maxim Integrated DS3231M - ±5ppm...
  • arduino和ds1302的基于lcd12864闹钟,按键可调时间,可设定闹钟闹钟可通过按键更改,可掉电保存
  • Arduino Nano R3× 1 SparkFun气压传感器- BME280× 1 Maxim Integrated DS1307 64 x 8,串行,I²C实时时钟× 1 软件应用程序和在线服务 Arduino IDE 手动工具和制造机器 烙铁(通用) 到目前为止,除了时钟本身,...
  • 益智闹钟 一个基于Arduino的拼图闹钟在这个项目中,我使用了线程,I2C,旋转编码器(ec11),ds1302实时时钟和I2C LCD模块...
  • Arduino版的库里初始化配置PWR时钟、初始化配置备份寄存器时钟、复位备份寄存器(RTC时钟需要用到备份寄存器相关东西) 官方老标准库里也是一样的: 设置寄存器RCC_APB1ENR的PWREN和BKPEN位打开电源和后备时钟。 使...
  • 刚刚做的 或许是你需要的
  • 课程设计 课题基于Arduino的音乐播放器设计 班级14计应1班 姓名吕文龙 日期2016.12.05 目 录 TOC \o "1-3" \h \z \u 目 录 2 引言 3 一基本原理 4 1.1实验目的 4 1.2实验要求和内容 4 1.3实验器件 4 二基本流程图 5...
  • 使用这款凉爽的设备,可以将床头灯变成唤醒灯。

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 565
精华内容 226
关键字:

arduino闹钟