Industriële fabricage
Industrieel internet der dingen | Industriële materialen | Onderhoud en reparatie van apparatuur | Industriële programmering |
home  MfgRobots >> Industriële fabricage >  >> Manufacturing Technology >> Productieproces

Eenvoudig te bouwen voerbak

Componenten en benodigdheden

Arduino Nano R3
Het is het beste om een ​​Arduino Nano te gebruiken als je een compacte behuizing wilt gebruiken
× 1
Adafruit realtime klok
× 1
Continue rotatieservo
× 1
Graandispenser
× 1
Zaalsensor UNIPOLAR
× 1
Staafmagneten 3 mm diameter, 5 mm lengte
× 6
Adafruit RGB-achtergrondverlichting LCD - 16x2
× 1
lcd i2c-rugzak
× 1
Apem-drukknop tijdelijk IP67
× 1
Kleine drukknoppen tijdelijk
× 1
LED (generiek)
× 6
Hammond Multi ABS-behuizing met flens
× 1

Apps en online services

LCD-tekengenerator

Over dit project

Update 06-09-2018

Mijn twee voerbakken voor huisdieren werken de afgelopen 7 maanden probleemloos. We zorgen natuurlijk overdag voor onze huisdieren, maar ze krijgen nu op vaste tijden hun voer. Erg blij met het systeem!

Waarom nog een voerbak?

Mijn versie van een voerbak voor huisdieren is gebaseerd op een Arduino-microcontroller. De gebruikte materialen zijn relatief goedkoop en ik denk dat het gemakkelijk te bouwen is!

Natuurlijk zijn er veel versies, maar ik kon geen compleet project vinden, klaar om te bouwen met de functies die ik nodig had, dus begon ik helemaal opnieuw.

Dit zijn de kenmerken:

  • *Nauwkeurige porties* elke keer geleverd! (met behulp van een Hall-sensor)
  • Twee voedermomenten per dag
  • *Extreem* nauwkeurige real-time klok (alleen met echte DS3231-chip)
  • Je kunt een aanstaande voeding afzonderlijk annuleren voor beide timers met display en led-indicator. Annuleren wordt automatisch gereset nadat de ingestelde tijd is verstreken.
  • Handmatige invoerfunctie (één portie per druk op de knop)
  • Verstelbare porties voor elk van de twee voedertijden (1-9 porties)
  • Overzicht van alle ingestelde parameters in het hoofdscherm
  • Eenvoudig te navigeren menusysteem
  • LED-indicatie of het voeren is gelukt
  • Timer LCD-achtergrondverlichting (uit na 30 sec, aan met een willekeurige knop)
  • Tijd en andere instellingen worden veilig opgeslagen in het geheugen (EEPROM)

Demonstratie VIDEO's:

voor video klik HIER

meer gedetailleerde uitleg video:klik HIER

de Pet Feeder in slow-mo actie! klik HIER

Foto's:

