Caracteres extraños en LCD al conectar un relé

Buenas tardes.

Estoy construyendo un sistema de control de temperatura de una placa calefactora. Para ello, utilizo una tarjeta Arduino UNO, un sensor DB18S20+ para medir la T de la superficie de la placa, un relé para en "encendido/apagado" de la misma, un potenciómetro para fijar la T objetivo y un LCD para visualizar la T real (medida por el sensor comentado anteriormente) y la T objetivo fijada por el potenciómetro.

Al arrancar el programa todo va bien. En el LCD se muestra la T real y la objetivo. El relé entra en funcionamiento hasta que la T real es la objetivo más un incremento de 0.5ºC momento en el que se desconecta el rele hasta que la T real baja en 0.5ºC por debajo de la T objetivo.

El problema viene en esta segunda conexión del relé. En ese momento, el LCD comienza a mostrar caracteres extraños en vez de los valores de las temperaturas, como hacía inicialmente.

No sé si es causado por hardware o por software (o ambos).

Por favor, si alguien pudiese orientarme para solucionar este problema, se lo agradecería.

Gracias.

Nota: espero haber explicado con claridad el montaje y el problema encontrado.

Saludos.

Sin el código, poco podemos ver...

A continuación os muestro el codigo. Aquí no se incluye el potenciómetro (es lo que estoy implementando ahora), pero el problema de los caracteres extraños ya se daba en esta fase del programa:

/*
Este programa controla el calentamiento de una placa calefactora
comparando el valor medido con un valor objetivo. Como elementos se
utiliza una tarjeta arduino UNO, un rele y una pantalla LCD

*/

#include <LiquidCrystal.h> //libreria para LCD
#include <OneWire.h> //libreria para sensor temperaturs DS18S20

//declaracion de pines y variables
LiquidCrystal lcd(12, 11, 5, 4, 3, 2);
int DS18S20_Pin=7;
OneWire ds(DS18S20_Pin);
int T_OBJ=70;
const int Rele=6;

void setup() {
// declaracion de pines 6 y 9 como salida:
pinMode(9, OUTPUT);
analogWrite(9, 50);
pinMode(6,OUTPUT);
// configuracion de numero de columnas y filas en el LCD:
lcd.begin(16, 2);
// mensajes mostrados en LCD.
lcd.setCursor(0,0); lcd.print(“T Real”);
lcd.setCursor(10,0); lcd.print(“T OBJ”);
}

void loop() {

float temperature = getTemp();

lcd.setCursor(0, 1); lcd.print(temperature);
lcd.setCursor(10,1); lcd.print(T_OBJ);

delay(800);

//condiciones de ON/OFF para el rele
if (temperature <= (T_OBJ+0.5))
{
digitalWrite(Rele, HIGH);
}
else if (temperature == (T_OBJ-0.5))
{
digitalWrite(Rele,HIGH);
}
else
{
digitalWrite(Rele, LOW);
}
}

float getTemp(){
//devuelve la temperatura del sensor en grados centigrados

byte data[12];
byte addr[8];

if ( !ds.search(addr)) {
//no more sensors on chain, reset search
ds.reset_search();
return -1000;
}

if ( OneWire::crc8( addr, 7) != addr[7]) {
Serial.println(“CRC is not valid!”);
return -1000;
}

if ( addr[0] != 0x10 && addr[0] != 0x28) {
Serial.print(“Device is not recognized”);
return -1000;
}

ds.reset();
ds.select(addr);
ds.write(0x44,1); // start conversion, with parasite power on at the end

byte present = ds.reset();
ds.select(addr);
ds.write(0xBE); // Read Scratchpad

for (int i = 0; i < 9; i++) { // we need 9 bytes
data = ds.read();

  • }*

  • ds.reset_search();*

  • byte MSB = data[1];*

  • byte LSB = data[0];*

  • float tempRead = ((MSB << 8) | LSB); //using two’s compliment*

  • float TemperatureSum = tempRead / 16;*

  • return TemperatureSum;*
    }

Yo probaría escribiendo toda la información de la LCD cada vez que escribes la temperatura, y poniendo un clear antes de escribirlo todo, en vez de escribir los mensajes en el setup y los valores de temperatura en el loop.

Buenas.

¿Podrías indicarme cómo se hace lo que me has comunicado en tu anterior respuesta?

Es que soy nuevo en esto y no sé cómo hacerlo. Estoy probando, y el programa no funciona.

Gracias.

Saludos.

Básicamente, sería algo así:

/*
 Este programa controla el calentamiento de una placa calefactora
 comparando el valor medido con un valor objetivo. Como elementos se 
 utiliza una tarjeta arduino UNO, un rele y una pantalla LCD
 
 */

#include <LiquidCrystal.h> //libreria para LCD
#include <OneWire.h> //libreria para sensor temperaturs DS18S20

//declaracion de pines y variables
LiquidCrystal lcd(12, 11, 5, 4, 3, 2); 
int DS18S20_Pin=7;
OneWire ds(DS18S20_Pin);
int T_OBJ=70;
const int Rele=6;

void setup() {
  // declaracion de pines 6 y 9 como salida:
  pinMode(9, OUTPUT);  
  analogWrite(9, 50);
  pinMode(6,OUTPUT);  
  // configuracion de numero de columnas y filas en el LCD: 
  lcd.begin(16, 2);
  // mensajes mostrados en LCD.
  
}

void loop() {
  
  float temperature = getTemp();

  lcd.clear();
  lcd.setCursor(0,0); lcd.print("T Real");
  lcd.setCursor(10,0); lcd.print("T OBJ");
  lcd.setCursor(0, 1); lcd.print(temperature);
  lcd.setCursor(10,1); lcd.print(T_OBJ);
  
  delay(800);
  
  //condiciones de ON/OFF para el rele
  if (temperature <= (T_OBJ+0.5))
  {
    digitalWrite(Rele, HIGH);
  }
  else if (temperature == (T_OBJ-0.5))
  {
    digitalWrite(Rele,HIGH);
  }
  else
  {
    digitalWrite(Rele, LOW);
  }
}

float getTemp(){
  //devuelve la temperatura del sensor en grados centigrados
  
  byte data[12];
  byte addr[8];

  if ( !ds.search(addr)) {
      //no more sensors on chain, reset search
      ds.reset_search();
      return -1000;
  }

  if ( OneWire::crc8( addr, 7) != addr[7]) {
      Serial.println("CRC is not valid!");
      return -1000;
  }

  if ( addr[0] != 0x10 && addr[0] != 0x28) {
      Serial.print("Device is not recognized");
      return -1000;
  }

  ds.reset();
  ds.select(addr);
  ds.write(0x44,1); // start conversion, with parasite power on at the end

  byte present = ds.reset();
  ds.select(addr);    
  ds.write(0xBE); // Read Scratchpad

  
  for (int i = 0; i < 9; i++) { // we need 9 bytes
    data = ds.read();
  }
  
  ds.reset_search();
  
  byte MSB = data[1];
  byte LSB = data[0];

  float tempRead = ((MSB << 8) | LSB); //using two's compliment
  float TemperatureSum = tempRead / 16;
  
  return TemperatureSum;
}