Arduino justerbar sällskapsdjur mat Dispenser (3 / 4 steg)
Steg 3: kod
Detta är koden för arduino. Denna kod kontrollerar tid och jämför det med larm, om de matchar upp det kommer att vända motorn, trycka maten ut. För att räkna ut hur länge motorn ska vända för, arbetade vi fram hur mycket mat är befriaren för varje varv. En tur i en skruv pushteknik 10g och varje rotation tar 11 sekunder. Därför kommer att 2 skruvarna driva 20g var 11 sekunder. Vi utforskade hund Matportioner och arbetade att en liten hund behövde ca 50g av mat, ett medelstort behöver 140g och en stor behöver ca 260g. Detta innebär att för en liten del skruven vänder 27.5 sekunder, en medelstor portion vänder för ca 77 sekunder och en stor i 141 sekunder.
Beroende på den mat du använder kan du ändra detta. Du kan vanligtvis hitta korrekt portionr på baksidan av förpackningen. Kom ihåg att tidsskalan i arduino IDE i millisekunder. ((recommended portions size)/20) * 11 = tiden cog bör tur bibliotekets som vi alla kan hittas på webbplatsen för arduino de kallas time.h, DS1307RTC.h. De andra två är redan installerade i Arduino IDE. https://www.Arduino.cc/en/reference/libraries
bibliotek:
#include
#include / / behövs för RTC libraty
#include
#include / / verklig tid klocka bibliotek
LCD-setup
LiquidCrystal lcd (12, 11, 5, 8, 7, 6);
flyktiga boolean TurnDetected; Tillåter oss att använda & & uttalanden
flyktiga booleska upp;
Setup pin heltal
CONST int PinCLK = 2; Används för att generera avbrott med CLK signal
CONST int PinDT = 3; Används för att läsa DT signal
CONST int PinSW = 4; Används för växeln tryckknapp för Rotary Encoder
CONST int buttonPin = A3;
CONST int motorPin1 = 10;
CONST int motorPin2 = 13. numrera av tryckknapp PIN-koden för manuell matning 13
Setup-knappen
int buttonState = 0;
Omställningstiden mat förbestämda
int feed1hour = 10;
int feed1minute = 30.
int feed2hour = 17;
int feed2minute = 30.
setup mat belopp
int feedQty = 1;
Installationsprogrammet för LED
int LED1 = 0;
int LED2 = 1;
int LED3 = 9;
Ställ in tid
int tm. Timme = 1;
int tm. Minut = 1;
int tm. Timme = 1
void isr () {
om (digitalRead(PinCLK)) //setup för klicket på rotary encoder
upp = digitalRead(PinDT);
annat
upp =! digitalRead(PinDT);
TurnDetected = sant;
}
Ogiltiga inställningar () {
inställning av tid
Installationsprogrammet för LED
pinMode (LED1, OUTPUT);
pinMode (LED2, OUTPUT);
pinMode (LED3, OUTPUT);
Ange den LCD antal kolumner och rader:
LCD.BEGIN (16, 2);
setup Rotary encoder
pinMode(PinCLK,INPUT);
pinMode(PinDT,INPUT);
pinMode(PinSW,INPUT);
pinMode (buttonPin, ingång);
attachInterrupt (0, isr, faller); avbryta 0 alltid är ansluten till stift 2 på Arduino UNO
lcd.setCursor(17,0);
LCD.Print ("Tom & dans hund"); startskärm
lcd.setCursor(17,1);
LCD.Print ("mat Dispenser");
för (int positionCounter = 0; positionCounter < 17; positionCounter ++) {
Bläddra en position åt vänster:
lcd.scrollDisplayLeft();
vänta lite:
Delay(150);
}
Delay(3000);
för (int positionCounter = 0; positionCounter < 17; positionCounter ++) {
Bläddra en position åt vänster:
lcd.scrollDisplayRight();
vänta lite:
Delay(150);
}
lcd.setCursor(17,0);
LCD.Print("");
lcd.setCursor(17,1);
LCD.Print("");
}
Ogiltig loop () {//Main program loop - de flesta saker här!
statiska lång virtualPosition = 0; utan STATIC räknas det inte korrekt!
tmElements_t tm; Denna sectionm läser tiden från RT, då visar den.
RTC.read(tm);
lcd.setCursor (0, 0);
printDigits (tm. Timme). Ring för att skriva ut siffran funktion som lägger till inledande nollor som saknas kan vara
LCD.Print(":");
printDigits (tm. Minut).
LCD.Print(":");
printDigits (tm. Andra).
LCD.Print("");
LCD.Print ("storlek");
LCD.Print(feedQty);
LCD.Print("");
lcd.setCursor(0,1);
LCD.Print("1)");
printDigits(feed1hour);
LCD.Print(":");
printDigits(feed1minute);
LCD.Print ("2)");
printDigits(feed2hour);
LCD.Print(":");
printDigits(feed2minute);
om (! () digitalRead(PinSW))) {/ / kolla om tryckknapp trycks
Om ja ange programmering subrutinen
LCD.Blink(); Aktivera den blinkande markören:
lcd.setCursor(5,0);
LCD.Print ("SET");
virtualPosition = tm. Timme; behövs eller timmen blir noll varje gång du ändra klockan.
göra {
lcd.setCursor(0,0); Placera markören på tid timme
Delay(500); Dröjsmål behövs eller samma knapptryckning avslutas göra-samtidigt som tag kontroll för en annan knapp push!
om (TurnDetected) {/ / gör detta endast om rotation upptäcktes
IF (upp)
virtualPosition--;
annat
virtualPosition ++;
TurnDetected = false; INTE upprepa om loop tills nya rotation upptäckt
}
Här ändra jag timmen av tid-
TM. Timme = virtualPosition;
RTC.write(tm);
lcd.setCursor (0, 0);
printDigits (tm. Timme). sedan åter skriva ut timmen på LCD
} medan ((digitalRead(PinSW))); gör detta "gör" loop medan PinSW knappen inte trycks
lcd.noBlink();
Delay(1000);
ANGE MINS
LCD.Blink(); Aktivera den blinkande markören:
virtualPosition = tm. Minut. behövs eller i minuten blir noll varje gång du ändra klockan.
göra {
lcd.setCursor(3,0); Placera markören på tid Mins
Delay(500); Dröjsmål behövs eller samma knapptryckning avslutas göra-samtidigt som tag kontroll för en annan knapp push!
om (TurnDetected) {/ / gör detta endast om rotation upptäcktes
IF (upp)
virtualPosition--;
annat
virtualPosition ++;
TurnDetected = false; INTE upprepa om loop tills nya rotation upptäckt
}
Här ändra jag min tid-
TM. Minut = virtualPosition;
RTC.write(tm);
lcd.setCursor (3, 0);
printDigits (tm. Minut). sedan åter skriva ut min på LCD-skärmen
} medan ((digitalRead(PinSW)));
lcd.noBlink();
Delay(1000);
Ange antal - foder kvantitet
LCD.Blink(); Aktivera den blinkande markören:
virtualPosition = feedQty; behövs eller antal kommer att vara noll.
göra {
lcd.setCursor(14,0); Placera markören på Kvt
Delay(500); Dröjsmål behövs eller samma knapptryckning avslutas göra-samtidigt som tag kontroll för en annan knapp push!
om (TurnDetected) {/ / gör detta endast om rotation upptäcktes
IF (upp)
virtualPosition--;
annat
virtualPosition ++;
TurnDetected = false; INTE upprepa om loop tills nya rotation upptäckt
}
Här ändra jag den foder Kvt
feedQty = virtualPosition;
lcd.setCursor (14, 0);
LCD.Print(feedQty);
} medan ((digitalRead(PinSW)));
lcd.noBlink();
Delay(1000);
Ställa in Feed1 timmen
LCD.Blink(); Aktivera den blinkande markören:
virtualPosition = feed1hour; behövs eller kommer att vara noll till att börja med.
göra {
lcd.setCursor(2,1); Placera markören på feed1hour
Delay(500); Dröjsmål behövs eller samma knapptryckning avslutas göra-samtidigt som tag kontroll för en annan knapp push!
om (TurnDetected) {/ / gör detta endast om rotation upptäcktes
IF (upp)
virtualPosition--;
annat
virtualPosition ++;
TurnDetected = false; INTE upprepa om loop tills nya rotation upptäckt
}
Här ändra jag feed1 timme
feed1hour = virtualPosition;
lcd.setCursor(2,1);
printDigits(feed1hour);
} medan ((digitalRead(PinSW)));
lcd.noBlink();
Delay(1000);
Ange Feed1 Mins
LCD.Blink(); Aktivera den blinkande markören:
virtualPosition = feed1minute; behövs eller kommer att vara noll till att börja med.
göra {
lcd.setCursor(5,1); Placera markören på feed1minute
Delay(500); Dröjsmål behövs eller samma knapptryckning avslutas göra-samtidigt som tag kontroll för en annan knapp push!
om (TurnDetected) {/ / gör detta endast om rotation upptäcktes
IF (upp)
virtualPosition--;
annat
virtualPosition ++;
TurnDetected = false; INTE upprepa om loop tills nya rotation upptäckt
}
Här ändra jag i feed1 minuten
feed1minute = virtualPosition;
lcd.setCursor(5,1);
printDigits(feed1minute);
} medan ((digitalRead(PinSW)));
lcd.noBlink();
Delay(1000);
Ställa in Feed2 timmen
LCD.Blink(); Aktivera den blinkande markören:
virtualPosition = feed2hour; behövs eller kommer att vara noll till att börja med.
göra {
lcd.setCursor(10,1); Placera markören på feed1hour
Delay(500); Dröjsmål behövs eller samma knapptryckning avslutas göra-samtidigt som tag kontroll för en annan knapp push!
om (TurnDetected) {/ / gör detta endast om rotation upptäcktes
IF (upp)
virtualPosition--;
annat
virtualPosition ++;
TurnDetected = false; INTE upprepa om loop tills nya rotation upptäckt
}
Här ändra jag feed1 timme
feed2hour = virtualPosition;
lcd.setCursor(10,1);
printDigits(feed2hour);
} medan ((digitalRead(PinSW)));
lcd.noBlink();
Delay(1000);
Ange Feed2 Mins
LCD.Blink(); Aktivera den blinkande markören:
virtualPosition = feed2minute; behövs eller kommer att vara noll till att börja med.
göra {
lcd.setCursor(13,1); Placera markören på feed1minute
Delay(500); Dröjsmål behövs eller samma knapptryckning avslutas göra-samtidigt som tag kontroll för en annan knapp push!
om (TurnDetected) {/ / gör detta endast om rotation upptäcktes
IF (upp)
virtualPosition--;
annat
virtualPosition ++;
TurnDetected = false; INTE upprepa om loop tills nya rotation upptäckt
}
Här ändra jag i feed1 minuten
feed2minute = virtualPosition;
lcd.setCursor(13,1);
printDigits(feed2minute);
} medan ((digitalRead(PinSW)));
lcd.noBlink();
Delay(1000);
} / / end för huvudsakliga om rotationsencoder tryckknapp checker
CHECK FÖR MANUELL MATNING KNAPP
buttonState = digitalRead(buttonPin);
om (buttonState == hög) {
digitalWrite (motorPin1, hög);
digitalWrite (motorPin2, låg);
Delay(5000);
digitalWrite (motorPin1, låg);
digitalWrite (motorPin2, låg);
}
NÄR UTFODRINGEN TID OCH FODER OM MATCHAS
om (tm. Timme == feed1hour & & tm. Minut == feed1minute & & tm. För det andra == 0 & & feedQty == 1) {/ / om jag inte "kontrollera sekunder är noll
digitalWrite (motorPin1, hög);
digitalWrite (motorPin2, låg);
Delay(5000);
digitalWrite (motorPin1, låg);
digitalWrite (motorPin2, låg);
}
om (tm. Timme == feed1hour & & tm. Minut == feed1minute & & tm. För det andra == 0 & & feedQty == 2) {/ / om jag inte "kontrollera sekunder är noll
digitalWrite (motorPin1, hög);
digitalWrite (motorPin2, låg);
Delay(10000);
digitalWrite (motorPin1, låg);
digitalWrite (motorPin2, låg);
}
om (tm. Timme == feed1hour & & tm. Minut == feed1minute & & tm. För det andra == 0 & & feedQty == 3) {/ / om jag inte "kontrollera sekunder är noll
digitalWrite (motorPin1, hög);
digitalWrite (motorPin2, låg);
Delay(15000);
digitalWrite (motorPin1, låg);
digitalWrite (motorPin2, låg);
}
om (tm. Timme == feed2hour & & tm. Minut == feed2minute & & tm. För det andra == 0 & & feedQty == 1) {
digitalWrite (motorPin1, hög);
digitalWrite (motorPin2, låg);
Delay(27500);
digitalWrite (motorPin1, låg);
digitalWrite (motorPin2, låg);
}
om (tm. Timme == feed2hour & & tm. Minut == feed2minute & & tm. För det andra == 0 & & feedQty == 2) {
digitalWrite (motorPin1, hög);
digitalWrite (motorPin2, låg);
Delay(77000);
digitalWrite (motorPin1, låg);
digitalWrite (motorPin2, låg);
}
om (tm. Timme == feed2hour & & tm. Minut == feed2minute & & tm. För det andra == 0 & & feedQty == 3) {
digitalWrite (motorPin1, hög);
digitalWrite (motorPin2, låg);
Delay(141000);
digitalWrite (motorPin1, låg);
digitalWrite (motorPin2, låg);
}
LED-inställningar
om (feedQty == 1) {
digitalWrite (LED1, hög);
digitalWrite (LED2, låg);
digitalWrite (LED3, låg);
}
om (feedQty == 2) {
digitalWrite (LED1, låg);
digitalWrite (LED2, hög);
digitalWrite (LED3, låg);
}
om (feedQty == 3) {
digitalWrite (LED1, låg);
digitalWrite (LED2, låg);
digitalWrite (LED3, hög);
}
} / / End av huvudloop
void printDigits (int siffror) {/ / utility funktion för digital klockdisplay: utskrifter leder 0
IF(digits < 10)
LCD.Print('0');
LCD.Print(digits);
}
void feed() {
lcd.setCursor(17,0);
LCD.Print ("Extra foder!");
för (int positionCounter = 0; positionCounter < 16; positionCounter ++) {
Bläddra en position åt vänster:
lcd.scrollDisplayLeft();
vänta lite:
Delay(150);
}
}