Benodigde onderdelen:

  • 1x Granendispenser (goedkoop op Ebay)
  • wat (schroot)hout om de houder voor de graandispenser te bouwen
  • 1x Arduino Uno
  • 1x I2C DS3231 (extreem nauwkeurig) of DS1307 Real Time Clock
  • 1x LCD-scherm 16 tekens / 2 regels
  • 1x I2C-rugzak voor het LCD-scherm
  • 1x Continue rotatie Servo (koop een goede!)
  • 1x Honeywell SS443R Unipolaire Hall-sensor
  • 1x 12Volts/1 Amp externe voeding (muurwrat)
  • 7x drukknoppen - tijdelijk
  • 6x LED (2x ROOD, 3x GROEN, 1 GEEL)
  • 2x weerstand 1KΩ (voor de rode led's)
  • 4x weerstand 560Ω (voor de groene en gele led's)
  • 1x behuizing voor de elektronica
  • stekker vrouwelijk en connectoren om de externe servo en hall-sensor aan te sluiten
  • heel veel HETE LIJM.

Het is het beste om indien mogelijk een hogere spanning voor de servo te gebruiken. Meer kracht! Mijn HSR-2645CRH Servo kan 7,4 Volt aan, dus als je dit ook wilt doen, heb je nodig:

  • Performantiebord
  • LM317T Variabele spanningsregelaar
  • 3 weerstanden om de uitgangsspanning in te stellen (1KΩ, 150kΩ en 4K7)
  • 2 gepolariseerde condensatoren (220µF, 10µF)
  • koellichaam niet nodig, de servo draait slechts 1-2 seconden per dag;)

Online kun je veel LM317 rekenmachines vinden.

De voerbak voor huisdieren

Het goedkoopste en gemakkelijkst te gebruiken zijn de graandispensers die je in veel winkels en op Ebay kunt vinden. Ik kocht een dubbele graandispenser op Ebay voor 15 euro inclusief verzending (VK naar Nederland)

De uitdaging was om een ​​houder voor de feeder te maken en rondkijken op internet hielp me niet veel dus ik keek rond in mijn schuur en vond een aantal mooie stukken cederhout.

Het hout dat de plastic graandispenser vasthoudt, is 3 cm dik, dus geen wiebelen! U moet er zeker van zijn dat het gat (mijn feederbasis is 86 mm) strak zit, dus meet voordat u gaat boren! Het is beter om een ​​kleiner gat te boren en het een beetje vorm te geven dan een te groot gat.

Bekijk de foto's om een ​​idee te krijgen waarom en hoe het bij elkaar past.

De servo en bevestiging aan het scheprad van de dispenser

Zorg ervoor dat je een goede servo koopt. Eerst kocht ik een MG996R-servo die ik heb aangepast voor continue rotatie, maar dat was geldverspilling... Toen kreeg ik kwaliteitsservo's, in mijn geval de HSR-2645CRH Servo

Het MOET een continu roulatiemodel ZIJN!! Probeer niet om een ​​normale servo te wijzigen zoals ik deed. Het presteerde lang niet goed genoeg en bij het stoppen was het niet onmiddellijk.

video van de servo-proef:klik HIER

De servo-verbinding met het schoepenwiel van de dispenser

Dus nu was de vraag:hoe sluit je de servo aan op het feeder-scheprad? Het leek in eerste instantie het moeilijkste deel van het project, maar het was eigenlijk heel simpel.

Ik nam een ​​stuk polycarbonaat van 5 mm en zaagde er met een figuurzaag een ronde schijf uit van ongeveer 6 cm. In het midden heb ik een gat geboord van 8 mm (de dikte van de feeder-as. Deze plastic as is verwijderbaar van het schoepenrad)

Aan de buitenkant boor ik 6 gaten van 3 mm, de dikte van de magneten. Deze worden gebruikt om de Arduino feedback te geven over de positie van het pedaalwiel van de feeder.

Omdat het schoepenrad 6 rubberen peddels had heb ik 6 magneten gebruikt en deze verdeeld over de rand van de polycarbonaat schijf. 360 graden gedeeld door 6 is 60 graden. De staafmagneten passen er precies in.

De hall-sensor detecteert elk van de 6 magneten, zodat we die informatie kunnen gebruiken om het schoepenrad nauwkeurig te positioneren en te stoppen. De servo stop vertragingstijd variabele wordt gebruikt om een ​​vertraging toe te voegen na voeden, voordat u stopt de servomotor. Met deze vertraging kun je dus de exacte positie van het schoepenrad aanpassen. Dit is belangrijk, want als de 'stop'-stand verkeerd is, zal het voer het schoepenrad niet volledig verlaten. Ook de positie van de hall-sensor kan in jouw geval anders zijn. Het aanpassen van de servo stop vertraging variabele tijd zal dit oplossen.

Nu kunnen we de as van het schoepenrad in de schijf van polycarbonaat lijmen.

De witte ronde servohoorn is met 3 M3-bouten op de polycarbonaat schijf geschroefd. gebruik wat extra moeren als afstandhouders en draai ze niet te vast!

Nu maakt de servo deel uit van de feeder-constructie, dus we kunnen hem in de houten houder plaatsen en meten hoe hoog het stuk hout onder de servo moet zijn.

De Hall-sensor

De hall-sensor die ik heb gebruikt is van het type UNIPOLAR. Het geeft een LAGE uitgang als een magneet in de buurt is en heeft GEEN omgekeerde polariteit van de magneet nodig om de uitgang weer HOOG te zetten. Gebruik dus een Unipolaire Hall-sensor, veel gemakkelijker.

!!! De hall-sensor heeft een optrekweerstand van 10KΩ nodig.

Ik heb een 0805 SMD-weerstand bovenop de hall-sensor gemonteerd, maar je kunt het op jouw manier doen. Vergeet deze weerstand niet!

Toen nam ik een oude balpen en gebruikte het plastic als houder voor de sensor.

De elektronicabehuizing

Ik gebruikte een Hammond ABS behuizing met flens. 120 x 65 x 40 mm

voor de externe verbindingen heb ik vrouwelijke precisie-connectoren gebruikt, niet de goedkope Chinese. Ik gebruik deze veel in al mijn projecten. Niets erger dan slechte verbindingen die (moeilijk te vinden) storingen veroorzaken.

Om het programmeren van de Arduino makkelijker te maken, heb ik een externe FTDI-aansluiting:

Het voorpaneel

Ik heb veel geprobeerd om een ​​goedkoop en mooi frontpaneel te maken...

Eerst heb ik Mod Podge gebruikt om een ​​papieren laserprint op de voorkant van de behuizing te lijmen en deze te bedekken met meer Mod Podge. --> MISLUKT

Daarna probeerde ik een blanke lak op basis van polyurethaan acrylaat dispersie. Zeer duurzaam en sterk na drogen. Ik heb het papier heel goed op de behuizing geplakt en het lakken van de bovenzijde van de print op het voorpaneel zag er erg goed uit, MAAR het zou niet hechten aan de laserprinter tonerdelen van de print. --> MISLUKT

Daarna heb ik de laserprint van het voorpaneel genomen en alleen de bovenkant gelamineerd met lamineer pcv. zeer mooie afwerking, die de voorkant beschermt en de kleuren prachtig oplicht. Daarna heb ik het gelamineerde papier met de vernis op de behuizing geplakt. Mijn idee was dat de vernis het papier zou doordringen waardoor het waterafstotend zou worden. Maar omdat ik dik papier gebruikte dat niet werkte en het nat maakte om de waterbestendigheid te testen, krulde het papier van de behuizing. --> GEDEELTELIJK MISLUKT, wordt nader onderzocht.

Nog een poging:ik kocht speciale aluminiumfolie, gemaakt voor laserprinten. 2,25 euro per vel. Het resultaat was geweldig, maar ik wilde de toner beschermen met een speciale heldere folie. Dat was geen succes omdat ik de oneffenheden zoals te zien op foto 1 niet weg kon krijgen:

Dan nog een poging om te beschermen met de blanke lak, Het maakte de alu folie zeer hoogglans! MAAR... nogmaals, de vernis hechtte niet aan de toner, dus gaf ik de vernis definitief op...

EINDELIJK... Ik heb de foliedruk zonder bescherming gebruikt... Er zullen vingerafdrukken te zien zijn bij vaak aanraken (kijk onder de TERUG-knop van de foto bovenaan deze pagina, huisvesting in het kippenvoer) dus niet ideaal maar nog steeds goed genoeg voor mij.

Meer foto's zijn blijkbaar niet toegestaan, dus...

Dat is alles mensen... hebben leuk!

Code

  • Pet Feed-O-Matic v 1.1 - 20-02-2018
Pet Feed-O-Matic v 1.1 - 20-02-2018Arduino
v 1.1:als u op de knop Annuleren 1 of 2 drukt, wordt een uitleg weergegeven
// 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 -------- -------------------------------------------------- ------------------- Te doen:- voeren op afstand? - stopvertraging feeder als menu-editable item laatste wijziging:dinsdag 20 februari 2018 - 17:20:28 KENMERKEN:- *Nauwkeurige porties* elke keer (door gebruik te maken van een Hall-sensor) - Twee voedertijden, één keer per dag - *Extreem* nauwkeurige Real Time Clock (Alleen met echte DS3231-chip) - Aankomende voeding afzonderlijk annuleren voor beide timers met display en led-indicator Automatische reset na verloop van tijd - Handmatige voerfunctie (één portie per druk op de knop) - Instelbare porties voor elk van de twee voertijden (1-9 porties) - Overzicht van alle ingestelde parameters in het hoofdscherm - Makkelijk te navigeren menu systeem - LED-indicatie of het voeren succesvol was - LCD-achtergrondverlichting timer (uit na 30 sec, aan met een willekeurige knop) - Back-up in het geval van een defecte Hall-sensor - Hass-sensor-LED knippert tot middernacht als de Hall-sensor is mislukt - Tijd en andere instellingen zijn veilig opgeslagen in EEPROM WEBSITES:LCD HD44780 karaktergenerator website om je eigen lcd-symbolen te maken https://omerk.github.io/lcdchargen/ Arduino sketch Grote letter commentaar generator http://patorjk.com /software/taag/#p=display&c=c%2B%2B&f=Big&t=Comment Revisies:zondag 28 januari 2018 - 20:17:10 *////////////////// ////////////////////////////////////////////////// /////////////// VERANDERBARE VARIABELEN DOOR GEBRUIKER//////////////////////////////// ////////////////////////////////////////////////// gebruikt voor de back-upfunctie van de Hall-sensor.// de intervaltijd moet iets groter zijn dan één 60 graden// draai van de feeder (één portie) #define HALL_SENSOR_BACKUP_VALUE 300// vertraging voordat de feeder-servo stopt na het voeren. Op deze manier kunt u// het roterende pedaalwiel op de juiste positie laten stoppen#define FEEDER_STOP_DELAY 100// lcd-achtergrondverlichting op tijd na het indrukken van een knop#define LCD_BACKLIGHT_ON_TIME 30000// verlaat het menu zonder opslaan na een tijd die hier in ms is ingesteld#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 (meegeleverd met Arduino IDE)#include  #include // CONNECTIONS://// LCD (I2C module):// SCL - A5// SDA - A4// VCC// GND// interrupt hal sensor pin#define HALL_SENSOR_PIN 3#define BUTTON_BACK_PIN 4#define BUTTON_UP_PIN 5#define BUTTON_DOWN_PIN 6#define BUTTON_SELECT_PIN 7#define 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 A3// feeder Servo-ingang Pin#define Hall-sensor Pin#define Hall-sensor (16x2) 0x27 of 0x3FLiquidCrystal_I2C lcd(0x3F, 16, 2);// definieer de instellingen van de knopbibliotheek// Een debouncetijd van 20 milliseconden werkt meestal goed// voor tactiele knopschakelaars.#define DEBOUNCE_MS 20// ms vereist voordat wordt herhaald op lang indrukken#define REPEAT_FIRST 1000// herhaal interval voor lang indrukken#define REPEAT_INCR 200// Om het simpel te houden, gebruiken we de interne pullup-weerstand van de Arduino.#define PULLUP true#define INVERT true// Declareer de knoppenButton buttonSelect (BUTTON_SELECT_PIN, PULLUP , INVERT, DEBOUNCE_MS);Button buttonUp (BUTTON_UP_PIN, PULLUP, INVERT, DEBOUNCE_MS);Button buttonDown (BUTTON_DOWN_PIN, PULLUP, INVERT, DEBOUNCE_MS);Button buttonBack (BUTTON_BACK_PIN, PULLUP, INVERT,); Button buttonCancel1 (BUTTON_CANCEL1_PIN, PULLUP, INVERT, DEBOUNCE_MS);Button buttonCancel2 (BUTTON_CANCEL2_PIN, PULLUP, INVERT, DEBOUNCE_MS);Button buttonManual (BUTTON_MANUAL_PIN, PULLUP, INVERT,//DEBOUNCE_ dat is aangepast count (geïnitialiseerd om er zeker van te zijn dat het anders is wanneer// de sketch start)int lastCount =-1;// Een variabele tijd die wordt gebruikt om de herhalingen aan te sturen voor lang indrukken unsigned long rpt =REPEAT_FIRST;// gebruikt voor het menu time-outunsigned long timeoutValue =0;// handmatig annuleren voedertijden variabelenboolean manualCancelFeed1 =false;boolean manualCancelFeed2 =false;// Handmatige feed optionboolean manualFeed =false;// Voerhoeveelheid (in porties)int feedAmount1 =1;int feedAmount2 =1;bool feederSuccess =false;// feederportiesint porties =0;int beurten =0;// input actionsenum {btnSELECT, btnUP, btnDOWN, btnBACK, btnCANCEL1, btnCANCEL2, btnMANUAL, trigTIMEOUT};// Staten van de Finite State Machine (FSM)enum STATES { HOOFD, MENU_BEWERKEN _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,}; // Zet de huidige toestand van de systemSTATES-status;int8_t userInput;int8_t trigger;int Second;int Minute;int Hour;int Day;int Month;int Year;int8_t DoW;String day_of_week;unsigned char-adres, 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;// gebruikt voor de knipperfunctie bij het bewerken van waardenuint32_t blink_interval =500;uint32_t blink_previousMint32_t blink_previousMint 0;boolean blink_state =false;// gebruikt voor de knipperfunctie bij het bewerken van waardenuint32_t spinningWheel_interval =170;uint32_t spinningWheel_previousMillis =0;uint32_t spinningWheel_currentMillis =0;int spinningWheelSymbol =0;// gebruikt voor de Hall-sensor fail-back-upfunctie// de intervaltijd moet iets groter zijn dan één 60 graden// draai van de feeder (een deel).uint32_t hallSensorBackup_interval =HALL_SENSOR_BACKUP_VALUE;uint32_t hallSensorBackup_currentMillis =0;boolean hallSensorFail =false;// gebruikt voor de lcd-achtergrondverlichting timeruint32_t lcdBacklight_interval =LCD_BACKLIGHT_Millit_TIME;uint32_t hallSensorBackup_currentMillis =0;boolean hallSensorFail =false;// gebruikt voor de lcd-achtergrondverlichting timeruint32_t lcdBacklight_interval =LCD_BACKLIGHT_Millit_TIME;uint32_t lcdBacklight_interval =LCD_BACKLIGHT_ON_TIME;uint32_t // Definieer aangepaste symbolen voor het LCD-schermbyte bell_symbol_Char [8] ={ B00100, B01110, B01110, B01110, B11111, B00100, B00000, B00000};byte inverted_one_Char [8] ={ 0b11111, 0b11011, 0b10011, 0b11011, 01111011, 0b110 , 0b10001, 0b11111};byte inverted_two_Char[8] ={ 0b11111, 0b11011, 0b10101, 0b11101, 0b11011, 0b10111, 0b10001, 0b11111};door te arrow_up_Char[8] ={ 0b00100, 0b01110, 0b11111, 0b01110, 0b01110, 0b01110, 0b01110, 0b00000};byte arrow_down_Char[8] ={ 0b00000, 0b01110, 0b01110, 0b01110, 0b01110, 0b11111, 0b01} [8] ={ 0b11111, 0b10001, 0b10101, 0b10001, 0b10111, 0b10111, 0b11111, 0b00000};byte backslash_Char[8] ={ 0b00000, 0b10000, 0b01000, 0b00100, 0b00010, 0b00001, 0b00000, 0b00000}; ] ={ 0b00000, 0b00000, 0b11111, 0b11111, 0b11111, 0b00000, 0b00000, 0b00000};vluchtige boolean hallSensorActivated =false;// Interrupt 1void HallSensorIsr(){ hallSensorActivated =true; // zet Hall-sensor LED aan digitalWrite(LED_HALL_SENSOR_PIN, HIGH);}// Deze regels zijn nodig om van deze schets een C++-bestand te maken.// Ik gebruik het omdat ik de code bewerk met de Atom// teksteditor en de PlatformIO-add -onvoid HallSensorIsr();void setup();void loop();void change_states();void check_inputs();void transition(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 middernacht_reset();void display_time();void displayFeedingAmouts();void displayFeedingTimes();void set_feedAmount();void 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 digits);void blinkFunction();void displaySpinningWheel();void startFeederServo();void stopFeederServo();voidactivateFeeder(int parts);void check_LcdBacklight();void lcd_backlight_ON();void ledsAndLcdDisplayStartup();void hallSensorCheck();#line 355// ************************** ********************************************** **// SETUPvoid ​​setup(){ // activeer het lcd-scherm lcd.begin(); // zet lcd-achtergrondverlichting aan en start achtergrondverlichting uit-timer lcd_backlight_ON(); // start I2C Wire.begin(); // Hall-sensorinvoer om rotatie van de feeder / voerhoeveelheiduitvoer te detecteren, controleer pinMode (HALL_SENSOR_PIN, INPUT_PULLUP); pinMode (LED_HALL_SENSOR_PIN, UITGANG); pinMode (SERVO_OUTPUT_PIN, OUTPUT); pinMode (LED_CANCEL1_PIN, UITGANG); pinMode (LED_CANCEL2_PIN, UITGANG); pinMode (LED_SUCCESS1_PIN, UITGANG); pinMode (LED_SUCCESS2_PIN, UITGANG); // zet de standaardstatus van de LED's op OFF digitalWrite (LED_CANCEL1_PIN, LOW); digitalWrite (LED_CANCEL2_PIN, LAAG); digitalWrite (LED_SUCCESS1_PIN, LAAG); digitalWrite (LED_SUCCESS2_PIN, LAAG); digitalWrite (LED_HALL_SENSOR_PIN, LAAG); 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); // stel feeder Servo in op standaard UIT stopFeederServo (); Draad.begin(); // stel RTC in als de Syncprovider setSyncProvider (RTC.get); // tijd in seconden van hersynchronisatie met RTC setSyncInterval(60); // Schakel de standaard blokgolf van de SQW-pin uit. RTC.squareWave(SQWAVE_NONE); // Bevestig een interrupt op de Hall-sensor (wanneer de unput LOW wordt) // elke keer dat de feeder-as 60 graden wordt gedraaid, moet de Hall-sensor een interrupt genereren attachInterrupt(INT1, HallSensorIsr, FALLING); // display test ledsAndLcdDisplayStartup(); // Initiële status van de FSM-status =MAIN; // lees de opgeslagen alarmwaarde uit het Arduino-geheugen get_feed_time1(); get_feed_time2();}// Einde SETUP// **************************************** ************************************// LOOPvoid ​​loop(){ // status wijzigen van FSM change_states(); // check inputs (knoppen) check_inputs(); // controleer of alarm werd genoemd check_alarm(); // controleer of handmatige feed is aangevraagd check_manual_feed(); // reset om middernacht enkele variabelen middernacht_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(); pauze; //--------------------------------------- case MENU_EDIT_FEEDTIME1:display_menu_option_set_feedtime1(); pauze; //--------------------------------------- case MENU_EDIT_FEEDTIME2:display_menu_option_set_feedtime2(); pauze; //--------------------------------------- case MENU_EDIT_FEEDAMOUNT:display_menu_option_set_feed_amount(); pauze; //--------------------------------------- case MENU_EDIT_TIME:display_menu_option_set_time(); pauze; //--------------------------------------- case MENU_EDIT_DATE:display_menu_option_set_date(); pauze; //--------------------------------------- case EDIT_FEED_TIME1_HOUR:set_feeding1_time(); pauze; //--------------------------------------- case EDIT_FEED_TIME1_MINUTE:set_feeding1_time(); pauze; //--------------------------------------- case EDIT_FEED_TIME1_ON_OFF:set_feeding1_time(); pauze; //--------------------------------------- case EDIT_FEED_TIME2_HOUR:set_feeding2_time(); pauze; //--------------------------------------- case EDIT_FEED_TIME2_MINUTE:set_feeding2_time(); pauze; //--------------------------------------- case EDIT_FEED_TIME2_ON_OFF:set_feeding2_time(); pauze; //--------------------------------------- case EDIT_FEED_AMOUNT1:set_feedAmount(); pauze; //--------------------------------------- case EDIT_FEED_AMOUNT2:set_feedAmount(); pauze; //--------------------------------------- case EDIT_HOUR:set_time(); pauze; //--------------------------------------- case EDIT_MINUTE:set_time(); pauze; //--------------------------------------- case EDIT_DAY:set_date(); pauze; //--------------------------------------- case EDIT_MONTH:set_date(); pauze; //--------------------------------------- case EDIT_YEAR:set_date(); pauze; //--------------------------------------- }}//******************************************************************************// 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 "); vertraging (2000); lcd.wissen(); } 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"); vertraging (2000); lcd.wissen(); } pauze; } // 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 "); vertraging (2000); lcd.wissen(); } 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"); vertraging (2000); lcd.wissen(); } pauze; } // check manual Feed button switch (buttonManual.wasPressed()) { case 1:manualFeed =true; //turn on lcd backlight manually lcd_backlight_ON(); pauze; } // check MENU/SELECT button switch (buttonSelect.wasPressed()) { case 1:userInput =btnSELECT; //turn on lcd backlight manually lcd_backlight_ON(); transition(userInput); pauze; } // check UP button switch (buttonUp.wasPressed()) { case 1:userInput =btnUP; transition(userInput); //turn on lcd backlight manually lcd_backlight_ON(); pauze; } // check long press UP button switch (buttonUp.wasReleased()) { case 1:long_press_button =false; rpt =REPEAT_FIRST; pauze; } switch (buttonUp.pressedFor(rpt)) { case 1:// increment the long press interval rpt +=REPEAT_INCR; long_press_button =true; userInput =btnUP; transition(userInput); pauze; } // check DOWN button switch (buttonDown.wasPressed()) { case 1:userInput =btnDOWN; transition(userInput); //turn on lcd backlight manually lcd_backlight_ON(); pauze; } // check long press DOWN button switch (buttonDown.wasReleased()) { case 1:long_press_button =false; rpt =REPEAT_FIRST; pauze; } switch (buttonDown.pressedFor(rpt)) { case 1:// increment the long press interval rpt +=REPEAT_INCR; long_press_button =true; userInput =btnDOWN; transition(userInput); pauze; } // check btnBACK button switch (buttonBack.wasPressed()) { case 1:userInput =btnBACK; transition(userInput); //turn on lcd backlight manually lcd_backlight_ON(); pauze; }}//******************************************************************************// 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; } pauze; //--------------------------------------- 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; } pauze; //--------------------------------------- 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; } pauze; //--------------------------------------- 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; } pauze; //--------------------------------------- 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; } pauze; //--------------------------------------- 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; } pauze; //--------------------------------------- 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.

Schema's

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

Productieproces

  1. Voedsel voor huisdieren
  2. DIY Photoshop-bewerkingsconsole met Arduino Nano RP 2040
  3. Arduino Spybot
  4. Bloemen - Arduino Nano, CrazyCircuits, DFRobot
  5. Arduino Nano Tetris-spel op zelfgemaakte 16x8 Matrix
  6. Arduino Tamagotchi Clone - Digital Pet
  7. Arduino Nano:bedien 2 stappenmotoren met joystick
  8. Op afstand bedienbare voerbak
  9. Handheld geigerteller met Arduino Nano
  10. TFT Shield voor Arduino Nano - Start
  11. Voederbak voor huisdieren met 3D-geprinte onderdelen