Calefactor para Impresora 3D

Espero no cometer errores, moderador.

Hola, buenas, me presento, mi nombre es Juan Carlos. Recibí un curso de Arduino de iniciación, básicamente me enseñaron qué es arduino, qué aplicaciones puede tener, algo de electrónica básica y programación a nivel bebé.

Estoy intentando hacer un calefactor para cabina de impresora 3D, para reducir el Warping en ABS. Para ello necesito una fuente constante de calor que mantenga la cabina por encima de 50º. Por ello lo que necesito es que por debajo de 50º arranque un calefactor junto a un ventilador con disipador que distribuya el calor, cuando alcance los 60º que pare el circuito y por debajo de 50º que vuelva a arrancar. Además me gustaría poder visualizar la temperatura en el LCD y poder variar los valores desde la botonera del lcd.

Para ello, tengo un sucedaneo de Arduino UNO, un LCD con botonera integrada 1602, una sonda DS18B20, ventilador con disipador, calefactor cerámico (tipo al de las planchas de pelo femeninos) y los relés y adaptador de sonda, además de una fuente de alimentación a 3.3v, 5v. 12v. 24v. y 220v.

He utilizado el código de un chico que hizo un proyecto para ventilar el calor de la calefacción, en teoría es básicamente lo mismo, salvo que hay que conectar además del ventilador, el calefactor. El código quizá lo tenga que ampliar (no lo sé).

La sonda al principio me daba una lectura poco creible, para que subiera de los 36º había que prenderle, literalmente, fuego, no se que habré hecho pero ahora si parece dar lecturas correctas, creo que no funcionaba bien con la tensión que ofrece el usb del ordenador y tras ponerlo en la fuente de alimentación parece que funciona.

Entre cientos de miles de dudas la primera es la lectura de la sonda, el resto de las dudas pues.... básicamente pediros ayuda para finalizar el proyecto. Os paso el código a ver si me podeis echar unas cuantas manos, ya que creo que este proyecto puede venirle bien a mucha gente con el mismo problema con las impresoras 3d.

Gracias por adelantado. Un saludo.

// 2017 Calefactor Impresora 3D
// 

// Temp Monitor: DS18B20 (digital)
// Celsius Example.

// **WARNING**
// Configurado para calefactor de impresora 3D, sus parametros pueden variar dependiendo de la aplicación
// Encendido cuando la cabina descienda de los 40 grados centígrados
// Uso el símbnolo >  
// under "Check Temperature is in limit" below
// If turning on something such as an electric heater and monitoring an environment for cold
// use >

/********************************************************************/

// Primero incluyo las librerias:
#include <OneWire.h> 
#include <DallasTemperature.h>
#include <LiquidCrystal.h>
/********************************************************************/

// Los datos de la sonda van conectados al pin 13 de Arduino 
#define ONE_WIRE_BUS 13 
/********************************************************************/

// Setup a oneWire instance to communicate with any OneWire devices  
// (not just Maxim/Dallas temperature ICs) 
OneWire oneWire(ONE_WIRE_BUS); 
/********************************************************************/

// Pass our oneWire reference to Dallas Temperature. 
DallasTemperature sensors(&oneWire);
/********************************************************************/ 

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

// define interface pins:
// LCD BackLight uses PIN 10
#define RELAY 12 //Lock Relay or motor
// Temp Sensor is on PIN 13
/********************************************************************/

// Value for Default Setpoint (temp for Relay) in Celsius:
int SetPoint=40;
/********************************************************************/

// define some values used by the panel and buttons
int lcd_key     = 0;
int adc_key_in  = 0;

#define btnRIGHT  0
#define btnUP     1
#define btnDOWN   2
#define btnLEFT   3
#define btnSELECT 4
#define btnNONE   5

int read_LCD_buttons(){               // read the buttons
    adc_key_in = analogRead(0);       // read the value from the sensor 

    // my buttons when read are centered at these valies: 0, 144, 329, 504, 741
    // we add approx 40 to those values and check to see if we are close
    // We make this the 1st option for speed reasons since it will be the most likely result

    if (adc_key_in > 1000) return btnNONE; 

    // For V1.1 us this threshold
    if (adc_key_in < 50)   return btnRIGHT;  
    if (adc_key_in < 250)  return btnUP; 
    if (adc_key_in < 450)  return btnDOWN; 
    if (adc_key_in < 650)  return btnLEFT; 
    if (adc_key_in < 850)  return btnSELECT;   

    return btnNONE;                // when all others fail, return this.
}
/********************************************************************/
// only run once, after each powerup or reset of the Arduino board.
// (void) variables the ISR function takes no arguments & continues with it's next line after the interrupt occurs.
void setup(void) 
{ 

// Set outputs  
   pinMode(RELAY,OUTPUT);

// Initialize Relay PIN so it stays inactive at reset 
  digitalWrite(RELAY,LOW);       //Turn off Relay 

 
 // start serial port for debug change "lcd.print" to "Serial.print" 
 // and listen to COM port
 Serial.begin(9600); 
 // set up the LCD's number of columns and rows: 
   lcd.begin(16, 2);
   lcd.print("Calefactor 3D");
   lcd.setCursor(0,1); //Move coursor to second Line
   lcd.print("Control");
   
delay (8000);
 lcd.clear();
 
 // Start up the library 
 sensors.begin(); 
} 
/********************************************************************/
void loop(void) 
{ 
 
 // call sensors.requestTemperatures() to issue a global temperature 
 // request to all devices on the bus 
   sensors.requestTemperatures(); // Send the command to get temperature readings 
   lcd.setCursor(0,0);
   lcd.print("Temp:");    //Do not display entered keys 
   lcd.print(sensors.getTempCByIndex(0));
   lcd.print((char)223); // Degree Symbol
   lcd.print(" C"); 
   // You can have more than one DS18B20 on the same bus.  
   // 0 refers to the first IC on the wire 

//Get user input for setpoints 
  if(read_LCD_buttons() == btnDOWN)
   {
    if(SetPoint>0)
    {
      SetPoint--;   
    }
  }
  if(read_LCD_buttons() == btnUP)
  {
    if(SetPoint<40)
    {
      SetPoint++;
    }
  }
/********************************************************************/

//Display Set point on LCD in Celsius (C)).
  lcd.setCursor(0,1);
  lcd.print("Set Point:");
  lcd.print(SetPoint);
  lcd.print((char)223);
  lcd.print(" C");
/********************************************************************/

//Check Temperature is in limit:
// I am monitoring a Hot Water Boiler, I want to turn on the heater when the water is HOT
// I use a < 
// If turning on something such as an electric heater and monitoring an environment for cold
// use >
if((sensors.getTempCByIndex(0)) > SetPoint) 
{
   digitalWrite(RELAY,LOW);    //Turn off heater
   Serial.print("HEATER OFF"); // serial port for debug
}
else
{
  digitalWrite(RELAY,HIGH);    //Turn on heater
  Serial.print("HEATER ON"); //serial port for debug
  
  lcd.clear(); // Clears the LCD Information

   sensors.requestTemperatures(); // Send the command to get temperature readings 
   lcd.setCursor(0,0);
   lcd.print("Calef. ON");    //Do not display entered keys 
   lcd.setCursor(0,1);
   lcd.print(sensors.getTempCByIndex(0));
   lcd.print((char)223); // Degree Symbol
   lcd.print(" C");



}
 /********************************************************************/     
      delay(100); //Update at every 100mSeconds
 
}

Como tienes conectado el DS18b20 al pin 13, usas una resistencia de 4k7?

Si, efectivamente. De momento tengo conectada una resistencia de 4k7 Ohm, aunque le pondré el adaptador que me llega mañana, esa placa viene con la resistencia y un diodo. La sonda ya me está midiendo bien (Creo) el problema es el código para que pueda darle utilidad a la botonera ya que de momento lo que tengo pensado es poner en la salida 12 dos relés, uno para el calefactor y otro para el ventilador y el código dejarlo tal cual y con la botonera poder acceder a los parámetros para variar temperatura de arranque/paro.

Porque no usas un NANO con el DS18B20 que controle la temperatura y dejas a la impresora hacer su trabajo sin interferir con esto?

Gracias surbyte, quizá me he expresado mal, yo no quiero modificar nada de la impresora con el Arduino UNO, ese Arduino es exclusivamente para controlar el calefactor y el ventilador, lo de modificar temperaturas me refería a modificar los valores asignados para el arranque y parada tanto del calefactor como del ventilador, no de la impresora y utilizo el UNO porque es el que tengo y lo tenía por ahí tirado.

