Mi utilidad práctica para arduino+LCD SHIELD

Buenos dias comunidad,tengo en marcha mi proyecto para un quemador de biomasa controlado con arduino. Esta pequeña maravilla (arduino) me permite gobernar mi quemador, darle una interfaz, proporcionarle seguridades por temperatura,... es sencillamente genial, estoy que lo flipo :D.
Os pongo un video del quemador

(prototipo, ahora ya lo tengo más avanzado) que espero utilizar en breve. Los elementos básicos a manejar son el ventilador, para el que preveo 2 marchas de velocidad (con la ayuda de una placa cebek para este fin), y una torba que alimentará el quemador con pellets por detrás.
El problema que tengo y para lo que pido ayuda y consejo viene en el programa de arduino. La alimentación del quemador es intermitente, y uso el comando "delay", pero he observado que durante esos delay, los pulsadores no funcionan. ¿habrá otra manera de controlar las pausas con la misma placa arduino o he de utilizar otros elementos?. Espero vuestro consejo, os dejo el programa que llevo escrito (sobre otro que encontré para usar el LCDSHIELD :grin: ). Saludos.

//Sample using LiquidCrystal library
#include <LiquidCrystal.h>

/*******************************************************
This program will test the LCD panel and the buttons
Mark Bramwell, July 2010
********************************************************/

// select the pins used on the LCD panel
LiquidCrystal lcd(8, 9, 4, 5, 6, 7);

// define some values used by the panel and buttons
int lcd_key = 0;
int adc_key_in = 0;
int estado = 0 ;//estado en el que se encuentra el quemador
int temperatura = 0; //variable para el control de la seguridad y gobierno de la potencia del quemador

float temp_in_celsius = 0, temp_in_kelvin=0, temp_in_fahrenheit=0;//variable para temperatura sensor 1
float temp_in_celsius2 = 0, temp_in_kelvin2=0, temp_in_fahrenheit2=0;//variable para temperatura sensor 2

#define apagado 0
#define marcha_rapida 1
#define btnDOWN 2
#define marcha_media 3
#define marcha_lenta 4
#define btnNONE 5
#define torba 21
#define ventilador1 20
#define ventilador2 19
#define ventilador3 18

// read the buttons (lectura de botones)
int read_LCD_buttons()
{
adc_key_in = analogRead(0); // read the value from the sensor (pin 0 da el valor usado para los botones)
// my buttons when read are centered at these valies: 0, 144, 329, 504, 741(valores que da pin 0 con cada boton)
// we add approx 50 to those values and check to see if we are close(le añade 50 al valor de cada boton y usa esta variable)
if (adc_key_in > 1000) return btnNONE; // We make this the 1st option for speed reasons since it will be the most likely result
if (adc_key_in < 50) return apagado;
if (adc_key_in < 195) return marcha_rapida;
if (adc_key_in < 380) return btnDOWN;
if (adc_key_in < 555) return marcha_media;
if (adc_key_in < 790) return marcha_lenta;
return btnNONE; // when all others fail, return this...
}

void setup()
{
Serial.begin(9600);
lcd.begin(16, 2); // comienza la libreria
lcd.setCursor(0,0);
lcd.print("VULCANITO POWER"); // que quede constancia del poder de vulcano!!!
pinMode (21, OUTPUT);
pinMode (20, OUTPUT);
pinMode (19, OUTPUT);
pinMode (18, OUTPUT);
}

