Arduino automático alimentado alimentador del animal doméstico (5 / 6 paso)

Paso 5: Arduino - el código de

El código no es como intimidante ya que primero se ve, y he tratado de anotarlo máximo posible.

En Resumen:

Lee el tiempo desde el chip RTC

Muestra el tiempo, el veces por defecto de la alimentación y la cantidad

Comprueba si se ha presionado el codificador rotatorio si tiene: luego va en la rutina de programación, ciclismo en orden a través de reloj, tamaño de la porción, alimentar a la vez 1, alimentar a la vez 2. Cuando termines, sigue a continuación...

Comprueba si es alimentación tiempo 1 o 2 - si así se alimenta.

Comprueba si se ha pulsado el manual de alimentación botón, si así se alimenta. Y entonces comienza todo otra vez.

Esta es la primera vez he utilizado una rutina de servicio de interrupción - para el codificador rotatorio. Esto significa que si se activa, sea cual sea el programa es hacer ocupado, registra su acción. Por lo que es siempre escuchar para el codificador.

Pensé que la rutina para definir los tiempos de reloj/alimentación y cantidad sería desalentador, pero rompió justo en pasos sencillos. 1 º he aprendido cómo hacer flash el cursor en la pantalla, bastante fácil. Luego coloca el cursor en el dígito de la hora del reloj y dijo que para aumentar la hora cuando el codificador se convirtió (o disminución), entonces una vez que se presiona el codificador, escriba la nueva "hora" del reloj de tiempo real y luego mueva el cursor hasta el minuto y comienzo cambiar y así sucesivamente. Fue sorprendentemente fácil.

Las rutinas de alimentación son rutinas de simple "if" - es decir, "si" los tiempos emparejan, y luego hacen la rutina de alimentación. Simple como eso. Tuve que añadir un poco para que cheques a los segundos o de lo contrario se alimenta durante un minuto entero, como los bucles de programa y comprueba el tiempo otra vez - y lo es todavía tiempo de alimentación! por lo que se repite... agregando un control de los segundos detiene esto como tarda al menos un segundo para el ciclo de alimentación.

El programa no es perfecto - a veces girando el codificador no siempre incrementa el número en pantalla. Creo que es a mi inexperiencia. Sin embargo no impiden el funcionamiento de la máquina!

He incluido un gancho agarrador de la pantalla de mi arduino IDE sin razón real que no quería que esta sección que sin una imagen :-)

Obviamente el vídeo en la Página 1 me muestra pulsando el botón de alimentación manual, pero por supuesto, auto-alimenta a las dos horas (podría definir dos veces el mismo y sólo se alimentaban una vez).

