Paso 3: código
Este es el código para el arduino. Este código comprueba si el tiempo y compara con las alarmas, si coinciden encima de él dará vuelta el motor, empujando la comida hacia fuera. Para calcular cuánto debe girar el motor para, trabajamos a Cuánta comida queda liberado para cada turno. Una vuelta de un tornillo empujado hacia fuera 10g y cada rotación tarda 11 segundos. Por lo tanto 2 tornillos empujará a 20g cada 11 segundos. Investigamos las porciones de comida de perro y elaborado que un perro necesita aproximadamente 50g de alimento, un tamaño mediano 140g y un grande cerca de 260g. Esto significa que para una pequeña porción que el tornillo gira por 27,5 segundos, una porción media gira por unos 77 segundos y un gran por 141 segundos.
Dependiendo de los alimentos que utilizas puede que desee cambiar esto. Generalmente puede encontrar las porciones correctas en la parte posterior del embalaje. Recuerde que la escala de tiempo en el arduino IDE es en milisegundos. ((Recommended PORTIONS size)/20) * 11 = la longitud de tiempo que la corona debe girar a la biblioteca que puede encontrarse en la Página Web de arduino, se llaman time.h, DS1307RTC.h. Los otros dos ya están instalados en el IDE de Arduino. https://www.Arduino.CC/en/Reference/Libraries
Biblioteca:
#include
#include / / necesario para la biblioteca RTC
#include
#include / / biblioteca de reloj en tiempo real
Instalación de LCD
LiquidCrystal lcd (12, 11, 5, 8, 7, 6);
TurnDetected boolean volátil; Nos permite utilizar & & Estados
volátil hasta booleano;
Configurar pin enteros
const int PinCLK = 2; Utilizado para la generación de interrupciones utilizando señal de CLK
const int PinDT = 3; Utilizado para la lectura de señal DT
const int PinSW = 4; Utiliza para el interruptor de botón del codificador rotatorio
const int buttonPin = A3;
const int motorPin1 = 10;
const int motorPin2 = 13; el número del pin pulsador manual alimentación 13
botón de configuración
int buttonState = 0;
tiempo de suministro de alimentos de configuración
int feed1hour = 10;
int feed1minute = 30;
int feed2hour = 17;
int feed2minute = 30;
alimento cantidad de configuración
int feedQty = 1;
Configuración de LED
int LED1 = 0;
int LED2 = 1;
int LED3 = 9;
tiempo del sistema
int tm. Hora = 1;
int tm. Minutos = 1;
int tm. Hora = 1
isr nulo () {}
Si (digitalRead(PinCLK)) //setup para el haga clic en el codificador rotatorio
alto = digitalRead(PinDT);
otra cosa
arriba =! digitalRead(PinDT);
TurnDetected = true;
}
void setup () {}
tiempo de fraguado
Configuración de LED
pinMode (LED1, salida);
pinMode (LED2, salida);
pinMode (LED3, salida);
fijar número la pantalla del LCD de filas y columnas:
LCD.Begin (16, 2);
configuración del 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 ("Tom y de Dan perro"); pantalla de inicio
lcd.setCursor(17,1);
LCD.Print "(dispensador de la comida del);
para (int positionCounter = 0; positionCounter < 17; positionCounter ++) {}
izquierda de una posición de desplazamiento:
lcd.scrollDisplayLeft();
espera un poco:
Delay(150);
}
Delay(3000);
para (int positionCounter = 0; positionCounter < 17; positionCounter ++) {}
izquierda de una posición de desplazamiento:
lcd.scrollDisplayRight();
espera un poco:
Delay(150);
}
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 RT y luego lo muestra.
RTC.read(tm);
lcd.setCursor (0, 0);
printDigits (tm. Hora); llamar a función de dígitos que añade los ceros que faltan de impresión
LCD.Print(":");
printDigits (tm. Minuto);
LCD.Print(":");
printDigits (tm. En segundo lugar);
LCD.Print("");
LCD.Print ("tamaño");
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);
Si (! () digitalRead(PinSW))) {/ / comprobar si el pulsador está presionado
en caso afirmativo entonces entrar en la subrutina programación
LCD.Blink(); Activar 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.
{}
lcd.setCursor(0,0); Coloque el cursor en la hora
Delay(500); Retardo necesario o mismo botón saldrá hacer-mientras que como mientras están comprobando otro push botón!
Si (TurnDetected) {/ / realizar esto sólo si la rotación fue detectada
if (arriba)
virtualPosition--;
otra cosa
virtualPosition ++;
TurnDetected = false; no repita IF loop hasta Nueva rotación detectado
}
Aquí puedo cambiar la hora del tiempo-
TM. Hora = virtualPosition;
RTC.write(tm);
lcd.setCursor (0, 0);
printDigits (tm. Hora); a continuación, volver a imprimir la hora en la pantalla LCD
} 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.
{}
lcd.setCursor(3,0); Coloque el cursor en el tiempo minutos
Delay(500); Retardo necesario o mismo botón saldrá hacer-mientras que como mientras están comprobando otro push botón!
Si (TurnDetected) {/ / realizar esto sólo si la rotación fue detectada
if (arriba)
virtualPosition--;
otra cosa
virtualPosition ++;
TurnDetected = false; no repita IF loop hasta Nueva rotación detectado
}
Aquí cambio 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 LCD
} 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.
{}
lcd.setCursor(14,0); Coloque el cursor en el QTY
Delay(500); Retardo necesario o mismo botón saldrá hacer-mientras que como mientras están comprobando otro push botón!
Si (TurnDetected) {/ / realizar esto sólo si la rotación fue detectada
if (arriba)
virtualPosition--;
otra cosa
virtualPosition ++;
TurnDetected = false; no repita IF loop hasta Nueva rotación detectado
}
Aquí cambio la cantidad de alimento
feedQty = 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.
{}
lcd.setCursor(2,1); Coloque el cursor en feed1hour
Delay(500); Retardo necesario o mismo botón saldrá hacer-mientras que como mientras están comprobando otro push botón!
Si (TurnDetected) {/ / realizar esto sólo si la rotación fue detectada
if (arriba)
virtualPosition--;
otra cosa
virtualPosition ++;
TurnDetected = false; no repita IF loop hasta Nueva rotación detectado
}
Aquí cambio la hora feed1
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.
{}
lcd.setCursor(5,1); Coloque el cursor en feed1minute
Delay(500); Retardo necesario o mismo botón saldrá hacer-mientras que como mientras están comprobando otro push botón!
Si (TurnDetected) {/ / realizar esto sólo si la rotación fue detectada
if (arriba)
virtualPosition--;
otra cosa
virtualPosition ++;
TurnDetected = false; no repita IF loop hasta Nueva rotación detectado
}
Aquí cambio el minuto feed1
feed1minute = 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.
{}
lcd.setCursor(10,1); Coloque el cursor en feed1hour
Delay(500); Retardo necesario o mismo botón saldrá hacer-mientras que como mientras están comprobando otro push botón!
Si (TurnDetected) {/ / realizar esto sólo si la rotación fue detectada
if (arriba)
virtualPosition--;
otra cosa
virtualPosition ++;
TurnDetected = false; no repita IF loop hasta Nueva rotación detectado
}
Aquí cambio la hora feed1
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.
{}
lcd.setCursor(13,1); Coloque el cursor en feed1minute
Delay(500); Retardo necesario o mismo botón saldrá hacer-mientras que como mientras están comprobando otro push botón!
Si (TurnDetected) {/ / realizar esto sólo si la rotación fue detectada
if (arriba)
virtualPosition--;
otra cosa
virtualPosition ++;
TurnDetected = false; no repita IF loop hasta Nueva rotación detectado
}
Aquí cambio el minuto feed1
feed2minute = 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
VERIFIQUE QUE EL BOTÓN DE ALIMENTACIÓN MANUAL
buttonState = digitalRead(buttonPin);
Si (buttonState == HIGH) {}
digitalWrite (motorPin1, HIGH);
digitalWrite (motorPin2, LOW);
Delay(5000);
digitalWrite (motorPin1, LOW);
digitalWrite (motorPin2, LOW);
}
COMPRUEBE LA ALIMENTACIÓN Y TIEMPO DE ALIMENTACIÓN SI
Si (tm. Hora == feed1hour & & tm. Minutos == feed1minute & & tm. En segundo lugar == 0 & & feedQty == 1) {/ / si no ' comprobar segundos cero
digitalWrite (motorPin1, HIGH);
digitalWrite (motorPin2, LOW);
Delay(5000);
digitalWrite (motorPin1, LOW);
digitalWrite (motorPin2, LOW);
}
Si (tm. Hora == feed1hour & & tm. Minutos == feed1minute & & tm. En segundo lugar == 0 & & feedQty == 2) {/ / si no ' comprobar segundos cero
digitalWrite (motorPin1, HIGH);
digitalWrite (motorPin2, LOW);
Delay(10000);
digitalWrite (motorPin1, LOW);
digitalWrite (motorPin2, LOW);
}
Si (tm. Hora == feed1hour & & tm. Minutos == feed1minute & & tm. En segundo lugar == 0 & & feedQty == 3) {/ / si no ' comprobar segundos cero
digitalWrite (motorPin1, HIGH);
digitalWrite (motorPin2, LOW);
Delay(15000);
digitalWrite (motorPin1, LOW);
digitalWrite (motorPin2, LOW);
}
Si (tm. Hora == feed2hour & & tm. Minutos == feed2minute & & tm. En segundo lugar == 0 & & feedQty == 1) {}
digitalWrite (motorPin1, HIGH);
digitalWrite (motorPin2, LOW);
Delay(27500);
digitalWrite (motorPin1, LOW);
digitalWrite (motorPin2, LOW);
}
Si (tm. Hora == feed2hour & & tm. Minutos == feed2minute & & tm. En segundo lugar == 0 & & feedQty == 2) {}
digitalWrite (motorPin1, HIGH);
digitalWrite (motorPin2, LOW);
Delay(77000);
digitalWrite (motorPin1, LOW);
digitalWrite (motorPin2, LOW);
}
Si (tm. Hora == feed2hour & & tm. Minutos == feed2minute & & tm. En segundo lugar == 0 & & feedQty == 3) {}
digitalWrite (motorPin1, HIGH);
digitalWrite (motorPin2, LOW);
Delay(141000);
digitalWrite (motorPin1, LOW);
digitalWrite (motorPin2, LOW);
}
Configuración de LED
Si (feedQty == 1) {}
digitalWrite (LED 1, elevado);
digitalWrite (LED2, LOW);
digitalWrite (LED 3, bajo);
}
Si (feedQty == 2) {}
digitalWrite (LED 1, bajo);
digitalWrite (LED2, alto);
digitalWrite (LED 3, bajo);
}
Si (feedQty == 3) {}
digitalWrite (LED 1, bajo);
digitalWrite (LED2, LOW);
digitalWrite (LED 3, alto);
}
} / / Fin de bucle principal
void printDigits (int dígitos) {/ / función de utilidad para la visualización del reloj digital: impresiones principales 0
if(digits < 10)
LCD.Print('0');
LCD.Print(digits);
}
void feed() {}
lcd.setCursor(17,0);
LCD.Print ("Extra alimento!");
para (int positionCounter = 0; positionCounter < 16; positionCounter ++) {}
izquierda de una posición de desplazamiento:
lcd.scrollDisplayLeft();
espera un poco:
Delay(150);
}
}