void loop()
{

temp_in_kelvin = analogRead(6) * 0.004882812 * 100;//lee el valor del termostato en pin a6
temp_in_celsius = temp_in_kelvin - 2.5 - 273.15; //este sensor esta destinado a la temperatura del
temp_in_fahrenheit = ((temp_in_kelvin - 2.5) * 9 / 5) - 459.67;//agua del circuito de calefacción
//------------------------------------------------------------------------------------------------------------------//
temp_in_kelvin2 = analogRead(7) * 0.004882812 * 100;//lee el valor del termostato en pin a7
temp_in_celsius2 = temp_in_kelvin2 - 2.5 - 273.15; //este sensor esta destinado a la temperatura del
temp_in_fahrenheit2 = ((temp_in_kelvin2 - 2.5) * 9 / 5) - 459.67;//armazon del quemador, por si se prende
//el combustible, para parar todo el sistema
//-----------------------------------------------------------------------------------------------------------------//
//A continuacion van todas las medidas de seguridad por temperatura (tanto de agua del circuito como de incendio).
if (temp_in_celsius2 >= 28) {temperatura=1;}//si el termostato de seguridad lee una temperatura alta, para el sistema
//-----------------------------------------------------------------------------------------------------------------//

Serial.print("Celsius: ");
Serial.println(temp_in_celsius2);

// lcd.setCursor(0,1);
//lcd.print(temp_in_celsius);

//lcd.setCursor(9,1); // move cursor to second line "1" and 9 spaces over
//lcd.print(millis()/1000); // display seconds elapsed since power-up

lcd.setCursor(0,1); // move to the begining of the second line
lcd_key = read_LCD_buttons(); // read the buttons

switch (estado)
{
case 0:
digitalWrite(21,LOW);
digitalWrite(20,LOW);
digitalWrite(19,LOW);
digitalWrite(18,LOW);
lcd.setCursor(0,1);
lcd.print(temp_in_celsius);
delay(500);

break;

case 1:
lcd.setCursor(0,1);
lcd.print(temp_in_celsius);
digitalWrite(21,LOW);
digitalWrite(20,HIGH);//apagado
digitalWrite(19,LOW);
digitalWrite(18,LOW);
delay (5000);
digitalWrite(20,LOW);
lcd.clear ();
lcd.print ("apagado");
estado=0;
break;

case 2:
lcd.setCursor(0,1);
lcd.print(temp_in_celsius);
digitalWrite(19,LOW);
digitalWrite(18,LOW);
digitalWrite(20,HIGH);//marcha lenta
digitalWrite(21,HIGH);
delay (1000);
digitalWrite(21,LOW);
delay (1000);
break;

case 3:
lcd.setCursor(0,1);
lcd.print(temp_in_celsius);

digitalWrite(20,LOW);//marcha media
digitalWrite(19,HIGH);
digitalWrite(18,LOW);
digitalWrite(21,HIGH);
delay (500);
digitalWrite(21,LOW);
delay (500);
break;

case 4:
lcd.setCursor(0,1);
lcd.print(temp_in_celsius);

digitalWrite(20,LOW);
digitalWrite(19,LOW);
digitalWrite(18,HIGH);//marcha rapida
digitalWrite(21,HIGH);
delay (100);
digitalWrite(21,LOW);
delay (100);
break;
}

switch (temperatura)
{
case 1:
{
estado=0;
lcd.clear();
lcd.print("temperatura quemador");
lcd.setCursor (0,1);
lcd.print("critica, comprobar");
delay(5000);
break;
}
}

switch (lcd_key) // depending on which button was pushed, we perform an action
{ //La variable "estado" la dirige el boton que pulsemos
case apagado:
{
lcd.clear();
lcd.print("apagando");
estado=1;//ventilador activo durante 10 minutos y apagado
break;
}
case marcha_media:
{
lcd.clear();
lcd.print("marcha media");
estado=3;//led verde
break;
}
case marcha_rapida:
{
lcd.clear();
lcd.print("marcha rapida");
estado=4;//led rojo
break;
}
case btnDOWN:
{
lcd.print("DOWN ");
break;
}
case marcha_lenta:
{
lcd.clear();
lcd.print("marcha lenta");
estado=2; //led amarillo
break;
}
/case btnNONE:
{
lcd.print("NONE ");
break;
}
/
}

}

Buen proyecto!

Yo tengo una estufa de pellets, la abriré y te enviré una foto para que veas los componentes de control y a ver si te ayuda en algo.

Para estos casos en los que quieres controlas pulsadores, otros elementos, etc.. mientras se realiza una pausa, se emplea la función millis() controlando el tiempo en el que comienza la pausa y el tiempo en que quieres que acabe, mira por la referencia de arduino, y en el IDE de arduino viene un ejemplo de como hacer estas pausas con la función millis(). Un saludo, te está quedando muy bien ese quemador.

Como te dicen, utiliza la función millis.

Hace poco vi un buen ejemplo donde la usaban, si lo encuentro te lo pongo. Utilizaban variables int o long:
anteriormillis=millis();
actualmillis=0;
rango=xx // siendo rango el tiempo en milisegundos que quieres que se aplique la función, el tiempo que tienes fijado en delay vamos.

Y en la cabecera de un condicional ya dentro del loop se hacía:
si actualmillis - anteriormillis >= rango:
anteriormillis=actualmillis;
bla bla bla
fSi

Lo pongo rápido y muy por encima (en pseudocódigo) para que captes un poco la idea, es sencillo en realidad.

Por cierto, ¿has seguido algún esquema público en internet para el quemador? Me gustaría echar un ojo al tema jeje

