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);}}