Pages: [1] 2   Go Down
Author Topic: Mi utilidad práctica para arduino+LCD SHIELD  (Read 7306 times)
0 Members and 1 Guest are viewing this topic.
Offline Offline
Newbie
*
Karma: 0
Posts: 3
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

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  smiley-grin.
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  smiley-mr-green ). 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;
     }*/
 }
 
}
Logged

Madrid
Offline Offline
Sr. Member
****
Karma: 5
Posts: 481
Life isn't about finding yourself, life is about creating yourself!!
View Profile
WWW
 Bigger Bigger  Smaller Smaller  Reset Reset

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.
Logged

Engineering is the art of
making what you want from
things you can get.

     

[SOLUCIONADO]

Foz- Lugo
Offline Offline
Newbie
*
Karma: 0
Posts: 48
View Profile
WWW
 Bigger Bigger  Smaller Smaller  Reset Reset

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.
Logged


Offline Offline
Jr. Member
**
Karma: 0
Posts: 89
Arduino rocks
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

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
Logged

Offline Offline
Newbie
*
Karma: 0
Posts: 3
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

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-twist .
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"
http://www.solarweb.net/forosolar/biomasa/25542-quemador-biomasa-casero.html
Ya postearé resultados y mostraré mi proyecto, gracias de nuevo a todos
Logged

Offline Offline
Jr. Member
**
Karma: 0
Posts: 89
Arduino rocks
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

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:

Code:
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! smiley
« Last Edit: November 22, 2011, 10:33:40 am by Ixreb » Logged

0
Offline Offline
Edison Member
*
Karma: 8
Posts: 1040
Arduino rocks
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

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

Quote
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.
Logged

Trabajando en ...

    * Control Domotico (En montaje ...)
    http://casitadomotica.blogspot.com/
 

[url=https://bitbucket.org/fmalpartida

0
Offline Offline
Jr. Member
**
Karma: 0
Posts: 54
Arduino rocks
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

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í:

Code:
#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!!!
Logged

Offline Offline
Newbie
*
Karma: 0
Posts: 3
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

¡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
Logged

Offline Offline
Jr. Member
**
Karma: 0
Posts: 89
Arduino rocks
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

¿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
Logged

Offline Offline
Newbie
*
Karma: 0
Posts: 2
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

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
« Last Edit: October 31, 2012, 01:19:23 pm by velapublicidad » Logged

0
Offline Offline
Edison Member
*
Karma: 17
Posts: 1414
Arduino rocks
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

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
Logged

* Si preguntas, pon el código de tu programa, hace mucho mas fácil ayudarte. Y me ahorro un mensaje pidiendo que lo hagas.
* Si consigues solucionar tu problema, dedica unos minutos a explicar en tu post como lo conseguiste para beneficio de todos.
* Cambia el 'Subject' de tu hilo y añade 'SOLUCIONADO' cuando hayas llegado a una solución al problema que planteaste.
* Utiliza un 'Subject' para tu hilo que explique de que va el hilo.
Si estas empezando:
* Comienza a usar Arduino
* Guías de iniciación a Arduino
* Ejemplos
* Referencia del Lenguaje
* Conceptos básicos
Guia de usuario de arduino
Tutoriales en Ingles
Si necesitas que alguien te escriba el código: http://www.freelancer.com/  o esta  http://www.guru.com/

Offline Offline
Newbie
*
Karma: 0
Posts: 2
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

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

0
Offline Offline
Edison Member
*
Karma: 8
Posts: 1040
Arduino rocks
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

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://www.ardumania.es/
http://wiki.webdearde.com/index.php?title=Tutorial:_Comenzando_con_Arduino
http://txapuzas.blogspot.com.es/
« Last Edit: November 01, 2012, 06:25:46 am by flico » Logged

Trabajando en ...

    * Control Domotico (En montaje ...)
    http://casitadomotica.blogspot.com/
 

[url=https://bitbucket.org/fmalpartida

0
Offline Offline
Edison Member
*
Karma: 17
Posts: 1414
Arduino rocks
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

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
Logged

* Si preguntas, pon el código de tu programa, hace mucho mas fácil ayudarte. Y me ahorro un mensaje pidiendo que lo hagas.
* Si consigues solucionar tu problema, dedica unos minutos a explicar en tu post como lo conseguiste para beneficio de todos.
* Cambia el 'Subject' de tu hilo y añade 'SOLUCIONADO' cuando hayas llegado a una solución al problema que planteaste.
* Utiliza un 'Subject' para tu hilo que explique de que va el hilo.
Si estas empezando:
* Comienza a usar Arduino
* Guías de iniciación a Arduino
* Ejemplos
* Referencia del Lenguaje
* Conceptos básicos
Guia de usuario de arduino
Tutoriales en Ingles
Si necesitas que alguien te escriba el código: http://www.freelancer.com/  o esta  http://www.guru.com/

Pages: [1] 2   Go Up
Jump to: