Paso 5: Código de Arduino
A continuación es el código de arduino que hemos utilizado.
Mascota de Audiono taladro automático
alimentador del 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 batería recargable construido adentro (puede utilizar el código de ejemplo RTC de arduino en el IDE para programar el reloj, o utilice el codificador rotatorio como se pretendía)
* / / / incluye el código de biblioteca: #include
#include / / necesario para el RTC biblioteca #include #include / / reloj de tiempo Real biblioteca #include #include #include #include
inicializar la biblioteca con el número del interfaz pernos dor el lcd LCD LiquidCrystal (12, 11, 5, 8, 7, 6);
#define PIN_SERVO 9
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 al pin 2 de Arduino UNO lcd.setCursor(17,0);
LCD.Print ("Tia & Jordan"); Un poco de diversión sonrisa emoticon
lcd.setCursor(17,1); LCD.Print "(Dispencer del alimento del); 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 la 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);
PRINCIPAL BREAKOUT "IF" SECION QUE CONTROLA EL BOTÓN Y ENTRA EN PROGRAMACIÓN SI SE EMPUJA
Si (! () 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);
AJUSTAR LOS MINUTOS
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 la cantidad - cantidad de alimento
LCD.Blink(); 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);
AJUSTAR 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);
ESTABLECE los minutos Feed1
LCD.Blink(); 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);
AJUSTAR 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);
ESTABLECE los minutos Feed2
LCD.Blink(); 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
PARA el MANUAL de alimentación Botón CHECK buttonState = digitalRead(buttonPin); Si (buttonState == HIGH) {feed();} / / Comprobar alimentación de tiempo y de la 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. En segundo lugar == 0) {feed();}
} / / Fin de bucle principal
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 ("Woooorf."); para (int positionCounter = 0; positionCounter < 16; positionCounter ++) {/ / desplazamiento de una posición de izquierda: lcd.scrollDisplayLeft();
espera un poco: delay(150); }
Sección de servo revolver si no necesita un servo de remover simplemente comente todos fo esto hasta que el taladro gire la sección stirServo.attach(10); No sé si necesito uno bien pero que estoy añadiendo ahora como es más fácil si antes lo construyo! para (pos = 0; pos < = 180; pos += 1) {stirServo.write(pos);
Delay(10); } para (pos = 180; pos > = 0; pos-= 1) {stirServo.write(pos);
Delay(10); }
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 hacia adelante 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);