Paso 10: El código de Arduino para la puerta de Coop de pollo automática
Nota: para una mejor visión de las imágenes, partes, diagramas y código, por favor visite:
http://davenaves.com/blog/interests-Projects/chickens/Chicken-Coop/Arduino-Chicken-Door/
Información privilegiada
Para que guardar algún tiempo, voy a dejar el truco que finalmente consiguió esta puerta para trabajar con los niveles de luz, contra rebotes los interruptores y * pollos *. (como verás en el código) Compruebe los niveles de luz cada 10 minutos para evitar las lecturas que despide hacia adelante y hacia atrás entre amanecer/anochecer de oscuro/Crepúsculo/luz durante esos minutos. Entonces, cuando "dark" se ha alcanzado (para mí escogí > = 0 & & < = 3 en base cuando mis gallinas realmente pasaban y me alojé en el tonel) habilitar dir motor abajo > debounce los interruptores > detener. Luego hacer lo contrario para mañana. Estoy seguro que allí son diferentes, tal vez más eficientes métodos, pero este código ha estado funcionando perfectamente durante un tiempo ahora y me siento suficiente confianza para salir de noche sin preocuparse por los depredadores. Aunque de alguna manera todavía encontrar una razón para comprobar la ChickenCam de vez en cuando. (actualmente en espera de mi nuevo servomotores y webcam de visión nocturna para llegar en el correo)
// libraries <p>// libraries<br> </p><p>#include < SimpleTimer.h > // load the SimpleTimer library to make timers, instead of delays & too many millis statements<br> #include < OneWire.h > // load the onewire library</p>/* (before running the sketch, remove spaces before and after the above ">" "<" characters - the instructables editor wouldn't publish the includes unless i added those spaces) */ /* * Copyright 2013, David Naves (http://daveworks.net, <a rel="nofollow"> http://davenaves.com) </a> * * This program is free software; you can redistribute it and/or * modify it under the terms of the GNU General Public License * as published by the Free Software Foundation; either version 3 * of the License, or (at your option) any later version. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this program; if not, write to the Free Software * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA * 02110-1301, USA. */ /* * I'm hoping that if you use/modify this code, you will share your * coop project with me and the world (pictures, whatever) * I'm big on sharing. * Cheers, * //D */ //pins const int photocellPin = A0; // photocell connected to analog 0 const int enableCoopDoorMotorB = 7; // enable motor b - pin 7 const int directionCloseCoopDoorMotorB = 8; // direction close motor b - pin 8 const int directionOpenCoopDoorMotorB = 9; // direction open motor b - pin 9 const int bottomSwitchPin = 26; // bottom switch is connected to pin 26 const int topSwitchPin = 27; // top switch is connected to pin 27 // vars // photocell int photocellReading; // analog reading of the photocel int photocellReadingLevel; // photocel reading levels (dark, twilight, light) // reed switches top and bottom of coop door // top switch int topSwitchPinVal; // top switch var for reading the pin status int topSwitchPinVal2; // top switch var for reading the pin delay/debounce status int topSwitchState; // top switch var for to hold the switch state // bottom switch int bottomSwitchPinVal; // bottom switch var for reading the pin status int bottomSwitchPinVal2; // bottom switch var for reading the pin delay/debounce status int bottomSwitchState; // bottom switch var for to hold the switch state // just need 1 SimpleTimer object SimpleTimer coopTimer; // ************************************** the setup ************************************** void setup(void) { Serial.begin(9600); // welcome message Serial.println(" Checking doCoopDoor: every 10 minutes for light levels to open or close door"); Serial.println(); // coop door // coop door motor pinMode (enableCoopDoorMotorB, OUTPUT); // enable motor pin = output pinMode (directionCloseCoopDoorMotorB, OUTPUT); // motor close direction pin = output pinMode (directionOpenCoopDoorMotorB, OUTPUT); // motor open direction pin = output // coop door switches // bottom switch pinMode(bottomSwitchPin, INPUT); // set bottom switch pin as input digitalWrite(bottomSwitchPin, HIGH); // activate bottom switch resistor // top switch pinMode(topSwitchPin, INPUT); // set top switch pin as input digitalWrite(topSwitchPin, HIGH); // activate top switch resistor // timed actions setup coopTimer.setInterval(600000, readPhotoCell); // read the photocell every 10 minutes } // functions // operate the coop door // photocel to read levels of exterior light void readPhotoCell() { // function to be called repeatedly - per cooptimer set in setup photocellReading = analogRead(photocellPin); Serial.print(" Photocel Analog Reading = "); Serial.println(photocellReading); // set photocel threshholds if (photocellReading >= 0 && photocellReading <= 3) { photocellReadingLevel = '1'; Serial.print(" Photocel Reading Level:"); Serial.println(" - Dark"); } else if (photocellReading >= 4 && photocellReading <= 120){ photocellReadingLevel = '2'; Serial.print(" Photocel Reading Level:"); Serial.println(" - Twilight"); } else if (photocellReading >= 125 ) { photocellReadingLevel = '3'; Serial.print(" Photocel Reading Level:"); Serial.println(" - Light"); } } //debounce bottom reed switch void debounceBottomReedSwitch() { //debounce bottom reed switch bottomSwitchPinVal = digitalRead(bottomSwitchPin); // read input value and store it in val delay(10); bottomSwitchPinVal2 = digitalRead(bottomSwitchPin); // read input value again to check or bounce if (bottomSwitchPinVal == bottomSwitchPinVal2) { // make sure we got 2 consistant readings! if (bottomSwitchPinVal != bottomSwitchState) { // the switch state has changed! bottomSwitchState = bottomSwitchPinVal; } Serial.print (" Bottom Switch Value: "); // display "Bottom Switch Value:" Serial.println(digitalRead(bottomSwitchPin)); // display current value of bottom switch; } } // debounce top reed switch void debounceTopReedSwitch() { topSwitchPinVal = digitalRead(topSwitchPin); // read input value and store it in val delay(10); topSwitchPinVal2 = digitalRead(topSwitchPin); // read input value again to check or bounce if (topSwitchPinVal == topSwitchPinVal2) { // make sure we got 2 consistant readings! if (topSwitchPinVal != topSwitchState) { // the button state has changed! topSwitchState = topSwitchPinVal; } Serial.print (" Top Switch Value: "); // display "Bottom Switch Value:" Serial.println(digitalRead(topSwitchPin)); // display current value of bottom switch; } } // stop the coop door motor void stopCoopDoorMotorB(){ digitalWrite (directionCloseCoopDoorMotorB, LOW); // turn off motor close direction digitalWrite (directionOpenCoopDoorMotorB, LOW); // turn on motor open direction analogWrite (enableCoopDoorMotorB, 0); // enable motor, 0 speed } // close the coop door motor (motor dir close = clockwise) void closeCoopDoorMotorB() { digitalWrite (directionCloseCoopDoorMotorB, HIGH); // turn on motor close direction digitalWrite (directionOpenCoopDoorMotorB, LOW); // turn off motor open direction analogWrite (enableCoopDoorMotorB, 255); // enable motor, full speed if (bottomSwitchPinVal == 0) { // if bottom reed switch circuit is closed stopCoopDoorMotorB(); Serial.print(" Coop Door Closed - no danger"); } } // open the coop door (motor dir open = counter-clockwise) void openCoopDoorMotorB() { digitalWrite(directionCloseCoopDoorMotorB, LOW); // turn off motor close direction digitalWrite(directionOpenCoopDoorMotorB, HIGH); // turn on motor open direction analogWrite(enableCoopDoorMotorB, 255); // enable motor, full speed if (topSwitchPinVal == 0) { // if top reed switch circuit is closed stopCoopDoorMotorB(); Serial.print(" Coop Door open - danger!"); } } void doCoopDoor(){ if (photocellReadingLevel == '1') { // if it's dark if (photocellReadingLevel != '2') { // if it's not twilight if (photocellReadingLevel != '3') { // if it's not light debounceTopReedSwitch(); // read and debounce the switches debounceBottomReedSwitch(); closeCoopDoorMotorB(); // close the door } } } if (photocellReadingLevel == '3') { // if it's light if (photocellReadingLevel != '2') { // if it's not twilight if (photocellReadingLevel != '1') { // if it's not dark debounceTopReedSwitch(); // read and debounce the switches debounceBottomReedSwitch(); openCoopDoorMotorB(); // Open the door } } } } // ************************************** the loop ************************************** void loop() { // polling occurs coopTimer.run(); doCoopDoor(); }
Lecciones aprendidas
Lo que he aprendido sobre la puerta, Arduino, luz y construcción:
- Mejor comprobar los niveles de luz cada 10 minutos para evitar las lecturas que despide hacia adelante y hacia atrás entre oscuro/Crepúsculo/luz durante los amanecer/anochecer minutos
- Prueba de la puerta con sus pollos para ver si alguno de ellos como colgar fuera de horario
- Los valores reales de la luz exterior es muy importante (muchas variables involucradas: luz de la casa de su vecino, nubes, interno y externo coop luces etc..)
- Debouncing de los conmutadores en el código de Arduino es importante (puerta saltar alrededor y mientras lecturas electrónicas varían grandemente por el milisegundo)
- Llegar para ayuda en los Foros de Arduino antes de sacar el pelo. (estaría bien, hacer su tarea y hacer preguntas muy específicas)
- Se ha cambiado de micro-switches por reed switches (imanes) porque no quería que la mecánica de los micro interruptores para quebrar con el tiempo
Lo que he aprendido acerca de los pollos:
- Mantener una luz dentro de la cooperativa puede mantener pollos fuera más largo (creo que b y c del ambiente luz brilla fuera) y que es importante a la hora de automatizar esta puerta, por lo que no obtiene accidentalmente bloqueados.
- Puede saltar y volar (alto y lejos)
- Aman a gallinero en seguridad por la noche, pero quieren nada más que al salir tan pronto como es luz