He construido un sencillo termostato on ArduinoUNO y un LM35. Sin embargo, el Arduino parece demasiado para un control tan sencillo y quise "traducir" el soft para usarlo con un Attiny85. Mis habilidades son muy limitadas y no he podido hacerlo funcionar. Transcribo mi programa de Arduino y mi intento de "traducción". ¿podrían ayudarme a ver que cambiar? ¡Muchas gracias!
void setup()
{
analogReference(INTERNAL);
Serial.begin(9600);
pinMode (RELAY1, OUTPUT);
}
void loop()
{
float celsius = analogRead(SensorPIN);
celsius = -1.8+(110 * celsius)/1024.0;
//resto 1,8 ºC a la lectura para que coincida con
//la lectura del termometro de alcohol en vidrio a aprox. 20ºC
if (celsius<=17.5)
{
Serial.print("T = ");
Serial.print(celsius);
digitalWrite(RELAY1,0); //turns on relay 1
Serial.println(" Conectado");
}
else if (celsius>= 18.5)
{
Serial.print("T = ");
Serial.print(celsius);
digitalWrite(RELAY1,1); //turns off relay
Serial.println(" desconectado");
//Serial.println("ciclo");
}
else
{
Serial.println("ciclo");
}
delay(1000);
// delay in between reads for stability
}
ATTINY85
//Proyecto de termostato con LM35 y attiny
int sensorPin = 2;
int RelayPin = 4; // New temp measure indicator
float sensorValue = 0;
float celsius=0;
void setup() {
analogReference(INTERNAL);
pinMode(RelayPin, OUTPUT);
pinMode(sensorPin, INPUT);
}
void loop() {
sensorValue = analogRead(sensorPin);
celsius=-1,8+(sensorValue*110.0)/1023.0;
//resto 1,8 ºC a la lectura para que coincida con
//la lectura del termometro de alcohol en vidrio a aprox. 20ºC
if (celsius<= 17,5)
{
digitalWrite(RelayPin,LOW); //turns on relay 1
}
else if (celsius>= 18.5)
{
digitalWrite(RelayPin,HIGH); //turns off relay
}
else
{
delay(1000);
}
Moderador:
Bienvenido al Foro Arduino en Español.
Por favor, lee las Normas del foro y edita tu código usando etiquetas de código.
Ve a edición, luego selecciona todo el error que has publicado, lo cortas y click en </>
Teóricamente el único cambio a realizar era la asignación de pines y eliminar todo lo referente a Serial para que no moleste. Debería funcionarte sin problemas.
Lo único que "me hace ruido" es
pinMode(sensorPin, INPUT);
nunca defino los pines analógicos como entradas salvo que los use en modo digital.
Gracias por la respuesta!. Resguardado en mi declarada ignorancia, me atrevo a preguntar:
Respecto de la placa destino, si lo entiendo bien, creo que se refiere a gestor de otras tarjetas, instalé http://drazzy.com/package_drazzy.com_index.json.
Respecto de tu comentario sobre pines, el contacto central del LM35 está conectado al sensorPin, que es 2. ¿debería usar otro? La salida del LM35, ¿no es un voltaje analógico?
Seguí las instrucciones de https://laboratoriodejuguete.com/2017/12/04/update-como-programar-el-attiny85-con-arduino/ para programar el Attiny. Al intentar usar el programa, el attiny conecta el relay, pero no lo desconecta aunque toque el LM35 con hielo. ¿puede ser que haya un problema con la referencia interna del attiny [analogReference(INTERNAL);], o con la conversión [celsius = -1, 8 + (sensorValue * 110.0) / 1023.0;]?
Ah, ahora se entiende, yo pensé que no cargaba o si cargaba no hacía nada.
¿Qué módulo de relé estás usando?
Hay un modelo que activa por LOW y otro por HIGH.
Según los comentarios del código activaría por debajo de 17.5C y desactivaría por encima de 18.5C
Viendo el código en detalle encuentro algunos errores, si lo tienes tal cual, hay problemas.
En el calculo de temperatura restas 1,8 pero debe ser 1.8 (punto no coma).
Lo mismo en la comparación con 17,5 (hay una coma en lugar de un punto)
porque para los números de pin alcanza con 1 byte y al hacerlo const(ante) no ocupan ram.
analogRead() devuelve un int (entero) no tiene sentido usar un float (que además ocupa 4 bytes de memoria).
Es largo e inutil comentar mis dudas y errores, pero yo también creia que no hacía nada. El módulo de relé (¿Songle?) tiene las dos opciones, pero no cambia su estado, tanto si caliento como si enfrio el LM35.
¡Es cierto! las comas está ahi, y no entiendo por qué, ya que el código está copiado del que uso para el Arduino, y éste tiene los decimales separados con punto.
Gracias por tu análisis. Cambiaré las comas y las lineas según tus indicaciones y te contaré el resultado.
Gracias!
//Proyecto de termostato con LM35 y attiny
const byte sensorPin = 2;
const byte RelayPin = 4; // New temp measure indicator
int sensorValue = 0;
float celsius = 0;
void setup() {
analogReference(INTERNAL);
pinMode(RelayPin, OUTPUT);
pinMode(sensorPin, INPUT);
}
void loop() {
sensorValue = analogRead(sensorPin);
celsius = -1.8 + (sensorValue * 110.0) / 1023.0;
//resto 1.8 ºC a la lectura para que coincida con
//la lectura del termometro de alcohol en vidrio a aprox. 20ºC
if (celsius <= 17.5)
{
digitalWrite(RelayPin, LOW); //turns on relay 1
}
else if (celsius >= 18.5)
{
digitalWrite(RelayPin, HIGH); //turns off relay
}
else
{
delay(1000);
}
Las conexiones son:
ATtiny (CW desde pin VCC, lado “derecho”):
a 5 V (de un Arduino); a + del LM35; a VCC del relé
Pin 2: a sensor del LM35. Siguientes 2 pines sin conexión. Comienza lado “izquierdo”
GND: a GND del mismo Arduino; a GND del LM35
Pin 4 al relé.
El relé está conectado a otra fuente de 5 VCC.
El resultado es:
El relé se activa y permanece activo tanto si caliento el LM35 a la temp de mi mano, como si lo enfrío con hielo sacado del freezer.
Ya sin saber que cambiar, cargué el código en un chip ATtiny diferente, con el mismo resultado.
Un dato que puede ser (o no) significativo es que, cada vez que cargo el código en el Attiny, tengo que quemar nuevamente el bootloader, de otra manera, da error. Yo creía que eso se hacía una sola vez.
En el Arduino que uso para cargar el Attiny, las selecciones que pueden ser significativas son:
Placa: “ATtiny 45/85 (Optiboot)”
Chip: “ATtiny85”
Clock Source (only set on bootload): “8 MHZ internal”
Puse como placa "ATtiny85(no bootloader), y ahora no tengo que quemar el bootloader cada vez.
puse 1MHz internal, en lugar de 8 MHz. No hay cambios que pueda ver.
El comportamiento del sistema siempre fué que el relé se activaba siempre y nunca cortaba aunque se enfriara el LM35 con hielo. Entones:
Elimine (//) la liean de definición de "celsius" y puse
celsius = 25;
Armado el ciercuito, el relé permaneció apagado
cambié a
celsius = 15;
Armado el ciercuito, el relé permaneció encendido
Mi conclusión es que hay un problema con el valor que resulta del cálculo de la linea:
celsius = -1.8 + (sensorValue * 110.0) / 1023.0;
Me gustaría conocer su opinión.
Muchas gracias.
¿Has comprobado con tester (multímetro) si la tensión en el pin 2 es acorde a la temperatura?
El cálculo está bien, descartemos un problema del sensor.
EDITO: Creo que encontré el error. Está mal el pin me parece, el pin físico nro. 2 del Attiny está definido como pin 3 (digital) o A3 (analógico) en el IDE de Arduino. El pin 2 (digital) o A1 (analógico) se corresponde con el pin físico nro. 7. Creo que lee el pin equivocado.