Hola a todos estoy haciendo un proyecto personal pero el problema es que soy novato en este maravilloso mundo del arduino ,y el proyecto q tengo lo encontré en la web y lo ando modificando. es un temporizador y quisiera cada vez que presiono el boton start se incremente los minutos. por ejemplo si tengo 10 minutos al presionar start sea 15. lo estaba modificando de varias maneras y me choque que tengo q mantener presionado el boton start para que recien sume los minutos .por fa vor pido de su ayuda . Gracias por todo
#include <LiquidCrystal.h>
LiquidCrystal lcd(7, 8, 9, 10, 11, 12);
int ahoras = 0; //Variable a mostrar por LCD de las horas
int aminutos = 0; //Variable a mostrar por LCD de los minutos
int asegundos = 0; //Variable a mostrar por LCD de los segundos
int segundostotal = 0; //Tiempo total
int start = 2; //Pulsador de arranque
int empieza = 1024; // Variable para almacenaje del pulsador de arranque
void setup() {
lcd.begin(16, 2);
pinMode(start, INPUT_PULLUP); //pin 2 como entrada
pinMode(3, OUTPUT); //pin 3 como salida
empieza = 1024; //Barrera de arranque
Serial.begin(9600);
}
void loop() {
do {
lcd.setCursor(1,0);
lcd.print("Inserte Moneda");
lcd.setCursor(4,1);
if (ahoras < 10)
lcd.print("0"); // Si las horas son menor que 10, pone un "0" delante.
lcd.print(ahoras); // Sin este codigo, se muestra asi: H:M:S (1:M:S)
lcd.print(":");
if (aminutos < 10)
lcd.print("0"); // Si los minutos son menor que 10, pone un "0" delante
lcd.print(aminutos); // Sin este codigo, se muestra asi: H:M:S (H:1:S)
lcd.print(":");
if (asegundos < 10)
lcd.print("0"); // Si los segundos son menor que 10, pone un "0" delante.
lcd.print(asegundos); // Sin este codigo, se muestra asi: H:M:S (H:M:1)
} while(digitalRead(start) == 0); // Se repite el menu de elegir tiempo hasta que pulsemos el boton de arranque.
//int asegundos = 5;
segundostotal = asegundos + (aminutos * 60 + 1) + (ahoras * 60 * 60); //Convierte el tiempo elegido en segundos!!
while (segundostotal > 0)
{
if(digitalRead(start)==HIGH){
segundostotal=segundostotal+10;
}
digitalWrite(3, HIGH);
delay (1000); //Descontamos en periodos de 1 segundo
segundostotal--;
ahoras = ((segundostotal / 60)/ 60); //Convertimos los segundos totales en horas
aminutos = (segundostotal / 60) % 60; //Convertimos los segundos totales en minutos
asegundos = segundostotal % 60; //Convertimos los segundos totales en periodos de 60 segundos
lcd.setCursor(0,0);
lcd.print("Tiempo restante"); //Mostramos mensaje de tiempo restante
lcd.setCursor(4,1);
if (ahoras < 10) lcd.print("0"); // Si las horas son menor que 10, pone un "0" delante.
lcd.print(ahoras); // Sin este codigo, se muestra asi: H:M:S (1:M:S)
lcd.print(":");
if (aminutos < 10) lcd.print("0"); // Si los minutos son menor que 10, pone un "0" delante.
lcd.print(aminutos); // Sin este codigo, se muestra asi: H:M:S (H:1:S)
lcd.print(":");
if (asegundos < 10) lcd.print("0"); // si el valor de segundo esta por debajo de 9 (unidad) antepone un cero
lcd.print(asegundos); // Sin este codigo, se muestra asi: H:M:S (H:M:1)
if (segundostotal == 0) //Si finaliza el tiempo
{
digitalWrite(3, LOW);
lcd.clear();
lcd.setCursor(5,0);
lcd.print("Tiempo");
lcd.setCursor(3,1);
lcd.print("Finalizado");
delay(2000);
lcd.clear();
}
}
}
Se que mi proyecto depende tiene muchos fallos de programacion pero aun soy muy novato
lcd.setCursor(4,1);
if (ahoras < 10)
lcd.print("0"); // Si las horas son menor que 10, pone un "0" delante.
lcd.print(ahoras); // Sin este codigo, se muestra asi: H:M:S (1:M:S)
lcd.print(":");
if (aminutos < 10)
lcd.print("0"); // Si los minutos son menor que 10, pone un "0" delante
lcd.print(aminutos); // Sin este codigo, se muestra asi: H:M:S (H:1:S)
lcd.print(":");
if (asegundos < 10)
lcd.print("0"); // Si los segundos son menor que 10, pone un "0" delante.
lcd.print(asegundos); // Sin este codigo, se muestra asi: H:M:S (H:M:1)
Gracias ing. Kike_GL y surbyte. Ing surbyte me ayudastes con tu codigo, elimine varias lineas de codigo. Pero aun sigo con el problema no puedo incrementar el tiempo cuando el temporizador empezo con la cuenta regresiva. Tengo que mentener presionado varios segundos para que recien me sume el tiempo. Por favor pido de su ayuda , se que me falta mucho y sin su ayuda no podre terminarlo
#include <LiquidCrystal.h>
LiquidCrystal lcd(7, 8, 9, 10, 11, 12);
int ahoras = 0; //Variable a mostrar por LCD de las horas
int aminutos = 0; //Variable a mostrar por LCD de los minutos
int asegundos = 0; //Variable a mostrar por LCD de los segundos
int segundostotal = 0; //Tiempo total
int start = 2; //Pulsador de arranque
int empieza = 1024; // Variable para almacenaje del pulsador de arranque
void setup() {
lcd.begin(16, 2);
pinMode(start, INPUT_PULLUP); //pin 2 como entrada
pinMode(3, OUTPUT); //pin 3 como salida
empieza = 1024; //Barrera de arranque
Serial.begin(9600);
}
void loop() {
do {
lcd.setCursor(1,0);
lcd.print("Inserte Moneda");
lcd.setCursor(4,1);
char buffer[20];
sprintf(buffer, "%02d:%02d:%02d", ahoras, aminutos, asegundos);
lcd.print(buffer);
} while(digitalRead(start) == 0); // Se repite el menu de elegir tiempo hasta que pulsemos el boton de arranque.
//int asegundos = 5;
segundostotal = asegundos + (aminutos * 60 + 1) + (ahoras * 60 * 60); //Convierte el tiempo elegido en segundos!!
while (segundostotal > 0)
{
if(digitalRead(start)==HIGH){
delay(100);
segundostotal=segundostotal+10;
}
digitalWrite(3, HIGH);
delay (1000); //Descontamos en periodos de 1 segundo
segundostotal--;
ahoras = ((segundostotal / 60)/ 60); //Convertimos los segundos totales en horas
aminutos = (segundostotal / 60) % 60; //Convertimos los segundos totales en minutos
asegundos = segundostotal % 60; //Convertimos los segundos totales en periodos de 60 segundos
lcd.setCursor(0,0);
lcd.print("Tiempo restante"); //Mostramos mensaje de tiempo restante
lcd.setCursor(4,1);
if (ahoras < 10) lcd.print("0"); // Si las horas son menor que 10, pone un "0" delante.
lcd.print(ahoras); // Sin este codigo, se muestra asi: H:M:S (1:M:S)
lcd.print(":");
if (aminutos < 10) lcd.print("0"); // Si los minutos son menor que 10, pone un "0" delante.
lcd.print(aminutos); // Sin este codigo, se muestra asi: H:M:S (H:1:S)
lcd.print(":");
if (asegundos < 10) lcd.print("0"); // si el valor de segundo esta por debajo de 9 (unidad) antepone un cero
lcd.print(asegundos); // Sin este codigo, se muestra asi: H:M:S (H:M:1)
if (segundostotal == 0) //Si finaliza el tiempo
{
digitalWrite(3, LOW);
lcd.clear();
lcd.setCursor(5,0);
lcd.print("Tiempo");
lcd.setCursor(3,1);
lcd.print("Finalizado");
delay(2000);
lcd.clear();
}
}
}
Se que mi codigo tiene muchos errores es por que soy novato que recien esta aprendiendo, gracias por toda la ayuda que me puedan brindar
Intenta no utilizar delay.
Si en lugar de utilizar delay utilizas millis la cosa cambia.
Cuando quieres descontar 1 segundo, detienes al pobre arduino, y no se entera de lo que pasa a su alrededor hasta que no pasa ese tiempo, por eso tienes que dejar pulsado tanto tiempo par que descuente.
Lee un poco sobre el uso de millis, cuando te acostumbres a utilizarlo verás delays en un código que te molestarán a la vista.
En lugar de esto:
delay (1000); //Descontamos en periodos de 1 segundo
segundostotal--;
Si en lugar de eso también quieres utilizar millis para que la suma sea mas lenta utiliza esto también.
El 500 que le sumas a tiempo2 es el tiempo en ms que pasa entre cada suma de 10 segundos.
Gracias Ing Sereno. y a todas las personas que me ayudaron , gracias pero hay un detalle ahi momentos donde no registra el pulsador , es cuando presiono consecutivamente el boton , depende sera por mi codigo, alguna observacion para cambiar algunos parametros y gracias por toda la ayuda que me dieron. Se que me falta mucho por aprender pero nunca es tarde para aprender.
O alguna forma de mejorar el codigo para que funcione mejor. Gracias nuevamente
La manera en la que sumas 10 segundos cuando pulsas es la causa de que no siempre funcione.
Entre pulsación y pulsación tienes que dejar que pase el tiempo que pongas.
Todo no se puede tener, o sumas solo 10 segundos cada vez que pulses independientemente del tiempo que lo tengas pulsado, o sumas durante el tiempo que lo tienes pulsado.
Ing Sereno una consulta estoy agregando un modulo rele al temporizador, para que cuando preciono el boton start se active el rele y cuando se acabe el tiempo se apague , el problema es cuando lo reclaro en el setup y conecto el arduino se activa el rele sin presionar ningun boton, estaba buscando como solucionarlo con ejemplos solo boton y rele , pero cuando aplico al codigo no me funciona. Por favor si alguien me puede ayudar . Estaria muy agradecido
#include <LiquidCrystal.h>
LiquidCrystal lcd(7, 8, 9, 10, 11, 12);
int ahoras = 0; //Variable a mostrar por LCD de las horas
int aminutos = 0; //Variable a mostrar por LCD de los minutos
int asegundos = 0; //Variable a mostrar por LCD de los segundos
int segundostotal = 0; //Tiempo total
int start = 2; //Pulsador de arranque
int empieza = 1024; // Variable para almacenaje del pulsador de arranque
int rele=6;
unsigned long tiempo1 = 0;
unsigned long tiempo2 = 0;
void setup() {
lcd.begin(16, 2);
pinMode(rele,OUTPUT);
pinMode(start, INPUT); //pin 2 como entrada
pinMode(3, OUTPUT); //pin 3 como salida
empieza = 1024; //Barrera de arranque
Serial.begin(9600);
}
void Tiempo_Final(){
if (segundostotal == 0) //Si finaliza el tiempo
{
digitalWrite(6,LOW);
digitalWrite(3, LOW);
lcd.clear();
lcd.setCursor(5,0);
lcd.print("Tiempo");
lcd.setCursor(3,1);
lcd.print("Finalizado");
delay(2000);
lcd.clear();
}
}
void loop() {
do {
lcd.setCursor(1,0);
lcd.print("Inserte Moneda");
lcd.setCursor(4,1);
char buffer[20];
sprintf(buffer, "%02d:%02d:%02d", ahoras, aminutos, asegundos);
lcd.print(buffer);
} while(digitalRead(start) == 0); // Se repite el menu de elegir tiempo hasta que pulsemos el boton de arranque.
segundostotal = asegundos + (aminutos * 60 + 1) + (ahoras * 60 * 60); //Convierte el tiempo elegido en segundos!!
while (segundostotal > 0){
if(digitalRead(start)==HIGH){
if(millis() > (tiempo2+500))
segundostotal=segundostotal+600;
tiempo2 = millis();
}
digitalWrite(3, HIGH);
digitalWrite(6,LOW);
if(millis() > (tiempo1+1000)){
segundostotal--;
tiempo1 = millis();
}
ahoras = ((segundostotal / 60)/ 60); //Convertimos los segundos totales en horas
aminutos = (segundostotal / 60) % 60; //Convertimos los segundos totales en minutos
asegundos = segundostotal % 60; //Convertimos los segundos totales en periodos de 60 segundos
lcd.setCursor(0,0);
lcd.print("Tiempo restante"); //Mostramos mensaje de tiempo restante
lcd.setCursor(4,1);
if (ahoras < 10) lcd.print("0"); // Si las horas son menor que 10, pone un "0" delante.
lcd.print(ahoras); // Sin este codigo, se muestra asi: H:M:S (1:M:S)
lcd.print(":");
if (aminutos < 10) lcd.print("0"); // Si los minutos son menor que 10, pone un "0" delante.
lcd.print(aminutos); // Sin este codigo, se muestra asi: H:M:S (H:1:S)
lcd.print(":");
if (asegundos < 10) lcd.print("0"); // si el valor de segundo esta por debajo de 9 (unidad) antepone un cero
lcd.print(asegundos); // Sin este codigo, se muestra asi: H:M:S (H:M:1)
Tiempo_Final();
}
}
Gracias por todo y disculpen si les molesto mucho para que me ayuden.
Ya lo habia declarado de esa forma pero cuando conecto el arduino de activa el rele, lo que entiendo es
para activar rele =digitalwrite(rele,LOW) = digitalwrite((rele)==0)
para apagar rele =digitalwrite(rele,HIGH) = digitalwrite((rele)==1)
Alguna forma para que sea al reves osea para activar =HIGH apagar=LOW como lo puedo declarar .
Cuando agrego el rele en el codigo y conecto el arduino defrente se activa el rele como si hubiera presionado el boton start, creo que es por esto. while(digitalRead(start) == 0);como lo podria modificar ,y de antemano muchas gracias por toda la ayuda que me dieron, porque sin la ayuda de todos ustedes no hubiera avanzado hasta aca mi proyecto. Muchas gracias
if (segundostotal == 0) //Si finaliza el tiempo
{
digitalWrite(rele, LOW);
digitalWrite(6,LOW);
digitalWrite(3, LOW);
lcd.clear();
lcd.setCursor(5,0);
lcd.print("Tiempo");
lcd.setCursor(3,1);
lcd.print("Finalizado");
delay(2000);
lcd.clear();
}
}
Pero si tu rele se activa por nivel bajo:
Primero lo apagas antes de ejecutar nada tal y como ha comentado @surbyte
Luego es el mismo código per cambia LOW por HIGH y HIGH por LOW
Mi modulo rele se activa en nivel bajo por eso cuando agrege tu codigo ing. Sereno y enciendo el arduino el rele se activa estando el temporizador en 00:00:00 y sin haber presionado el boton de start creo que debe ser por el bucle. Gracias a todos por toda la ayuda prestada porque sin ustedes no hubiera llegado avanzar el proyecto.Gracias
do {
lcd.setCursor(1,0);
lcd.print("Inserte Moneda");
lcd.setCursor(4,1);
char buffer[20];
sprintf(buffer, "%02d:%02d:%02d", ahoras, aminutos, asegundos);
lcd.print(buffer);
} while(digitalRead(start) == 0); // Se repite el menu de elegir tiempo hasta que pulsemos el boton de arranque.
Alfin lo pude solucionar agregue estos codigos, buscando y buscando encontre para solucionar mi problema gracias por toda la ayuda que me dieron. Quisiera comprar una fuente para alimentar el arduino que caracteristicas debe tener la fuente tipo cagador de celular o que fuente me recomiendan gracias por toda la ayuda, Gracias de toda corazon nunca me cansare de decir gracias, gracias por toda la ayuda que le dan a todos quienes inician en este mundo del arduino. Gracias
const byte PIN_RELE = 4; // Pin al que está conectado el relé
const byte VALOR_RELE_SISTEMA_ENCENDIDO = LOW; // En qué estado ha de estar la salida del pin relé cuando la cuenta atrás está activa
Sobre como alimentar tu arduino, seguro que puedes encontrar muchísima información.
En este mismo foro se habla en muchas ocasiones.
Si quieres alimentarlo a trabes del jack de alimentación, lo ideal es que utilices un alimentador con una tensión entre 7 y 12V DC, en cuanto a la intensidad máxima que acepta el alimentador, eso ya tu mismo en función del consumo total que tenga tu proyecto.
Solo un consejo, cuanta mas corriente consuma tu proyecto, mas baja debería ser la tensión que le llegue a tu arduino.
El regulador interno del arduino, no solo tendrá que aguantar esa corriente, si no que tendrá que bajar el voltaje hasta los 5V DC, por lo que un alimentador de 7V DC para corrientes elevadas hará que el regulador del arduino se caliente menos que uno de 12V DC para la misma corriente.