ArduMyth, gracias por tus consejos sobre la utilización de los materiales y los problemas que pueden generar, no sólo en la impresión sino en la salud, pero tengo la necesidad de utilizar ese material en algunos casos y he probado de todo, con los valores que me marca el fabricante de ABS, haciendole una cabina no consigo casi nada, estoy en una cochera cerca de la puerta y no tengo otra opción de cambiarla de sitio.

Con respecto a la parte final del comentario, quizá sea cierto que he sido muy atrevido en pedir ayuda con el código, pero verás que he sido completamente franco y si algo te puedo asegurar es que si me pides ayuda en algo que yo pueda hacer lo hago sin problemas, no me mueve el dinero, si he pedido esa ayuda es porque no tengo ni papas y he visto a mucha gente en este foro que si y no llego a tener conciencia de si lo que estoy pidiendo es algo extraordinario o no, pensaba que no es complicado para los que tienen experiencia, pues hay multitud de proyectos similares, pero hasta ahí, similares, de hecho el código no es un corta pega, he hecho algunos cambios, pero muy básicos.

De todas formas gracias por las aclaraciones y si te puedo ayudar en algo no dudes en pedirmelo, no te pasaré ni mi cuenta bancaria ni la cuenta, por supuesto. Un saludo a todos y gracias

Si. Justamente mi comentario apuntaba a que no conozco el software de la impresora y sumar algo siempre tiene riesgos por la falta de experiencia en cómo hacerlo sin consumir tiempo del código principal. Basicamente por el uso de delay() o porque pongas un sensor como el DS18B20 que puede consumirte 750ms para darte un valor.
Entonces por estas razones mi sugerencia de separar las cosas.

Surbyte, gracias de nuevo por tus consejos y respuestas y te reitero, no voy a tocar el control de la impresora, el control de la impresora es independiente del arduino, con el arduino "solo" voy a controlar el arranque/parada del calefactor y el ventilador en base a la temperatura que arroje la sonda y a los parámetros que introducta en el código para el arranque y la parada.

Ardumyth gracias nuevamente por todos los consejos. Antes de embacarme en este proyecto he pasado por multitud de foros para aprender todo lo posible para imrpimir ABS, con los parametros aconsejador por el fabricante, cambiando algunos parametros de velocidad, arranque o parada del ventilador que enfría el filamento al caer sobre capas, no se, habré hecho 50 pruebas distintas y siempre me pasa lo mismo, las primeras capas se pegan como si le hubiese puesto cianocrilato y las siguientes empiezan a separarse.

La impresora que tengo es una creality CR-10, lleva su controlador con la fuente y la refrigeración separada de la propia estructura de la impresora, que es de 300x300x400. La cama caliente alcanza sin problemas y mantenidos los 80º, llega hasta los 110º pero de forma irregular. La cabina que he construido es de aluminio y metacrilato, las dimensiones son de 650x600x600. Dentro de esa cabina está la estructura de la impresora, los motores, extrusor, cama caliente, etc....

Con la cama caliente a 80º la sonda me da una medición a los 10 minutos de 41º centigrados más o menos mantenidos y, aparentemente, no sufren los componentes, reitero, aparentemente. Como con esos 41º no hay forma de levantar más de 2 cm. sin sufrir warpin, consultando en varios foros, muchos me recomendaban fuentes de calor constantes, algunos me decían que le metiera un secador de pelo, otros bombillas de 100w y todo me parecía una cutrería, ni que decir de la dificultad de controlar la temperatura y sobre todo el coste del consumo, por eso me decidí a algo más complejo y currado. Fuente ATX, Arduino UNO, Sonda, LCD, relés....etc y el dichoso código.

Por eso he seguido un tuto-briko de un forero que le pone una célula calefactora de 20w que alcanza los 120ºC y distribuye el calor con un fan de procesaror de PC con disipador.

Dejando a un lado la conveniencia o no de "hacer un horno" lo que he hecho es coger el código de un tercero, hacerle unas modificaciones muy básicas, a la altura de mis cortísimos conocimientos y para que sea un proyecto terminado y currado pues necesitaba aplicar algunos detalles adicionales (detalles que quizá sean cuestiones más complejas que el código original, no lo se) tales como, que con la botonera del LCD se pueda modificar los parametros de arranque/parada (ahora están en arranque menos de 40º y parada a 50º) sin necesidad de tener que conectar arduino a PC y modificar el código y el otro detalle es que el ventilador no pare al mismo tiempo que la célula calefactora, sino que se quede funcionando un minuto más para que el disipador haga su trabajo.

