3D tryckt Automatisk Sällskapsdjur Mataren (6 / 7 steg)

Steg 6: Arduino kod

För vårt projekt att köra måste vi ladda upp koden till Arduino att kontrollera elektriska komponenter. Bibliotek ingår i zip-filen nedan och mappar inuti måste placeras i främsta Arduino library-mappen på din dator efter packa. Här ingår bibliotek för IR-sensor, stegmotor och sju segment display. Den bifogade zipfilen med titeln PetFeeder innehåller mappen med Arduino skiss behövs för att köra koden. Detta måste helt enkelt bli blinkat till Arduino för att koden ska köras.

< br >< p > < br > #include #include
#include
#include
#include "SevSeg.h"
SevSeg sevseg;
#define STEPS_PER_MOTOR_REVOLUTION 32
#define STEPS_PER_OUTPUT_REVOLUTION 32 * 64 / / uppsättningar motorn för en revolution
Stepper small_stepper (STEPS_PER_MOTOR_REVOLUTION, A1, A4, A2, A3);
CONST int touchPin = A5; Touch sensor tilldelas här
int touchState; Behandlingen av touch sensor
int rörde; Villkor om touch sensor trycktes
int disableTouch; Inaktiverar flera inslag
int foder; Kör den utfodring loopen
int AMorPM = låg; Beslutar om utfodring cykel är på morgonen eller kvällen används för att ställa tiden
int justFed; Villkoret som används för att ställa in tiden
int minuter; För timern
int jag = 0; Används i formeln för att bestämma om det är AM eller PM
int disableMinutes; Hur länge touch sensor är inaktiverad
CONST int limPin = 8; Limit sensor tilldelas här
int limState = hög; Limit state
int tryckte = låg; Hur många gånger gräns sensorn var tryckt
int upprätt;
int IRpin = A0; PIN-koden för IR-sensor
IRrecv irrecv(IRpin);
decode_results resultat.
int singlecup;
int resetPin = 9. < /p >

Denna initalizes variabler och sätter vissa stater. Om du börjar koden på kvällen, kommer du vill int AMorPM så högt.

{Ogiltig setup() < br > < br >< p >
digitalWrite (resetPin, hög);
Delay(200);
pinMode (limPin, indata);
pinMode (touchPin, ingång);
pinMode (resetPin, produktionen);
Serial.BEGIN(9600);
Serial.println ("reset"); //print Återställ till vet programmet har återställts och
byte numDigits = 4;
byte digitPins [] = {10, 11, 12, 13}; Ställa in för den 4-siffriga sju segment displayen
byte segmentPins [] = {2, 3, 4, 5, 6, 7, 1, 14}; < /p >< p > sevseg.begin (COMMON_CATHODE, numDigits, digitPins, segmentPins);
sevseg.setBrightness(90);
irrecv.enableIRIn(); Starta mottagaren < /p >< p >} < /p >

Denna installation körs en gång och anges stiften som indata eller utdata. Det sätter också upp ljusstyrkan på de sju segment display som kan justeras.

< br >< p > void loop() {< br > statisk osignerade långa startTime = millis();
statisk int minuter = 480; Initierar för 480 minuter eller timmar, eftersom det är till att börja med (9 på utfodring -> 8 timmar -> 5 pm utfodring)
int justFed = låg;
touchState = digitalRead(touchPin); Kontrollerar om touchpin trycktes
limState = digitalRead(limPin);
medan (upprätt == låg & & limState == låg) {/ / denna loop gör en engångsavgift kontroll för att se om cylindern är

linje, om inte kommer att rotera tills den är upprätt
limState = digitalRead(limPin);
small_stepper.setSpeed(380);
small_stepper.Step(10);
om (limState == hög) {
small_stepper.Step(-60); < /p >< p > upprätt = hög;
Serial.println ("växla hit"); < /p >< p >
}

} < /p >< p > om (touchState == låg & & disableTouch == låg) {
berört = hög;
flöde = hög;
Delay(10);
Serial.println ("Pad var inne"); < /p >< p >} < /p >

Detta är början av huvudkoden. Det börjar med att initiera hur många minuter förrän nästa utfodring. Om du börjar på kvällen och har satt AMorPM till hög, då du måste också ändra protokollet här till 960 (eller 16 timmar tills nästa utfodring). Detta gör också en inledande kontroll se till att cylindern är upprätt när du slår systemet på - cylindern roterar tills växeln är hit. Längst ned i koden anges att om kapacitans touch sensor går låg (dvs du tryckte den) då det sätter hög matning slingan, och touch kommer att inaktiveras för att undvika flera utfodringar.

< p > om (irrecv.decode (& resultat)) {//has en överföring varit emot? < br > Serial.println (results.value), //If ja: tolka de mottagna kommandona...
om (results.value == 3810010651) {
flöde = hög;
berört = hög;
}
Marks uppdateringsknappen 5316027
Joe's - digital zoom-knappen
om (results.value == 2885434849) {
disableTouch = låg;
}
om (results.value == 810318687) {
Serial.println("resetting");
Delay(10);
digitalWrite (resetPin, låg);
Serial.println ("det aldrig händer");
}
Marks en knapp 2534850111
Joe's timer på knappen
om (results.value == 1429432985) {
small_stepper.setSpeed(300);
small_stepper.Step(2000);
tryckte = låg;
Delay(3000); Från början har ett stort steg att få bort begränsande sensorn (mindre och sensorn registrerar flera pressar)
While(Pressed == low) {
small_stepper.setSpeed(450); Denna loop fortsätter tills begränsande sensorn trycks en gång (vilket betyder att cylindern gick runt en gång för en kopp)
small_stepper.Step(30);
Delay(200); Det kommer att flytta fram 50 steg och tillbaka 20, för att minimera störning
small_stepper.Step(-10);
limState = digitalRead(limPin);
om (limState == hög) {
tryckte = hög; Läser gräns pin och räknar en press
Serial.println ("switch hit");
Delay(4500);
}
}
small_stepper.setSpeed(500);
small_stepper.Step(-20);
Delay(10);
small_stepper.setSpeed(500);
small_stepper.Step(-50);
Delay(500);
small_stepper.setSpeed(500);
small_stepper.Step(50);
Delay(500);
small_stepper.setSpeed(500);
small_stepper.Step(-50);
Delay(500);
small_stepper.setSpeed(500);
small_stepper.Step(50);
Delay(500);
small_stepper.setSpeed(500);
small_stepper.Step(-50);
Delay(500);
small_stepper.setSpeed(500);
small_stepper.Step(50);
Delay(500);
small_stepper.setSpeed(500);
small_stepper.Step(-50);
Delay(500);
small_stepper.setSpeed(500);
small_stepper.Step(50);
Delay(500);
small_stepper.setSpeed(500);
small_stepper.Step(-50);
Delay(500);
small_stepper.setSpeed(500);
small_stepper.Step(50);
Delay(500);
small_stepper.setSpeed(500);
small_stepper.Step(-50);
Delay(500);
small_stepper.setSpeed(500);
small_stepper.Step(50);
Delay(500);
small_stepper.setSpeed(500);
small_stepper.Step(-50);
Delay(500);
small_stepper.setSpeed(500);
small_stepper.Step(50);
Delay(500);
small_stepper.setSpeed(500);
small_stepper.Step(-50);
Delay(500);
small_stepper.setSpeed(500);
small_stepper.Step(50);
Delay(500);
small_stepper.setSpeed(500);
small_stepper.Step(-50);
Delay(500);
small_stepper.setSpeed(500);
small_stepper.Step(50);
Delay(500);
small_stepper.setSpeed(500);
small_stepper.Step(-50);
Delay(500);
small_stepper.Step(50);
Delay(500);
tryckte = låg;
} < /p >< p > irrecv.resume(); Ta emot nästa värde
} < /p >

Denna kod motsvarar fjärrkontrollerna. Dessa siffror kommer att ersättas av de värden som du fått från IRdecoder. Det finns en funktion för att köra en utfodring cykel, med en extra kopp (för dagar där du tror att ditt husdjur behöver de extra kalorierna), och en funktion för att återställa hela systemet.

< p > if(feed == HIGH) {//Feeds Lydia < br >
small_stepper.setSpeed(300);
small_stepper.Step(2000);
tryckte = låg;
Delay(3000); Från början har ett stort steg att få bort begränsande sensorn (mindre och sensorn registrerar flera pressar)
While(Pressed == low) {
small_stepper.setSpeed(450); Denna loop fortsätter tills begränsande sensorn trycks en gång (vilket betyder att cylindern gick runt en gång för en kopp)
small_stepper.Step(30);
Delay(200); Det kommer att flytta fram 50 steg och tillbaka 20, för att minimera störning
small_stepper.Step(-10);
limState = digitalRead(limPin);
om (limState == hög) {
tryckte = hög; Läser gräns pin och räknar en press
Serial.println ("switch hit");
Delay(4500);
}
} < /p >< p > small_stepper.setSpeed(500);
small_stepper.Step(-20);
Delay(10);
small_stepper.setSpeed(500);
small_stepper.Step(-50);
Delay(500);
small_stepper.setSpeed(500);
small_stepper.Step(50);
Delay(500);
small_stepper.setSpeed(500);
small_stepper.Step(-50);
Delay(500);
small_stepper.setSpeed(500);
small_stepper.Step(50);
Delay(500);
small_stepper.setSpeed(500);
small_stepper.Step(-50);
Delay(500);
small_stepper.setSpeed(500);
small_stepper.Step(50);
Delay(500);
small_stepper.setSpeed(500);
small_stepper.Step(-50);
Delay(500);
small_stepper.setSpeed(500);
small_stepper.Step(50);
Delay(500);
small_stepper.setSpeed(500);
small_stepper.Step(-50);
Delay(500);
small_stepper.setSpeed(500);
small_stepper.Step(50);
Delay(500);
small_stepper.setSpeed(500);
small_stepper.Step(-50);
Delay(500);
small_stepper.setSpeed(500);
small_stepper.Step(50);
Delay(500);
small_stepper.setSpeed(500);
small_stepper.Step(-50);
Delay(500);
small_stepper.setSpeed(500);
small_stepper.Step(50);
Delay(500);
small_stepper.setSpeed(500);
small_stepper.Step(-50);
Delay(500);
small_stepper.setSpeed(500);
small_stepper.Step(50);
Delay(500);
small_stepper.setSpeed(500);
small_stepper.Step(-50);
Delay(500);
small_stepper.setSpeed(500);
small_stepper.Step(50);
Delay(500);
small_stepper.setSpeed(500);
small_stepper.Step(-50);
Delay(500);
small_stepper.Step(50);
Delay(500);
small_stepper.setSpeed(300);
small_stepper.Step(2000);
Delay(3000);
tryckte = låg;
While(Pressed == low) {< /p >< p > small_stepper.setSpeed(450);
small_stepper.Step(30);
Delay(200);
small_stepper.Step(-10);
limState = digitalRead(limPin);
om (limState == hög) {
tryckte = hög;
Delay(500);
Serial.println ("Pad var inne");
Serial.println ("växla hit"); < /p >< p >}
}
small_stepper.setSpeed(500);
small_stepper.Step(-25);
Delay(500);
small_stepper.setSpeed(500);
small_stepper.Step(-50);
Delay(500);
small_stepper.setSpeed(500);
small_stepper.Step(50);
Delay(500);
small_stepper.setSpeed(500);
small_stepper.Step(-50);
Delay(500);
small_stepper.setSpeed(500);
small_stepper.Step(50);
Delay(500);
small_stepper.setSpeed(500);
small_stepper.Step(-50);
Delay(500);
small_stepper.setSpeed(500);
small_stepper.Step(50);
Delay(500);
small_stepper.setSpeed(500);
small_stepper.Step(-50);
Delay(500);
small_stepper.setSpeed(500);
small_stepper.Step(50);
Delay(500);
small_stepper.setSpeed(500);
small_stepper.Step(-50);
Delay(500);
small_stepper.setSpeed(500);
small_stepper.Step(50);
Delay(500);
small_stepper.setSpeed(500);
small_stepper.Step(-50);
Delay(500);
small_stepper.setSpeed(500);
small_stepper.Step(50);
Delay(500);
small_stepper.setSpeed(500);
small_stepper.Step(-50);
Delay(500);
small_stepper.setSpeed(500);
small_stepper.Step(50);
Delay(500);
small_stepper.setSpeed(500);
small_stepper.Step(-50);
Delay(500);
small_stepper.setSpeed(500);
small_stepper.Step(50);
Delay(500);
small_stepper.setSpeed(500);
small_stepper.Step(-50);
Delay(500);
small_stepper.setSpeed(500);
small_stepper.Step(50);
Delay(500);
small_stepper.setSpeed(500);
small_stepper.Step(-50);
small_stepper.setSpeed(500);
small_stepper.Step(50);
Delay(500);
tryckte = låg;
flöde = låg;
jag = i + 1. Berättar mataren det går vidare till nästa cykel (AMorPM)
justFed = hög;
} < /p >

Detta är den viktigaste delen av koden - den utfodring cykeln. Det börjar med ett stort "steg" att flytta de flesta av vägen runt systemet. Det därefter uppsättningar att låg, vilket korrelerar till den begränsande växla. Om det inte gör det hela vägen runt då det var en sylt, så det går genom en un-störning tag-loop. Det kommer att börja ta 30 steg framåt och 10 steg tillbaka fram till växeln begränsande slog. Väl på toppen, kommer det gå fram och tillbaka för att skaka mat in i cylindern. Denna cykel börjar sedan igen, att mata mitt husdjur sammanlagt två koppar. Detta kan justeras för ditt husdjur genom att ta bort den andra cykeln.

< p > om (disableTouch == hög & & minuter == 960 & & AMorPM == hög) {/ / om touch sensorn trycks någonsin, det blir funktionshindrade. Detta gör det möjligt att tryckas igen när en ny utfodring cykel har börjat. < br > disableTouch = låg;
}
om (disableTouch == hög & & minuter == 480 & & AMorPM == låg) {
disableTouch = låg;
} < /p >

Om touch sensor trycktes till en början matning, aktiveras funktionen disableTouch. Jag kallar detta min "Greg-bevis funktion." Jag har en vän som heter Greg, som jag vet, skulle spendera tid att trycka på touch sensor om och om igen tills alla 20 £ av hundmat skulle vara utspridda över mitt golv. Touch sensorn aktiveras igen när den tidiga-utfodring tiden förflutit, och det går tillbaka till det är ordinarie schemaläggning.

< p > om (millis() > = startTime) {< br > minuter--; / / 60000 sekunder är lika med 1 min
startTime += 60000;
om (minuter == 0) {/ / kör utfodring cykeln om timern når noll
flöde = hög;
disableTouch = låg;
berört = låg;
}
sevseg.setNumber (minuter, 1);
} < /p >

Om-funktionen är timerfunktionen. Det kommer nedräkning varje minut och om protokollet är lika med noll, det kommer att köra funktionen foder och inaktivera funktionen Greg-bevis.

< p > om (i %2 == 1) {/ / villkorlig uppgift att avgöra om det är AM eller PM udda cykler en re PM < br > AMorPM = hög;
}
annars om (i %2 == 0) {
AMorPM = låg;} < /p >

Detta är del av koden som växlar mellan de två utfodring cyklerna. Varje gång den utfodring cykeln körs "i" kommer att öka med ett. Det sägs att när "i" delas av och och har en fettåterstoden (udda), det kommer att växla till den kvällen foder cykeln och vice versa. Detta korrelerar till nollställa timern.

< p > om (justFed == hög & & rörd == låg & & AMorPM == låg) {/ / för tidsinställning och inaktivera touch sensor. < br > minuter = 480;
justFed = låg;
}
annat if (justFed == hög & & rörd == låg & & AMorPM == hög) {
minuter = 960;
justFed = låg;
}
annat if (justFed == hög & & rörd == hög & & AMorPM == låg) {
minuter = 480 + minuter.
justFed = låg;
disableTouch = hög; < /p >< p > sevseg.refreshDisplay(); < /p >< p >
}
annars om (justFed == hög & & rörd == hög & & AMorPM == hög) {
minuter = 960 + minuter.
justFed = låg;
disableTouch = hög; < /p >< p > sevseg.refreshDisplay(); < /p >< p >}
sevseg.refreshDisplay(); Måste köra flera gånger
} < /p >

Detta är slutet av kod som återställs timern till lämplig tidpunkt. Om touch sensor var nere, kommer det ta den tid som fanns kvar och lägga till den i nästa utfodring gång. Detta är så mataren är aldrig bort schemat. Om timern går ner till noll, sätts helt enkelt tiden till dess att nästa utfodring. Sevseg.refreshDisplay(); är vad berättar timern att uppdatera.

Se Steg
Relaterade Ämnen

Automatisk Sällskapsdjur Mataren

jag behövde en pålitlig fisk feeder för min damm för när jag är borta. Detta instructable ger Detaljer om mataren som jag precis avslutat bygga och testa. Samma idé kan användas för utfodring av andra husdjur eller för ett inomhus akvarium. Jag gjord...

Automatisk Arduino Powered sällskapsdjur mataren

Detta är min Automatisk Sällskapsdjur Mataren. Drivs med arduino, med hjälp av en 3D tryckt skruv och programmerbar med två utfodring gånger med en användare ange mängd livsmedel, med batteri backas upp interna klocka.Min katt köra mig nötter i morgo...

Twitter kontrollerad sällskapsdjur mataren

Ett stort projekt för upptagen sällskapsdjur egendomsrätt. Detta Twitter-kontrollerade sällskapsdjur mataren avstår automatiskt mat som svar på din Twitter-konto. Projektet styrs av en Arduino och använder Arduino Ethernet shield att ta emot data frå...

