Traducir termostato ArduinoUNO+LM35 a iattiny85 + idem

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 </>


Espero haber comprendido el procedimiento de edición. Gracias por sus consejos!

Perfectamente editado. ¡Bien!

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.

¿Cambiaste el tipo de placa destino en el IDE?

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?

Te pregunté si además seleccionaste attinycore en el gestor de tarjetas, la placa y chip attiny85 en herramientas

El pin 2 está bien.
Lo que te decía es que no acostumbro definir como entradas (digitales) los pines que utilizo como analógicos.

Saludos

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)

No están mal pero yo cambiaría las definiciones a

const byte sensorPin = 2;  
const byte RelayPin = 4;   // New temp measure indicator
int sensorValue = 0;   
float celsius=0;

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!

El nuevo código es este:

//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”

Seguí experimentando. Le cuento:

  1. Puse como placa "ATtiny85(no bootloader), y ahora no tengo que quemar el bootloader cada vez.
  2. 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:
  3. Elimine (//) la liean de definición de "celsius" y puse
    celsius = 25;
    Armado el ciercuito, el relé permaneció apagado
  4. 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.

Prueba con

const byte sensorPin = A3;

y comenta la línea

 pinMode(sensorPin, INPUT);

ya que como expliqué antes, no es conveniente definir como entradas digitales los pines que se usan en su función de entrada analógica.

¡Felicitaciones! ¡Funciona a la perfección!

Por supuesto he aprendido varias cosas, ¡Gracias! (No hay como el fracaso. . . y, ante él, tener a quién recurrir, para aprender).

Si tienes tiempo, por favor, contame porqué, cuando definí celsius como constante, no importó que el pin estuviera definido como “4”.

Gracias nuevamente. ¿tengo que hacer algo para cerrar el intercambio . . . y definirlo como exitoso?

Porque al darle un valor fijo a la variable, ya la lectura no importaba.

Creo que tienes un tilde (o algo parecido) en la.parte inferior del post que quieres marcar como solución.

Me alegra haberte ayudado a solucionarlo.

Saludos

This topic was automatically closed 120 days after the last reply. New replies are no longer allowed.