2023年12月10日 星期日

浪浪餵食器 優化版

 多配置了 LCD螢幕

方便了解目前時鐘模組情況

以及上次餵食的紀錄時間

/*
 浪浪自動餵食器
 固定每日 0600 1200 1800 透過SG90 開啟飼料口N秒後關閉
*/
#include <Servo.h>
#include <RtcDS1302.h>
#include <LiquidCrystal_PCF8574.h>

//建立馬達對象 feederServo
Servo feederServo;
//連接DS1302模組的3線(IO,SCLK,CE) , 引腳配置 4,5,2
ThreeWire myWire(4,5,2);
//使用模ThreeWire配置建立 RtcDS1302 物件
RtcDS1302<ThreeWire> Rtc(myWire);

//設定I2C位址 配置在 A4 A5 接地 5V
LiquidCrystal_PCF8574 lcd(0x27);  //一般記憶體位址都在0x27 如果失敗就改成0x3F

//伺服馬達的連接在~9 WPM引腳
const int servoPin = 9;
const int openDuration = 5000; //設定每次開啟時間為5秒鐘
char dateTimeString[20]; //定義字串緩衝區, 用來容納日期時間
char eatTime[10]="Null";
void setup() {
  //Serial.begin(9600); // 初始化串行通信, 用於輸出調適信息
  feederServo.attach(servoPin); //將伺服馬達連接到指定的PWM
  feederServo.write(0); // 確認馬達角度初始在0度
  Rtc.Begin(); //初始化DS1302 模組
 
  pinMode(LED_BUILTIN,OUTPUT); //關閉燈
  digitalWrite(LED_BUILTIN,0);

  lcd.begin(20,2); //初始化LED面板寬20, 兩行

  lcd.setBacklight(1); //設定背板亮度 最大255
  lcd.clear();//清除顯示器內容
 
}

void loop() {

  RtcDateTime now = Rtc.GetDateTime(); //獲取當前的日期和時間
  //使用sprintf()函數將RtcDateTime型態轉換成字串
  sprintf(dateTimeString,"%02d/%02d %02d:%02d",now.Month(),now.Day(),now.Hour(),now.Minute());
  lcd.clear();//清除顯示器內容
  lcd.setCursor(0,0);//設定游標位置 (字,行)
  lcd.print("Now:");
  lcd.print(dateTimeString);
  lcd.setCursor(0,1);//設定游標位置
  lcd.print("Ate:");
  lcd.print(eatTime);  
 
  lcd.print("STP:6H");

 
  delay(60000);


  //觸發條件 6點、12點、18點
  if ((now.Hour()==6 && now.Minute()<3)||(now.Hour()==12 && now.Minute()<3)||(now.Hour()==18 && now.Minute()<3)){
    feed();
    sprintf(eatTime,"%02d:%02d",now.Hour(),now.Minute());
   
    delay(60000); //測試時等待1分鐘

  }

}


void feed(){
  //Serial.println("Feeding..."); //輸出餵食開始的調適信息

  feederServo.write(180);  //打開飼料開口
  delay(openDuration);

  feederServo.write(0);  //關閉飼料開口
  delay(1000); //等待1秒
  //Serial.println("Feeding complete.");   //輸出餵食完成
}

標籤:

0 個意見:

張貼留言

訂閱 張貼留言 [Atom]

<< 首頁