Stap 3: Code
Dit is de code voor de arduino. Deze code controleert de tijd en vergelijkt het met de alarmen, als zij overeenkomen met het zal veranderen de motor, het voedsel te duwen. Om te trainen hoe lang de motor moet wenden voor, die we uitgewerkt hoe veel voedsel wordt vrijgegeven voor elke beurt. Een beurt van een schroef geduwd 10g en elke rotatie duurt 11 seconden. Daarom zal 2 schroeven 20g elke 11 seconden duwen. We hond voedsel delen onderzocht en uitgewerkt dat een kleine hond ongeveer 50g van voedsel nodig, een middelgrote 140g en een grote moet ongeveer 260g. Dit betekent dat voor een klein deel die de schroef 27.5 seconden draait, een middelgrote gedeelte voor ongeveer 77 seconden en een groot ongeveer 141 seconden draait.
Afhankelijk van het voedsel u kunt u om dit te veranderen. Meestal kunt u de juiste porties op de achterkant van de verpakking. Vergeet niet dat de tijdschaal in de arduino IDE in milliseconden. ((Recommended Portions size)/20) * 11 = de lengte van de tijd de Kogge moet beurt van de bibliotheek waarmee we allemaal kan worden gevonden op de arduino website, ze heten time.h, DS1307RTC.h. De andere twee zijn al geïnstalleerd in de Arduino IDE. https://www.Arduino.CC/en/Reference/libraries
van de bibliotheek:
#include
#include / / die nodig zijn voor de RTC-libraty
#include
#include / / real-time klok bibliotheek
LCD setup
LiquidCrystal lcd (12, 11, 5, 8, 7, 6);
vluchtige Booleaanse TurnDetected; Ons toestaat te gebruiken & & verklaringen
vluchtige Booleaanse omhoog;
Setup pin gehele getallen
Const int PinCLK = 2; Gebruikt voor het genereren van interrupts met behulp van CLK signaal
Const int PinDT = 3; Gebruikt voor het lezen van DT signaal
Const int PinSW = 4; Gebruikt voor de Drukknopschakelaar van de Rotary-Encoder
Const int buttonPin = A3;
Const int motorPin1 = 10;
Const int motorPin2 = 13; het nummer van de drukknop pin voor manual feed 13
knop instellen
int buttonState = 0;
Insteltijd voedsel verstrekking
int feed1hour = 10;
int feed1minute = 30;
int feed2hour = 17;
int feed2minute = 30;
Setup voedsel bedrag
int feedQty = 1;
LED installatie
int LED1 = 0;
int LED2 = 1;
int LED3 = 9;
tijdinstelling
int tm. Uur = 1;
int tm. Minute = 1;
int tm. Uur = 1
VOID isr () {}
Als (digitalRead(PinCLK)) //setup voor de Klik op de roterende encoder
omhoog = digitalRead(PinDT);
anders
omhoog =! digitalRead(PinDT);
TurnDetected = true;
}
void setup () {}
tijd instellen
LED installatie
pinMode (LED1, uitvoer);
pinMode (LED2, uitvoer);
pinMode (LED3, uitvoer);
de LCD's aantal kolommen en rijen instellen:
LCD.begin (16, 2);
Setup de Rotary encoder
pinMode(PinCLK,INPUT);
pinMode(PinDT,INPUT);
pinMode(PinSW,INPUT);
pinMode (buttonPin, INPUT);
attachInterrupt (0, isr, vallen); Interrupt 0 is altijd verbonden met pin 2 op Arduino UNO
lcd.setCursor(17,0);
LCD.Print ("Tom & Dan's Dog"); opstartscherm
lcd.setCursor(17,1);
LCD.Print ("snackautomaat");
voor (int positionCounter = 0; positionCounter < 17; positionCounter ++) {}
Scroll één positie links:
lcd.scrollDisplayLeft();
wachten een beetje:
delay(150);
}
delay(3000);
voor (int positionCounter = 0; positionCounter < 17; positionCounter ++) {}
Scroll één positie links:
lcd.scrollDisplayRight();
wachten een beetje:
delay(150);
}
lcd.setCursor(17,0);
LCD.Print("");
lcd.setCursor(17,1);
LCD.Print("");
}
void loop () {//Main programma lus - de meeste dingen hier!
statische lange virtualPosition = 0; zonder STATIC telt het niet correct!
tmElements_t tm; Deze sectionm leest de tijd van de RT, dan wordt deze weergegeven.
RTC.read(tm);
lcd.setCursor (0, 0);
printDigits (tm. Uur); oproep tot het cijfer functie die voegt voorloopnullen die mogelijk ontbrekende print
LCD.Print(":");
printDigits (tm. Minuut);
LCD.Print(":");
printDigits (tm. Seconde);
LCD.Print("");
LCD.Print ("grootte");
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);
Als (! () digitalRead(PinSW))) {/ / controleren als de drukknop wordt ingedrukt
Als ja, voert de programmering subroutine
LCD.Blink(); De knipperende cursor inschakelen:
lcd.setCursor(5,0);
LCD.Print ("SET");
virtualPosition = tm. Uur; nodig of het uur nul telkens wanneer u de klok wijzigt zal worden.
{}
lcd.setCursor(0,0); plaats de cursor op tijd uur
delay(500); Vertraging nodig of dezelfde knop drukt zal verlaten doen-terwijl als tijdje controleert voor een andere knop duwen!
Als (TurnDetected) {/ / doe dit alleen als rotatie werd ontdekt
Als (omhoog)
virtualPosition--;
anders
virtualPosition ++;
TurnDetected = false; NIET als lus herhalen tot nieuwe rotatie gedetecteerd
}
Hier wijzigen ik het uur van de tijd-
TM. Uur = virtualPosition;
RTC.write(tm);
lcd.setCursor (0, 0);
printDigits (tm. Uur); drukt u opnieuw het uur op het LCD-scherm
} terwijl ((digitalRead(PinSW))); ken dit "doen" lus terwijl de PinSW knop is niet ingedrukt
lcd.noBlink();
delay(1000);
STEL DE MINUTEN
LCD.Blink(); De knipperende cursor inschakelen:
virtualPosition = tm. Minuut; nodig of de minuut zullen nul telkens wanneer u de klok wijzigt.
{}
lcd.setCursor(3,0); plaats de cursor op tijd minuten
delay(500); Vertraging nodig of dezelfde knop drukt zal verlaten doen-terwijl als tijdje controleert voor een andere knop duwen!
Als (TurnDetected) {/ / doe dit alleen als rotatie werd ontdekt
Als (omhoog)
virtualPosition--;
anders
virtualPosition ++;
TurnDetected = false; NIET als lus herhalen tot nieuwe rotatie gedetecteerd
}
Hier veranderen ik de min tijd-
TM. Minuten = virtualPosition;
RTC.write(tm);
lcd.setCursor (3, 0);
printDigits (tm. Minuut); Druk opnieuw op de min op het LCD-scherm
} terwijl ((digitalRead(PinSW)));
lcd.noBlink();
delay(1000);
INSTELLEN van het aantal - Feed hoeveelheid
LCD.Blink(); De knipperende cursor inschakelen:
virtualPosition = feedQty; nodig, of het aantal zal gelijk zijn aan nul.
{}
lcd.setCursor(14,0); plaats de cursor op de hoeveelheid
delay(500); Vertraging nodig of dezelfde knop drukt zal verlaten doen-terwijl als tijdje controleert voor een andere knop duwen!
Als (TurnDetected) {/ / doe dit alleen als rotatie werd ontdekt
Als (omhoog)
virtualPosition--;
anders
virtualPosition ++;
TurnDetected = false; NIET als lus herhalen tot nieuwe rotatie gedetecteerd
}
Hier wijzigen ik de feed aantal
feedQty = virtualPosition;
lcd.setCursor (14, 0);
LCD.Print(feedQty);
} terwijl ((digitalRead(PinSW)));
lcd.noBlink();
delay(1000);
HET uur in diervoeders1
LCD.Blink(); De knipperende cursor inschakelen:
virtualPosition = feed1hour; nodig of zullen om te beginnen met nul.
{}
lcd.setCursor(2,1); plaats de cursor op de feed1hour
delay(500); Vertraging nodig of dezelfde knop drukt zal verlaten doen-terwijl als tijdje controleert voor een andere knop duwen!
Als (TurnDetected) {/ / doe dit alleen als rotatie werd ontdekt
Als (omhoog)
virtualPosition--;
anders
virtualPosition ++;
TurnDetected = false; NIET als lus herhalen tot nieuwe rotatie gedetecteerd
}
Hier veranderen ik het diervoeders1 uur
feed1hour = virtualPosition;
lcd.setCursor(2,1);
printDigits(feed1hour);
} terwijl ((digitalRead(PinSW)));
lcd.noBlink();
delay(1000);
INSTELLEN van de diervoeders1 minuten
LCD.Blink(); De knipperende cursor inschakelen:
virtualPosition = feed1minute; nodig of zullen om te beginnen met nul.
{}
lcd.setCursor(5,1); plaats de cursor op de feed1minute
delay(500); Vertraging nodig of dezelfde knop drukt zal verlaten doen-terwijl als tijdje controleert voor een andere knop duwen!
Als (TurnDetected) {/ / doe dit alleen als rotatie werd ontdekt
Als (omhoog)
virtualPosition--;
anders
virtualPosition ++;
TurnDetected = false; NIET als lus herhalen tot nieuwe rotatie gedetecteerd
}
Hier veranderen ik de diervoeders1 minuut
feed1minute = virtualPosition;
lcd.setCursor(5,1);
printDigits(feed1minute);
} terwijl ((digitalRead(PinSW)));
lcd.noBlink();
delay(1000);
HET uur in Feed2
LCD.Blink(); De knipperende cursor inschakelen:
virtualPosition = feed2hour; nodig of zullen om te beginnen met nul.
{}
lcd.setCursor(10,1); plaats de cursor op de feed1hour
delay(500); Vertraging nodig of dezelfde knop drukt zal verlaten doen-terwijl als tijdje controleert voor een andere knop duwen!
Als (TurnDetected) {/ / doe dit alleen als rotatie werd ontdekt
Als (omhoog)
virtualPosition--;
anders
virtualPosition ++;
TurnDetected = false; NIET als lus herhalen tot nieuwe rotatie gedetecteerd
}
Hier veranderen ik het diervoeders1 uur
feed2hour = virtualPosition;
lcd.setCursor(10,1);
printDigits(feed2hour);
} terwijl ((digitalRead(PinSW)));
lcd.noBlink();
delay(1000);
INSTELLEN van de Feed2 minuten
LCD.Blink(); De knipperende cursor inschakelen:
virtualPosition = feed2minute; nodig of zullen om te beginnen met nul.
{}
lcd.setCursor(13,1); plaats de cursor op de feed1minute
delay(500); Vertraging nodig of dezelfde knop drukt zal verlaten doen-terwijl als tijdje controleert voor een andere knop duwen!
Als (TurnDetected) {/ / doe dit alleen als rotatie werd ontdekt
Als (omhoog)
virtualPosition--;
anders
virtualPosition ++;
TurnDetected = false; NIET als lus herhalen tot nieuwe rotatie gedetecteerd
}
Hier veranderen ik de diervoeders1 minuut
feed2minute = virtualPosition;
lcd.setCursor(13,1);
printDigits(feed2minute);
} terwijl ((digitalRead(PinSW)));
lcd.noBlink();
delay(1000);
} / / einde van belangrijkste als roterende encoder drukknop checker
SELECTIEVAKJE VOOR HANDMATIGE FEED BUTTON
buttonState = digitalRead(buttonPin);
Als (buttonState == HIGH) {}
digitalWrite (motorPin1, hoge);
digitalWrite (motorPin2, laag);
delay(5000);
digitalWrite (motorPin1, laag);
digitalWrite (motorPin2, laag);
}
CONTROLEER VOEDERTIJD EN DIERVOEDERS ALS VOLDAAN
Als (tm. Uur == feed1hour & & tm. Minuut == feed1minute & & tm. Tweede == 0 & & feedQty == 1) {/ / als ik niet ' controleren seconden zijn nul
digitalWrite (motorPin1, hoge);
digitalWrite (motorPin2, laag);
delay(5000);
digitalWrite (motorPin1, laag);
digitalWrite (motorPin2, laag);
}
Als (tm. Uur == feed1hour & & tm. Minuut == feed1minute & & tm. Tweede == 0 & & feedQty == 2) {/ / als ik niet ' controleren seconden zijn nul
digitalWrite (motorPin1, hoge);
digitalWrite (motorPin2, laag);
delay(10000);
digitalWrite (motorPin1, laag);
digitalWrite (motorPin2, laag);
}
Als (tm. Uur == feed1hour & & tm. Minuut == feed1minute & & tm. Tweede == 0 & & feedQty == 3) {/ / als ik niet ' controleren seconden zijn nul
digitalWrite (motorPin1, hoge);
digitalWrite (motorPin2, laag);
delay(15000);
digitalWrite (motorPin1, laag);
digitalWrite (motorPin2, laag);
}
Als (tm. Uur == feed2hour & & tm. Minuut == feed2minute & & tm. Tweede == 0 & & feedQty == 1) {}
digitalWrite (motorPin1, hoge);
digitalWrite (motorPin2, laag);
delay(27500);
digitalWrite (motorPin1, laag);
digitalWrite (motorPin2, laag);
}
Als (tm. Uur == feed2hour & & tm. Minuut == feed2minute & & tm. Tweede == 0 & & feedQty == 2) {}
digitalWrite (motorPin1, hoge);
digitalWrite (motorPin2, laag);
delay(77000);
digitalWrite (motorPin1, laag);
digitalWrite (motorPin2, laag);
}
Als (tm. Uur == feed2hour & & tm. Minuut == feed2minute & & tm. Tweede == 0 & & feedQty == 3) {}
digitalWrite (motorPin1, hoge);
digitalWrite (motorPin2, laag);
delay(141000);
digitalWrite (motorPin1, laag);
digitalWrite (motorPin2, laag);
}
LED-instellingen
Als (feedQty == 1) {}
digitalWrite (LED1, hoge);
digitalWrite (LED2, laag);
digitalWrite (LED3, laag);
}
Als (feedQty == 2) {}
digitalWrite (LED1, laag);
digitalWrite (LED2, hoge);
digitalWrite (LED3, laag);
}
Als (feedQty == 3) {}
digitalWrite (LED1, laag);
digitalWrite (LED2, laag);
digitalWrite (LED3, hoge);
}
} / / Einde van de hoofdlus
VOID printDigits (int cijfers) {/ / utility functie voor digitale klokvertoning: prenten 0 voorsprong
if(digits < 10)
LCD.Print('0');
LCD.Print(digits);
}
Ongeldig feed() {}
lcd.setCursor(17,0);
LCD.Print ("Extra Feed!");
voor (int positionCounter = 0; positionCounter < 16; positionCounter ++) {}
Scroll één positie links:
lcd.scrollDisplayLeft();
wachten een beetje:
delay(150);
}
}