Calificación:
  • 0 voto(s) - 0 Media
  • 1
  • 2
  • 3
  • 4
  • 5
Medición de temperatura
#1
Buenos días a tod@s:

Estoy con mi primer proyecto con arduino, intentando aprender poco a poco. Es complicado memorizar tantas cosas nuevas, pero con consultas a la web voy haciendo funcionar algo, pero desde ayer estoy atascado.

Quiero controlar la temperatura de una placa mediante un sensor LM35, con estos objetivos:
  • Ver la temperatura actual por el monitor serie.
  • Almacenar la temperatura máxima alcanzada durante todo el tiempo de lectura.
  • A través de leds, controlar visualmente el funcionamiento y el rango actual de temperatura (esto para una vez calibrada la media utilizarlo sin ordenador)
He conseguido hacer que funcionen las dos primeras funciones, pero con el led amarillo tengo problema. No se apaga cuando el umbral baja de la temperatura indicada.
Probablemente sea alguna tontería, pero por más cambios y pruebas que hago en el código, no doy con lo que pasa.
Este es el código último que estoy usando:
Código:
// Script para leer temperatura utilizando un LM35

// Declaracion de variables
float tempC;
float tempCmax;
int tempPin = 0;  // Definimos la entrada en pin A0
const int ledV = 0; // Defino el led verde en el pin 0
const int ledA = 1; // Defino el led amarillo en el pin 1
const int ledR = 2; // Defino el led rojo en el pin 2

void setup()
{
   // Abre puerto serial y lo configura a 9600 bps
   Serial.begin(9600);
   pinMode(ledV , OUTPUT); //defino pin0 como salida
   pinMode(ledA , OUTPUT);  // defino pin1 como salida
   pinMode(ledR , OUTPUT); //defino pin2 como salida
}
void loop()
{
   // Lee el valor desde el sensor
   tempC = analogRead(tempPin);

   // Convierte el valor a temperatura
   tempC = (5.0 * tempC * 100.0)/1024.0;
   // Almacena la temperatura máxima
 if(tempC>tempCmax)
 {
   tempCmax=tempC
;  }

   // Envia el dato al puerto serial
   Serial.print(tempC);
   Serial.print(" grados Celsius\n");
   Serial.print (tempCmax);
   Serial.print (" temperatura máxima alcanzada\n");
   digitalWrite(ledV , HIGH); // Enciendo el led verde
   if(tempC>30) // Si la temperatura es superior a 30
   {
     digitalWrite(ledA , HIGH); // Enciendo el led amarillo

   }
   if(tempC>50) // Si la temperatura es superior a 50
   {
     digitalWrite(ledR , HIGH); // Enciendo el led rojo
   }

   // Espera cinco segundo para repetir el loop
   delay(5000);
   //Apago todos los leds
   digitalWrite(ledV , LOW);
   digitalWrite(ledA , LOW);
   digitalWrite(ledR , LOW);
}
Las conexiones son estas:
resim

Añadir que aún no lo he montado. Estoy usando Tinkercad Circuits como simulador para probarlo físicamente una vez funcione, y si todo va bien hacer luego el montaje definitivo.

Supongo que tendré varias cosas que arreglar. Como dije, es mi primer programa, así que cualquier consejo es bienvenido.
Prusa Steel MK2 - Electrónica OVM20 con drivers DRV8825  (muerta en acto de servicio) - Hotend E3D Lite V6 - de nuevo, electrónica OVM20 lite con drivers DRV8825
Citar
#2
Yo creo que tendría que funcionar.
Con la conversión que haces para pasar el valor del sensor a temperatura supongo que es correcto.
Has probado a poner otra condición que si la temperatura es inferior a 30 el led amarillo este en low.
El led que queda siempre encendido es el verde.
Revisa tu conexión a ver si has intercambiado el led verde por el amarillo en el esquema


Enviado desde mi Mi A2 Lite mediante Tapatalk
Citar
#3
Creo que tu problema son los pins que usas.
el Pin 0 es el RX y el Pin 1 el TX, tal vez por eso si conectas el led amarillo al TX y transmites por ese pin te enciende el led.
Puedes probar a los leds a partir del pin 2 y probar.
Saludos
Citar
#4
(15-03-2019, 05:16 PM)PauFerlo escribió: Creo que tu problema son los pins que usas.
el Pin 0 es el RX y el Pin 1 el TX, tal vez por eso si conectas el led amarillo al TX y transmites por ese pin te enciende el led.
Puedes probar a los leds a partir del pin 2 y probar.
Saludos
Yo también había pensado que puede ser esto


Enviado desde mi Mi A2 Lite mediante Tapatalk
Citar
#5
Pues si has escrito tu todo el código tengo que darte mi enhorabuena. Está muy bien escrito y acorde con las "buenas practicas" de la programación. Hay alguna tabulación mal y alguna cuestión de orden por mejorar, pero se ve que son fallos puntuales y que sabes cómo hacerlo, sólo te falta práctica.
Quizás lo más raro es que las 3 líneas que apagan todos los leds estén al final del todo, después del delay. Normalmente si necesitas inicializar salidas, se haría al principio (del loop), y así queda el delay al final.


Pero si que hay un problema importante que hace que no te funcione bien. El simulador es realista y sabe que el PIN0 y PIN1, Arduino los usa para la comunicación serie. Fíjate al lado de los pines en la placa que pone Rx y Tx.

