久久久久久久999_99精品久久精品一区二区爱城_成人欧美一区二区三区在线播放_国产精品日本一区二区不卡视频_国产午夜视频_欧美精品在线观看免费

 找回密碼
 立即注冊(cè)

QQ登錄

只需一步,快速開(kāi)始

搜索
查看: 6375|回復(fù): 2
打印 上一主題 下一主題
收起左側(cè)

Arduino電子鬧鐘源碼

[復(fù)制鏈接]
跳轉(zhuǎn)到指定樓層
樓主
ID:302246 發(fā)表于 2018-6-6 18:31 | 只看該作者 回帖獎(jiǎng)勵(lì) |倒序?yàn)g覽 |閱讀模式
Arduino的電子鬧鐘,可以設(shè)置時(shí)間,蜂鳴器報(bào)警,播放葫蘆娃,使用超聲波模塊,當(dāng)手與超聲波一定距離的時(shí)候關(guān)掉鬧鐘。
代碼復(fù)制到IDE下載即可。

Arduino單片機(jī)源程序如下:
  1. #include <EEPROM.h>
  2. #include <SR04.h>

  3. //葫蘆娃對(duì)應(yīng)的樂(lè)譜
  4. #define NOTE_D0 -1
  5. #define NOTE_D1 262
  6. #define NOTE_D2 293
  7. #define NOTE_D3 329
  8. #define NOTE_D4 349
  9. #define NOTE_D5 392
  10. #define NOTE_D6 440
  11. #define NOTE_D7 494
  12. #define NOTE_DL1 147
  13. #define NOTE_DL2 165
  14. #define NOTE_DL3 175
  15. #define NOTE_DL4 196
  16. #define NOTE_DL5 221
  17. #define NOTE_DL6 248
  18. #define NOTE_DL7 278
  19. #define NOTE_DH1 523
  20. #define NOTE_DH2 586
  21. #define NOTE_DH3 658
  22. #define NOTE_DH4 697
  23. #define NOTE_DH5 783
  24. #define NOTE_DH6 879
  25. #define NOTE_DH7 987
  26. //以上部分是定義是把每個(gè)音符和頻率值對(duì)應(yīng)起來(lái),其實(shí)不用打這么多,但是都打上了,后面可以隨意編寫D調(diào)的各種歌,我這里用NOTE_D+數(shù)字表示音符,NOTE_DH+數(shù)字表示上面有點(diǎn)的那種音符,NOTE_DL+數(shù)字表示下面有點(diǎn)的那種音符。這樣后面寫起來(lái)比較好識(shí)別。
  27. #define WHOLE 1
  28. #define HALF 0.5
  29. #define QUARTER 0.25
  30. #define EIGHTH 0.25
  31. #define SIXTEENTH 0.625
  32. //這部分是用英文對(duì)應(yīng)了拍子,這樣后面也比較好看
  33. int tune[] =
  34. {
  35.   NOTE_DH1,NOTE_D6,NOTE_D5,NOTE_D6,NOTE_D0,
  36.   NOTE_DH1,NOTE_D6,NOTE_D5,NOTE_DH1,NOTE_D6,NOTE_D0,NOTE_D6,
  37.   NOTE_D6,NOTE_D6,NOTE_D5,NOTE_D6,NOTE_D0,NOTE_D6,
  38.   NOTE_DH1,NOTE_D6,NOTE_D5,NOTE_DH1,NOTE_D6,NOTE_D0,
  39.   NOTE_D1,NOTE_D1,NOTE_D3,
  40.   NOTE_D1,NOTE_D1,NOTE_D3,NOTE_D0,
  41.   NOTE_D6,NOTE_D6,NOTE_D6,NOTE_D5,NOTE_D6,
  42.   NOTE_D5,NOTE_D1,NOTE_D3,NOTE_D0,
  43.   NOTE_DH1,NOTE_D6,NOTE_D6,NOTE_D5,NOTE_D6,
  44.   NOTE_D5,NOTE_D1,NOTE_D2,NOTE_D0,
  45.   NOTE_D7,NOTE_D7,NOTE_D5,NOTE_D3,
  46.   NOTE_D5,
  47.   NOTE_DH1,NOTE_D0,NOTE_D6,NOTE_D6,NOTE_D5,NOTE_D5,NOTE_D6,NOTE_D6,
  48.   NOTE_D0,NOTE_D5,NOTE_D1,NOTE_D3,NOTE_D0,
  49.   NOTE_DH1,NOTE_D0,NOTE_D6,NOTE_D6,NOTE_D5,NOTE_D5,NOTE_D6,NOTE_D6,
  50.   NOTE_D0,NOTE_D5,NOTE_D1,NOTE_D2,NOTE_D0,
  51.   NOTE_D3,NOTE_D3,NOTE_D1,NOTE_DL6,
  52.   NOTE_D1,
  53.   NOTE_D3,NOTE_D5,NOTE_D6,NOTE_D6,
  54.   NOTE_D3,NOTE_D5,NOTE_D6,NOTE_D6,
  55.   NOTE_DH1,NOTE_D0,NOTE_D7,NOTE_D5,
  56.   NOTE_D6,
  57. };//這部分就是整首曲子的音符部分,用了一個(gè)序列定義為tune,整數(shù)
  58. float duration[]=
  59. {
  60.   1,1,0.5,0.5,1,
  61.   0.5,0.5,0.5,0.5,1,0.5,0.5,
  62.   0.5,1,0.5,1,0.5,0.5,
  63.   0.5,0.5,0.5,0.5,1,1,
  64.   1,1,1+1,
  65.   0.5,1,1+0.5,1,
  66.   1,1,0.5,0.5,1,
  67.   0.5,1,1+0.5,1,
  68.   0.5,0.5,0.5,0.5,1+1,
  69.   0.5,1,1+0.5,1,
  70.   1+1,0.5,0.5,1,
  71.   1+1+1+1,
  72.   0.5,0.5,0.5+0.25,0.25,0.5+0.25,0.25,0.5+0.25,0.25,
  73.   0.5,1,0.5,1,1,
  74.   0.5,0.5,0.5+0.25,0.25,0.5+0.25,0.25,0.5+0.25,0.25,
  75.   0.5,1,0.5,1,1,
  76.   1+1,0.5,0.5,1,
  77.   1+1+1+1,
  78.   0.5,1,0.5,1+1,
  79.   0.5,1,0.5,1+1,
  80.   1+1,0.5,0.5,1,
  81.   1+1+1+1
  82. };//這部分是整首曲子的接拍部分,也定義個(gè)序列duration,浮點(diǎn)(數(shù)組的個(gè)數(shù)和前面音符的個(gè)數(shù)是一樣的,一一對(duì)應(yīng)么)
  83. //LCD初始化
  84. #include <LiquidCrystal.h>
  85. LiquidCrystal lcd=LiquidCrystal(2,3,4,5,6,7,8);
  86. // 初始 化按鍵
  87. int ring=A3;
  88. int set=A0;  //選擇端口
  89. int add=A1;     //加
  90. int minus=A2;    //減
  91. //設(shè)置參數(shù)
  92. int jy=0,jmonth=0,jd=0,jh=0,jm=0,js=0;//      進(jìn)位
  93. int year=0,month=0,day=0,hour=0,minute=0,second=0;//   當(dāng)前時(shí)間
  94. int YEAR=2018,MONTH=4,DAY=12,HOUR=18,MINUTE=10,SECOND=00;// 初始設(shè)定時(shí)間
  95. int moving=0,ring_moving=0;// 設(shè)置時(shí)間的移動(dòng)
  96. int ring_hour=0,ring_minute=0,jr=0;//鬧鐘時(shí)間
  97. unsigned long seconds=0;//讀取程序運(yùn)行時(shí)間
  98. unsigned long b=1,secondcomp=0,exsecond=0;
  99. //蜂鳴器模塊定義
  100. int length;//這里定義一個(gè)變量,后面用來(lái)表示共有多少個(gè)音符
  101. int tonePin=9;//蜂鳴器的pin
  102. int a=0;
  103. //超聲波模塊管腳參數(shù)
  104. int echo=13;
  105. int trig=12;
  106. SR04 target=SR04(echo,trig);
  107. long distance=0;

  108. //共同體設(shè)置,把 無(wú)符號(hào)長(zhǎng)整 分4個(gè)字節(jié)存入 EEPROM
  109. union data
  110. {
  111.   float renewtime;
  112.   byte difference[4];
  113. };
  114. data col;
  115. void Time_Lcd(int rol,int raw,int number)// 標(biāo)準(zhǔn)格式 在lcd 顯示時(shí)間
  116. {
  117.   lcd.setCursor(rol,raw);
  118.   if(number<10)// 如果小于 10,輸出 為 0X
  119.   {
  120.     lcd.print(0);
  121.   }
  122.   lcd.print(number);
  123. }
  124. //顯示具體的時(shí)間
  125. void time()
  126. {
  127.   if(SECOND<=0) SECOND=0;
  128.   second=(secondcomp+seconds+SECOND+exsecond)%60;
  129.   Time_Lcd(6,1,second);
  130.   jm=(seconds+SECOND)/60;
  131.   if(MINUTE<=0) MINUTE=0;
  132.   minute=(jm+MINUTE)%60;
  133.   Time_Lcd(3,1,minute);
  134.   jh=(jm+MINUTE)/60;
  135.   if(HOUR<=0) HOUR=0;
  136.   hour=(jh+HOUR)%24;
  137.   Time_Lcd(0,1,hour);
  138.   lcd.setCursor(2,1);
  139.   lcd.print(":");
  140.   lcd.setCursor(5,1);
  141.   lcd.print(":");
  142.   lcd.setCursor(8,1);
  143.   lcd.print(" ");
  144.   lcd.setCursor(4,0);
  145.   lcd.print("-");
  146.   lcd.setCursor(7,0);
  147.   lcd.print("-");
  148. }
  149. //算出當(dāng)月一共多少個(gè)月
  150. int DAYS(int year,int month)
  151. {
  152.   if(year%4==0&&year%100!=0||year%400==0)
  153.   {
  154.      switch(month){
  155.      case 1:case 3:case 5:case 7:case 8:case 10:case 12: return 31;break;
  156.      case 2:return 29;break;
  157.      case 4:case 6:case 9:case 11: return 30;break;}
  158.   }
  159.   else
  160.   {
  161.      switch(month){
  162.       case 1:case 3:case 5:case 7:case 8:case 10:case 12: return 31;break;
  163.       case 2:return 28;break;
  164.       case 4:case 6:case 9:case 11: return 30;break;}
  165.   }
  166. }
  167. //設(shè)置后的天數(shù),考慮進(jìn)一個(gè)月或者天數(shù)為 0,退一個(gè)月的情況
  168. void Day()
  169. {
  170.   if(DAY<=0) DAY=0;
  171.   int day=0;
  172.   int exdays=0;
  173.   int days=DAYS(year,month);
  174.   if(month==1) exdays=DAYS(year-1,12);
  175.   else exdays=(year,month-1);
  176.   jd=(HOUR+jh)/24;
  177.   day=(jd+DAY)%(days+1);
  178.   if((jd+DAY)==0)
  179.   {
  180.     jmonth--;
  181.     DAY=exdays;
  182.   }
  183.   if((jd+DAY)==(days+1))
  184.   {
  185.     jmonth++;
  186.     DAY=DAY-days;
  187.   }
  188.   Time_Lcd(8,0,day);
  189. }
  190. //設(shè)置后的月數(shù),考慮  0月退一年的情況
  191. void Month()
  192. {
  193.   if(MONTH<=0) MONTH=0;
  194.   month=(MONTH+jmonth)%12;
  195.   if(month==0&&(MONTH+jmonth)!=0) month=12;
  196.   jy=(jmonth+MONTH-1)/12;
  197.   if((MONTH+jmonth)==0)
  198.   {
  199.     month=12;
  200.     jy--;
  201.   }
  202.   Time_Lcd(5,0,month);
  203. }
  204. //設(shè)置 年
  205. void Year()
  206. {
  207.   if(YEAR<=0) YEAR=0;  
  208.   year=(jy+YEAR)%10000;
  209.   lcd.setCursor(0,0);
  210.   if(year<1000)
  211.   {
  212.     lcd.print("0");
  213.   }
  214.   if(year<100)
  215.   {
  216.     lcd.print("00");
  217.   }
  218.   if(year<10)
  219.   {
  220.     lcd.print("000");
  221.   }
  222.   lcd.print(year);
  223. }

  224. // 顯示時(shí)間匯總
  225. //設(shè)置鬧鐘,移動(dòng)光標(biāo)到對(duì)應(yīng)的時(shí)間位置
  226. void Set_Clock()   //按鍵選擇
  227. {
  228.   if(digitalRead(set)==LOW)
  229.   {  
  230.     lcd.setCursor(9, 1);  lcd.print("SetTime");
  231.     while(1)
  232.     {      
  233.         if(digitalRead(set)==LOW)
  234.         {
  235.            delay(10);
  236.            if(digitalRead(set)==LOW)
  237.              moving++;  
  238.          }
  239.         seconds = millis()/1000;
  240.         Show_Time();
  241.         if(moving == 1)
  242.            Set_Time(0, 1, HOUR);  //設(shè)置小時(shí)
  243.         if(moving == 2)
  244.            Set_Time(3, 1, MINUTE);     //分鐘
  245.         if(moving == 3)
  246.            Set_Time(6, 1, SECOND);    //秒
  247.         if(moving== 4)
  248.            Set_Time(8, 0, DAY);      //天
  249.         if(moving== 5)
  250.            Set_Time(5, 0, MONTH);      // 月
  251.         if(moving== 6)            
  252.            Set_Time(2, 0, YEAR);       // 年
  253.         if(moving >= 7)  
  254.         {
  255.            moving = 0;
  256.           lcd.setCursor(9,1);
  257.           lcd.print("       ");
  258.           break;
  259.         }
  260.     }
  261.         delay(50);
  262.   }  
  263. }
  264. //光標(biāo)閃爍,顯示正在設(shè)置哪一位
  265. void Cursor_Blink(int col,int raw)
  266. {
  267.   lcd.setCursor(col,raw);
  268.   lcd.cursor();
  269.     delay(100);     
  270.     lcd.noCursor();
  271.     delay(100);  
  272. }
  273. //更改初始時(shí)間
  274. void Set_Time(int col, int row, int &TIME)   //通過(guò)按鍵設(shè)置時(shí)間
  275. {
  276.    Cursor_Blink(col, row);
  277.    if(digitalRead(add) == LOW)
  278.    {
  279.        delay(10);
  280.        if(digitalRead(add) == LOW)
  281.            TIME ++;
  282.        Show_Time();      
  283.    }  
  284.    if(digitalRead(minus) == LOW)
  285.    {
  286.        delay(10);
  287.        if(digitalRead(minus) == LOW)
  288.            TIME --;
  289.        Show_Time();
  290.     }  
  291. }
  292. //光標(biāo)閃爍,顯示正在設(shè)置哪一位

  293. //更改初始時(shí)間

  294. void Show_Time()
  295. {
  296.   time();
  297.   Day();
  298.   Month();
  299.   Year();
  300. }
  301. //設(shè)置鬧鈴時(shí)間,原理同上
  302. void Set_Ring()
  303. {
  304.    if(digitalRead(ring)==LOW)
  305.   {  
  306.     lcd.setCursor(0,0);  lcd.print("  set RINGTime  ");
  307.     lcd.setCursor(0,1);
  308.     lcd.print("   ");
  309.     Time_Lcd(2,1,ring_hour);
  310.     lcd.print(":");
  311.     Time_Lcd(5,1,ring_minute);   
  312.     lcd.print("   ");
  313.     while(1)
  314.     {      
  315.         if(digitalRead(ring)==LOW)
  316.         {
  317.            delay(10);
  318.            if(digitalRead(ring)==LOW)
  319.              ring_moving++;  
  320.          }
  321.         if(ring_moving == 1)
  322.            Set_RingHour();      //SetHour
  323.         if(ring_moving == 2)
  324.            Set_RingMinute();    //SetMinute
  325.         if(ring_moving >= 3)  
  326.         {
  327.            ring_moving = 0;
  328.           lcd.setCursor(10,0);
  329.            lcd.print("    ");
  330.            break;
  331.         }
  332.     }
  333.     delay(100);
  334.   }  
  335. }
  336. void Set_RingHour()   //通過(guò)按鍵設(shè)置時(shí)間
  337. {
  338.    Cursor_Blink(2,1);
  339.    if(digitalRead(add) == LOW)
  340.    {
  341.        delay(10);
  342.        if(digitalRead(add) == LOW)
  343.            ring_hour++;
  344.        ring_hour=ring_hour%24;
  345.        Time_Lcd(2,1,ring_hour);   
  346.        Time_Lcd(5,1,ring_minute);
  347.    }  
  348.    if(digitalRead(minus) == LOW)
  349.    {
  350.        delay(10);
  351.        if(digitalRead(minus) == LOW)
  352.            ring_hour--;
  353.        Time_Lcd(2,1,ring_hour);  
  354.        Time_Lcd(5,1,ring_minute);
  355.     }  
  356. }
  357. void Set_RingMinute()   //通過(guò)按鍵設(shè)置時(shí)間
  358. {
  359.    Cursor_Blink(5,1);
  360.    if(digitalRead(add) == LOW)
  361.    {
  362.        delay(10);
  363.        if(digitalRead(add) == LOW)
  364.        {
  365.            ring_minute++;
  366.            ring_minute=ring_minute%60;
  367.            if(ring_minute==0)  ring_hour++;
  368.            ring_hour=ring_hour%24;
  369.        }
  370.        Time_Lcd(2,1,ring_hour);
  371.        Time_Lcd(5,1,ring_minute);   
  372.    }  
  373.    if(digitalRead(minus) == LOW)
  374.    {
  375.        delay(10);
  376.        if(digitalRead(minus) == LOW)
  377.            ring_minute--;
  378.        ring_minute=ring_minute%60;
  379.        Time_Lcd(2,1,ring_hour);
  380.        Time_Lcd(5,1,ring_minute);  
  381.     }  
  382. }
  383. void showdistance() //超聲波測(cè)量距離
  384. {
  385.   distance=target.Distance();
  386. }
  387. void music()//控制蜂鳴器
  388. {
  389.   length = sizeof(tune)/sizeof(tune[0]);//這里用了一個(gè)sizeof函數(shù),可以查出tone序列里有多少個(gè)音符
  390.   for(int x=0;x<length;x++)
  391.   {
  392.     distance=target.Distance();
  393.     if(distance<10)
  394.     {
  395.       break;
  396.     }
  397.     tone(tonePin,tune[x]);//此函數(shù)依次播放tune序列里的數(shù)組,即每個(gè)音符
  398.     delay(200*duration[x]);//每個(gè)音符持續(xù)的時(shí)間,即節(jié)拍duration,400是調(diào)整時(shí)間的越大,曲子速度越慢,越小曲子速度越快,自己掌握吧
  399.     noTone(tonePin);//停止當(dāng)前音符,進(jìn)入下一音符
  400.   }
  401. }
  402. void Ring()//鬧鈴
  403. {
  404.   if(hour==ring_hour&&minute==ring_minute&&second==0)
  405.       music();
  406. }
  407. void setup() {
  408.   // put your setup code here, to run once:
  409.   lcd.begin(16,2);
  410.   digitalWrite(add, HIGH);
  411.   digitalWrite(minus, HIGH);
  412.   digitalWrite(set, HIGH);  
  413.   digitalWrite(ring,HIGH);
  414.   pinMode(tonePin,OUTPUT);//設(shè)置蜂鳴器的pin為輸出模式
  415.   for(int i=0;i<4;i++)
  416.   col.difference[i]=EEPROM.read(i);
  417.   exsecond=col.renewtime;
  418. }
  419. void loop() {
  420.   // put your main code here, to run repeatedly:
  421.   seconds=millis()/1000;
  422.   if(seconds==900*b+(b-1)) {secondcomp++;b++;}//補(bǔ)償誤差
  423.   Show_Time();
  424.   Set_Clock();
  425.   Set_Ring();
  426.   Ring();
  427.   col.renewtime=seconds;
  428.   for(int i=0;i<4;i++)
  429.   EEPROM.write(i, col.difference[i]);
  430. }