/ * Alimentador de mascotas automático Auger Audiono autor Roger Donoghue 28/03/2015 todos los derechos reservados. Sólo para uso personal. No para uso comercial o de reventa. Le permite ajustar tiempos de alimentación 2 y la cantidad como un múltiplo de la cantidad de la alimentación por defecto. Utiliza un reloj de tiempo real DS1307 para mantener el tiempo, con una pulgadas batería recargable incorporada (puede utilizar el código de ejemplo RTC de arduino en el IDE para ajustar el reloj, o utilice el codificador rotatorio como se pretendía) * / / incluye el código de biblioteca: #include < LiquidCrystal.h > #include < Wire.h > / / necesario para el RTC biblioteca #include < Time.h > #include < DS1307RTC.h > / / reloj de tiempo Real biblioteca #include < Servo.h > / / inicializar la biblioteca con el número de la interfaz dor de pines del lcd LCD LiquidCrystal (12, 11, 5, 8, 7, 6); #define Servo de 9 PIN_SERVO feedServo; Servo stirServo; int pos = 0; TurnDetected boolean volátil; volátil hasta booleano; const int PinCLK = 2; Utilizado para la generación de interrupciones con CLK señal const int PinDT = 3; Utilizado para la lectura de DT señal const int PinSW = 4; Utiliza para el interruptor de botón de la codificador rotatorio const int buttonPin = A3; el número del botón pin para alimentación manual 13 int buttonState = 0; variable para leer el manual de alimentación botón estado int feed1hour = 07; variables para la alimentación de tiempos y cantidad int feed1minute = 00; int feed2hour = 17; int feed2minute = 30; int feedQty = 4; velocidad de avance de int = 800; un tipo de pwm los disparadores hacia adelante en el servo 75 int feedReversal = 80; un tipo de pwm que desencadena la inversa en el servo / / jugar con estos números para el servo. El mío es un servo digital Futaba / / que quitó el bote de y el estirón de plástico, para que sea continua. anular (isr) {/ / rutina de servicio de interrupción se ejecuta cuando se detecta un alto a la transición de bajo a CLK si (digitalRead(PinCLK)) / / Esto guarda un ojo hacia fuera para el codificador rotatorio se convirtió independientemente de donde el programa es hasta = digitalRead(PinDT); / / actualmente exectuting - en otras palabras, durante el bucle principal este ISR estará siempre activada más arriba =! digitalRead(PinDT); TurnDetected = true; } void setup () {/ / configurar número la pantalla del LCD de filas y columnas: lcd.begin (16, 2); / / configurar el codificador rotatorio pinMode(PinCLK,INPUT); pinMode(PinDT,INPUT); pinMode(PinSW,INPUT); pinMode (buttonPin, entrada); attachInterrupt (0, isr, caer); / / interrupción 0 está siempre conectado a la clavija 2 de Arduino UNO lcd.setCursor(17,0); lcd.print de ("Roger Donoghue"); / / un poco de diversión :-) lcd.setCursor(17,1); lcd.print ("Cat-O-Matic"); para (int positionCounter = 0; positionCounter < 17; positionCounter ++) {/ / desplazamiento de una posición de izquierda : lcd.scrollDisplayLeft(); espera un poco: delay(150); } delay(3000); para (int positionCounter = 0; positionCounter < 17; positionCounter ++) {/ / desplazamiento de una posición de izquierda: lcd.scrollDisplayRight(); / / espera un poco: delay(150);} / / fin de diversión lcd.setCursor(17,0); LCD.Print(""); lcd.setCursor(17,1); LCD.Print("");} void loop () {//Main bucle de programa - mayoría de las cosas aquí! estática virtualPosition largo = 0; / / sin estática no cuenta correctamente! tmElements_t tm; / / Este sectionm lee el tiempo de la RTC, pone en tmElements tm (agradable trabajar con), y luego muestra. RTC.read(tm); lcd.setCursor (0, 0); printDigits (tm. Hora); llamada a función de dígitos que añade los ceros que pueden faltar lcd.print(":"); de impresión printDigits (tm. Minuto); LCD.Print(":"); printDigits (tm. En segundo lugar); LCD.Print(""); LCD.Print ("cantidad"); 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); DESGLOSE de principales "IF" SECION debajo que monitores el botón y entra en programación si es presionado if (! () digitalRead(PinSW))) {/ / comprobar si el pulsador está presionado / / en caso afirmativo entonces entrar en la programación lcd.blink() de subrutina; / / enciende el cursor parpadeante: lcd.setCursor(5,0); lcd.print ("juego"); virtualPosition = tm. Hora; necesario o la hora será cero cada vez que cambie el reloj. hacer {lcd.setCursor(0,0); / / poner cursor en hora delay(500); / / retraso saldrá del botón necesario o mismo hacer-mientras que como mientras están comprobando otro push botón
! Si (TurnDetected) {/ / realizar esto sólo si la rotación fue detectado if (arriba) virtualPosition--; else virtualPosition ++; TurnDetected = false; no repita IF loop hasta Nueva rotación detectado} / / aquí cambio la hora del tiempo - tm. Hora = virtualPosition; RTC.write(tm); lcd.setCursor (0, 0); printDigits (tm. Hora); luego volver a imprimir la hora en la pantalla} mientras que ((digitalRead(PinSW))); hacer esto "" bucle mientras no se pulse el botón de PinSW lcd.noBlink(); Delay(1000); MINUTOS el conjunto lcd.blink(); Activar el cursor parpadeante: virtualPosition = tm. Minutos; necesarios o el minuto será cero cada vez que cambie el reloj. hacer {lcd.setCursor(3,0); / / poner cursor en delay(500) minutos de tiempo; / / retraso saldrá del botón necesario o mismo hacer-mientras que como mientras están comprobando otro push botón! si (TurnDetected) {/ / realizar esto sólo si la rotación fue detectado if (arriba) virtualPosition--; else virtualPosition ++; TurnDetected = false; no repita IF loop hasta Nueva rotación detectado} / / aquí cambiar el minuto de tiempo - tm. Minutos = virtualPosition; RTC.write(tm); lcd.setCursor (3, 0); printDigits (tm. Minuto); luego volver a imprimir el minuto en la pantalla} mientras que ((digitalRead(PinSW))); lcd.noBlink(); Delay(1000); ESTABLECER el QTY - lcd.blink() de la cantidad de alimento; Activar el cursor parpadeante: virtualPosition = feedQty; necesario o la cantidad será de cero. hacer {lcd.setCursor(14,0); / / Coloque el cursor en el QTY delay(500); / retraso saldrá del botón necesario o mismo hacer -mientras que como mientras están comprobando otro push botón! si (TurnDetected) {/ / realizar esto sólo si la rotación fue detectado if (arriba) virtualPosition--; else virtualPosition ++; TurnDetected = false; no repita IF loop hasta Nueva rotación detectado} / / aquí cambiar el feedQty de alimentación qty = virtualPosition; lcd.setCursor (14, 0); LCD.Print(feedQty); } mientras que ((digitalRead(PinSW))); lcd.noBlink(); Delay(1000); ESTABLECER la hora Feed1 lcd.blink(); Activar el cursor parpadeante: virtualPosition = feed1hour; necesario o será cero para comenzar con. hacer {lcd.setCursor(2,1); / / poner cursor en feed1hour delay(500); / retraso saldrá del botón necesario o mismo hacer -mientras que como mientras están comprobando otro push botón! si (TurnDetected) {/ / realizar esto sólo si la rotación fue detectado if (arriba) virtualPosition--; else virtualPosition ++; TurnDetected = false; no repita IF loop hasta Nueva rotación detectado} / / aquí cambiar el feed1 hora feed1hour = virtualPosition; lcd.setCursor(2,1); printDigits(feed1hour); } mientras que ((digitalRead(PinSW))); lcd.noBlink(); Delay(1000); ESTABLECER la lcd.blink() Feed1 minutos; Activar el cursor parpadeante: virtualPosition = feed1minute; necesario o será cero para comenzar con. hacer {lcd.setCursor(5,1); / / poner cursor en feed1minute delay(500); / retraso saldrá del botón necesario o mismo hacer -mientras que como mientras están comprobando otro push botón! si (TurnDetected) {/ / realizar esto sólo si la rotación fue detectado if (arriba) virtualPosition--; else virtualPosition ++; TurnDetected = false; no repita IF loop hasta Nueva rotación detectado} / / aquí cambiar el feed1minute minuto feed1 = virtualPosition; lcd.setCursor(5,1); printDigits(feed1minute); } mientras que ((digitalRead(PinSW))); lcd.noBlink(); Delay(1000); ESTABLECER la hora Feed2 lcd.blink(); Activar el cursor parpadeante: virtualPosition = feed2hour; necesario o será cero para comenzar con. hacer {lcd.setCursor(10,1); / / poner cursor en feed1hour delay(500); / retraso saldrá del botón necesario o mismo hacer -mientras que como mientras están comprobando otro push botón! si (TurnDetected) {/ / realizar esto sólo si la rotación fue detectado if (arriba) virtualPosition--; else virtualPosition ++; TurnDetected = false; no repita IF loop hasta Nueva rotación detectado} / / aquí cambiar el feed1 hora feed2hour = virtualPosition; lcd.setCursor(10,1); printDigits(feed2hour); } mientras que ((digitalRead(PinSW))); lcd.noBlink(); Delay(1000); ESTABLECER la lcd.blink() Feed2 minutos; Activar el cursor parpadeante: virtualPosition = feed2minute; necesario o será cero para comenzar con. hacer {lcd.setCursor(13,1); / / poner cursor en feed1minute delay(500); / retraso saldrá del botón necesario o mismo hacer -mientras que como mientras están comprobando otro push botón! si (TurnDetected) {/ / realizar esto sólo si la rotación fue detectado if (arriba) virtualPosition--; else virtualPosition ++; TurnDetected = false; no repita IF loop hasta Nueva rotación detectado} / / aquí cambiar el feed2minute minuto feed1 = virtualPosition; lcd.setCursor(13,1); printDigits(feed2minute); } mientras que ((digitalRead(PinSW))); lcd.noBlink(); Delay(1000); } / / fin del principal inspector de pulsador de codificador rotatorio de IF / / CHECK para el botón de alimentación MANUAL buttonState = digitalRead(buttonPin); Si (buttonState == HIGH) {feed();} / / Comprobar alimentación tiempo y alimentación si emparejado si (tm. Hora == feed1hour & & tm. Minutos == feed1minute & & tm. En segundo lugar == 0) {/ / si no ' comprobar segundos cero feed(); / / entonces te alimente continuamente durante 1 minuto! } Si (tm. Hora == feed2hour & & tm. Minutos == feed2minute & & tm. Second == 0) {feed();}} Final del principal bucle void printDigits (int dígitos) {/ / función de utilidad para la visualización del reloj digital: impresiones lleva 0 si (dígitos < 10) lcd.print('0'); lcd.print(digits);} void feed() {lcd.setCursor(17,0); lcd.print ("Meowwwww."); para (int positionCounter = 0; positionCounter < 16; positionCounter ++) {/ / desplazamiento de una posición de izquierda: lcd.scrollDisplayLeft(); / / esperar un poco: delay(150);} / / sección de servo de remover si usted no necesita un servo de revolver simplemente comente todos fo esto hasta que el taladro gire la sección stirServo.attach(10); / / no sé si sea una necesidad pero yo estoy agregando ahora como es más fácil si antes lo construyo! para (pos = 0; pos < = 180; pos += 1) {stirServo.write(pos); delay(5);} para (pos = 180; pos > = 0; pos-= 1) {stirServo.write(pos); delay(10);} delay(200); para (pos = 0; pos < = 180; pos += 1) {stirServo.write(pos); delay(10);} para (pos = 180; pos > = 0; pos-= 1) {stirServo.write(pos); delay(5);} stirServo.detach(); Gire la barrena feedServo.attach(PIN_SERVO); para (int cnt = 0; cnt < feedQty; cnt ++) {feedServo.write(feedRate); //the velocidad de avance es el delay(600) de dirección y tasa de alimentación //this retardo define cuánto tiempo el servo permanecerá desde el anterior comando feedServo.write(feedReversal); //...until este comando establece el servo una nueva tarea! delay(200); feedServo.write(feedRate); delay(600); feedServo.write(feedReversal); / / Si desea aumentar el aumento de la velocidad de avance general al delantero retrasa (1000 en el momento) delay(200); / / o mejor aún sólo copia y pasado el delantero y hacia atrás debajo del código a repetir} / / que forma la pequeña ondulación inversa siempre está ahí para evitar atascos de feedServo.detach(); para (int positionCounter = 0; positionCounter < 16; positionCounter ++) {/ / desplazamiento de una posición de izquierda: lcd.scrollDisplayRight(); / / espera un poco: delay(150);}}

Artículos Relacionados

Fat Cat automático alimentador del animal doméstico de Arduino

Fat Cat automático alimentador del animal doméstico de Arduino

Todo el mundo saluda al duque! Es un libra 24 Maine Coon que adoptado hace tres años. Duque goza poniendo en el sol, observar aves, y... despertando su dueño en el 5:00 de la mañana para el desayuno. Como puede imaginar, si tienes un gato de 24 libra
Controlado por Twitter alimentador del animal doméstico

Controlado por Twitter alimentador del animal doméstico

Un gran proyecto para los dueños de mascotas ocupados. Este alimentador del animal doméstico controlado por Twitter automáticamente distribuye alimentos en respuesta a la actividad en su cuenta de Twitter. El proyecto es controlado por un Arduino y e
Internet habilitado frambuesa Pi alimentador del animal doméstico

Internet habilitado frambuesa Pi alimentador del animal doméstico

Se trata de un comedero de perro con un Raspberry Pi.Si quieres:una manera fácil de alimentar a su perro grandehacer un seguimiento de cuando te alimentasCuánto control y cuánto alimentay ser capaz de alimentar remotamente a través de correo electrón
Hacer un alimentador del animal doméstico conectado Internet

Hacer un alimentador del animal doméstico conectado Internet

En primer lugar, se necesita hardware especial para hacer esto, que se puede comprar en el link que te proporciono. Tenga en cuenta que se trata de una plataforma similar a Arduino, así que usted podrá realizar una cantidad casi infinita de proyectos
Alimentador del animal doméstico de materiales reciclados de vacaciones

Alimentador del animal doméstico de materiales reciclados de vacaciones

Si usted es propietario de una mascota, te vas de vacaciones pueden ser estresante. Por lo general, necesita un amigo o un vecino para venir todos los días y alimentar a sus mascotas. Sin embargo, por esclavizar a robots puede mantener a su mascota f
Alimentador del animal doméstico de IOT (intel edison)

Alimentador del animal doméstico de IOT (intel edison)

En este proyecto hacemos un alimentador del animal doméstico de Internet habilitado. Comida para gatos o perro comida se mantiene en una tolva y se entrega en una bandeja por un taladro del tornillo. Este concepto se puede ampliar o modificado para a
Alimentador del animal doméstico

Alimentador del animal doméstico

este es mi dosificador de alimentos para mascotas en base taladro digital fabricado.  Usted simplemente cargue el lanzador con el alimento de animal doméstico y automáticamente se empuja con el tornillo del taladro en el plato para alimentar a su mas
LEGO MINDSTORMS alimentador del animal doméstico

LEGO MINDSTORMS alimentador del animal doméstico

Este alimentador de mascotas de LEGO MINDSTORMS se basa en la teoría pavloviana del condicionamiento clásico. Condicionamiento clásico (también pavloviana acondicionado o acondicionado demandado) es un tipo de aprendizaje que se produce cuando un est
LittleBits remoto alimentador del animal doméstico

LittleBits remoto alimentador del animal doméstico

Al lejos, asegúrese de que su mascota (pez, gato, perro) nunca pasa hambre con este alimentador activado WiFi. Con este proyecto de littleBits, o alimente su animal doméstico remotamente por pulsar un botón en su teléfono o automatizar un programa de
Arduino controla alimentador del animal doméstico

Arduino controla alimentador del animal doméstico

Este proyecto permite animales domésticos para alimentar a un ritmo constante que no te levanta más de un dedo. Hay una rampa en la caja que permite que los alimentos entrar en la rueda que es accionada por un servo que distribuye comida a su mascota
Auto alimentador del animal doméstico

Auto alimentador del animal doméstico

Este es un tutorial sobre cómo construir un alimentador automático de mascotas. Se puede utilizar para su perro, su gato, su caballo o cualquier animal que desea alimentar.Construirla porque mi perro estaba teniendo problemas para comer y era muy del
Croccolino!!!!!! Elegante del alimentador del animal doméstico (mejorado)

Croccolino!!!!!! Elegante del alimentador del animal doméstico (mejorado)

Código añadido mejoras y controles. Ahora el alimentador puede reaccionar con sonidos cuando el pet es en proximidad.Maaaaaaaaaaaaaaaaaoooooooowwwwwwww!¿Usted ha sido fuera de su casa por un par de días? ¿No tienes a alguien que puede alimentar a su
Toque de queda del animal doméstico: Un Arduino controlado puerta para mascotas

Toque de queda del animal doméstico: Un Arduino controlado puerta para mascotas

El problema: quiere restringir el tiempo cuando su mascota pueda salir al exterior. Esto podría ser porque el barrio no es seguro para su gato o perro pequeño por la noche (Merodeadores coyotes viene a la mente). Pero desea que su mascota para poder
Alimentador del pájaro del animal doméstico botella

Alimentador del pájaro del animal doméstico botella

Hola a todos,Decidí darle a los pájaros en mi jardín una buena comida este invierno. La receta es muy sencilla algunas freír grasa con semillas. Sirve en una botella de PET de 1 / 2l. Este es un excelente regalo para las criaturas con plumas ligeras.