Gracias por las pistas, el tema de "millis" lo he investigado pero poco, porque los millis empiezan a contar desde que iniciamos la placa, pero también podemos modificar su valor cuando queramos ]:smiley: .
Os pongo un enlace de la página SOLARWEB con diferentes proyectos de quemadores de biomasa, a ver cuando termino el mio y hago un post chulo con "afotos"

Ya postearé resultados y mostraré mi proyecto, gracias de nuevo a todos

Me parece muy interesante tu proyecto. Lo seguiré de cerca!

Ya de paso de dejo el código al que me refería en mi anterior post, hay un ejemplo llamado BlinkWithoutDelay que usa millis(), nombre muy descriptivo vamos, el archiconocido ejemplo blink pero sin delay jej:

const int ledPin =  13;      // the number of the LED pin

int ledState = LOW;             // ledState used to set the LED
long previousMillis = 0;        // will store last time LED was updated

long intervalOn = 500;           // medio segundo  ON
long intervalOff = 5000;         // cinco segundos OFF
void setup() {
  pinMode(ledPin, OUTPUT);      
}

void loop()
{
  unsigned long currentMillis = millis();
  if (ledState == LOW) {
    if(currentMillis - previousMillis > intervalOff) {
            previousMillis = currentMillis;   
            ledState = HIGH;
    }
 } else {
    if(currentMillis - previousMillis > intervalOn) {
           previousMillis = currentMillis;   
          ledState = LOW;
    }
 }
 digitalWrite(ledPin, ledState); 
}

Ya contarás como va saliendo el invento! :slight_smile:

Interesante proyecto y al precio que esta el gasoleo como que es para inventar.

Los elementos básicos a manejar son el ventilador, para el que preveo 2 marchas de velocidad (con la ayuda de una placa cebek para este fin),...

Me imagino que te refieres al modulo cebek CE-R10 para motores monofasicos a 220V.

Hola mcdohl, hace un tiempo vi una librería muy interesante que podría llegar a aplicarse a tu problema.
Se trata de la declaración de un Timmer al cual se le asigna una función y un intervalo en milisegundos.
De esta manera lo que haces es que se ejecute una función cada x milisegundos...

Podrías hacer una función que tome el valor leido de los pulsadores y se ejecute cada 500 ms
Es una idea tentativa, habría que revisarlo un poco mas detenidamente.
Algo así:

#include <MsTimer2.h>

int lcd_key=0;

void updateLCD_Key() {
   lcd_key = read_LCD_buttons();
}

void setup() {
  
  MsTimer2::set(5000, updateLCD_Key); // 500ms period
  MsTimer2::start();
}

int i =0;

void loop() {
 
}

Esta idea aporta una visión distinta al problema y.... de alguna manera busca evitar los if que a futuro los vas a tener diseminados en todo el código. Creo que de esta manera harías mas clara la programación.

La librería la puedes encontrar en
http://www.arduino.cc/playground/Main/MsTimer2

Cuéntame que te parece el enfoque

Suerte con eso!!!

¡Ya tengo escrito el código!, ¡¡¡los millis son el futuro!!!
Estas funciones van de lujo que te crujo, también para poner la temperatura del termostato. Lo postearé mañana por si le sirve a alguien de ayuda. Gracias a todos

¿mcdohl te vas inspirando en algo en cuanto a medidas del quemador y demás? ¿O lo vas haciendo a ojo? Porque la verdad es que me gustaría echar un vistazo a algún documento donde se explique un poco los principios de funcionamiento, características, el encendido y demás jeje.

¿Donde vas a usarlo por cierto? Porque en el enlace que pusiste vi post tuyos hablando de un horno de piedra, ¿vas a utilizarlo en eso?

Un saludo

Buenas

No tengo ni idea de usar Arduino, pero quiero empezar a toquetearlo un poco. A ver si alguien me puede orientar...
Quiero controlar en un quemador de biomasa la velocidad de un ventilador y la velocidad del sinfin (pararlos y arrancarlos también), dependiendo de la temperatura. También quiero hacer funcionar la bomba de recirculación del agua y el tiro en función de la temperatura. Qué necesito??

Mil Gracias

velapublicidad:
Buenas

No tengo ni idea de usar Arduino, pero quiero empezar a toquetearlo un poco. A ver si alguien me puede orientar...
Quiero controlar en un quemador de biomasa la velocidad de un ventilador y la velocidad del sinfin (pararlos y arrancarlos también), dependiendo de la temperatura. También quiero hacer funcionar la bomba de recirculación del agua y el tiro en función de la temperatura. Qué necesito??

