Manufaktur industri
Industri Internet of Things | bahan industri | Pemeliharaan dan Perbaikan Peralatan | Pemrograman industri |
home  MfgRobots >> Manufaktur industri >  >> Manufacturing Technology >> Proses manufaktur

Pengumpan Hewan Peliharaan yang Mudah Dibuat

Komponen dan persediaan

Arduino Nano R3
Sebaiknya gunakan Arduino Nano jika Anda ingin menggunakan housing yang ringkas
× 1
Jam Waktu Nyata Adafruit
× 1
Servo Rotasi Berkelanjutan
× 1
Dispenser sereal
× 1
Sensor hall UNIPOLAR
× 1
Magnet Batang dismeter 3mm, panjang 5mm
× 6
Adafruit RGB Backlight LCD - 16x2
× 1
ransel lcd i2c
× 1
Apem Push button sesaat IP67
× 1
Tekan tombol kecil sesaat
× 1
LED (generik)
× 6
Rumah Hammond Multi ABS dengan flensa
× 1

Aplikasi dan layanan online

Pembuat karakter LCD

Tentang proyek ini

Pembaruan 2018-09-06

Dua pengumpan hewan peliharaan saya bekerja dengan sempurna selama 7 bulan terakhir. Kami merawat hewan peliharaan kami di siang hari, tentu saja, tetapi mereka sekarang mendapatkan makanan mereka secara teratur. Sangat senang dengan sistemnya!

Mengapa ada Pengumpan Hewan Peliharaan?

Versi pengumpan hewan peliharaan saya didasarkan pada mikrokontroler Arduino. Bahan yang digunakan relatif murah dan menurut saya mudah dibuat!

Tentu saja ada banyak versi tetapi saya tidak dapat menemukan proyek yang lengkap, siap untuk membangun dengan fitur yang saya butuhkan jadi saya mulai dari awal.

Ini dia fitur-fiturnya:

  • *Porsi akurat* dikirimkan setiap saat! (dengan menggunakan sensor Hall)
  • Dua kali makan sehari
  • *Sangat* Jam Waktu Nyata yang akurat (Hanya dengan chip DS3231 asli)
  • Anda dapat membatalkan pemberian makan yang akan datang satu per satu untuk kedua timer dengan tampilan dan indikator Led. Pembatalan diatur ulang secara otomatis setelah waktu yang ditentukan berlalu.
  • Fungsi umpan manual (satu porsi per penekanan tombol)
  • Porsi yang dapat disesuaikan untuk masing-masing dari dua waktu makan (1-9 porsi)
  • Ikhtisar semua parameter yang disetel di layar utama
  • Sistem menu yang mudah dinavigasi
  • Indikasi LED jika pemberian makan berhasil
  • Pengatur waktu lampu latar LCD (mati setelah 30 detik, hidup dengan menekan tombol apa saja)
  • Waktu dan pengaturan lainnya disimpan dengan aman di memori (EEPROM)

VIDEO Demonstrasi:

untuk video klik DI SINI

video penjelasan lebih detail:klik DI SINI

Pengumpan Hewan Peliharaan dalam aksi slow-mo! klik DI SINI

Foto:

Bagian yang dibutuhkan:

  • 1x Dispenser sereal (murah di Ebay)
  • beberapa kayu (sisa) untuk membuat dudukan dispenser sereal
  • 1x Arduino Uno
  • 1x I2C DS3231 (sangat akurat) atau DS1307 Jam Waktu Nyata
  • 1x layar LCD 16 karakter / 2 baris
  • 1x ransel I2C untuk layar LCD
  • 1x Melanjutkan rotasi Servo (beli yang bagus!)
  • 1x Honeywell SS443R Sensor Hall Unipolar
  • 1x 12Volts/1 Amp catu daya eksternal (kutil dinding)
  • Tombol Tekan 7x - Sesaat
  • 6x LED (2x MERAH, 3x HIJAU, 1 KUNING)
  • 2x resistor 1KΩ (untuk led merah)
  • Resistor 4x 560Ω (untuk led hijau dan kuning)
  • 1x penutup untuk elektronik
  • steker listrik perempuan dan konektor untuk menghubungkan servo eksternal dan sensor hall
  • banyak dan banyak LEM PANAS.

Yang terbaik adalah menggunakan tegangan yang lebih tinggi untuk servo jika memungkinkan. Lebih banyak kekuatan! Servo HSR-2645CRH saya dapat mengambil 7,4 Volt jadi jika Anda juga ingin melakukan ini, Anda perlu:

  • Papan bagus
  • Pengatur tegangan variabel LM317T
  • 3 resistor untuk mengatur tegangan keluaran (1KΩ, 150kΩ, dan 4K7)
  • 2 kapasitor terpolarisasi (220µF, 10µF)
  • heat sink tidak diperlukan, servo akan berputar 1-2 detik saja setiap hari;)

