第1步:第一步







首先,我們需要設(shè)置LCD,RTC并清除arduinos eeprom。
-LCD lcd必須有一個(gè)地址,在代碼的開(kāi)頭聲明:
LiquidCrystal_I2C lcd(0x3F,16,2);//0x3F是我的lcd地址,也許不是你的地址!
如果您不知道地址,請(qǐng)使用實(shí)用程序“I2C掃描儀”。按如下方式連接你的液晶顯示器:
-VCC到arduino 5V
-GND到arduino GND
-SCL到arduino模擬引腳5
上傳代碼并打開(kāi)串口監(jiān)視器,將顯示地址。如果地址不同,則替換地址(0x3F)。
下載:
https://gist.github.com/tfeldmann/5411375
-RTC 我們將使用RTC 3231,但必須對(duì)編程時(shí)間進(jìn)行編程。將RTClib-master添加到Arduino庫(kù)中。轉(zhuǎn)到文件/examples/RTClib/ds3231。上傳代碼。此草圖根據(jù)您正在使用的計(jì)算機(jī)(編譯代碼時(shí)的正確性)獲取日期和時(shí)間,并使用它來(lái)編程RTC。如果您的計(jì)算機(jī)時(shí)間設(shè)置不正確,您應(yīng)該先修復(fù)它。然后你必須按上傳按鈕進(jìn)行編譯,然后立即上傳。
警告?。?如果你編譯然后再上傳,時(shí)鐘將是離開(kāi)這段時(shí)間。然后打開(kāi)串行監(jiān)視器窗口以顯示時(shí)間已設(shè)置。
按如下方式連接rtc:
-VCC到arduino 5V
-GND到arduino GND
-SDA到arduino模擬引腳4
-SCL到arduino模擬引腳5
如果你不知道,可以連接lcd和rtc同時(shí)到I2C總線(xiàn)(模擬4 SDA,模擬5 SCL)。
-EEPROM清除通常,eeprom值是255 x地址,我們需要將這些值設(shè)置為0. eeprom庫(kù)已包含在您的arduino IDE中。
轉(zhuǎn)到文件/示例/EEPROM/eeprom_clear。
上傳代碼并等待引腳13導(dǎo)通。您可以使用eeprom_read代碼檢查您的值。
觀(guān)看視頻!
本教程中使用的RTC和LCD庫(kù):
步驟2:計(jì)時(shí)器的詭計(jì)