Mil Gracias

necesitas primero aprender a utilizar un Arduino, esto te puede llevar unas semanas o unos meses depende del tiempo que tengas. Aprende a encender y apagar un LED, luego un rele, ejemplos faciles.
luego ya te meteras en algo tan elaborado como controlar un quemador.
mira mi firma
suerte

ya se que primero tengo que aprender, pero quiero saber qué placa comprar y esas cosas básicas para no gastar dos veces

Para lo que quieres hacer con una placa Arduino UNO es suficiente, hay con los consejos que te da nuestro amigo @Sergegsx empezar a hacer pequeñas cositas para ir aprendiendo.

Links para aprender
http://arduino.cc/playground/Es/Es
http://www.arduino.cc/es/Tutorial/HomePage
http://arduino.cc/playground/Main/InterfacingWithHardware
http://www.arduteka.com/

http://wiki.webdearde.com/index.php?title=Tutorial:_Comenzando_con_Arduino

velapublicidad:
ya se que primero tengo que aprender, pero quiero saber qué placa comprar y esas cosas básicas para no gastar dos veces

me parece correcto, pero preparate para ir comprando cosas, y muchas por duplicado para hacer pruebas etc
te recomiendo que si tienes pacienda (15dias) compres lo sigiuente en ebay:
2 x arduino uno (dos porque así puedes hacer pruebas)
placa de prototipos para montar el circuito
cables
sensores temperatura DS18B20 http://www.ebay.com/itm/1PCS-DALLAS-DS18B20-18B20-TO-92-Thermometer-Temperature-Sensor-55-C-TO-125-C-/221124700611?pt=LH_DefaultDomain_0&hash=item337c0f29c3
fuente alimentación para arduino 7V o 9V
pantalla lcd, mejor si es I2C para no usar tantos cables http://www.ebay.com/itm/IIC-I2C-TWI-Serial-LCD-2004-20x4-Module-Shield-Display-Blue-Arduino-competible-/290728681866?pt=LH_DefaultDomain_0&hash=item43b0c7a18a
4 channel relay ( o los que necesites ) http://www.ebay.com/itm/4-Channels-5V-Relay-Module-For-Arduino-ARM-PIC-AVR-DSP-/290803907966?pt=LH_DefaultDomain_0&hash=item43b5437d7e
leds, resistencias

suerte

Hola y saludos, mcdohl yo estoy empezando casi al revés que tu, mira quiero empezar por la programación del arduino, la verdad que de programación no tengo ni idea con lo cual quiero seguir este post de cerca, también tengo una pregunta para todos si es posible,ya poseo la placa arduino duemilanove me estoy familiarizando con ella, y tengo barias dudas pero preguntare poco a poco.
Por ejemplo como puedo hacer para controlar que me encienda la resistencia unos dos minutos, a la vez que tenga el motor del ventilador en marcha es decir tener mas de una función en marcha.
Creo que pido mucho... pero haber si aprendemos un poco...gracias de antemano...

Hola a todos. Refloto este hilo para continuar con el tema. Tengo pedido un arduino mega y algunas cosas mas para controlar un quemador de biomasa. Es mi primera experiencia con arduino aunque si tengo algun conocimiento de programación en C. Empezare a trastearlo en cuanto me llegue.Conforme vaya avanzando ire preguntado cosas. ¿Porque son necesarios dos arduinos para las pruebas? No sirve con uno solamente. Muchas gracias.

Saludos.

Sirve con uno solo, pero conforme hagas pruebas veras que te pueden hacer falta mas. Al menos esta es mi experiencia.
Un arduino lo montas con el proyecto que estas desarrollando, el otro arduino lo utilizas para hacer pruebas de los diferentes modulos o secciones que quieres aprender para añadir al proyecto.
De esta forma puedes usar el arduino de pruebas junto con el codigo solo de lo que estas probando y el sensor o lo que sea.

Gracias por responder.
Ahora entiendo lo de tener dos arduinos.
Como en principio no voy a empezar con el proyecto, sino que dedicare un tiempo a aprender a programar y familiarizarme con él, me valdra con uno. En cuanto pille soltura pillare otro para lo que propones.

Muchas gracias.

Estoy intentando hacer un menu al cual acceder mediante la pulsacion de un encoder rotativo con boton. He visto ejemplos de menus con botonera y de lectura de encoder. Me lio al unir todo.