En tu código has abierto la comunicación en serie, asi que no puedes utilizar esos 2 pines para las salidas. O quitas la comunicación serie, o usas otros pines.

Sabiendo esto, lo normal al programar Arduino es empezar por el pin2 siempre, tienes 12 salidas. Si necesitas 13 o 14 pues ya no te queda más remedio que usar los de la comunicación serie.
Citar
#6
Pues lo de la simulación no me habia dado cuenta, pero si que simula bien el tinkercad. yo personalmente tengo siempre un arduino a mano para probar los sketchs.
Saludos
Citar
#7
Perdón estaba comiendo y no vi las 2 anteriores respuestas xD.
Citar
#8
Estan en lo cierto sobre los pines 0 y 1. Si usas el serial se van a transmitir y recibir datos por ellos, no deberias escribir nunca sobre esos pines o podrias tener problemas de comunicaciones en un entorno real.

Por lo demas no veo ningun problema para que te funcione mal el led amarillo salvo eso.
Lo unico... te recomiendo que los pines analogicos los declares con su nomenclatura de placa, por ejemplo "A0" en lugar de poner un "0". La funcion de analogRead sabe que le estas indicando que leas del A0 si le pasas un 0 pero seria mejor que usases A0 por cuestiones de entendimiento del codigo.

Por ultimo, te recomiendo cambiar los "const int ledR = 2" por un "#define ledR 2"
Ahora no te hace falta pero cuando declaras constantes o variables usas memoria, con esto el compilador incluye las referencias directamente en el codigo compilado y ahorras ram.
Citar
#9
Genial, muchas gracias a todos.
Tenían razón. He cambiado los pines y ya funciona. Tomo nota de esos otros usos de los pines 0 y 1.

Además he hecho los cambios recomendados: la re-inicialización de los leds al principio del loop, la nomenclatura de los pines analógicos, y en lugar de declarar constantes he definido los pines como dice Shellmer.
Ahora me falta añadir el control de un relé a partir de una temperatura "de peligro" para desconectar totalmente la impresora si se llega a ese límite.


Es mi primer programa en arduino, pero lo he hecho buscando ejemplos, intentando entenderlos y adaptándolos después a lo que necesito. Mis últimos intentos de programar fueron hace más de 30 años en MS-DOS 3.11, y la sintaxis me recuerda en algo esos tiempos.
Evidentemente salvando las distancias.

Aún me queda muchísimo por aprender y sobre todo memorizar  Confundido

Gracias a tod@s por la ayuda Clap
Prusa Steel MK2 - Electrónica OVM20 con drivers DRV8825  (muerta en acto de servicio) - Hotend E3D Lite V6 - de nuevo, electrónica OVM20 lite con drivers DRV8825
Citar
#10
Busca info sobre los pines que vayas a utilizar siempre ya que muchos de ellos estan multiplexados, es decir... pueden ejercer vaeias funciones.
Hay ciertos pines por ejemplo que son para comunicaciones (0y1 serial), (A4yA5 I2c), pines con funciones pwm mediante comparadores (timer tambien) y asi. Si no usas sus funciones y no los activas deberian comportarse como pines analogicos o digitales, pero basta que realices una inicializacion para que ocurran cosas raras.
Citar
#11
De acuerdo. Voy buscando más info.
Gracias.
Prusa Steel MK2 - Electrónica OVM20 con drivers DRV8825  (muerta en acto de servicio) - Hotend E3D Lite V6 - de nuevo, electrónica OVM20 lite con drivers DRV8825
Citar
#12
Por suerte suele venir serigrafiado al lado de cada pin la función que tiene. Lo de los timer está muy bien explicado aquí, en la sección de INCOMPATIBILIDADES:
https://www.luisllamas.es/salidas-analog...n-arduino/

Cita:Por ultimo, te recomiendo cambiar los "const int ledR = 2" por un "#define ledR 2"
Ahora no te hace falta pero cuando declaras constantes o variables usas memoria, con esto el compilador incluye las referencias directamente en el codigo compilado y ahorras ram.
Cuidado con los defines... Hay que entender bien como funcionan. En mi opinión para principiantes usaría const ya que por el tamaño de los programas no suele ser un problema.

El problema de los defines es que si defines ledR =2 y después se te ocurre crear una variable que se llame ledRedondo, el compilador leerá "2edondo".

Cita:Ahora me falta añadir el control de un relé a partir de una temperatura "de peligro" para desconectar totalmente la impresora si se llega a ese límite.
Solo tienes que inicializar el pin que lo vaya a controlar a 1 y usar un IF para apagarlo, poniendo como condición la temperatura que quieras o cuando se encienda el led rojo.
Citar
#13
La web que reomiendas ya la tenía en favoritos. Está muy bien.
Ya tengo el relé funcionando en el simulador, y lo próximo es montarlo y si todo va bien, empezar a medir la temperatura de la placa.

Gracias por los consejos. Sonrisa
Prusa Steel MK2 - Electrónica OVM20 con drivers DRV8825  (muerta en acto de servicio) - Hotend E3D Lite V6 - de nuevo, electrónica OVM20 lite con drivers DRV8825
Citar


Temas similares...
Tema Autor Respuestas Vistas Último mensaje
  Problemas con la Humedad y temperatura Asclem 23 1,931 01-07-2015, 12:43 PM
Último mensaje: Asclem
  Duda de como hacer una medición con arduino Universo 2 860 04-02-2014, 03:59 PM
Último mensaje: profesorfrink42