Bueno, perdonad el rollazo que os he metido, pero quería quedar clara todas las cuestiones y dudas.

Gracias a los dos por vuestras respuestas. Voy a intentar subir fotos, a ver si soy capaz !!!



Controlar temperatura de aire fluyendo, es una de las cosas más complicadas de hacer ( lo aprendí por las malas). El aire posee un muy bajo coeficiente de transferencia térmica y los sensores encapsulados tienen una respuesta miserable. La histeresis de respuesta del sensor ahce que fluctue la temperatura real, sobre todo si la fuente de calor está sobredimensionada. Existen sensores de respuesta rapida, pero son carísimos. La solución más simple es regular la cantidad de calor entregada pulsando mediantes un relay de estado sólido la resistencia de calentamiento.

Cuando me refería a encapsulado lo hacía porque está utilizando un DS18B20, que es un sensor con un recubrimiento de resina y algunos modelos a su vez vienen dentro de una cápsula metálica inyectada en silicona. El sensor responde muy lentamente a cambios de temperatura y a su vez el aire transfiere mal el calor, por eso cuando dentro de la cabina se puede cocinar un pollo el sensor no se enteró.

PeterKantTropus, gracias por la info. Según tus explicaciones, entonces será recomendable poner un margen de parada más cercano al de arranque, para que si detecta tarde la temperatura, no lo haga cuando en realidad se haya sobrepasado 50º. Es decir en vez de parar a 50º y que la temperatura real sean 55 ó 60º, poner la parada a 44 ó 45 y cuando detecte la temperatura real no será mayor de 50º ( así a lo bruto ) y haga la parada del sistema. ¿no crees?

Por otro lado no entiendo bien que solución me planteas con el relay de estado sólido. Un relay de estado sólido sería el típico relay de arduino ¿como este?:

Si es así, ese es el sistema que tengo instalado. Un Arduino UNO con el código que aparece al inicio del post. Le entra la lectua de la sonda por pin 13, y pin 12 salida de señal para arranque/parada que está conectada a DOS relay, uno para el ventilador y otro para el calefactor cerámico.

Edito:

Según veo en fotos de google, un relay de estado sólido es otro elemento parecido al relay de arduino, y mi pregunta es ¿que diferencia hay con el relay de arduino que he puesto arriba? ¿Está fisicamente en contacto con el calefactor?... puff ando pez !!

Ese es un relay electromecánico . El relay de estado sólido se puede conmutar rápidamente sin inconvenientes. De esa manera se puede regular la potencia que entrega la resistencia prendiendo y apagando en décimas de segundos. Tendrías una fuente de calor constante. Esta es una solución muy utilizada en moldes de inyección donde por cuestiones físicas no se puede agregar una sonda.

Ok. Entendido. Ahora la pregunta es.... ¿se puede conectar a Arduino? ¿hay que modificar el código? jajajjaa. Si hay que modificar el código........ mejor me quedo como estoy, jajajajajajajaja. Gracias por tu ayuda PeterKantTropus

Bueno ya he terminado el proyecto y modificado como buenamente he podido el código. Aunque no me ha salido todo como esperaba, me está dando el resultado deseado.

Al final he puesto dos relés, uno para el calefactor cerámico al pin 12 y otro para el fan con disipador al pin 11. La sondo está "pegada" al propio calefactor para que detecte la temperatura con mayor rápidez, siguiendo el consejo que me disteis de la medición de temperatura en aire.

Lo que he hecho es elevar la temperatura de parada del calefactor a 90º y la del ventilador a 91º, así el calefactor está encendido y el fan disipando y la temperatura que alcanzo en la caja es de unos 50º, medido con termómetro externo.

Las pruebas realizadas han dado su fruto evitando el warpin exagerado que yo sufría, antes tenía que hacer una adherencia en placa de balsa y aún así me producía mucho warpin,, ahora sólo le hago la adherencia con borde y me va bastante bien. Si alguien quiere esquema, código, conexionado o cualquier otra cosa, me pongo a vuestra disposición, eso si, lo del código me ha salido de medio chorra, así es que para tema de códigos mejor preguntar a otro con experiencia.

Un saludo