Online Anda dapat menemukan banyak kalkulator LM317.

Wadah pakan hewan peliharaan

Yang termurah dan termudah untuk digunakan adalah dispenser sereal yang dapat Anda temukan di banyak toko dan di Ebay. Saya membeli dispenser sereal ganda di Ebay seharga 15 euro termasuk pengiriman (Inggris ke Belanda)

Tantangannya adalah membuat tunggangan untuk pengumpan dan melihat-lihat di internet tidak banyak membantu saya, jadi saya melihat-lihat di gudang saya dan menemukan beberapa potongan kayu Cedar yang indah.

Kayu yang menahan dispenser sereal plastik setebal 3 cm jadi tidak bergoyang! Anda harus memastikan lubangnya (dasar pengumpan saya 86mm) rapat jadi ukur sebelum mengebor! Lebih baik mengebor lubang yang lebih kecil dan membentuknya sedikit daripada lubang yang terlalu besar.

Lihat foto untuk mendapatkan ide mengapa dan bagaimana itu cocok.

Servo dan lampiran ke roda dayung dispenser

Pastikan untuk membeli servo yang bagus. Pertama saya membeli servo MG996R yang saya modifikasi untuk rotasi terus menerus tapi itu buang-buang uang... Kemudian saya mendapatkan yang berkualitas, dalam kasus saya Servo HSR-2645CRH

HARUS MENJADI model rotasi terus menerus!! Jangan mencoba untuk memodifikasi servo normal seperti yang saya lakukan. Performanya hampir tidak cukup baik dan saat berhenti, itu tidak langsung.

video uji coba servo:klik DI SINI

Koneksi Servo ke roda dayung dispenser

Jadi sekarang pertanyaannya:bagaimana menghubungkan servo ke roda dayung pengumpan? Awalnya tampak seperti bagian tersulit dari proyek ini, tetapi sebenarnya sangat sederhana.

Saya mengambil sepotong Polikarbonat 5mm dan dengan gergaji besi saya memotong cakram bundar sekitar 6 cm. Di tengah saya mengebor lubang 8 mm (ketebalan sumbu pengumpan. Sumbu plastik ini dapat dilepas dari roda dayung)

Di bagian luar saya mengebor 6 lubang 3 mm, ketebalan magnet. Ini digunakan untuk memberikan umpan balik kepada Arduino tentang posisi roda penjaja pengumpan.

Karena roda dayung memiliki 6 dayung karet, saya menggunakan 6 magnet dan membaginya di sekitar tepi cakram polikarbonat. 360 derajat dibagi 6 adalah 60 derajat. Magnet batang akan pas.

Sensor hall akan mendeteksi masing-masing dari 6 magnet sehingga kami dapat menggunakan informasi itu untuk memposisikan dan menghentikan roda dayung dengan tepat. Variabel waktu tunda berhenti servo digunakan untuk menambahkan penundaan setelah memberi makan, sebelum berhenti servonya. Jadi dengan penundaan ini Anda dapat mengubah posisi yang tepat dari roda dayung. Hal ini penting karena jika posisi 'stop' salah, umpan tidak akan keluar sepenuhnya dari roda dayung. Juga posisi sensor hall mungkin berbeda dalam kasus Anda. Mengubah waktu variabel penundaan penghentian servo akan menyelesaikan masalah ini.

Sekarang kita bisa merekatkan sumbu roda dayung ke dalam cakram polikarbonat.

Klakson servo bulat putih dibaut pada cakram polikarbonat dengan 3 baut M3. gunakan beberapa mur tambahan sebagai pengatur jarak dan jangan terlalu kencang!

Sekarang servo adalah bagian dari rakitan pengumpan sehingga kami dapat meletakkannya di dudukan kayu dan mengukur seberapa tinggi potongan kayu harus berada di bawah servo.

Sensor Aula

Sensor hall yang saya gunakan adalah tipe UNIPOLAR. Ini akan memberikan output RENDAH jika magnet dekat dan TIDAK perlu polaritas terbalik dari magnet untuk mengatur ulang output ke TINGGI lagi. Jadi gunakan sensor hall Unipolar, jauh lebih mudah.

!!! Sensor hall membutuhkan resistor pull-up 10KΩ.

Saya memasang resistor 0805 SMD tepat di atas sensor hall tetapi Anda dapat melakukannya dengan cara Anda. Jangan lupa resistor ini!

Kemudian saya mengambil pulpen bekas dan menggunakan plastik sebagai dudukan sensor.

Perumahan Elektronik

Saya menggunakan rumah Hammond ABS dengan flensa. 120 x 65 x 40 mm

untuk koneksi eksternal saya menggunakan konektor soket presisi perempuan, bukan yang cina murah. Saya sering menggunakan ini di semua proyek saya. Tidak ada yang lebih buruk daripada koneksi buruk yang menyebabkan kegagalan (sulit ditemukan).

