[AYUDA] Programación de horno con arduino

Buenas.

Soy nuevo con el tema del arduino, y se me ha presentado un problema:

Actualmente estoy intentando programar una especie de “horno” con la ayuda de un potenciómetro, un sentor DHT11, y un relé que hace de “horno” (lucirá si la temperatura es mayor a la seleccionada por el potenciómetro).

Los problemas que se me presentan es que en el monitor serie me aparece como 0 todos los valores, y en la sección de testeo para ver si el potenciómetro me funciona, me aparece de 1 a 1023, pero la otra no, por lo que parece ser que la función map no me la reconoce o algo.

El sensor de temperatura me funciona correctamente con este programa:

#include <dht.h>

dht DHT; //Esto de aquí lo necesitamos para que nos permita usar la librería.
#define DHT11_PIN 8 //definimos el pin de lectura, por lo que no hará falta hacer ningún digitalRead para el sensor.
//con "DHT." llamamos a una funcioón referente a nuestra biblioteca, ya sea temperatura, humedad, lectura, ect

void setup(){//Aquí definimos las entradas y salidas. Cabe mencionar que las entradas analógicas son siempre entradas y no hace falta definirlas.
    Serial.begin (9600); //Para iniciar el monitor serial
}

void loop(){
DHT.read11 (DHT11_PIN); //Cada dos segundos, el arduíno recibe una lectura del sensor
    //Temperatura
    Serial.print("Temperatura ="); //Escribe lo que ponemos
    Serial.print(DHT.temperature); //Con esto imprimimos en nuestra pantalla la temperatura
    Serial.print("C"); //Acompañamos a nuestra temperatura con el clásico símbolo de grados.
    Serial.println(); //Salto de líneea
    //Humedad
    Serial.print("Humedad =");
    Serial.print(DHT.humidity); //Con esto imprimimos en nuestra pantalla la humedad
    Serial.print("%");
    Serial.println();
    delay(3000); //Esperamos 3 segundos         
  }[/quote]
El problema le tengo con el siguiente programa:


[quote]#include <dht.h>

dht DHT; //Esto de aquí lo necesitamos para que nos permita usar la librería.
#define DHT11_PIN 8 //definimos el pin de lectura, por lo que no hará falta hacer ningún digitalRead para el sensor.
//con "DHT." llamamos a una funcioón referente a nuestra biblioteca, ya sea temperatura, humedad, lectura, ect

void setup(){//Aquí definimos las entradas y salidas. Cabe mencionar que las entradas analógicas son siempre entradas y no hace falta definirlas.
    Serial.begin (9600); //Para iniciar el monitor serial
    pinMode(2, OUTPUT); //Salida para el relé. (Se observa que no definimos la entrada de DHT11 ya que ya está definida arriba, y las entradas analógicas son siempre
                         //entradas, por lo que es absurdo hacerlo.
}

void loop(){
  
  int Potenciometro; //Aquí se almacenará el valor entero del potenciómetro
  int Potenmap; //Variable que usaremos para mapear
  float SETPOINT; //USaré esta variable para almacenar números decimales del potenciómetro
  float temp; //Usaré esta variable para almacenar numeros decimales del sensor
  float hum; //Usaré esta variable para almacenar numeros decimales del sensor
  int error; //Por defecto lo dejaremos a 0. El sensor manda 0 cuando funciona correctamente. SI no es así, entonces fallaría.
  Potenciometro=analogRead(A0);
 
  Potenmap=map(Potenciometro,0,1023,0,30);
  Potenmap=float(SETPOINT); //En estas tres últimas intrucciones, se observa que he usado 3 variables para poder almacenar el valor del potenciometro en numero decimal.
 DHT.read11 (DHT11_PIN); //Ordena lectura
  DHT.temperature=float(temp);
  DHT.humidity=float(hum); //En ambos casos almacenamos el valor en variables con decimal.

//HORNO
  if(SETPOINT>temp){
    digitalWrite(2, HIGH); //Si se cumple de que el SETPOINT es mayor que temp, el relé se encederá.
  }else{
    digitalWrite(2, LOW); //Manda una señal de apagado cuando la temperatura supere al SETPOINT
  }

    //Temperatura
    Serial.print("Temperatura ="); //Escribe lo que ponemos
    Serial.print(temp); //Con esto imprimimos en nuestra pantalla la temperatura
    Serial.print("C"); //Acompañamos a nuestra temperatura con el clásico símbolo de grados.
    Serial.println(); //Salto de líneea
    //Humedad
    Serial.print("Humedad =");
    Serial.print(hum); //Con esto imprimimos en nuestra pantalla la humedad
    Serial.print("%");
    Serial.println();
   //MANDO
    Serial.print("Posición del mando =");
    Serial.print(SETPOINT);
    Serial.println();
    //TESTEO++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
   DHT.read11 (DHT11_PIN); //Ordena lectura
    Serial.print("Temperatura ="); //Escribe lo que ponemos
    Serial.print(DHT.temperature); //Con esto imprimimos en nuestra pantalla la temperatura
    Serial.print("C"); //Acompañamos a nuestra temperatura con el clásico símbolo de grados.
    Serial.println(); //Salto de líneea
    //Humedad
    Serial.print("Humedad =");
    Serial.print(DHT.humidity); //Con esto imprimimos en nuestra pantalla la humedad
    Serial.print("%");
    Serial.println();
   //MANDO
    Serial.print("Posición del mando =");
    Serial.print(analogRead(A0));
    Serial.println();
//    ++++++++++++++++++++++++++++++++++++++++FIN DE TEST********++++++++++++++++
    delay(3000); //Esperamos 3 segundos         
  }

Como podéis ver, he añadido una sección de testeo para ver los valores directamente, pero en dicha zona solo funciona el potenciómetro sin aparentemente la función map (0 a 1023).
¿Alguna alma caritativa podría ayudarme y explicarme por qué no funciona? :frowning:
Por cierto, el programa compila perfectamente.

Claro el error es este

Potenmap=map(Potenciometro,0,1023,0,30);
Potenmap=float(SETPOINT);

Inmediatamente del map() estas poniendo Potenmap a 0 que es el valor que tiene SETPOINT.
Haz esto

Potenmap=map(Potenciometro,0,1023,0,30);
// Potenmap=float(SETPOINT);

Y verás que funciona. Después revisa para qué se usaría SETPOINT, puede que sobre.

Saludos

PD: quita "ayuda" del título antes que te den un tirón de orejas!

Vayamos por partes, como jack el destripador:

float SETPOINT; //USaré esta variable para almacenar números decimales del potenciómetro

Deja SETPOINT con valor 0

  Potenmap=float(SETPOINT); //En estas tres últimas intrucciones, se observa que he usado 3 variables para poder almacenar el valor del potenciometro en numero decimal.

Potenmap va a tener un valor flotante de 0

  int Potenmap; //Variable que usaremos para mapear

¿¿PERO ES INT??? :o
analogRead es de tipo long
Luego, simplificar:

long Potenmap = map(analogRead(A0), 0, 1023, 0, 30);

eso sí, justo en la linea de abajo la vuelves a dejar a cero
y aquí

if(SETPOINT>temp){

Pues como SETPOINT siempre vale 0, no creo que se cumpla

jejeje, ¿respondimos a la vez?

Primero se define SETPOINT (que debería ser setpoint porque no es una constante) sin asignarle valor entonces vale 0.0 por defecto.
Y nunca se le asigna otro valor.

Después el error de asignación que intenta cambiar el tipo de Potenmap (que debiera ser potenmap, en minúsculas), pero que es secundario porque no debería estar.

Creo que la asignación debería ser

setpoint = (float) potenmap

Igual no tiene sentido porque los decimales se perdieron al asignar el resultado de map() a un entero.

Yo lo haría así

float potenmap = map(0, 1023, 0,30);
...
if(potenmap > temp) {
...

Y me olvidaría de setpoint.

Pero, revisando el código, hay muchas asignaciones mal hechas, por ej.

DHT.temperature=float(temp);

Siendo que DHT.temperature es de lectura, no se puede asignar un valor (¿aparte qué sentido tendría?), por lo que debería ser

temp=(float)DHT.temperature;

En resumen, ese código es un desastre

Moderador:
En el título no debe usarse la palabra Ayuda ni tampoco usar mayúsculas. Edita!!
Ya edité por ti el código que estaba como cita o quote y deben usarse etiquetas para código.

Lee las Normas del foro