這里的挑戰(zhàn)之一是比較“準(zhǔn)時(shí)”和“關(guān)閉時(shí)間”隨時(shí)了解當(dāng)前時(shí)間。人們可以這樣思考:
if(now hour == on hour && now minute == on minute && now second == on second)
relay on
if(now hour == off hour && now minute == off minute && now second == off second)
relay off
這可能會(huì)有效,但是如果你的設(shè)定點(diǎn)是12 :30:00,你的設(shè)定點(diǎn)15:45:15,當(dāng)前時(shí)間是13:00:00?好吧,你會(huì)等到第二天打開(kāi)你的設(shè)備!或者如果你在12:30:00和15:45:15失去力量怎么辦?同樣的事情:等待觸發(fā)設(shè)置。
如果你查看我以前的計(jì)時(shí)器,有很多if/else語(yǔ)句來(lái)控制繼電器,因?yàn)闀r(shí)間是循環(huán)的,我們需要涵蓋所有可能的情況。但要添加分鐘和秒鐘則是別的。所有值都可以高于或低于開(kāi)/關(guān)設(shè)置或當(dāng)前時(shí)間,并嘗試比較它將是一團(tuán)糟。
所以我想在軍事時(shí)間或字符串?dāng)?shù)字從0到235959,和這就是這些計(jì)時(shí)器的訣竅。因此,我們將當(dāng)前時(shí)間,設(shè)定值和關(guān)閉設(shè)定值轉(zhuǎn)換為單個(gè)數(shù)字。
我將解釋定時(shí)器的工作原理,因?yàn)楦脑O(shè)置和顯示值等的界面可以是在我的多屏幕教學(xué)中學(xué)習(xí)。介紹中的鏈接。
首先,我們?yōu)橛?jì)時(shí)器創(chuàng)建變量(開(kāi)/關(guān)):
byte onhour1;
字節(jié)onmin1;
字節(jié)onsec1;
字節(jié)offhour1;
字節(jié)offmin1;
字節(jié)offsec1;
字節(jié)數(shù)據(jù)類(lèi)型(0到255無(wú)符號(hào))用于存儲(chǔ)值。一個(gè)字節(jié)可以很容易地存儲(chǔ)在eeprom(1個(gè)數(shù)據(jù)x地址)中,較大的數(shù)字將是59(分鐘或秒)。我們從最初的eeprom值0開(kāi)始,因?yàn)閑eprom被清除了。其中()是eeprom地址。
void setup 。..。..。
//-------- eePROM讀取值-------//
//------第一個(gè)定時(shí)器
onhour1 = EEPROM.read(0 );
onmin1 = EEPROM.read(1);
onsec1 = EEPROM.read(2);
offhour1 = EEPROM.read(3);
offmin1 = EEPROM.read(4);
offsec1 = EEPROM.read(5);
這些值可以更改和保存,稍后再進(jìn)行按鈕接口。
但是我們不能用字節(jié)進(jìn)行數(shù)學(xué)運(yùn)算(轉(zhuǎn)換為單個(gè)數(shù)字),因?yàn)槲覀兊妮^大數(shù)字將是235,959或int = 32,767(正數(shù))或無(wú)符號(hào)int = 65,535。所以,unsigned long將是。
我們創(chuàng)建另一個(gè)變量來(lái)將字節(jié)轉(zhuǎn)換為unsigned long。此外,使用的最終值:on_Time1和off_Time1
//------將第一個(gè)計(jì)時(shí)器轉(zhuǎn)換為單個(gè)數(shù)字
無(wú)符號(hào)長(zhǎng)整數(shù)on_Time1;
unsigned long on_hour1;
unsigned long on_min1;
unsigned long on_sec1;
unsigned long off_Time1;
unsigned long off_hour1;
unsigned long off_min1;
unsigned long off_sec1;
//-------將時(shí)鐘轉(zhuǎn)換為單個(gè)數(shù)字
unsigned long Time;
unsigned long Hour;
unsigned long Min;
unsigned long Sec;
轉(zhuǎn)換在void循環(huán)中執(zhí)行。對(duì)于當(dāng)前時(shí)間,我們從庫(kù)函數(shù)now(),hour,minute,second獲取rtc中的值,并將此值分配給Hour,Min和Sec。 “時(shí)間”是小時(shí)* 10000的總和的結(jié)果; Min * 100和Sec。
示例:15:45:34 =(15 * 10000 + 45 * 100 + 34)= 154,534
//------- ------轉(zhuǎn)換----------//
//---------將時(shí)鐘時(shí)間轉(zhuǎn)換為單個(gè)數(shù)字
Hour = now.hour();
Min = now.minute();
秒= now.second();
時(shí)間=(小時(shí)* 10000 +最小* 100 +秒* 1);
與開(kāi)/關(guān)設(shè)置相同。這里我們從開(kāi)頭(字節(jié))獲取值并按如下方式分配這些值:
//--------將firt定時(shí)器開(kāi)/關(guān)轉(zhuǎn)換為單個(gè)數(shù)字
on_hour1 = onhour1;
on_min1 = onmin1;
on_sec1 = onsec1;
on_Time1 =(on_hour1 * 10000 + on_min1 * 100 + on_sec1);
off_hour1 = offhour1;
off_min1 = offmin1;
off_sec1 = offsec1;
off_Time1 =(off_hour1 * 10000 + off_min1 * 100 + off_sec1 );
最終結(jié)果是我們將要工作的3個(gè)變量:Time,on_Time1和off_Time1
現(xiàn)在是繼電器功能。在這里,我們將“Time”與“on_Time1”和“off_Time1”進(jìn)行比較以打開(kāi)或關(guān)閉繼電器。我們有3個(gè)主要的“if”語(yǔ)句:
1)if(onhour1 == offhour1 && onmin1 == offmin1 && onsec1 == offsec1){
digitalWrite(Relay,LOW); }
此語(yǔ)句是啟用/禁用功能。我們使用字節(jié)值,因?yàn)檫@里我們不需要任何轉(zhuǎn)換。如果所有值都相同,則繼電器關(guān)閉。如果你改變,即使是一秒,計(jì)時(shí)器也會(huì)工作。
2)if(on_Time1
if(Time》 = on_Time1 && Time
digitalWrite(Relay,HIGH);
}
否則if(Time》 = off_Time1){
digitalWrite(Relay,LOW);
}
else {
digitalWrite(Relay,LOW);
}
}
3)if(on_Time1》 off_Time1){
if(Time》 = on_Time1 && Time 《= 235959 ){//開(kāi)始
digitalWrite(Relay,HIGH);
}
否則if(Time
digitalWrite (接力,HIGH);
}
否則if(Time》 = off_Time1 && Time
digitalWrite(Relay,LOW);這兩個(gè)函數(shù)涵蓋了兩種可能的設(shè)置:“開(kāi)啟時(shí)間”低于“關(guān)閉時(shí)間”和“開(kāi)啟時(shí)間”高于“關(guān)閉時(shí)間”。在每個(gè)設(shè)置中你可以找到3個(gè)以上的語(yǔ)句隨時(shí)控制繼電器。通過(guò)圖形演示可以很容易地理解功能。觀(guān)看圖片!
使用按鈕界面,我們可以更改值(開(kāi)/關(guān))并存儲(chǔ)新的值。這是存儲(chǔ)值的結(jié)構(gòu)。正如我所說(shuō),我們將字節(jié)值存儲(chǔ)在一個(gè)地址上。其中:
(地址,字節(jié)值)
EEPROM.write(0,onhour1);
EEPROM.write(1,onmin1);
EEPROM.write(2,onsec1);
EEPROM.write(3,offhour1);
EEPROM.write(4,offmin1);
EEPROM。 write(5,offsec1);
步驟3:1日常計(jì)時(shí)器




此計(jì)時(shí)器是下一個(gè)計(jì)時(shí)器的基礎(chǔ)。按照原理圖安裝電路,記住RTC和LCD共用相同的引腳(模擬4 SDA;模擬5 SCL)。
上傳代碼,記得添加庫(kù)RTClib和LiquidCrystal_I2C。
您有3個(gè)按鈕可以使用向上/向下按鈕移動(dòng)3個(gè)主頁(yè)面,然后選擇按鈕進(jìn)入和移動(dòng)子菜單。
第一頁(yè)顯示消息和當(dāng)前時(shí)間。
第二頁(yè)是開(kāi)/關(guān)界面,在這里您可以更改設(shè)定值。按選擇按鈕進(jìn)入子菜單,箭頭將放在每個(gè)項(xiàng)目的前面,按向上或向下按鈕設(shè)置開(kāi)啟小時(shí),分鐘,秒和關(guān)閉小時(shí),分鐘,秒。按下選擇按鈕移動(dòng)beetwen項(xiàng)目(僅限前進(jìn))最后一項(xiàng)是“后退”字符,如果按下,它將退出子菜單,現(xiàn)在您可以移動(dòng)主頁(yè)面。如果按下,箭頭將放在第一個(gè)項(xiàng)目的前面。
第三頁(yè)是保存設(shè)置。只需按下選擇按鈕,您的所有數(shù)據(jù)都將存儲(chǔ)在eeprom上。消息“已保存!”將顯示并自動(dòng)重定向到主頁(yè)面。
此計(jì)時(shí)器每天都會(huì)工作,如果出現(xiàn)電源故障或斷開(kāi)連接,將從eeprom恢復(fù)數(shù)據(jù)再次啟動(dòng)。
通過(guò)繼電器,您可以控制設(shè)備。繼電器通過(guò)高信號(hào)(5V)激活。
警告!小心繼電器的最大負(fù)載!
步驟4:1定時(shí)器,可選日




此計(jì)時(shí)器適用于那些想要控制定時(shí)器激活日期的人。為此,我們將使用RTC的函數(shù)“now.dayOfTheWeek()”,它的值可以是1到7;周一至周日。要為每個(gè)數(shù)字指定星期幾,我們使用此(全局變量):
char daysOfTheWeek [7] [12] = {“Sunday”,“Monday”,“Tuesday”,“Wednesday” “,”星期四“,”星期五“,”星期六“};
要在液晶顯示屏(主頁(yè))上顯示:
lcd.print(daysOfTheWeek [now.dayOfTheWeek( )]);
我們需要新的變量來(lái)知道這一天是否被激活/禁用。所以:
//------星期幾
布爾值Sun1;
布爾值Mon1;
布爾值Tue1;
布爾值Wed1;
布爾值Thu1;
布爾值Fri1;
布爾值Sat1;
我們使用布爾值(1或0)作為其他變量,我們從eeprom.Boolean中取值可以存儲(chǔ)在1個(gè)地址中。最后使用的地址是5(offsec1),所以我們繼續(xù):
void setup 。..。.
Sun1 = EEPROM.read(6);
Mon1 = EEPROM.read(7);
Tue1 = EEPROM.read(8);
Wed1 = EEPROM.read(9);
Thu1 = EEPROM.read(10);
Fri1 = EEPROM.read(11);
Sat1 = EEPROM.read(12);
請(qǐng)記住,您的第一個(gè)值為0(eeprom clear)。因此0表示禁用,1表示啟用日。
為了控制繼電器,我們需要檢查當(dāng)天并檢查當(dāng)天是否啟用/禁用計(jì)時(shí)器。
使用另一個(gè)開(kāi)關(guān)函數(shù),其中每個(gè)“case”將是“now.dayOfTheWeek()”的值(1到7)
//----每天的中繼函數(shù)--- -//
switch(now.dayOfTheWeek()){//now.dayOfTheWeek值1到7,星期一到星期日
案例1://如果星期一
如果(Mon1 == 1){
First_Timer();
}
else {
digitalWrite(Relay1,LOW);
}
打破;
案例2://如果星期二
if(Tue1 == 1){
First_Timer();
}
else {
digitalWrite(Relay1,LOW);
}休息;
案例3:。..。..。依此類(lèi)推。..。..
例如:如果今天是星期一(now.dayOfTheWeek()= 1),我們進(jìn)入第一個(gè)案例。如果布爾值Mon1 == 1(啟用日期),我們調(diào)用自定義函數(shù)“First_Timer()”,與前一個(gè)計(jì)時(shí)器相同的中繼函數(shù),現(xiàn)在作為自定義函數(shù)工作,所以我們不需要寫(xiě)它每個(gè)案例。如果我們輸入0,則繼電器功能將為低電平(禁用一天)。所以我們每天使用一個(gè)案例并跳過(guò)其他案例。
現(xiàn)在我們需要在界面上添加另一個(gè)屏幕來(lái)更改設(shè)置。
主頁(yè)面顯示當(dāng)前日期和時(shí)間。
開(kāi)/關(guān)設(shè)置的第二頁(yè)。
這里我們介紹新頁(yè)面,您可以選擇激活繼電器的日期,其工作方式與其他工作方式相同:箭頭表示該項(xiàng)目,如果按下向上按鈕,則會(huì)在當(dāng)天放置1并啟用。如果按下,您將輸入0并且該日期將被禁用。
第四頁(yè)保存設(shè)置,開(kāi)/關(guān)時(shí)間和日期啟用/禁用。要保存的結(jié)構(gòu):
EEPROM.write(0,onhour1);
EEPROM.write(1,onmin1);
EEPROM.write(2,onsec1);
EEPROM.write(3,offhour1);
EEPROM.write(4,offmin1);
EEPROM.write(5,offsec1);
EEPROM.write(6,Sun1);
EEPROM.write(7,Mon1);
EEPROM.write(8,Tue1);
EEPROM.write(9,Wed1);
EEPROM.write(10,Thu1);
EEPROM.write(11,F(xiàn)ri1);
EEPROM.write(12,Sat1);
步驟5:4個(gè)定時(shí)器1每天接力






來(lái)自用戶(hù)的另一個(gè)請(qǐng)求。此計(jì)時(shí)器能夠通過(guò)單個(gè)輸出在一天內(nèi)控制4個(gè)事件。沒(méi)什么可說(shuō)的,因?yàn)槲覀冎粸槎〞r(shí)器2,3和4添加更多變量,也是移動(dòng)設(shè)置的界面。我們繼續(xù)從上次使用的地址讀取和寫(xiě)入。
注意:小心不要與定時(shí)器重疊,因?yàn)樗鼈冎械娜魏我粋€(gè)都可以打開(kāi)或關(guān)閉繼電器。
所以,這里有3個(gè)定時(shí)器,界面很好。對(duì)于“簡(jiǎn)單”版本,您只需要更改“///////////“中的值。默認(rèn)值為0。
開(kāi)/關(guān)1,2,3,4 = 0-23
on/offmin1,2,3,4 = 0-59
on/offsec1,2,3,4 = 0-59
Day啟用/禁用= 1表示啟用0表示禁用。
“簡(jiǎn)單”計(jì)時(shí)器不需要eeprom保存,因?yàn)槟呀?jīng)存儲(chǔ)了值。如果你想研究定時(shí)器的代碼,這也很有用。
正如你所看到的,可以按照邏輯添加更多的定時(shí)器,你可以使用“可選日”功能。
-
Arduino
+關(guān)注
關(guān)注
190文章
6526瀏覽量
197092
發(fā)布評(píng)論請(qǐng)先 登錄
Linux內(nèi)核的“心跳”:jiffies如何為系統(tǒng)計(jì)時(shí)?
精準(zhǔn)計(jì)時(shí)與低功耗的完美融合
“喂狗”的藝術(shù):看門(mén)狗不叫,才是系統(tǒng)好
TE Connectivity RAST 2.5標(biāo)準(zhǔn)計(jì)時(shí)器壓接連接器:家用電器連接的可靠解決方案
耐電痕化指數(shù)測(cè)定儀:滴液計(jì)時(shí)器設(shè)置與終點(diǎn)判據(jù)的深度解讀
MIC1551/53 IttyBitty RC定時(shí)器/振蕩器技術(shù)解析與應(yīng)用指南
TPS36-Q1汽車(chē)級(jí)超低功耗精密監(jiān)控器技術(shù)解析
TPS36-Q1超低功耗精密監(jiān)控器技術(shù)解析
零知開(kāi)源——基于STM32F407VET6零知增強(qiáng)板的四路獨(dú)立計(jì)時(shí)器
零知開(kāi)源——基于STM32F407VET6零知增強(qiáng)板的四路獨(dú)立計(jì)時(shí)器
基于STM32F407VET6零知增強(qiáng)板的四路獨(dú)立計(jì)時(shí)器
納祥科技客戶(hù)案例 | 集計(jì)時(shí)、照明、裝飾于一體的電子沙漏計(jì)時(shí)器方案
基于瑞薩RX13T系列微控制器的工業(yè)直流無(wú)刷風(fēng)機(jī)解決方案
ArduinoUltraMega計(jì)時(shí)器的制作
評(píng)論