Sällskapsdjur Mataren

detta är min digitalt fabricerade skruv baserat sällskapsdjur mat dispenser. Du laddar helt enkelt kannan med sällskapsdjur mat och det skjuts automatiskt med skruv skruv i skålen till mata dina husdjur. Detta har testats för att fungera med kattmat...

IOT sällskapsdjur mataren (intel edison)

I detta projekt gör vi en iot aktiverat sällskapsdjur mataren. Kattmat och hundmat förvaras i en behållare och levereras i ett fack av en skruv skruv. Detta koncept kan skalas upp eller ändras för att passa dina speciella krav.Steg 1: 3d skriva ut sk...

Fat Cat automatiserad Arduino sällskapsdjur mataren

Alla säga hej till hertig! Han är en 24 pund Maine Coon som jag antog för tre år sedan. Duke har om i solen, titta på fåglarna utanför, och... vakna upp hans ägare klockan 5 på morgonen till frukost. Som ni kan föreställa er, om du har en 24 pund kat...

Göra en Cloud Control sällskapsdjur mataren

Jag har en härlig hund heter Lele, det betyder glad på kinesiska. När jag går till jobbet varje dag, oroa jag alltid sig om han är hungrig. Så gjorde jag den här enheten att hjälpa till att mata Lele när jag är utanför.Jag använder Grove Servo att öp...

