制作一個由Arduino控制的定時器,并學習Arduino和LCD1602液晶顯示器以及鍵盤模塊的連接。
在這篇文章中,我們將學習如何創(chuàng)建一個由用戶控制的定時器。這個項目將幫助你管理時間,實現(xiàn)及時提醒。你可以方便地設(shè)定一個時間限制,然后離開,直到你聽到定時器發(fā)出“嗶嗶”聲后及時安排下一項工作。在這個項目中我們將使用一個Arduino液晶鍵盤模塊,你將從連接小蜂鳴器開始,直到讓設(shè)備啟動起來,并通過按鈕接口和LCD接口實現(xiàn)輸入和輸出功能。
定時器主要功能概述
在啟動電源之后,定時器將顯示一個“Arduino-Timer”的信息,并持續(xù)3秒。
計時器將提示設(shè)置時間。你可以通過按下左右鍵來將光標移動到要修改的位置,如分鐘和小時。
通過上下箭頭鍵調(diào)整分鐘和小時的設(shè)置。
一旦設(shè)置了所需的時間,按下“SELECT”按鈕,計時器就會啟動。
如果想重新設(shè)置時間,請再次按下“SELECT”按鈕。
到達設(shè)定的時間后,蜂鳴器就會發(fā)出嗶嗶聲。
需要關(guān)閉蜂鳴器聲音,在聽到嗶嗶聲后按下鍵盤上的“RST”鍵。
定時器所需的組件
Arduino
LCD1602鍵盤模塊
蜂鳴器
定時器的線路圖
首先,將液晶鍵盤模塊直接插到在Arduino上。然后將蜂鳴器的正極連接到Arduino上的12號引腳上,并將蜂鳴的負極連接到GND上。
制作Arduino定時器的代碼
adc_key_in = analogRead(0); // 從液晶鍵盤上讀取按鈕的值 // 檢查按下的是哪個按鈕 if (adc_key_in > 1000) return btnNONE; // 把它作為速度的第一個選項因為它是最有可能的結(jié)果 if (adc_key_in < 50) return btnRIGHT; if (adc_key_in < 250) return btnUP; if (adc_key_in < 450) return btnDOWN; if (adc_key_in < 650) return btnLEFT; if (adc_key_in < 850) return btnSELECT; return btnNONE; // 當所有讀取都失敗時,返回btnNONE } void setup() { Serial.begin(115200); pinMode(buzzer_pin, OUTPUT); lcd.begin(16, 2); // 啟動與LCD鍵盤的通信 lcd.setCursor(0,0); lcd.print("Arduino-"); lcd.setCursor(0, 1); lcd.print(" Timer"); delay(3000); } void loop(){ // 根據(jù)按下的按鈕檢查哪個條件是正確的 if(startTimer == true){ start_timer(); } else if (setTimer == true){ set_timer(); } } // 這個函數(shù)將計算時間 void start_timer(){ // 檢查時間是否正常 if(hrs == 0 && mins == 0 && secs == 0){ lcd.setCursor(0, 0); lcd.print(" Time is UP"); lcd.setCursor(0, 1); lcd.print(" Beep Beep"); digitalWrite(buzzer_pin, HIGH); delay(500); digitalWrite(buzzer_pin, LOW); delay(500); } else if(secs < 0){ secs = 59; mins = mins - 1; } else if(mins < 0){ mins = 59; hrs = hrs - 1; } else { get_time = true; counter(); lcd.setCursor(0, 0); lcd.print("Timer is ON"); lcd.setCursor(0, 1); lcd.print(hrs); lcd.print(":"); lcd.setCursor(4, 1); lcd.print(mins); lcd.print(":"); lcd.setCursor(8, 1); lcd.print(secs); } lcd_key = read_LCD_buttons(); // 讀取按鈕值 switch (lcd_key) // 根據(jù)哪個按鈕被按下來執(zhí)行一個操作 { // 如果按下select按鈕,則返回設(shè)置時間 case btnSELECT: { startTimer = false; setTimer = true; delay(300); lcd.clear(); break; } case btnNONE: { break; } } } // 這個函數(shù)將設(shè)置時間 void set_timer(){ counter(); lcd.setCursor(0, 0); lcd.print("Set Time"); lcd.setCursor(0, 1); lcd.print("Hrs:"); lcd.print(hrs); lcd.setCursor(8, 1); lcd.print("Mins:"); lcd.print(mins); lcd.setCursor(0,1); lcd_key = read_LCD_buttons(); // 讀取按鈕值 switch (lcd_key) // 根據(jù)哪個按鈕被按下來執(zhí)行一個操作 { // 如果按下RIGHT按鈕,移動光標到分鐘位置 case btnRIGHT: { cursor_pos = set_mins; break; } // 如果按下left按鈕,移動光標到小時位置 case btnLEFT: { cursor_pos = set_hrs; break; } // 如果up被按下, 分鐘或小時加1 case btnUP: { delay(300); if(cursor_pos == set_mins){ mins++; if(mins > 59){ mins = 0; } } else if(cursor_pos == set_hrs){ hrs++; if(hrs > 24){ hrs = 0; } } break; } // 如果Down被按下, 分鐘或小時減1 case btnDOWN: { delay(300); if(cursor_pos == set_mins){ mins--; if(mins < 0){ mins = 60; } } else if(cursor_pos == set_hrs){ hrs--; if(hrs < 0){ hrs = 24; } } break; } // 如果按下SELECT按鈕,啟動定時器 case btnSELECT: { startTimer = true; setTimer = false; mins = mins - 1; delay(300); break; } case btnNONE: { break; } } } void counter() { unsigned long currentMillis = millis(); // 獲取當前時間 // 檢查“interval”時間是否已超過(1000毫秒) if ((unsigned long)(currentMillis - previousMillis) >= interval) { lcd.clear(); if(get_time == true){ secs--; get_time = false; } previousMillis = millis(); } }
至此一款基于Arduino的定時器就制作完成了,余下的工作你可以根據(jù)喜好對它進行美化或者開發(fā)更有趣的應(yīng)用。
-
Arduino
+關(guān)注
關(guān)注
188文章
6477瀏覽量
187819
發(fā)布評論請先 登錄
相關(guān)推薦
評論