Untuk membuat pemrograman Arduino lebih mudah, saya memiliki koneksi FTDI eksternal:

Panel depan

Saya mencoba banyak cara untuk membuat panel depan yang murah dan bagus...

Pertama saya menggunakan Mod Podge untuk merekatkan kertas laserprint di bagian depan casing dan menutupinya dengan lebih banyak Mod Podge. --> GAGAL

Kemudian saya mencoba pernis bening, berdasarkan dispersi poliuretan akrilat. Sangat awet dan kuat saat dikeringkan. Saya merekatkan kertas dengan sangat baik pada wadahnya dan memoles sisi atas cetakan panel depan terlihat sangat bagus TETAPI tidak akan menempel pada bagian toner printer laser dari cetakan. --> GAGAL

Setelah itu, saya mengambil print laser panel depan dan hanya melaminasi bagian atasnya dengan laminating pcv. hasil akhir yang sangat bagus, melindungi bagian depan dan mengangkat warna dengan indah. Kemudian lagi, saya merekatkan kertas laminasi di rumah dengan pernis. Ide saya adalah bahwa pernis akan menembus kertas sehingga tahan air. Tetapi karena saya menggunakan kertas tebal yang tidak berfungsi dan membuatnya basah untuk menguji ketahanan air, kertas menggulung dari housing. --> SEBAGIAN GAGAL, ​​untuk diselidiki lebih lanjut.

Upaya lain:Saya membeli aluminium foil khusus, dibuat untuk pencetakan laser. 2,25 euro per lembar. Hasilnya bagus tapi saya ingin melindungi toner dengan foil bening khusus. Itu tidak berhasil karena saya tidak bisa menghilangkan ketidaksempurnaan seperti yang terlihat pada foto 1:

Kemudian upaya lain untuk melindungi dengan pernis bening, Itu membuat alu foil sangat mengkilap! TAPI... sekali lagi, pernis tidak akan menempel pada toner jadi saya menyerah pada pernis secara permanen...

AKHIRNYA... Saya menggunakan cetakan foil tanpa pelindung... Ini akan menunjukkan sidik jari jika sering ditangani (lihat di bawah tombol KEMBALI foto di bagian atas halaman ini, perumahan di pakan ayam) jadi tidak ideal tapi masih bagus cukup bagi saya.

Lebih banyak foto tidak diperbolehkan, jadi...

Itu saja teman-teman... memiliki menyenangkan!

Kode

  • Pakan Hewan Peliharaan-O-Matic v 1.1 - 20-02-2018