LittleBits Remote sällskapsdjur mataren

Away, kontrollera när ditt husdjur (fisk, katt, hund) går aldrig hungrig med denna WiFi-aktiverad feeder. Med detta littleBits projekt, kan du antingen mata ditt husdjur distans genom att trycka på en knapp på telefonen eller automatisera utfodringen...

LEGO MINDSTORMS sällskapsdjur mataren Version 2.0

Att införa den nya LEGO MINDSTORMS sällskapsdjur mataren Version 2.0! Denna skapelse är en förbättring av sin föregångare. Det är samma enhet du känner och älskar, men nu är bättre än någonsin! Vad är nytt du frågar? Låt oss ta en titt!Vad är det sen...

LEGO MINDSTORMS sällskapsdjur mataren

Detta LEGO MINDSTORMS sällskapsdjur mataren är baserad på Pavlovian teorin om klassisk betingning. Klassisk betingning (också Pavlovian conditioning eller respondent betingning) är en typ av lärande som uppstår när en betingad stimulus är parkopplad...

Semester sällskapsdjur mataren från återvunnet material

Om du är en sällskapsdjur ägare, kan gå på semester vara stressande. Du behöver vanligtvis, en vän eller granne att komma över varje dag och mata dina husdjur. Dock genom att förslava robotar kan du hålla din sällskapsdjur glad och njuta av en stress...

