เครื่องป้อนสัตว์เลี้ยงอัตโนมัติโดยใช้ Arduino
ในวงจรนี้เราใช้จอ LCD 16 * 2เพื่อแสดงเวลาโดยใช้โมดูล DS3231 RTC กับ Arduino UNO นอกจากนี้เซอร์โวมอเตอร์ยังใช้เพื่อหมุนภาชนะเพื่อให้อาหารและแป้นพิมพ์เมทริกซ์ขนาด 4 * 4 เพื่อตั้งเวลาสำหรับให้อาหารสัตว์เลี้ยงด้วยตนเอง คุณสามารถกำหนดมุมหมุนและระยะเวลาเปิดภาชนะได้ตามปริมาณอาหารที่คุณต้องการให้บริการแก่สัตว์เลี้ยงของคุณ ปริมาณอาหารอาจขึ้นอยู่กับสัตว์เลี้ยงของคุณไม่ว่าจะเป็นสุนัขแมวหรือนกก็ตาม
จำเป็นต้องใช้วัสดุ
แผนภูมิวงจรรวม
ในArduino Cat Feederสำหรับการเดินทางและเวลาเราได้ใช้โมดูล RTC (Real Time Clock) เราได้ใช้แป้นพิมพ์ Matrix 4 * 4 เพื่อตั้งเวลาการกินสัตว์เลี้ยงด้วยตนเองด้วยความช่วยเหลือของจอ LCD 16x2 มอเตอร์เซอร์โวหมุนภาชนะและวางอาหารตามเวลาที่กำหนดโดยผู้ใช้ จอ LCD ใช้แสดงวันที่และเวลา การทำงานที่สมบูรณ์สามารถพบได้ในวิดีโอที่ให้ไว้ตอนท้าย
เครื่องป้อนสัตว์เลี้ยงแบบ 3 มิติ
เราได้ออกแบบภาชนะArduino Pet Feeder นี้โดยใช้เครื่องพิมพ์ 3D นอกจากนี้คุณยังสามารถพิมพ์การออกแบบเดียวกันโดยการดาวน์โหลดไฟล์จากที่นี่ วัสดุที่ใช้ในการพิมพ์แบบนี้คือ PLA มันมีสี่ส่วนดังแสดงในภาพด้านล่าง:
|
ประกอบชิ้นส่วนทั้งสี่ส่วนและเชื่อมต่อเซอร์โวมอเตอร์ดังแสดงในภาพด้านล่าง:
ถ้าคุณยังใหม่กับการพิมพ์ 3 มิติที่นี่เป็นคู่มือเริ่มต้น คุณสามารถดาวน์โหลดไฟล์ STL สำหรับป้อนสัตว์เลี้ยงที่นี่
โมดูล RTC DS3231
DS3231 เป็นโมดูล RTC (Real Time Clock) ใช้เพื่อรักษาวันที่และเวลาสำหรับโครงการอิเล็กทรอนิกส์ส่วนใหญ่ โมดูลนี้มีแหล่งจ่ายไฟเซลล์เหรียญของตัวเองโดยใช้วันที่และเวลาแม้ว่าจะถอดกระแสไฟหลักหรือ MCU ได้ผ่านการตั้งค่าใหม่แล้วก็ตาม ดังนั้นเมื่อเราตั้งวันที่และเวลาในโมดูลนี้จะติดตามได้เสมอ ในวงจรของเราเราใช้ DS3231 เพื่อเลี้ยงสัตว์เลี้ยงตามระยะเวลาที่กำหนดโดยเจ้าของสัตว์เลี้ยงเช่นการเตือนภัย เมื่อนาฬิกาถึงเวลาที่กำหนดเครื่องจะทำงานมอเตอร์เซอร์โวเพื่อเปิดประตูตู้เก็บอาหารและวางอาหารลงในชามอาหารของสัตว์เลี้ยง
หมายเหตุ:เมื่อใช้โมดูลนี้เป็นครั้งแรกคุณต้องตั้งวันที่และเวลา นอกจากนี้คุณยังสามารถใช้ RTC IC DS1307 สำหรับการอ่านเวลากับ Arduino
รหัสและคำอธิบาย
รหัส Arduino Codeของผู้เลี้ยงสัตว์เลี้ยงอัตโนมัติจะได้รับเมื่อสิ้นสุด
Arduino มีไลบรารีดีฟอลต์สำหรับใช้ Servo motor และ LCD 16 * 2 พร้อมด้วย แต่สำหรับการใช้ DS3231 RTC Module และ 4 * 4 Matrix Keypad กับ Arduino คุณต้องดาวน์โหลดและติดตั้งไลบรารี ลิงก์ดาวน์โหลดสำหรับทั้งห้องสมุดจะได้รับด้านล่าง:
ในโค้ดด้านล่างเรากำหนดไลบรารี"#include <DS3231.h>"สำหรับโมดูล RTC "#include <Servo.h>"สำหรับเซอร์โวมอเตอร์"#include <LiquidCrystal.h>"สำหรับจอ LCD 16 * 2 และ"#include <Keypad.h>"สำหรับแป้นพิมพ์ Matrix 4 * 4
#include <DS3231.h> #include <Servo.h> #include <LiquidCrystal.h> #include <Keypad.h>
ในโค้ดด้านล่างเรากำลังกำหนดแป้นพิมพ์สำหรับแป้นพิมพ์เมตริก 4 * 4 และกำหนดหมุด Arduino สำหรับแถวและคอลัมน์ของแป้นพิมพ์
คีย์ char [ROWS] [COLS] = { { '1', '2', '3', 'A'} { '4', '5', '6', 'B'} { '7', '8', '9', 'C'} { '*', '0', '#', 'D'} }; ไบต์ rowPins [ROWS] = {2, 3, 4, 5}; ไบต์ colPins [COLS] = {6, 7, 8, 9};
ที่นี่เรากำลังสร้างแป้นพิมพ์โดยใช้คำสั่งด้านล่างในโค้ด
แป้นพิมพ์ kpd = ปุ่มกด (คีย์ (คีย์), rowPins, colPins, ROWS, COLS);
การกำหนดหมุด A4 และ A5 Arduino เพื่อเชื่อมต่อกับหมุด SCL และ SDA ของ DS3231 นอกจากนี้การกำหนดหมุดให้กับ LCD และเริ่มต้นใช้งานมอเตอร์เซอร์โว
DS3231 rtc (A4, A5); servo servo_test; / / การเริ่มต้นเซอร์โววัตถุสำหรับเซอร์โวที่เชื่อมต่อ LiquidCrystal lcd (A0, A1, A2, 11, 12, 13); // สร้างวัตถุ LC พารามิเตอร์: (rs, enable, d4, d5, d6, d7)
ในโค้ดด้านล่างเราจะประกาศ t1 ถึง t6 คีย์และอาร์เรย์ r [6] และฟีด
int t1, t2, t3, t4, t5, t6; boolean feed = true; คีย์ char; int r [6];
ในโค้ดด้านล่างเราจะตั้งค่าส่วนประกอบทั้งหมดสำหรับเริ่มต้น เช่นเดียวกับในรหัสนี้“servo_test.attach (10);” Servo ถูกแนบไปกับ 10 THขาของ Arduino กำหนด A0, A1 และ A2 เป็นขาออกและเริ่มต้นโมดูล LCD และ RTC
การตั้งค่าเป็นโมฆะ () { servo_test.attach (10); / / แนบขาสัญญาณของ servo เพื่อ pin9 ของ arduino rtc.begin (); lcd.begin (16,2); servo_test.write (55); Serial.begin (9600); pinMode (A0, เอาท์พุท); pinMode (A1, OUTPUT); pinMode (A2, เอาท์พุท); }
ตอนนี้ลูปทำงานเป็นส่วนสำคัญที่จะเข้าใจได้อย่างไร เมื่อใดก็ตามที่ปุ่มกดถูกกดก็จะหมายถึงสูง 1 ซึ่งสามารถอ่านได้โดย“buttonPress = digitalRead (A3)” ตอนนี้มันไปภายใน 'ถ้า' คำสั่งและ calles 'setFeedingTime'ฟังก์ชัน จากนั้นจะเปรียบเทียบเวลาจริงและเวลาที่ป้อนโดยผู้ใช้ ถ้าเงื่อนไขเป็นจริงซึ่งหมายถึงเวลาจริงและเวลาที่ป้อนเหมือนกันเซอร์โวมอเตอร์จะหมุนไปที่มุม 100 องศาและหลังจากนั้น 0.4 วินาทีจะเลื่อนกลับไปยังตำแหน่งเริ่มต้น
void loop () { lcd.setCursor (0,0); int ปุ่มกด; buttonPress = digitalRead (A3); ถ้า (buttonPress == 1) setFeedingTime (); lcd.print ("Time:"); สตริง t = ""; t = rtc.getTimeStr (); t1 = t.charAt (0) -48; t2 = t.charAt (1) -48; t3 = t.charAt (3) -48; t4 = t.charAt (4) -48; t5 = t.charAt (6) -48; t6 = t.charAt (7) -48; lcd.print (rtc.getTimeStr ()); lcd.setCursor (0,1); lcd.print ("วันที่:"); lcd.print (rtc.getDateStr ()); if (t1 == r [0] && t2 == r [1] && t3 == r [2] && t4 == r [3] && t5 <1 && t6 <3 && feed == true) { servo_test.write (100); / / เพื่อหมุนเซอร์โวไปยังมุมที่ระบุ ล่าช้า (400); servo_test.write (55); ฟีด = false; } }
ในsetFeedingTime ()รหัสฟังก์ชันหลังจากกดปุ่มเราสามารถป้อนเวลาให้อาหารสัตว์เลี้ยงแล้วเราจะต้องกด 'D' เพื่อประหยัดเวลาที่เมื่อเวลาที่บันทึกไว้ตรงกับเวลาจริง servo จะเริ่มหมุน
void setFeedingTime () { feed = true; int i = 0; lcd.clear (); lcd.setCursor (0,0); lcd.print ("ตั้งเวลาให้อาหาร"); lcd.clear (); lcd.print ( "HH: MM"); lcd.setCursor (0,1); ในขณะที่ (1) { key = kpd.getKey (); char j; ถ้า (คีย์! = NO_KEY) { lcd.setCursor (ญ, 1); lcd.print (คีย์); r [i] = คีย์ -48; i ++; J ++; ถ้า (j == 2) { lcd.print ( ":"); J ++; } ล่าช้า (500); } if (key == 'D') {= สำคัญ 0; ทำลาย; } } }
การทำงานของเครื่องป้อนสัตว์เลี้ยงอัตโนมัติ
หลังจากอัปโหลดรหัสไปที่ Arduino Uno วันที่และเวลาจะปรากฏบนจอ LCD 16 * 2 เมื่อคุณกดปุ่มกดจะถามเวลาให้อาหารสัตว์เลี้ยงและคุณต้องป้อนเวลาโดยใช้แป้นพิมพ์เมทริกซ์ 4 * 4 จอแสดงผลจะแสดงเวลาที่ป้อนและเมื่อคุณกด 'D' จะเป็นการประหยัดเวลา เมื่อเวลาจริงและเวลาที่ป้อนเข้าตรงจะหมุนเซอร์โวมอเตอร์จากตำแหน่งเริ่มต้น55⁰ถึง100⁰และหลังจากที่หน่วงเวลากลับสู่ตำแหน่งเริ่มต้นอีกครั้ง ดังนั้นมอเตอร์เซอร์โวจะเชื่อมต่อกับประตูตู้อาหารดังนั้นในขณะที่ประตูเคลื่อนที่ประตูจะเปิดขึ้นและอาหารบางส่วนตกลงไปในชามหรือจาน หลังจากล่าช้า 0.4 วินาทีมอเตอร์ Servo หมุนอีกครั้งและปิดประตู ขั้นตอนทั้งหมดเสร็จสิ้นภายในไม่กี่วินาที นี่เป็นวิธีที่สัตว์เลี้ยงของคุณได้รับอาหารโดยอัตโนมัติในเวลาที่คุณป้อน
เปลี่ยนเวลาและองศาตามอาหาร
รหัส
#include <DS3231.h>
#include <Servo.h>
#include <LiquidCrystal.h>
#include <Keypad.h>
#include <Servo.h>
#include <LiquidCrystal.h>
#include <Keypad.h>
const byte ROWS = 4; // สี่แถว
const byte COLS = 4; // สามคอลัมน์
const byte COLS = 4; // สามคอลัมน์
// กำหนด Keymap
คีย์ char [ROWS] [COLS] = {
{ '1', '2', '3', 'A'}
{ '4', '5', '6', 'B'}
{ '7', '8', '9', 'C'}
{ '*', '0', '#', 'D'}
};
// เชื่อมต่อแป้นพิมพ์ ROW0, ROW1, ROW2 และ ROW3 กับหมุด Arduino เหล่านี้
ไบต์ rowPins [ROWS] = {2, 3, 4, 5};
// เชื่อมต่อแป้นพิมพ์ COL0, COL1 และ COL2 กับหมุด Arduino เหล่านี้
ไบต์ colPins [COLS] = {6, 7, 8, 9};
// สร้างคีย์แพดคีย์
แพ็ด kpd = คีย์แพ็ด (makeKeymap (คีย์), rowPins, colPins, ROWS, COLS);
แพ็ด kpd = คีย์แพ็ด (makeKeymap (คีย์), rowPins, colPins, ROWS, COLS);
DS3231 rtc (A4, A5);
servo servo_test; // เริ่มต้นเซอร์โวเซอร์สำหรับเซอร์โว
LiquidCrystal lcd (A0, A1, A2, 11, 12, 13); // สร้างวัตถุ LC พารามิเตอร์: (rs, enable, d4, d5, d6, d7)
servo servo_test; // เริ่มต้นเซอร์โวเซอร์สำหรับเซอร์โว
LiquidCrystal lcd (A0, A1, A2, 11, 12, 13); // สร้างวัตถุ LC พารามิเตอร์: (rs, enable, d4, d5, d6, d7)
// int angle = 0;
/ / int potentio = A0; / / การเริ่มต้นขา A0analog สำหรับ Potentiometer
int t1, t2, t3, t4, t5, t6;
/ / int potentio = A0; / / การเริ่มต้นขา A0analog สำหรับ Potentiometer
int t1, t2, t3, t4, t5, t6;
boolean feed = true; // เงื่อนไขการแจ้งเตือน
คีย์ char;
int r [6];
การตั้งค่าเป็นโมฆะ ()
{
servo_test.attach (10); / / แนบขาสัญญาณของ servo เพื่อ pin9 ของ arduino
rtc.begin ();
lcd.begin (16,2);
servo_test.write (55);
Serial.begin (9600);
pinMode (A0, เอาท์พุท);
pinMode (A1, OUTPUT);
pinMode (A2, เอาท์พุท);
}
void loop ()
{
int r [6];
การตั้งค่าเป็นโมฆะ ()
{
servo_test.attach (10); / / แนบขาสัญญาณของ servo เพื่อ pin9 ของ arduino
rtc.begin ();
lcd.begin (16,2);
servo_test.write (55);
Serial.begin (9600);
pinMode (A0, เอาท์พุท);
pinMode (A1, OUTPUT);
pinMode (A2, เอาท์พุท);
}
void loop ()
{
lcd.setCursor (0,0);
int ปุ่มกด;
buttonPress = digitalRead (A3);
int ปุ่มกด;
buttonPress = digitalRead (A3);
ถ้า (buttonPress == 1)
setFeedingTime ();
setFeedingTime ();
//Serial.println(buttonPress);
lcd.print ("Time:");
สตริง t = "";
t = rtc.getTimeStr ();
t1 = t.charAt (0) -48;
t2 = t.charAt (1) -48;
t3 = t.charAt (3) -48;
t4 = t.charAt (4) -48;
t5 = t.charAt (6) -48;
t6 = t.charAt (7) -48;
lcd.print (rtc.getTimeStr ());
lcd.setCursor (0,1);
lcd.print ("วันที่:");
lcd.print (rtc.getDateStr ());
if (t1 == r [0] && t2 == r [1] && t3 == r [2] && t4 == r [3] && t5 <1 && t6 <3 && feed == true)
{
servo_test. เขียน (100); / / คำสั่งเพื่อหมุนเซอร์โวไป
ล่าช้ามุมที่กำหนด (400);
servo_test.write (55);
ฟีด = false;
}
}
สตริง t = "";
t = rtc.getTimeStr ();
t1 = t.charAt (0) -48;
t2 = t.charAt (1) -48;
t3 = t.charAt (3) -48;
t4 = t.charAt (4) -48;
t5 = t.charAt (6) -48;
t6 = t.charAt (7) -48;
lcd.print (rtc.getTimeStr ());
lcd.setCursor (0,1);
lcd.print ("วันที่:");
lcd.print (rtc.getDateStr ());
if (t1 == r [0] && t2 == r [1] && t3 == r [2] && t4 == r [3] && t5 <1 && t6 <3 && feed == true)
{
servo_test. เขียน (100); / / คำสั่งเพื่อหมุนเซอร์โวไป
ล่าช้ามุมที่กำหนด (400);
servo_test.write (55);
ฟีด = false;
}
}
void setFeedingTime ()
{
feed = true;
int i = 0;
{
feed = true;
int i = 0;
lcd.clear ();
lcd.setCursor (0,0);
lcd.print ("ตั้งเวลาให้อาหาร");
lcd.clear ();
lcd.print ( "HH: MM");
lcd.setCursor (0,1);
lcd.setCursor (0,0);
lcd.print ("ตั้งเวลาให้อาหาร");
lcd.clear ();
lcd.print ( "HH: MM");
lcd.setCursor (0,1);
while (1) {
key = kpd.getKey ();
char j;
if (key! = NO_KEY) {
lcd.setCursor (j, 1);
lcd.print (คีย์);
r [i] = คีย์ -48;
i ++;
J ++;
if (key! = NO_KEY) {
lcd.setCursor (j, 1);
lcd.print (คีย์);
r [i] = คีย์ -48;
i ++;
J ++;
if (j == 2)
{
lcd.print (":"); J ++;
}
ล่าช้า (500);
}
{
lcd.print (":"); J ++;
}
ล่าช้า (500);
}
if (key == 'D')
{key = 0; ทำลาย; }
}
}
{key = 0; ทำลาย; }
}
}
วีดีโอ
ไม่มีความคิดเห็น:
แสดงความคิดเห็น