復(fù)制代碼

所有資料51hei提供下載:
電子鬧鐘.docx (16.28 KB, 下載次數(shù): 55)


評(píng)分

參與人數(shù) 1黑幣 +50 收起 理由
admin + 50 共享資料的黑幣獎(jiǎng)勵(lì)!

查看全部評(píng)分

分享到:  QQ好友和群QQ好友和群 QQ空間QQ空間 騰訊微博騰訊微博 騰訊朋友騰訊朋友
收藏收藏3 分享淘帖 頂 踩
回復(fù)

使用道具 舉報(bào)

沙發(fā)
ID:850685 發(fā)表于 2020-11-28 14:38 來(lái)自手機(jī) | 只看該作者
這個(gè)實(shí)物怎么接線呀
回復(fù)

使用道具 舉報(bào)

板凳
ID:138707 發(fā)表于 2023-7-30 12:28 | 只看該作者
這個(gè)實(shí)物怎么接線呀,同問(wèn)
回復(fù)

使用道具 舉報(bào)

本版積分規(guī)則

手機(jī)版|小黑屋|51黑電子論壇 |51黑電子論壇6群 QQ 管理員QQ:125739409;技術(shù)交流QQ群281945664

Powered by 單片機(jī)教程網(wǎng)

快速回復(fù) 返回頂部 返回列表
主站蜘蛛池模板: 久久久99国产精品免费 | 天天射天天干 | 国产91综合 | 99一区二区 | 欧美精品91爱爱 | 国产三级精品视频 | 国产视频精品在线 | 久久亚洲天堂 | 日韩在线一区视频 | 亚洲精品久久久久久首妖 | 91精品久久久久久久久久入口 | 91精品国产乱码久久久久久久久 | 亚洲欧美综合 | 国产一区二区三区四区五区3d | 精品一区二区三区四区五区 | 一区二区精品 | 亚洲视频一区在线播放 | 国产精品区二区三区日本 | 久久不卡| 一区二区三区四区视频 | 欧美一二三四成人免费视频 | 日韩av在线一区 | 日韩精品亚洲专区在线观看 | 精品亚洲一区二区 | 久久精品中文字幕 | 久久久久亚洲精品 | 天天草天天干 | 天堂va在线观看 | 在线观看成年人视频 | 日韩欧美专区 | 久久久久久黄 | 中文字幕亚洲欧美日韩在线不卡 | 亚洲国产精品久久 | 亚洲午夜精品视频 | 超碰97免费在线 | 欧美成人a∨高清免费观看 老司机午夜性大片 | 国产精品二区三区在线观看 | 最新黄色在线观看 | 成人国产一区二区三区精品麻豆 | 日日操夜夜操天天操 | 天天干夜夜操 |