RFID-sällskapsdjur mataren

om du har två katter och en av dem är på en diet men andra behöver gratis mat, kan du bygga en matare med RFID-förmåga som endast öppnar för katten som behöver fri tillgång. Gratis-mat katten bär en krage med en RFID-tagg.Funktioner:-En gammal CD-rom...

Croccolino!!! Smart sällskapsdjur mataren (förbättrat)

Lagt till kod förbättringar och kontroller. Nu kan mataren reagera med ljud när pet är i närheten.Maaaaaaaaaaaaaaaaaoooooooowwwwwwww!Har du någonsin varit utanför ditt hem för ett par dagar? Har du någon som kan mata din sällskapsdjur under din frånv...

Croccolino Sällskapsdjur Mataren!

Maaaaaaaaaaaaaaaaaoooooooowwwwwwww!Har du någonsin varit utanför ditt hem för ett par dagar? Har du någon som kan mata din sällskapsdjur under din frånvaro? Eller har du någonsin velat att automatisera utfodring av din sällskapsdjur?CROCCOLINO FEEDER...

Oak topp kök Bar med sällskapsdjur mataren låda och rulla ut papperskorgen

min syster och hennes pojkvän är nya husägaren och hade en lista med projekt att slutföra innan de var redo att gå. De bad mig komma med en mångsidig användning för en skåp bar som inte var till specar. De behövde en sällskapsdjur utfodring station s...

Arduino kontrollerade sällskapsdjur mataren

Detta projekt tillåter husdjur att matas med en konstant hastighet som inte involverar du lyfta mer än ett finger. Det finns en ramp i rutan som gör mat till ange hjulet som drivs av ett servo som distribuerar mat till din sällskapsdjur.Steg 1: lever...

CUSTOM sällskapsdjur MATAREN

jag har 3 katter och utfodra dem var ganska rörigt. Jag hade 3 uppsättningar av inkompatibla skålar och bordstabletter att skydda golvet, och oavsett hur hårt jag försökte hålla det snyggt, området var alltid en röra. Så jag bestämde mig att göra en...

DIY automatisk sällskapsdjur vatten skål filler

denna enkla anordning fylls automatiskt din sällskapsdjur vatten bolle. Perfekt för när du planerar en resa och orolig dina husdjur kanske slut på vatten.Steg 1: Delar som behövs:Med VVS finns ett brett utbud av produkter du kan använda för att göra...

3D tryckt automatisk Walking Robot

När jag letade runt instructables jag kom över denna vandrande robot från crashbot och blev fascinerad av den. Den var så enkel men mycket funktionell. Jag visste från den stunden som jag var tvungen att göra en till mig själv. När ett skolprojekt en...