Bueno, ya tengo el menu inicial, aqui os dejo el codigo y un video, aun queda mucho por mejorar pero poco a poco.
Código: //Insoladora V1.0
//Librerias
#include <LiquidCrystal_I2C.h>
#include <Wire.h>
#include <Bounce.h>
//Caracteres
byte uparrow[8] = { //Flecha hacia arriba
B00100,
B01110,
B10101,
B00100,
B00100,
B00100,
B00100,
B00100
};
byte downarrow[8] = { //Flecha hacia abajo
B00100,
B00100,
B00100,
B00100,
B00100,
B10101,
B01110,
B00100
};
//LCD
LiquidCrystal_I2C lcd(0x20,16,2); // set the LCD address to 0x20 for a 16 chars and 2 line display
//Botones
Bounce UP = Bounce(2,100); //Pin 2 para boton UP
Bounce DOWN = Bounce(3,100); //Pin 3 para boton DOWN
Bounce START = Bounce(4,100); //Pin 4 para boton START
Bounce STOP = Bounce(5,100); //Pin 5 para boton STOP
//Salidas
#define RELE 6
//Variables
int segundos = 0; //Variable para los segundos
int minutos = 0; //Variable para los minutos
//Constantes
void setup() {
// put your setup code here, to run once:
pinMode(RELE, OUTPUT);
//Iniciamos el LCD
lcd.init();
lcd.backlight(); //Iniciamos la retroiluminacion
lcd.setCursor(0,0); //Situamos el cursor al inicio
lcd.print("Insoladora V1.0"); //Imprimimos mensaje inicial
lcd.setCursor(5,1); //
lcd.print("L1llo5"); //
delay(2000); //Esperamos 2 segundos con el mensaje
lcd.clear(); //Limpiamos la pantalla
//Registro Caracteres
lcd.createChar(1, uparrow);
lcd.createChar(2, downarrow);
}
void loop() {
// put your main code here, to run repeatedly:
lcd.setCursor(0,0);
lcd.print("Tiempo:");
//Actualizamos los botones
UP.update();
DOWN.update();
//Imprimimos la flechas en pantalla
lcd.setCursor(15,0);
lcd.write(1);
lcd.setCursor(15,1);
lcd.write(2);
//Imprimos los segundos y minutos
imprimir(segundos,minutos); //Imprimimos los minutos y segundos iniciales
if (UP.risingEdge()) //Comprobamos si se ha pulsado el interruptor UP
{
segundos=segundos+10; //Sumamos 10 segundos en cada pulsacion
if(segundos > 50) //Si los segundos pasan del 50, sumamos un minutos y reiniciamos los segundos
{
minutos=minutos+1;
segundos=0;
imprimir(segundos,minutos); //Imprimimos
}
imprimir(segundos,minutos); //Si no pasamos de 50 segundos los minutos no varian
}
else if (DOWN.risingEdge()) //Si pulsamos el boton DOWN
{
segundos=segundos-10; //Restamos 10 segundos en cada pulsacion
if(segundos < 0) //Si los segundos son menores que 0, restamos un minuto y ponemos los segundos a 50
{
minutos=minutos-1;
segundos=50;
if(minutos<0) //Evitamos que los minutos puedan ser negativos
{
minutos=0; //Ponemos a cero el contador
segundos=0; //
}
imprimir(segundos,minutos); //Imprimimos
}
imprimir(segundos,minutos); //Si no ocurre ni minutos negativos ni resta de los mismos imprimimos
}
}
//Funcion Imprimir
void imprimir(int seg,int minu)
{
if(minutos<10) //Si los minutos son menores de 10 situamos la cifra mas a la derecha
{
lcd.setCursor(11,0);
lcd.print(segundos);
lcd.setCursor(10,0);
lcd.print(":");
lcd.setCursor(9,0);
lcd.print(minutos);
}
else
{
lcd.setCursor(11,0);
lcd.print(segundos);
lcd.setCursor(10,0);
lcd.print(":");
lcd.setCursor(8,0);
lcd.print(minutos);
}
}
http://www.youtube.com/watch?v=R2uBn_QcwQY
Os dejo la secuencia de conteo, seguramente se podria hacer mas facil, pero tras darle muchas vueltas me salio asi, acepto sugerencias, y cualquier duda me decis:
Código: //Cuenta atras
segundosactual=millis(); //Guardamos los millis en los que nos encontramos
segundosviejo=millis(); //Guardamos en otra variable
segundostotal=(minutos*60+segundos); //Calculamos los segundos totales que hay que temporizar
lcd.setCursor(0,0);
lcd.print("Insolando:"); //Imprimimos un mensaje de INSOLANDO
while (segundosactual/1000<=segundosviejo/1000+segundostotal) //Cuenta atras, mientras segundos actual, sea mas pequeño que la suma de los que teniamos mas los que necesitamos, repetimos el bucle
{
STOP.update(); //Actualizamos el estado del boton STOP
if(STOP.risingEdge()) //Si pulsamos el boton stop paramos el bucle
{
digitalWrite(RELE, LOW); //Ponemos a cero la salida del rele
break; //Salimos del while
}
digitalWrite(RELE, HIGH); //Activamos el rele
contador=segundosactual-segundosviejo; //Calculamos la diferencia entre segundos viejo y nuevo
if (contador>1000*multiplo) //Cuando llege a 1000ms(1 segundo) restamos tiempo
{
if (segundos<=0) //Si los segundos son menores que 0 bajamos minutos
{
minutos=minutos-1; //Restamos un minuto
segundos=59; //Seteamos los segundos a 59
cuentaatras(segundos,minutos); //Imprimimos
}
else
{
segundos=segundos-1; //Restamos segundos si no son menores que 0
cuentaatras(segundos,minutos);
}
multiplo=multiplo+1; //Empleamos multiplo, para ir aumentando de un segundo en un segundo la diferencia entre tiempos, y asi poder contar cada segundo
}
segundosactual=millis(); //Renovamos la variable millis
}
//FIN DEL CONTEO
digitalWrite(RELE, LOW);
Bueno, por fin acabe el codigo, ya funciona todo perfectamente, dejo un video explicacion y el codigo:
Código: //Insoladora V1.0
//Librerias
#include <EEPROM.h>
#include <LiquidCrystal_I2C.h>
#include <Wire.h>
#include <Bounce.h>
//Caracteres
byte uparrow[8] = { //Flecha hacia arriba
B00100,
B01110,
B10101,
B00100,
B00100,
B00100,
B00100,
B00100
};
byte downarrow[8] = { //Flecha hacia abajo
B00100,
B00100,
B00100,
B00100,
B00100,
B10101,
B01110,
B00100
};
//LCD
LiquidCrystal_I2C lcd(0x20,16,2); // set the LCD address to 0x20 for a 16 chars and 2 line display
//Botones
Bounce UP = Bounce(2,100); //Pin 2 para boton UP
Bounce DOWN = Bounce(3,100); //Pin 3 para boton DOWN
Bounce START = Bounce(4,100); //Pin 4 para boton START
Bounce STOP = Bounce(5,100); //Pin 5 para boton STOP
//Salidas
#define RELE 6
#define BUZ 8
//Variables
long segundos = 0; //Variable para los segundos
long minutos = 0; //Variable para los minutos
long segundosactual = 0; //Variable para temporizacion
long segundostotal = 0; //Segundos a temporizar
long segundosviejo = 0; //Tope de segundos para el FOR
long contador = 0;
long multiplo = 1;
void setup() {
// put your setup code here, to run once:
//PINES
pinMode(RELE, OUTPUT);
pinMode(BUZ, OUTPUT);
//Iniciamos el LCD
lcd.init();
lcd.backlight(); //Iniciamos la retroiluminacion
lcd.setCursor(0,0); //Situamos el cursor al inicio
lcd.print("Insoladora V1.0"); //Imprimimos mensaje inicial
lcd.setCursor(5,1); //
lcd.print("L1llo5"); //
delay(2000); //Esperamos 2 segundos con el mensaje
lcd.clear(); //Limpiamos la pantalla
//Registro Caracteres
lcd.createChar(1, uparrow);
lcd.createChar(2, downarrow);
}
void loop()
{
// put your main code here, to run repeatedly:
//Leemos el tiempo guardado
segundos=EEPROM.read(1);
minutos=EEPROM.read(2);
do{
lcd.setCursor(0,0);
lcd.print("Tiempo:");
//Actualizamos los botones
UP.update();
DOWN.update();
//Imprimimos la flechas en pantalla
lcd.setCursor(15,0);
lcd.write(1);
lcd.setCursor(15,1);
lcd.write(2);
//Imprimos los segundos y minutos
imprimir(segundos,minutos); //Imprimimos los minutos y segundos iniciales
if (UP.risingEdge()) //Comprobamos si se ha pulsado el interruptor UP
{
segundos=segundos+10; //Sumamos 10 segundos en cada pulsacion
if(segundos > 50) //Si los segundos pasan del 50, sumamos un minutos y reiniciamos los segundos
{
minutos=minutos+1;
segundos=0;
imprimir(segundos,minutos); //Imprimimos
}
imprimir(segundos,minutos); //Si no pasamos de 50 segundos los minutos no varian
}
else if (DOWN.risingEdge()) //Si pulsamos el boton DOWN
{
segundos=segundos-10; //Restamos 10 segundos en cada pulsacion
if(segundos < 0) //Si los segundos son menores que 0, restamos un minuto y ponemos los segundos a 50
{
minutos=minutos-1;
segundos=50;
if(minutos<0) //Evitamos que los minutos puedan ser negativos
{
minutos=0; //Ponemos a cero el contador
segundos=0; //
}
imprimir(segundos,minutos); //Imprimimos
}
imprimir(segundos,minutos); //Si no ocurre ni minutos negativos ni resta de los mismos imprimimos
}
START.update();
}while (!START.risingEdge()||segundos==0&&minutos==0); //Mientras no se pulse START o sean cero los minutos y segundos se repite el bucle
//Pantalla de Inicio
lcd.clear();
lcd.setCursor(0,0);
lcd.print("INICIANDO....");
//Guardado en EEPROM
saveseg(segundos);
savemin(minutos);
buzzer(2);
delay(1000);
lcd.clear();
//Cuenta atras
segundosactual=millis(); //Guardamos los millis en los que nos encontramos
segundosviejo=millis(); //Guardamos en otra variable
segundostotal=(minutos*60+segundos); //Calculamos los segundos totales que hay que temporizar
lcd.setCursor(0,0);
lcd.print("Insolando:"); //Imprimimos un mensaje de INSOLANDO
while (segundosactual/1000<=segundosviejo/1000+segundostotal) //Cuenta atras, mientras segundos actual, sea mas pequeño que la suma de los que teniamos mas los que necesitamos, repetimos el bucle
{
STOP.update(); //Actualizamos el estado del boton STOP
if(STOP.risingEdge()) //Si pulsamos el boton stop paramos el bucle
{
digitalWrite(RELE, LOW); //Ponemos a cero la salida del rele
lcd.clear();
//Ponemos a cero las variables
segundosactual = 0;
segundostotal = 0;
segundosviejo = 0;
contador = 0;
multiplo = 1;
break; //Salimos del while
}
digitalWrite(RELE, HIGH); //Activamos el rele
contador=segundosactual-segundosviejo; //Calculamos la diferencia entre segundos viejo y nuevo
if (contador>1000*multiplo) //Cuando llege a 1000ms(1 segundo) restamos tiempo
{
if (segundos<=0) //Si los segundos son menores que 0 bajamos minutos
{
minutos=minutos-1; //Restamos un minuto
segundos=59; //Seteamos los segundos a 59
cuentaatras(segundos,minutos); //Imprimimos
}else
{
segundos=segundos-1; //Restamos segundos si no son menores que 0
cuentaatras(segundos,minutos);
}
multiplo=multiplo+1; //Empleamos multiplo, para ir aumentando de un segundo en un segundo la diferencia entre tiempos, y asi poder contar cada segundo
}
segundosactual=millis(); //Renovamos la variable millis
}
//////FIN DEL CONTEO
digitalWrite(RELE, LOW); //Desactivamos el rele
lcd.clear();
lcd.setCursor(0,0);
lcd.print("FINALIZADO");//Mostramos mensaje de finalizado
buzzer(1); //Melodia de final
lcd.clear();
//Ponemos a cero las variables
segundosactual = 0;
segundostotal = 0;
segundosviejo = 0;
contador = 0;
multiplo = 1;
//Volvemos al tiempo guardado
segundos=EEPROM.read(1);
minutos=EEPROM.read(2);
}
//Funcion Imprimir
void imprimir(int seg,int minu)
{
if(minutos<10) //Si los minutos son menores de 10 situamos la cifra mas a la derecha
{
lcd.setCursor(11,0);
lcd.print(segundos);
lcd.setCursor(10,0);
lcd.print(":");
lcd.setCursor(8,0);
lcd.print("0");
lcd.setCursor(9,0);
lcd.print(minutos);
}
else
{
lcd.setCursor(11,0);
lcd.print(segundos);
lcd.setCursor(10,0);
lcd.print(":");
lcd.setCursor(8,0);
lcd.print(minutos);
}
}
//Funcion imprimir cuenta atras, situacion correcta de los segundos
void cuentaatras(int seg, int minu)
{
if(minutos<10&&segundos>=10) //Si los minutos son menores de 10 situamos la cifra mas a la derecha y los segundos mayores que 10
{
lcd.setCursor(13,0);
lcd.print(segundos);
lcd.setCursor(12,0);
lcd.print(":");
lcd.setCursor(10,0);
lcd.print("0");
lcd.setCursor(11,0);
lcd.print(minutos);
}else if(minutos>=10&&segundos>=10)
{
lcd.setCursor(13,0);
lcd.print(segundos);
lcd.setCursor(12,0);
lcd.print(":");
lcd.setCursor(10,0);
lcd.print(minutos);
}
if(minutos<10&&segundos<10) //Si los minutos son menores de 10 situamos la cifra mas a la derecha, los segundos menores que 10
{
lcd.setCursor(13,0);
lcd.print("0");
lcd.setCursor(14,0);
lcd.print(segundos);
lcd.setCursor(12,0);
lcd.print(":");
lcd.setCursor(10,0);
lcd.print("0");
lcd.setCursor(11,0);
lcd.print(minutos);
}else if(minutos>=10&&segundos<10)
{
lcd.setCursor(13,0);
lcd.print("0");
lcd.setCursor(14,0);
lcd.print(segundos);
lcd.setCursor(12,0);
lcd.print(":");
lcd.setCursor(10,0);
lcd.print(minutos);
}
}
//Funciones Lectura y Grabado EEPROM
void saveseg(int segundos)
{
int saveseg=0;
saveseg=EEPROM.read(1); //Leemos los segundos guardados
if (saveseg!=segundos) //Si los segundos guardados no coinciden con los nuevos volvemos a guardar
{
EEPROM.write(1,segundos); //Guardamos
lcd.setCursor(0,1);
lcd.print("Saved"); //Imprimimos para verificar el guardado
}
}
void savemin(int minutos)
{
int savemin=0;
savemin=EEPROM.read(2); //Leemos los minutos guardados
if (savemin!=minutos) //Si los minutos guardados no coinciden con los nuevos volvemos a guardar
{
EEPROM.write(2,minutos); //Guardamos
lcd.setCursor(0,1);
lcd.print("Saved"); //Imprimimos para verificar el guardado
}
}
//Funcion BUZ
void buzzer(byte melodia)
{
switch (melodia)
{
case 1: //Melodia al finalizar la cuenta
digitalWrite(BUZ, HIGH);
delay(1000);
for (int i = 0; i<10; i++)
{
digitalWrite(BUZ, HIGH);
delay(200);
digitalWrite(BUZ, LOW);
delay(50);
}
break; //Melodia al iniciar la cuenta
case 2:
digitalWrite(BUZ, HIGH);
delay(250);
digitalWrite(BUZ, LOW);
break;
}
}
Ahora queda hacer una plaquita con el transistor, rele fuente etc etc y meterlo en la insoladora
Gracias por compartirlo! Igual me animo a hacer yo una...que te ha quedado muy guapa y es relativamente barata...
Código: try {
live();
}
catch (BestMoments) {
MessageBox.Show(Happy)
}
igargi escribió:Gracias por compartirlo! Igual me animo a hacer yo una...que te ha quedado muy guapa y es relativamente barata...
Para eso estamos¡, el codigo esta bastante comentado, y los pines de conexion creo que se ven bien, de no ser asi decirme y subo un esquema.
Alguien me puede explicar lo del rebote del pulsador?? No lo había escuchado
cansi22 escribió:Alguien me puede explicar lo del rebote del pulsador?? No lo había escuchado
Cuando pulsamos un interruptor, debido a que son puramente mecanicos se pueden producir chasquidos en los contactos, o contactos muy breves accidentales mientras pulsamos el pulsador, por tanto, se pone un "delay", tras realizar la lectura del pulsador para que esto no suceda ya que asi damos suficiente margen para que el pulsador este completamente abierto.
Yo uso la libreria BOUNCE, que es muy sencilla, y facil de usar, cualquier duda comentamelo, pero se puede solucionar por Hardware con la incorporacion de un condensador y resistencia adicional al pulsador.
Felicidades te ha quedado muy bien
Ait0r escribió:Felicidades te ha quedado muy bien
Muchas Gracias¡, tengo que cambiar una cosilla del codigo, que cuando tengo en memoria X minutos y 0 segundos me lo muestra asi:
4:0
en ved de
4:00
Es una jodida parida, pero me gusta dejar las cosas bien acabadas
Simplemente genial. Tanto acabados como la idea del programa. A ver si hago un hueco y me leo el código.
Lo que comentas del :0, quizás el día de mañana quieras modificarle alguna cosilla, ¿has pensado en ponerle una conexión usb para el nano? Así abrir la insoladora sería cuestión de causas mayores.
jukillo escribió:Simplemente genial. Tanto acabados como la idea del programa. A ver si hago un hueco y me leo el código.
Lo que comentas del :0, quizás el día de mañana quieras modificarle alguna cosilla, ¿has pensado en ponerle una conexión usb para el nano? Así abrir la insoladora sería cuestión de causas mayores.
estaria bien si, la verdad, cuando tenga un ratillo me pongo a ello y le caso una toma¡
No sé en que hilo vi una toma que te vendría bien. Creo que en el hilo de la impresora de Cansi.
P.D.: Algo asi: http://www.ebay.es/itm/D-type-1-4-Micro-...5f4&_uhb=1
El nano lleva mini USB¿? No lleva micro USB?¿?
jukillo escribió:El nano lleva mini USB¿? No lleva micro USB?¿?
mini mini Jukillo, el micro es el de los moviles que es aun mas peque
Tienes razón. No sé por qué tenía metido en la cabeza que llevaba micro.
soy de Nicaragua tengo 56años soy lisiado de guerra y aficionado a la electronica este proyecto de la insoladora me interesa y no se mucho de electronica menos de programar por eso no hallo que hacer cuando mando al arduino verificar el sketch tal vez me puedas ayudar a resolver este problema
Insoladora_con_relay.ino: In function 'void setup()':
Insoladora_con_relay.ino:68:7: error: 'class LiquidCrystal_I2C' has no member named 'init'
'class LiquidCrystal_I2C' has no member named 'init'
|