Pet Feed-O-Matic v 1.1 - 20-02-2018Arduino
v 1.1:menekan tombol Cancel1 atau 2 akan menampilkan penjelasan
// c++ stuff...//#include //#line 1//#line 1"/Users/Erik/Documents/ PlatformIO/Projects/180202-151127-uno/src/Pet_Feeder_1_1_ENG.cpp"/* _ _ /\ | | (_) / \ _ __ __| |_ _ _ _ __ ___ / /\ \ | '__/ _` | | | | | '_ \ / _ \ / ____ \| | | (_| | |_| | | | | (_) | /_/ \_\_| \__,_|\__,_|_|_| |_|\___/ ___ _ ______ _ | __ \ | | | ____| | | | |__) |__| |_ | |__ ___ ___ __| | _ _ __ | _/ _ \ __| | __/ _ \/ _ \/ _` |/ _ \ '__| | | | __/ |_ | | | __/ __/ (_| | __/ | |_| \___|\__| |_| \___|\___|\__,_|\___|_| Erik de Ruiter -------- -------------------------------------------------- ------------------- Untuk melakukan:- makan jarak jauh? - penundaan pengumpan berhenti sebagai item yang dapat diedit menu perubahan terakhir:dinsdag 20 februari 2018 - 17:20:28 FITUR:- *Porsi yang akurat* setiap waktu! (dengan menggunakan sensor Hall) - Dua kali makan, sekali sehari - *Sangat* Jam Waktu Nyata yang akurat (Hanya dengan chip DS3231 asli) - Batalkan pemberian makan yang akan datang satu per satu untuk kedua pengatur waktu dengan tampilan dan indikator Led . Secara otomatis mengatur ulang setelah waktu berlalu. - Fungsi pengumpanan manual (satu porsi per penekanan tombol) - Porsi yang dapat disesuaikan untuk masing-masing dari dua waktu pengumpanan (1-9 porsi) - Tinjauan semua parameter yang ditetapkan di layar utama - Menu yang mudah dinavigasi sistem - Indikasi LED jika pengumpanan berhasil - Timer lampu latar LCD (mati setelah 30 detik, hidup dengan menekan tombol apa saja) - Cadangan jika sensor Hall gagal - LED sensor hass akan berkedip hingga tengah malam jika sensor Hall telah gagal - Waktu dan pengaturan lainnya disimpan dengan aman di SITUS WEB EEPROM:Situs web generator karakter LCD HD44780 untuk membuat simbol lcd Anda sendiri https://omerk.github.io/lcdchargen/ Arduino sketch Generator komentar huruf besar http://patorjk.com /software/taag/#p=display&c=c%2B%2B&f=Big&t=Comment Revisi:zondag 28 januari 2018 - 20:17:10 *//////////////// ////////////////////////////////////////////////////////////////// /////////////// VARIABEL YANG DAPAT DIUBAH PENGGUNA///////////////////////////////////////////////// ////////////////////////////////////////////////////////////////// digunakan untuk fungsi pencadangan gagal sensor Hall.// interval waktu harus agak lebih besar dari satu 60 derajat// putaran pengumpan (satu porsi)#define HALL_SENSOR_BACKUP_VALUE 300// penundaan sebelum menghentikan servo pengumpan setelah makan. Dengan cara ini Anda dapat // membiarkan roda penjaja yang berputar berhenti di posisi yang tepat#menentukan FEEDER_STOP_DELAY 100// lampu latar lcd tepat waktu setelah menekan tombol#menentukan LCD_BACKLIGHT_ON_TIME 30000// keluar dari menu tanpa menyimpan setelah batas waktu yang ditentukan di sini dalam ms#define MENU_TIMEOUT_VALUE 7000//////////////////////////////////////////////////////////////// //////////////////////////////// https://github.com/fdebrabander/Arduino-LiquidCrystal-I2C- library#include // https://github.com/JChristensen/Button#include // http:// github.com/JChristensen/DS3232RTC#include // http:// www.arduino.cc/playground/Code/Time#include // http:// arduino.cc/en/Reference/Wire (disertakan dengan Arduino IDE)#include  #include // CONNECTIONS://// LCD (modul I2C):// SCL - A5// SDA - A4// VCC// GND// interrupt hal sensor pin#define HALL_SENSOR_PIN 3#define BUTTON_BACK_PIN 4#menentukan BUTTON_UP_PIN 5#menentukan BUTTON_DOWN_PIN 6#menentukan BUTTON_SELECT_PIN 7#menentukan BUTTON_CANCEL1_PI N 8#define BUTTON_CANCEL2_PIN 9#define BUTTON_MANUAL_PIN 10#define LED_CANCEL1_PIN A0#define LED_CANCEL2_PIN A1#define LED_SUCCESS1_PIN A2#define LED_SUCCESS2_pin_output LED_PIN_PIN A3_PIN A1#define LED_SUCCESS1_PIN A2#define LED_SUCCESS2_pin_output LED_PIN_PIN A3/PIN_Sensor input SEN_PIN_PIN A3// (16x2) 0x27 atau 0x3FLiquidCrystal_I2C lcd(0x3F, 16, 2);// tentukan pengaturan pustaka tombol// Waktu debounce 20 milidetik biasanya berfungsi dengan baik// untuk sakelar tombol taktil.#define DEBOUNCE_MS diperlukan 20// md sebelum mengulangi pada tekan lama#define REPEAT_FIRST 1000// ulangi interval untuk tekan lama#define REPEAT_INCR 200// Untuk mempermudah, kami menggunakan resistor pullup internal Arduino.#define PULLUP true#define INVERT true// Deklarasikan tombolTombol tombolPilih (BUTTON_SELECT_PIN, PULLUP , INVERT, DEBOUNCE_MS);Tombol tombolAtas (BUTTON_UP_PIN, PULLUP, INVERT, DEBOUNCE_MS);Tombol tombolBawah (BUTTON_DOWN_PIN, PULLUP, INVERT, DEBOUNCE_MS);Tombol tombolKembali (BUTTON_BACK_PIN, PULLUP, INVERT, DEBOUNCE_MS); Tombol tombolBatal1 (BUTTON_CANCEL1_PIN, PULLUP, INVERT, DEBOUNCE_MS);Tombol tombolBatal2 (BUTTON_CANCEL2_PIN, PULLUP, INVERT, DEBOUNCE_MS);Tombol tombolManual (BUTTON_MANUAL_PIN, PULLUP, INVERT, INVERT, DEBOUNCE_MS);/Jumlah yang disesuaikan/Jumlah yang disesuaikan/ count (diinisialisasi untuk memastikan itu berbeda ketika// sketsa dimulai)int lastCount =-1;// Variabel waktu yang digunakan untuk mendorong pengulangan untuk penekanan lamaunsigned long rpt =REPEAT_FIRST;// digunakan untuk menu time-outunsigned long timeoutValue =0;// manual membatalkan variabel waktu makan boolean manualCancelFeed1 =false;boolean manualCancelFeed2 =false;// Opsi umpan manaual manual booleanFeed =false;// Jumlah umpan (dalam porsi)int feedAmount1 =1;int feedAmount2 =1;bool feederSuccess =false;// bagian pengumpanint bagian =0;int ternyata =0;// tindakan inputsenum {btnSELECT, btnUP, btnDOWN, btnBACK, btnCANCEL1, btnCANCEL2, btnMANUAL, trigTIMEOUT};// States of the Finite State Machine (FSM)enum STATES { UTAMA, MENU_EDIT _FEEDTIME1, MENU_EDIT_FEEDTIME2, MENU_EDIT_FEEDAMOUNT, MENU_EDIT_TIME, MENU_EDIT_DATE, MENU_EDIT_SETTINGS, EDIT_FEED_TIME1_HOUR, EDIT_FEED_TIME1_MINUTE, EDIT_FEED_TIME1_ON_OFF, EDIT_FEED_TIME2_HOUR, EDIT_FEED_TIME2_MINUTE, EDIT_FEED_TIME2_ON_OFF, EDIT_FEED_AMOUNT1, EDIT_FEED_AMOUNT2, EDIT_HOUR, EDIT_MINUTE, EDIT_DAY, EDIT_MONTH, EDIT_YEAR, EDIT_SERVO_STOP_DELAY, EDIT_SERVO_BACKUP_DELAY,}; // Gelar keadaan saat dari status systemSTATES;int8_t userInput;int8_t trigger;int Second;int Menit;int Jam;int Hari;int Bulan;int Tahun;int8_t DoW;String day_of_week;alamat karakter yang tidak ditandatangani, data;int testt =0;int feed_time1_hour;int feed_time1_minute;bool feed_time1_active =false;bool alarm1Activated =false;int feed_time2_hour;int feed_time2_minute;bool feed_time2_active =false;bool alarm2Activated =false;// digunakan untuk fungsi kedip saat mengedit nilaiuint32_t blink_interval =500;uint32_t blink_previousMillis =0;blinkuint32_t blink_previous 0;boolean blink_state =false;// digunakan untuk fungsi berkedip saat mengedit nilaisuint32_t spinningWheel_interval =170;uint32_t spinningWheel_previousMillis =0;uint32_t spinningWheel_currentMillis =0;int spinningWheelSymbol =0;// digunakan untuk fungsi pencadangan gagal sensor Hall// waktu interval harus lebih besar dari satu 60 derajat// putaran dari pengumpan (satu porsi).uint32_t hallSensorBackup_interval =HALL_SENSOR_BACKUP_VALUE;uint32_t hallSensorBackup_currentMillis =0;boolean hallSensorFail =false;// digunakan untuk lampu latar lcd timeruint32_t lcdBacklight_interval_ON_TIME_ole_tekanan =LCD_BACKLint; // Tentukan simbol khusus untuk LCD displaybyte bell_symbol_Char[8] ={ B00100, B01110, B01110, B01110, B11111, B00100, B00000, B00000};byte inverted_one_Char[8] ={ 0b11111, 0b11011, 0b10011, 0b11011, 0b11011, 0b11011 , 0b10001, 0b11111};byte inverted_two_Char[8] ={ 0b11111, 0b11011, 0b10101, 0b11101, 0b11011, 0b10111, 0b10001, 0b11111};oleh te arrow_up_Char[8] ={ 0b00100, 0b01110, 0b11111, 0b01110, 0b01110, 0b01110, 0b01110, 0b00000};byte arrow_down_Char[8] ={ 0b00000, 0b01110, 0b01110, 0b01110, 0b01110, 0b11111, 0b01110} [8] ={ 0b11111, 0b10001, 0b10101, 0b10001, 0b10111, 0b10111, 0b11111, 0b00000};byte backslash_Char[8] ={ 0b00000, 0b10000, 0b01000, 0b00100, 0b00010, 0b00001, 0b00000, 0b00000};byte tebalDash ] ={ 0b00000, 0b00000, 0b11111, 0b11111, 0b11111, 0b00000, 0b00000, 0b00000};volatil boolean hallSensorActivated =false;// Interrupt 1void HallSensorIsr(){ hallSensorActivated =true; // nyalakan sensor Hall LED digitalWrite(LED_HALL_SENSOR_PIN, HIGH);}// Baris-baris ini diperlukan untuk membuat sketsa ini menjadi file C++.// Saya menggunakannya karena saya mengedit kode dengan editor teks Atom// dan PlatformIO menambahkan -onvoid HallSensorIsr();void setup();void loop();void change_states();void check_inputs();void transisi(int trigger);void check_alarm();void check_manual_feed();void display_menu_option_set_feedtime1();void display_menu_option_set_feedtime2 ();void display_menu_option_set_feed_amount();void display_menu_option_set_time();void display_menu_option_set_date();void midnight_reset();void display_time();void displayFeedingAmouts();void displayFeedingTimes();void set_feedAmount(); batal set_time ();void set_feeding1_time();void set_feeding2_time();void get_time();void get_date();void write_time();void write_date();void write_feeding_time1();void write_feeding_time2();void write_feedamount();void get_feedamount ();void get_feed_time1();void get_feed_time2();void check_RTC();byte decToBcd(byte val);byte bcdToDec(byte val);void leading_zero(int digit);void blinkFunction();void displaySpinningWheel();void startFeederServo();void stopFeederServo();void actFeeder(int bagian);void check_LcdBacklight();void lcd_backlight_ON();void ledsAndLcdDisplayStartup();void hallSensorCheck();#line 355// ************************** ************************************************** **// SETUPvoid ​​setup(){ // aktifkan layar lcd lcd.begin(); // nyalakan lampu latar lcd dan matikan lampu latar lcd_backlight_ON(); // mulai I2C Wire.begin(); // input sensor hall untuk mendeteksi rotasi feeder/jumlah feed output periksa pinMode(HALL_SENSOR_PIN, INPUT_PULLUP); pinMode(LED_HALL_SENSOR_PIN, OUTPUT); pinMode(SERVO_OUTPUT_PIN, OUTPUT); pinMode(LED_CANCEL1_PIN, OUTPUT); pinMode(LED_CANCEL2_PIN, OUTPUT); pinMode(LED_SUCCESS1_PIN, OUTPUT); pinMode(LED_SUCCESS2_PIN, OUTPUT); // setel status default LED ke OFF digitalWrite(LED_CANCEL1_PIN, LOW); digitalWrite(LED_CANCEL2_PIN, RENDAH); digitalWrite(LED_SUCCESS1_PIN, RENDAH); digitalWrite(LED_SUCCESS2_PIN, RENDAH); digitalWrite(LED_HALL_SENSOR_PIN, RENDAH); lcd.createChar(0, thickDash_Char); lcd.createChar(1, bell_symbol_Char); lcd.createChar(2, backslash_Char); lcd.createChar(3, inverted_p_Char); lcd.createChar(4, inverted_one_Char); lcd.createChar(5, inverted_two_Char); lcd.createChar(6, arrow_up_Char); lcd.createChar(7, arrow_down_Char); // atur Servo pengumpan ke status default OFF stopFeederServo(); Kawat.mulai(); // setel RTC sebagai Syncprovider setSyncProvider(RTC.get); // waktu dalam detik sinkronisasi ulang dengan RTC setSyncInterval(60); // Nonaktifkan gelombang persegi default dari pin SQW. RTC.squareWave(SQWAVE_NONE); // Pasang interupsi pada sensor Hall (ketika unput berubah RENDAH) // setiap putaran 60 derajat dari poros pengumpan, sensor hall // harus menghasilkan interupsi attachInterrupt(INT1, HallSensorIsr, FALLING); // menampilkan tes ledsAndLcdDisplayStartup(); // Status awal status FSM =MAIN; // membaca nilai alarm yang tersimpan dari memori Arduino get_feed_time1(); get_feed_time2();}// End SETUP// *************************************** ***************************************// LOOPvoid ​​loop(){ // ubah status dari FSM change_states(); // periksa input (tombol) check_inputs(); // periksa apakah alarm dipanggil check_alarm(); // check if manual feed was requsted check_manual_feed(); // at midnight, reset some variables midnight_reset(); // check connection RTC check_RTC(); // Check the Hall sensor function hallSensorCheck(); // check if lcd backlight must be turned off check_LcdBacklight();}// End of LOOP// ******************************************************************************// ******************************************************************************// ******************************************************************************// ******************************************************************************//******************************************************************************// Finite State Machinevoid change_states(){ // states switch (state) { //--------------------------------------- case MAIN:display_time(); displayFeedingAmouts(); displayFeedingTimes(); merusak; //--------------------------------------- case MENU_EDIT_FEEDTIME1:display_menu_option_set_feedtime1(); merusak; //--------------------------------------- case MENU_EDIT_FEEDTIME2:display_menu_option_set_feedtime2(); merusak; //--------------------------------------- case MENU_EDIT_FEEDAMOUNT:display_menu_option_set_feed_amount(); merusak; //--------------------------------------- case MENU_EDIT_TIME:display_menu_option_set_time(); merusak; //--------------------------------------- case MENU_EDIT_DATE:display_menu_option_set_date(); merusak; //--------------------------------------- case EDIT_FEED_TIME1_HOUR:set_feeding1_time(); merusak; //--------------------------------------- case EDIT_FEED_TIME1_MINUTE:set_feeding1_time(); merusak; //--------------------------------------- case EDIT_FEED_TIME1_ON_OFF:set_feeding1_time(); merusak; //--------------------------------------- case EDIT_FEED_TIME2_HOUR:set_feeding2_time(); merusak; //--------------------------------------- case EDIT_FEED_TIME2_MINUTE:set_feeding2_time(); merusak; //--------------------------------------- case EDIT_FEED_TIME2_ON_OFF:set_feeding2_time(); merusak; //--------------------------------------- case EDIT_FEED_AMOUNT1:set_feedAmount(); merusak; //--------------------------------------- case EDIT_FEED_AMOUNT2:set_feedAmount(); merusak; //--------------------------------------- case EDIT_HOUR:set_time(); merusak; //--------------------------------------- case EDIT_MINUTE:set_time(); merusak; //--------------------------------------- case EDIT_DAY:set_date(); merusak; //--------------------------------------- case EDIT_MONTH:set_date(); merusak; //--------------------------------------- case EDIT_YEAR:set_date(); merusak; //--------------------------------------- }}//******************************************************************************// Check INPUTSvoid check_inputs(){ // first check if timeout has occurred if ( millis() - timeoutValue> MENU_TIMEOUT_VALUE ) { userInput =trigTIMEOUT; transition(userInput); } // check state of buttons buttonSelect.read(); buttonUp.read(); buttonDown.read(); buttonBack.read(); buttonManual.read(); buttonCancel1.read(); buttonCancel2.read(); // check manual cancel Feed1 button switch (buttonCancel1.wasPressed()) { case 1:// invert variable value (true to false and vise versa) manualCancelFeed1 =!manualCancelFeed1; //turn on lcd backlight manually lcd_backlight_ON(); // message when Cancel1 button is pressed if (manualCancelFeed1 ==1) { lcd.clear(); lcd.setCursor(0, 0); // 0123456789012345 - LCD screen character counter lcd.print("Upcoming Feed #1"); lcd.setCursor(0, 1); lcd.print("cancelled once "); penundaan(2000); lcd.clear(); } else if (manualCancelFeed1 ==0) { lcd.clear(); lcd.setCursor(0, 0); // 0123456789012345 - LCD screen character counter lcd.print("Upcoming Feed #1"); lcd.setCursor(0, 1); lcd.print("canceling undone"); penundaan(2000); lcd.clear(); } merusak; } // check manual cancel Feed2 button switch (buttonCancel2.wasPressed()) { case 1:// invert variable value (true to false and vise versa) manualCancelFeed2 =!manualCancelFeed2; //turn on lcd backlight manually lcd_backlight_ON(); // message when Cancel1 button is pressed if (manualCancelFeed2 ==1) { lcd.clear(); lcd.setCursor(0, 0); // 0123456789012345 - LCD screen character counter lcd.print("Upcoming Feed #2"); lcd.setCursor(0, 1); lcd.print("cancelled once "); penundaan(2000); lcd.clear(); } else if (manualCancelFeed2 ==0) { lcd.clear(); lcd.setCursor(0, 0); // 0123456789012345 - LCD screen character counter lcd.print("Upcoming Feed #2"); lcd.setCursor(0, 1); lcd.print("canceling undone"); penundaan(2000); lcd.clear(); } merusak; } // check manual Feed button switch (buttonManual.wasPressed()) { case 1:manualFeed =true; //turn on lcd backlight manually lcd_backlight_ON(); merusak; } // check MENU/SELECT button switch (buttonSelect.wasPressed()) { case 1:userInput =btnSELECT; //turn on lcd backlight manually lcd_backlight_ON(); transition(userInput); merusak; } // check UP button switch (buttonUp.wasPressed()) { case 1:userInput =btnUP; transition(userInput); //turn on lcd backlight manually lcd_backlight_ON(); merusak; } // check long press UP button switch (buttonUp.wasReleased()) { case 1:long_press_button =false; rpt =REPEAT_FIRST; merusak; } switch (buttonUp.pressedFor(rpt)) { case 1:// increment the long press interval rpt +=REPEAT_INCR; long_press_button =true; userInput =btnUP; transition(userInput); merusak; } // check DOWN button switch (buttonDown.wasPressed()) { case 1:userInput =btnDOWN; transition(userInput); //turn on lcd backlight manually lcd_backlight_ON(); merusak; } // check long press DOWN button switch (buttonDown.wasReleased()) { case 1:long_press_button =false; rpt =REPEAT_FIRST; merusak; } switch (buttonDown.pressedFor(rpt)) { case 1:// increment the long press interval rpt +=REPEAT_INCR; long_press_button =true; userInput =btnDOWN; transition(userInput); merusak; } // check btnBACK button switch (buttonBack.wasPressed()) { case 1:userInput =btnBACK; transition(userInput); //turn on lcd backlight manually lcd_backlight_ON(); merusak; }}//******************************************************************************// Check for state transition triggervoid transition(int trigger){ switch (state) { //--------------------------------------- case MAIN:// set time-out timr timeoutValue =millis(); if (trigger ==btnSELECT) { lcd.clear(); state =MENU_EDIT_FEEDTIME1; } else if (trigger ==btnBACK) { //lcd.clear(); //state =ALARM1_AND_2_TIME; } merusak; //--------------------------------------- case MENU_EDIT_FEEDTIME1:// set time-out timer timeoutValue =millis(); // check for time-out 'button' trigger if (trigger ==trigTIMEOUT) { lcd.clear(); state =MAIN; } // Now check for button triggers if (trigger ==btnUP) { //no action, this is the first menu } else if (trigger ==btnDOWN) { lcd.clear(); state =MENU_EDIT_FEEDTIME2; } if (trigger ==btnSELECT) { lcd.clear(); state =EDIT_FEED_TIME1_HOUR; } if (trigger ==btnBACK) { lcd.clear(); state =MAIN; } merusak; //--------------------------------------- case MENU_EDIT_FEEDTIME2:// set time-out timer timeoutValue =millis(); // check for time-out 'button' trigger if (trigger ==trigTIMEOUT) { lcd.clear(); state =MAIN; } // Now check for button triggers if (trigger ==btnUP) { lcd.clear(); state =MENU_EDIT_FEEDTIME1; } else if (trigger ==btnDOWN) { lcd.clear(); state =MENU_EDIT_FEEDAMOUNT; } if (trigger ==btnSELECT) { lcd.clear(); state =EDIT_FEED_TIME2_HOUR; } if (trigger ==btnBACK) { lcd.clear(); state =MAIN; } merusak; //--------------------------------------- case MENU_EDIT_FEEDAMOUNT:// set time-out timer timeoutValue =millis(); // check for time-out 'button' trigger if (trigger ==trigTIMEOUT) { lcd.clear(); state =MAIN; } // Now check for button triggers if (trigger ==btnUP) { lcd.clear(); state =MENU_EDIT_FEEDTIME2; } else if (trigger ==btnDOWN) { lcd.clear(); state =MENU_EDIT_TIME; } if (trigger ==btnSELECT) { lcd.clear(); state =EDIT_FEED_AMOUNT1; } if (trigger ==btnBACK) { lcd.clear(); state =MAIN; } merusak; //--------------------------------------- case MENU_EDIT_TIME:// set time-out timer timeoutValue =millis(); // check for time-out 'button' trigger if (trigger ==trigTIMEOUT) { lcd.clear(); state =MAIN; } // Now check for button triggers if (trigger ==btnUP) { lcd.clear(); state =MENU_EDIT_FEEDTIME2; } if (trigger ==btnDOWN) { lcd.clear(); state =MENU_EDIT_DATE; } if (trigger ==btnSELECT) { lcd.clear(); state =EDIT_HOUR; } if (trigger ==btnBACK) { lcd.clear(); state =MAIN; } merusak; //--------------------------------------- case MENU_EDIT_DATE:// set time-out timer timeoutValue =millis(); // check for time-out 'button' trigger if (trigger ==trigTIMEOUT) { lcd.clear(); state =MAIN; } // Now check for button triggers if (trigger ==btnUP) { lcd.clear(); state =MENU_EDIT_TIME; } else if (trigger ==btnDOWN) { //no action, end of menu items! } if (trigger ==btnSELECT) { lcd.clear(); state =EDIT_DAY; } if (trigger ==btnBACK) { lcd.clear(); state =MAIN; } merusak; //--------------------------------------- case EDIT_FEED_TIME1_HOUR:// set time-out timer timeoutValue =millis(); // check for time-out 'button' trigger if (trigger ==trigTIMEOUT) { lcd.clear(); state =MAIN; } // Now check for button triggers...This file has been truncated, please download it to see its full contents.

Skema

Arduino based Pet Feeder I used Arduino IDE 1.8.2. BE CAREFUL NOT TO HAVE TWO VERSIONS OF THE SAME LIBRARIES IN YOUR LIBRARIES FOLDER!! arduino_pet_feeder_final_eng_v1_0-ino_hex_libraries_dsoo0HscCr.zip

Proses manufaktur

  1. Makanan Hewan
  2. Konsol Pengeditan Photoshop DIY menggunakan Arduino Nano RP 2040
  3. Arduino Spybot
  4. Bunga - Arduino Nano, CrazyCircuits, DFRobot
  5. Game Arduino Nano Tetris di Matriks 16x8 Buatan Sendiri
  6. Klon Arduino Tamagotchi - Hewan Peliharaan Digital
  7. Arduino Nano:Kontrol 2 Motor Stepper Dengan Joystick
  8. Pengumpan Hewan Peliharaan Terkendali Jarak Jauh
  9. Penghitung Geiger Genggam dengan Arduino Nano
  10. TFT Shield untuk Arduino Nano - Mulai