Automatisk Kyckling Coop dörren (10 / 10 steg)
Steg 10: Arduino koden för automatisk Kyckling Coop dörren
Obs: för en trevligare utsikt över bilder, delar, diagram och koden, vänligen besök:
http://davenaves.com/blog/Interests-projects/Chickens/Chicken-Coop/Arduino-Chicken-Door/
Insider information
För att förhoppningsvis spara lite tid, jag ska släppa in dig på de knep som äntligen fick denna dörr att arbeta med ljusnivåer, debouncing växlarna och * kycklingar *. (som du ser i koden) Kolla ljuset nivåer varje 10 minuter för att undvika de avläsningar som studsar fram och tillbaka mellan mörk/twilight/ljus under dessa gryning/skymning minuter. Sedan, när "dark" nås (för mig valde jag > = 0 & & < = 3 baserat på när mina kycklingar faktiskt gick och stannade i coop) aktiverar motor dir ner > Dämpningstid växlarna > stoppa. Sedan göra motsatsen för morgonen. Jag är säker på att det finns olika, kanske mer effektiva metoder, men denna kod har varit igång felfritt ett tag nu och jag känner mig tillräckligt säker för att gå ut på natten utan att oroa om rovdjur. Även om jag fortfarande på något sätt hitta en anledning att kontrollera ChickenCam från tid till annan. (för närvarande väntar min nya servomotorer och night vision webcam att komma med posten)
bibliotek
< p > / / bibliotek < br >
< /p >< p > #include < SimpleTimer.h > / / läsa in SimpleTimer för att göra timers, istället för förseningar & alltför många millis uttalanden < br > #include < OneWire.h > / / läsa in onewire < /p > / *
(innan du kör skissen, ta bort blanksteg före och efter ovanstående ">" "<" tecken - instructables redaktören ville inte publicera det inkluderar inte jag lagt till dessa utrymmen)
*/
/*
* Copyright 2013, David Naves (http://daveworks.net, < en rel = "nofollow" > http://davenaves.com)
< /a >
*
* Detta program är fri programvara; Du kan vidaredistribuera det och/eller
* ändra den enligt villkoren i GNU General Public License
* som offentliggörs av Free Software Foundation; antingen version 3
* för licensen eller (vid ditt alternativ) någon senare version.
*
* Detta program är distribuerat i hopp om att det kommer att vara användbar,
* men utan garantier; utan att ens underförstådd garanti om
* SÄLJBARHET eller lämplighet för ett visst ändamål. Se den
* GNU General Public License för mer detaljer.
*
* Du bör ha fått en kopia av GNU General Public License
* tillsammans med detta program; om inte, skriv till fri programvara
* Foundation, Inc., 51 Franklin Street, femte våningen, Boston, MA
* 02110-1301, USA.
*/
/*
* Jag hoppas att om du använda/ändra denna kod, du kommer att dela din
* coop projekt med mig och världen (bilder, oavsett)
* Jag är stor delning.
* Skål,
* //D
*/
Pins
CONST int photocellPin = A0; fotocell ansluten till analoga 0
CONST int enableCoopDoorMotorB = 7. Aktivera motor b - stift 7
CONST int directionCloseCoopDoorMotorB = 8; riktning Stäng motor b - stift 8
CONST int directionOpenCoopDoorMotorB = 9; riktning öppna motor b - pin 9
CONST int bottomSwitchPin = 26. nedre växel är ansluten till stift 26
CONST int topSwitchPin = 27. högsta växeln är ansluten till stift 27
vars
fotocell
int photocellReading; analog läsning av photocel
int photocellReadingLevel; photocel läsa nivåer (mörk, twilight, ljus)
Reed växlar upp och ner på coop dörr
övre växel
int topSwitchPinVal; högsta växeln var för att läsa pin status
int topSwitchPinVal2; högsta växeln var för att läsa pin dröjsmål/debounce status
int topSwitchState; Top switch var för att hålla switch staten
nedre växel
int bottomSwitchPinVal; botten switch var för att läsa pin status
int bottomSwitchPinVal2; botten byta var för att läsa pin dröjsmål/debounce status
int bottomSwitchState; botten byta var för att hålla switch staten
behöver bara 1 SimpleTimer objekt
SimpleTimer coopTimer;
// ************************************** the setup **************************************
void setup(void) {
Serial.BEGIN(9600);
välkomstmeddelande
Serial.println ("kontroll doCoopDoor: varje 10 minuter för ljuset nivåer att öppna eller stänga dörren");
Serial.println();
Coop dörr
Coop dörr motor
pinMode (enableCoopDoorMotorB, produktionen); aktiverar motor pin = utgång
pinMode (directionCloseCoopDoorMotorB, produktionen); motoriska nära riktning pin = utgång
pinMode (directionOpenCoopDoorMotorB, produktionen); motoriska öppen riktning pin = utgång
Coop dörren växlar
nedre växel
pinMode (bottomSwitchPin, ingång); ställa in botten switch pin som indata
digitalWrite (bottomSwitchPin, hög); Aktivera botten switch resistor
övre växel
pinMode (topSwitchPin, ingång); ställa in högsta växeln pin som indata
digitalWrite (topSwitchPin, hög); Aktivera topp switch resistor
tidsbestämda åtgärder installationen
coopTimer.setInterval (600000, readPhotoCell); Läs fotocellen varje 10 minuter
}
funktioner
manövrera coop dörren
photocel att läsa nivåer av yttre ljus
void readPhotoCell() {/ / funktion att kallas upprepade gånger - per cooptimer i installationsprogrammet
photocellReading = analogRead(photocellPin);
Serial.Print ("Photocel Analog läsning =");
Serial.println(photocellReading);
Set photocel threshholds
om (photocellReading > = 0 & & photocellReading < = 3) {
photocellReadingLevel = '1';
Serial.Print ("Photocel läsning nivå:");
Serial.println ("- mörk");
} else om (photocellReading > = 4 & & photocellReading < = 120) {
photocellReadingLevel = "2";
Serial.Print ("Photocel läsning nivå:");
Serial.println ("-Twilight");
} else om (photocellReading > = 125) {
photocellReadingLevel = '3';
Serial.Print ("Photocel läsning nivå:");
Serial.println ("- Light");
}
}
Debounce botten reed switch
void debounceBottomReedSwitch() {
Debounce botten reed switch
bottomSwitchPinVal = digitalRead(bottomSwitchPin); Läs indatavärde och lagra den i val
Delay(10);
bottomSwitchPinVal2 = digitalRead(bottomSwitchPin); Läs indatavärde igen för att kontrollera eller studsa
om (bottomSwitchPinVal == bottomSwitchPinVal2) {/ / se till att vi fick 2 konsekvent avläsningar!
om (bottomSwitchPinVal! = bottomSwitchState) {/ / switch staten har förändrats!
bottomSwitchState = bottomSwitchPinVal;
}
Serial.Print ("botten Switch-värde:"); Visa "botten Switch-värde:"
Serial.println(digitalRead(bottomSwitchPin)); Visa aktuella värdet av botten switch;
}
}
Debounce topp reed switch
void debounceTopReedSwitch() {
topSwitchPinVal = digitalRead(topSwitchPin); Läs indatavärde och lagra den i val
Delay(10);
topSwitchPinVal2 = digitalRead(topSwitchPin); Läs indatavärde igen för att kontrollera eller studsa
om (topSwitchPinVal == topSwitchPinVal2) {/ / se till att vi fick 2 konsekvent avläsningar!
om (topSwitchPinVal! = topSwitchState) {/ / knappen staten har förändrats!
topSwitchState = topSwitchPinVal;
}
Serial.Print ("Top Switch-värde:"); Visa "botten Switch-värde:"
Serial.println(digitalRead(topSwitchPin)); Visa aktuella värdet av botten switch;
}
}
stoppa coop dörr motor
void stopCoopDoorMotorB() {
digitalWrite (directionCloseCoopDoorMotorB, låg); Stäng av motor nära riktning
digitalWrite (directionOpenCoopDoorMotorB, låg); slå på motor öppen riktning
analogWrite (enableCoopDoorMotorB, 0); Aktivera motor, 0 hastighet
}
nära coop dörr motor (motorisk dir nära = medurs)
void closeCoopDoorMotorB() {
digitalWrite (directionCloseCoopDoorMotorB, hög); slå på motor nära riktning
digitalWrite (directionOpenCoopDoorMotorB, låg); Stäng av motor öppen riktning
analogWrite (enableCoopDoorMotorB, 255); möjliggöra motor, full fart
om (bottomSwitchPinVal == 0) {/ / om botten reed switch krets är stängd
stopCoopDoorMotorB();
Serial.Print ("Coop dörren stängd - ingen fara");
}
}
öppna dörren coop (motor dir öppen = motsols)
void openCoopDoorMotorB() {
digitalWrite (directionCloseCoopDoorMotorB, låg); Stäng av motor nära riktning
digitalWrite (directionOpenCoopDoorMotorB, hög); slå på motor öppen riktning
analogWrite (enableCoopDoorMotorB, 255); möjliggöra motor, full fart
om (topSwitchPinVal == 0) {/ / om topp reed switch krets är stängd
stopCoopDoorMotorB();
Serial.Print ("Coop dörren öppen - fara!");
}
}
void doCoopDoor() {
om (photocellReadingLevel == '1') {/ / om det är mörkt
om (photocellReadingLevel! = "2") {/ / om det inte är twilight
om (photocellReadingLevel! = "3") {/ / om det inte är lätt
debounceTopReedSwitch(); läsa och Dämpningstid växlarna
debounceBottomReedSwitch();
closeCoopDoorMotorB(); stänga dörren
}
}
}
om (photocellReadingLevel == "3") {/ / om det är ljus
om (photocellReadingLevel! = "2") {/ / om det inte är twilight
om (photocellReadingLevel! = '1') {/ / om det inte är mörkt
debounceTopReedSwitch(); läsa och Dämpningstid växlarna
debounceBottomReedSwitch();
openCoopDoorMotorB(); Öppna dörren
}
}
}
}
// ************************************** the loop **************************************
void loop() {
röstningen sker
coopTimer.run();
doCoopDoor();
}
Lärdomar
Vad jag har lärt mig om dörren, Arduino, ljus och konstruktion:
- Bäst att kolla ljusnivåer varje 10 minuter för att undvika de avläsningar som studsar fram och tillbaka mellan mörk/twilight/ljus under dessa gryning/skymning minuter
- Testa din dörr med din kycklingar för att se om någon av dem gillar att hänga utanför efter timmar
- Testa de faktiska ljus värdena utanför är mycket viktigt (många variabler inblandade: ljus från grannes hus, moln, intern/extern coop lyser etc.)
- Debouncing av din växlar inom din Arduino kod är viktigt (dörren kommer att hoppa runt och misslyckas som elektroniska avläsningar varierar mycket av vilken millisekund)
- Nå ut till hjälp på Arduino forum innan du drar ut håret. (vara trevligt, gör dina läxor och ställa specifika frågor)
- Jag ändrade från joystickens mikrobrytare till reed växlar (magneter) eftersom jag inte ville mekaniken i mikro-brytarna misslyckas över tid
Vad jag har lärt mig om kycklingar:
- Att hålla på en ljus inom coop kan hålla kycklingar utanför längre (jag tror b/c de omgivande ljus skiner utanför) och det är viktigt när det gäller att automatisera denna dörr, så de inte kommer få av misstag låst.
- De kan hoppa och flyga (högt och långt)
- De älskar att hönshus i säkerhet på natten, men vill inget mer än att få ut så snart det är ljus ut