Estructura del código

Muy buenas

Llevo tiempo con un proyecto en la cabeza y ya he jugueteado prácticamente con todos los módulos, sensores o partes separadas de la idea.

Sé que me faltan cosas, tales como aprender a usar millis(), pero como no tengo claro dónde o cómo lo voy a necesitar, he decidido ir empezando a juntar las piezas del puzzle y abordar lo que vea que voy necesitando aprender o practicar.

El problema es que no tengo claro del todo cual sería la forma más correcta de ir construyendo el código valiéndome de esas partes.

Muy resumidamente:
Se trata de un display 5110 Nokia que va a mostrar información de varios sensores, en distintas pantallas, entre las que me muevo a través de un Joystick. Este es un ejemplo de esquema de navegación entre pantallas.

Mi duda es cómo estructurar el código.
El movimiento entre pantallas obviamente quiero que responda rápido, y no dependa de que se encuentre en mitad de un void haciendo otra cosa.

Se me ocurren varias opciones pero la que más me convence es la siguiente:

Había pensado asignarle un void a cada pantalla de información (void1, void2, void2A, void2B, void3, etc)

La idea que más me convence es al final de cada función que se ve en una pantalla (Tª, H%, etc que revise si se está moviendo el joystick y si no… que repita el bucle de esa pantalla para actualizar el valor del sensor. Si por el contrario se mueve el joystick, ir mostrando la información de uno u otro sensor, haciendo ejecutar los voids correspondientes dependiendo de hacia donde se mueva. ¿Lo veis correcto o debería abordarlo de otra forma?

Por último, tengo un problema con el que me he atascado y necesito vuestra ayuda. Quería crear las primeras dos pantallas, pero primero quería mostrar los parametros del DHT y del termistor en la misma pantalla, para asegurarme que todo funciona. Pero no lo consigo.

He juntado dos códigos que funcionaban por separado. Un código que hice en el que un 5110 mostraba la información de un DHT. Y un segundo código cuyas líneas he intercalado en el primero para que muestre la Temperatura a través de un termistor, pero no consigo compilarlo y es que no sé lo que hago mal. Adjunto el código a ver si me podeis decir dónde estoy cometiendo los errores porque me temo que deben ser varios y no sé cuales son.

Siempre me acaba dando error con
float Termistor(int RawADC) {

Muchas gracias

#include <math.h>
#include <SPI.h>
#include <Adafruit_GFX.h>
#include <Adafruit_PCD8544.h>
#include "DHT.h"



// Software SPI (slower updates, more flexible pin options):
// pin 7 - Serial clock out (SCLK)
// pin 6 - Serial data out (DIN)
// pin 5 - Data/Command select (D/C)
// pin 4 - LCD chip select (CS)
// pin 3 - LCD reset (RST)
Adafruit_PCD8544 display = Adafruit_PCD8544(7, 6, 5, 4, 3);


#define DHTPIN 2  
#define DHTTYPE DHT22 
#define NUMFLAKES 10
#define XPOS 0
#define YPOS 1
#define DELTAY 2
DHT dht(DHTPIN, DHTTYPE);


void setup()   {
               
  Serial.begin(9600);
  display.begin();
  display.setContrast(60);

  dht.begin();
  display.display(); // show splashscreen
  delay(2000);
  display.clearDisplay();   // clears the screen and buffer
  // Reading temperature or humidity takes about 250 milliseconds!
  // Sensor readings may also be up to 2 seconds 'old' (its a very slow sensor)
  float h = dht.readHumidity();
  // Read temperature as Celsius (the default)
  float t = dht.readTemperature();
  delay(2500);
  display.clearDisplay();

}
  float Termistor(int RawADC) {
  float Temp;
  Temp = log(((1024*10000/RawADC) - 10000));
  Temp = 1 / (0.001606355783 + (0.0002632458140 * Temp) + (-0.0000001658963196 * Temp * Temp * Temp));
  Temp = Temp - 273.15;           // Convert Kelvin to Celcius
  return Temp;
  float temp = Termistor(analogRead(0));
  



  // text display tests
  display.setTextSize(1);
  display.setTextColor(BLACK);
  display.setCursor(0,20);
  display.print("Temp: ");
  display.print(t);
  display.println("C");
  display.print("H%:   ");
  display.print(h);
  display.println("%");  
  display.print("Motor: ");
  display.print(Temp);
  display.println("C");  
  display.display();
  delay(2500);


void loop() {
  



for (int m=0;m<100;m++){
  float h = dht.readHumidity();
  // Read temperature as Celsius (the default)
  float t = dht.readTemperature();
  // Read temperature as Fahrenheit (isFahrenheit = true)
  float f = dht.readTemperature(true);
  delay(4000);
  display.clearDisplay();
  // text display tests
  display.setTextSize(1);
  display.setTextColor(BLACK);
 
  display.setCursor(0,20);
  display.print("Temp: ");
  display.print(t);
  display.println("C");
  display.print("H%:   ");
  display.print(h);
  display.println("%");
  display.setCursor(50,0);
  display.print(m);  
  display.display();

  delay(4000);
  if (m==99)
  {int m=0;
  }
}
}

Básico de ardino

// incluyes librerías
//defines variables

void setup()

void loop()

No puedo haber dos setup, ni dos loop

Espero que funcione poruqe hay varias librerías que no tengo instaladay y no las instalare para verificar esto.

#include <math.h>
#include <SPI.h>
#include <Adafruit_GFX.h>
#include <Adafruit_PCD8544.h>
#include "DHT.h"

// Software SPI (slower updates, more flexible pin options):
// pin 7 - Serial clock out (SCLK)
// pin 6 - Serial data out (DIN)
// pin 5 - Data/Command select (D/C)
// pin 4 - LCD chip select (CS)
// pin 3 - LCD reset (RST)
Adafruit_PCD8544 display = Adafruit_PCD8544(7, 6, 5, 4, 3);

#define DHTPIN 			2  
#define DHTTYPE 		DHT22 
#define NUMFLAKES 		10
#define XPOS 			0
#define YPOS 			1
#define DELTAY 			2
DHT dht(DHTPIN, DHTTYPE);
float h, t;


void setup()   {

	Serial.begin(9600);
	display.begin();
	display.setContrast(60);

	dht.begin();
  	display.display(); // show splashscreen
  	delay(2000);
  	display.clearDisplay();   // clears the screen and buffer
}

float Termistor() {
  
  float Temp;
  Temp = log(((1024*10000/analogRead(0)) - 10000));
  Temp = 1 / (0.001606355783 + (0.0002632458140 * Temp) + (-0.0000001658963196 * Temp * Temp * Temp));
  Temp = Temp - 273.15;           // Convert Kelvin to Celcius
  return Temp;

}

void loop() {
  	
  float h = dht.readHumidity();
  // Read temperature as Celsius (the default)
  float t = dht.readTemperature();
  // Read temperature as Fahrenheit (isFahrenheit = true)
  float f = dht.readTemperature(true);
  display.clearDisplay();
  
  // text display tests
  display.setTextSize(1);
  display.setTextColor(BLACK);

  display.setCursor(0,20);
  display.print("Temp: ");
  display.print(t);
  display.println("C");
  display.print("H%:   ");
  display.print(h);
  display.println("%");
  display.setCursor(50,0);
  display.print("Term: ");
  display.print(Termistor(),2);
  display.display();
  delay(100);
}

No me refiero a dos setup o dos loop, me refiero a algo de este estilo que he visto en varias ocasiones y de entrada me ha parecido una forma ordenada de estructurar las secuencias.

void setup() {
  // put your setup code here, to run once:

}

void Secuencia_1() { 
}

void secuencia_2() { 
}

void secuencia_2a() { 
  
}
            //Al final de cada secuencia se indica que secuencia debe cointinuar dependiendo del movimiento de joystick. 
            //Cada secuencia extrae periodicamente info de un sensor y comprueba si hay movimiento en el joystick al final de cada ciclo. 
            //En caso de haberlo manda ejecutar otra secuencia

void loop() 
 {
  // put your main code here, to run repeatedly:

secuencia_1(); // esta secuencia iría llamando a la siguiente secuencia dependiendo del joystick


}

Respecto al código que has pegado, sí que compila, pero no obtengo valor, ahora le echo un vistazo a ver si lo consigo. De todas formas me interesa ver cual es la razón de que me diese error al compilar que es lo que me deja bloqueado sin poder seguir, más que conseguir que refleje o no el valor. (eso con paciencia puedo hacerlo)

De esto que has puesto, me puedes decir que hace el 2? y por qué me da error si pruebo a poner display.print Temp y no da si se pone Termistor() ?

display.print(Termistor(),2);

No se supone que el Temp ya está definido anteriormente? por que al compilar sale este error?
'Temp' was not declared in this scope

Tu programa es un código de 30 lineas para que quieres anidar tantos procedimientos? Bueno es a gusto del programador. Si lo quieres asi, hazlo asi.

Copia el error que te sale y ponlo entre etiquetas de código tmb.

Te contesto a todo.

1.- El motivo de anidar procedimientos (si es así como se dice) se debe a varias razones:

  • El código final será más extenso, no es de 30 líneas, el código final procede de ejemplos de lo que se mostrará en cada pantalla, comportamientos de leds, datos de sensores, etc. Hacerlo de esa forma creo que me ayudaría a tenerlo ordenado.
    -Aunque finalmente y de todas formas, el código sea pequeño, y no esté justificada tanta segmentación, de momento, me ayuda a tener un orden y me ayuda a poder probar cada sentencia por separado, de forma que los errores de compilación pueda tenerlos más localizados. Eso no quiere decir que al final del todo, pueda ahorrarme sentencias, reducir el número de ellas, fusionar código, etc, pero de momento creo que me ayudarían a estructurar todo.
    No olvides que empecé a finales de diciembre a aprender arduino y es mi primer contacto con la programación, mi nivel es básico, cada día avanzo un poco de lo que leo, experimento y me respondéis.

2.- El código del error que me sale es el siguiente. Me surge del código que me has sugerido, tan sólo cambiando tu línea
display.print(Termistor(),2); por la siguiente
display.print(Temp);

Me preguntarás que por qué cambio esa línea tuya por otra.
Bien, por dos razones, primero porque la línea que pones tu no da error de compilación, pero no la entiendo, y quería ver si la segunda línea producía un efecto similar, dado que con mi corta experiencia en programación me hubiese inclinado a escribir la segunda frase como primera opción.
Viendo al probarla, que no funciona. Me gustaría saber la razón del error porque si no... es un error que voy a cometer más veces.

La segunda razón está ligada a lo anterior. Quería ver el valor que daba Temp y contrastarlo con (Termistor(),2) a ver si sacaba algo en claro. Es decir, si se supone que he definido Temp, porque no acepta esa variable?
No entiendo como he dicho, tu linea " display.print(Termistor(),2);"
1- Qué indica el dos?
2- Cuando pones float termistor() {....
¿estás creando una variable que tiene el valor de lo que está dentro de esa llave? Por qué no crear directamente Temp? Qué aporta Termistor que no tenga Temp?
Como ves, son todo preguntas en torno a lo mismo, Temp y Termistor

Gracias

Arduino: 1.6.6 (Windows 10), Board: "Arduino Leonardo"

C:\Users\Alvaro\Documents\Arduino\sketch_jan17a\sketch_jan17a.ino: In function 'float Termistor()':

C:\Users\Alvaro\Documents\Arduino\sketch_jan17a\sketch_jan17a.ino:40:21: warning: integer overflow in expression [-Woverflow]

   Temp = log(((1024*10000/analogRead(0)) - 10000));

                     ^

C:\Users\Alvaro\Documents\Arduino\sketch_jan17a\sketch_jan17a.ino: In function 'void loop()':

sketch_jan17a:68: error: 'Temp' was not declared in this scope

   display.print(Temp);

                 ^

C:\Users\Alvaro\Documents\Arduino\sketch_jan17a\sketch_jan17a.ino:53:9: warning: unused variable 'f' [-Wunused-variable]

   float f = dht.readTemperature(true);

         ^

exit status 1
'Temp' was not declared in this scope

  This report would have more information with
  "Show verbose output during compilation"
  enabled in File > Preferences.

Este código donde he removido el display porque como dije: no tengo ni voy a instalar las librerías. Asi que lo probé con el monitor Serie, compila perefecto.

#include <math.h>
#include <SPI.h>
#include "DHT.h"

#define DHTPIN 			2  
#define DHTTYPE 		DHT22 
#define NUMFLAKES 		10
#define XPOS 			0
#define YPOS 			1
#define DELTAY 			2
DHT dht(DHTPIN, DHTTYPE);
float h, t;


void setup()   {
	Serial.begin(9600);
	dht.begin();
  	delay(2000);
}

float Termistor() {
  
  float Temp;
  Temp = log(((1024*10000/analogRead(0)) - 10000));
  Temp = 1 / (0.001606355783 + (0.0002632458140 * Temp) + (-0.0000001658963196 * Temp * Temp * Temp));
  Temp = Temp - 273.15;           // Convert Kelvin to Celcius
  return Temp;

}

void loop() {
  	
  float h = dht.readHumidity();
  // Read temperature as Celsius (the default)
  float t = dht.readTemperature();
  // Read temperature as Fahrenheit (isFahrenheit = true)
  float f = dht.readTemperature(true);

  Serial.print("Temp: ");
  Serial.print(t);
  Serial.println("C");
  Serial.print("H%:   ");
  Serial.print(h);
  Serial.println("%");
  
  Serial.print("Term: ");
  Serial.print(Termistor(),2);
  delay(100);
}

El 2 indica dos decimales. Algo que usas cuando imprimes float. Como la función termistor devuelve un float, lo imprimo asi
Serial.print(Termistor()); o // con los decimales que guste que son varios
Serial.print(Termistor(), 2); // con dos decimales

Este código donde he removido el display porque como dije: no tengo ni voy a instalar las librerías. Asi que lo probé con el monitor Serie, compila perefecto.

#include <math.h>
#include <SPI.h>
#include "DHT.h"

#define DHTPIN 			2  
#define DHTTYPE 		DHT22 
#define NUMFLAKES 		10
#define XPOS 			0
#define YPOS 			1
#define DELTAY 			2
DHT dht(DHTPIN, DHTTYPE);
float h, t;


void setup()   {
	Serial.begin(9600);
	dht.begin();
  	delay(2000);
}

float Termistor() {
  
  float Temp;
  Temp = log(((1024*10000/analogRead(0)) - 10000));
  Temp = 1 / (0.001606355783 + (0.0002632458140 * Temp) + (-0.0000001658963196 * Temp * Temp * Temp));
  Temp = Temp - 273.15;           // Convert Kelvin to Celcius
  return Temp;

}

void loop() {
  	
  float h = dht.readHumidity();
  // Read temperature as Celsius (the default)
  float t = dht.readTemperature();
  // Read temperature as Fahrenheit (isFahrenheit = true)
  float f = dht.readTemperature(true);

  Serial.print("Temp: ");
  Serial.print(t);
  Serial.println("C");
  Serial.print("H%:   ");
  Serial.print(h);
  Serial.println("%");
  
  Serial.print("Term: ");
  Serial.print(Termistor(),2);
  delay(100);
}

La pregunta 1 no la respondo porque hablas de algo que no has hecho.
Solo intento resolverte tu problema incial. Como quieras hacerlo luego es como tu lo desees.
Este era tu problema inicial, no podías compilarlo.

He juntado dos códigos que funcionaban por separado. Un código que hice en el que un 5110 mostraba la información de un DHT. Y un segundo código cuyas líneas he intercalado en el primero para que muestre la Temperatura a través de un termistor, pero no consigo compilarlo y es que no sé lo que hago mal. Adjunto el código a ver si me podeis decir dónde estoy cometiendo los errores porque me temo que deben ser varios y no sé cuales son.

Yo te muestro como resolverlo, el código final es tu responsabilidad pero creo que debes aprender un poco mas, porque esto es básico (sin que te ofendas). Mira documentación Clases de 0 a 7 y de 8 en adelante. Te servirán y mucho

No me ofendo :slight_smile: , soy completamente consciente que mi nivel es básico, así como mis dudas. El problema es que aunque mis errores sean básicos, en ocasiones me atasco con un código sencillo, muchas veces es cuestión de darle vueltas y vueltas y darme cuenta que el error era sencillo de resolver y tenía el error delante de mis narices, sin embargo en otras ocasiones no lo encuentro y sólo me queda que alguien me pueda dar un empujoncito.

Leo mucho, muchos tutoriales y veo muchos videos, estoy haciendo también un curso de cousera.org sobre arduino y en general devoro todo lo que me encuentro en la red en el tiempo que le dedico, sin embargo a veces no asimilo todo lo que leo. Cuando has explicado el significado del 2 en Termistor(),2... pufff es algo que ya debería saber, algo que he leído, sin embargo hay cosas que hasta que no las veo en un código y lo practico no termino de asimilar.

Por lo tanto, paciencia, si mi nivel es básico es lógico que mis dudas también lo sean...
Créeme que evito preguntar corriendo en cuanto algo no me sale.

Cuando dices que sólo intentas resolver mi problema inicial y que se trataba de que no compilaba, es cierto y lo agradezco, ya compila y es tarea mia ponerme a comparar códigos y ver dónde esta mi error. Pero para avanzar y no repetir los errores necesito también saber el motivo de los errores, que en ocasiones veo sólo y en ocasiones necesito una pequeña explicación. El objetivo de mis preguntas es aprender a detectar los errores, para resolverlos y no repetirlos.

Respecto a la pregunta 1, era simplemente si mi planteamiento es correcto. Creo entender por tus respuestas que tu no segmentarías tanto, pero que no es incorrecto y que puedo probar de esa forma. No obstante en cuanto lo vaya construyendo ya iré viendo si funciona.

Una pregunta, porqué escribes Serial.print(Termistor(),2); en lugar de Serial.print (Temp) ?
Por más vueltas que le doy no entiendo por qué es necesario crear la variable Termistor y no usar directamente Temp.

Y nuevamente gracias por el tiempo dedicado y las respuestas.

Como analizar un error?

Arduino: 1.6.6 (Windows 10), Board: "Arduino Leonardo"
C:\Users\Alvaro\Documents\Arduino\sketch_jan17a\sketch_jan17a.ino: In function 'float Termistor()':
C:\Users\Alvaro\Documents\Arduino\sketch_jan17a\sketch_jan17a.ino:40:21: warning: integer overflow in expression [-Woverflow]
   Temp = log(((1024*10000/analogRead(0)) - 10000));

Mira lo que dice este error.
Primero que deduzco yo.
Dece que tienes un error en la función float termistor()
Pero luego dice que esta en la línea 40 columna 21
y te pone Warning o Advertenica
integer overflow in expression [-Woverflow]
overflow o sea, intentaste poner un número mayor a un entero. mayor a 32768 y por eso el error de rebasamiento o overflow.
Donde ? y te muestra la función

Temp = log(((1024*10000/analogRead(0)) - 10000));

Algo inteligente es hacer que las operaciones se hagan paulatinamente.
Además debes cuidarte que analogRead(0) no devuelva un 0 porque esa operación generará un error de división por 0 no permitido.

Muy interesante todo lo que pones en el último mensaje.
Voy a ver si sigo avanzando el código y sigo avanzando con mis lecturas de tutoriales.

Gracias

Buenas
Vuelvo a la carga.

Ya tengo un código escrito con secuencias o dos “pantallas” y me puedo mover entre ellas con un mando.

1.- info de DHT, H% y no he quitado todavía el del Termistor
2.- Info del Termistor

Resumiendo: defino las dos primeras secuencias y el void loop empieza en secuencia 1. Al final de cada una se comprueba si el mando se mueve en una dirección y te envía a otra secuencia o en caso de no haber movimiento, se vuelve a repetir la misma.

En medio, he metido muchos led que se encienden y apagan que no estarán en el código final, pero de momento me ayudan a ver cómo se ejecutan las órdenes, dado que tengo muchos errores todavía, y eso me ayuda a detectar por qué el código no hace lo que yo quiero que haga.

Y ahora con un ejemplo sobre la mesa, vuelvo a una de las primeras preguntas que hice en este post. La estructura ya la tengo (es cuestión de ir añadiendo el resto de secuencias hacia los lados, arriba, abajo, etc)

En realidad tengo dos preguntas.

1.- Cómo puedo hacer para que el programa sea siempre sensible al mando lo toque cuando lo toque, y no sólo en el intervalo de código en el que se comprueba. Me refiero con esto, a que hay delays en medio y el mando se comprueba cada ciertos segundos, pero me gustaría que la respuesta al mando fuese instantánea.
Si me podéis indicar la función/es a utilizar o a que nivel de código habría que hacerlo… en fin, algo para poder seguir trasteando y ya me estudio yo lo que me toque.

2.- Hay una luz RGb en el pin 9 en la secuencia 1, que parpadea mientras la temperatura (en secuencia 1) es muy baja.

 if (Termistor(),2 <  25.50)  {        // pongo 25 para las pruebas, sería 4.00
    for (int a=0;a<=253;a++) 
 {
  analogWrite (RGBb,a);
  delay(4);
  }
  for (int a=254;a>=0;a--) 
  {
analogWrite (RGBb,a);
delay(3);
}

Ese led me gustaría que siguiese parpadeando independientemente de la secuencia o “pantalla” que se ejecute. La forma que se me ocurre es que lea el valor del termistor y repetir ese trozo de código en cada secuencia nada más empezar. Pero me parece una solución que consume mucho código, mucha repetición y me imagino que debe haber soluciones más limpias. Lo mismo, si me podéis orientar os lo agradezco.

Surbyte:

Me han sido muy útiles tus comentarios sobre el análisis de errores, me es mucho más fácil entender los problemas con apenas 4 cosillas que me dijiste sobre esto y noto que poco a poco… voy compilando menos veces :wink:

Por último, con tu código, el valor del Termistor me funcionaba bien en Serial.monitor, pero en el nokia5110 no me daba valor y me estaba ya volviendo loco. Tuve que añadir unas L mayúscula detrás de algunas cifras. Constantemente me daba “integer overflow in expression”
Al final poniéndolo así funciona bien en el 5110

Temp = log(((1024L*10000L/analogRead(0)) - 10000L));

Y el caso es que calculando a mano Temp, el valor no era superior a 32760… me volví loco.

En fin, si me podéis dar alguna pista sobre las dos preguntas de arriba… me daréis entretenimiento para otros buenos ratitos :wink:

Gracias

Pego el código completo en otro mensaje, que no cabe en este ya

Esto esta mal

 if (Termistor(),2 <  25.50)  {

Termistor() es una función que devuelve el dato completo, si quieres truncarlo debes hacerlo antes con una variable pero ese recurso de , 2 es solo para Serial.print(Termistor(),2); con el que imprimes un float con 2 decimales.
No va en ningun otro caso.
Si no quieres mas decimales arma una secuencia de truncamiento de digitos en tu rutina Termistor()
Antes del return solo pones esto

 Temp = int((Temp - 273.15)*100.0)/100.0;           // Convert Kelvin to Celcius
  return Temp;

Te refieres a que Termistor (),2 ahí no me está dando decimales? que sólo va a tomar valor de 25 o de 26?
Si es eso, no me preocupa para este caso concreto, pero interesante saberlo para otros casos

Ahí va el código entero

[code]
//*******************************************librerias********************

#include <math.h>
#include <SPI.h>
#include <Adafruit_GFX.h>
#include <Adafruit_PCD8544.h>
#include "DHT.h"



// Software SPI (slower updates, more flexible pin options):
// pin 7 - Serial clock out (SCLK)
// pin 6 - Serial data out (DIN)
// pin 5 - Data/Command select (D/C)
// pin 4 - LCD chip select (CS)
// pin 3 - LCD reset (RST)


//****************************************DEFINICIÓN DE VARIABLES Y PINES

#define DHTPIN 2  
#define DHTTYPE DHT22

Adafruit_PCD8544 display = Adafruit_PCD8544(7, 6, 5, 4, 3); 
#define NUMFLAKES 10
#define XPOS 0
#define YPOS 1
#define DELTAY 2
DHT dht(DHTPIN, DHTTYPE);
 int RGBb = 9; // led rgb azul
 int RGBg =10; // led rgb verde
 int RGBr = 11; // led rgb rojo
 
//********************************************Variables del joystick********************
 long ejejoysty = A1;
 long ejejoystx = A2;
 int valorjoystx =0;// 

 
void setup()   {
               
  pinMode (ejejoystx, INPUT);
  pinMode (ejejoysty, INPUT);
  
  
  Serial.begin(9600);
  display.begin();
  display.setContrast(60);
  dht.begin();
  
  display.display(); // show splashscreen
  delay(2000);  // Sensor readings may also be up to 2 seconds 'old' (its a very slow sensor)
  display.clearDisplay();   // clears the screen and buffer
  // Reading temperature or humidity takes about 250 milliseconds!

  display.setTextSize(1);
  display.setTextColor(BLACK);
  display.setCursor(0,20);
  delay(2500);
}

  float Termistor() {
  float Temp;
  Temp = log(((1024L*10000L/analogRead(0)) - 10000L));
  Temp = 1 / (0.001606355783 + (0.0002632458140 * Temp) + (-0.0000001658963196 * Temp * Temp * Temp));
  Temp = Temp - 273.15;           // Convert Kelvin to Celcius
  return Temp;
  }





//********************************************************SECUENCIAS************************
 //********************************************************************************************
 
 void secuencia1temphumedad(){ //******************************SECUENCIA  1*******secuencia1temphumedad**************************
  for (int m=0;m<100;m++){
  float h = dht.readHumidity();
  // Read temperature as Celsius (the default)
  float t = dht.readTemperature();
  // Read temperature as Fahrenheit (isFahrenheit = true)
  //float f = dht.readTemperature(true);
  delay(4000);
  display.clearDisplay();
  // text display tests
  display.setTextSize(1);
  display.setTextColor(BLACK);
 
  display.setCursor(0,10);
  display.print("Temp: ");
  display.print(t);
  display.println("C");
  display.print("H%:   ");
  display.print(h);
  display.println("%");
  Serial.print(analogRead(0));   //********************** comprobar R y Tª
  Serial.println ("      Comprobacion R Termistor");
  Serial.print(Termistor(),2);   //Comprobar T Motor
  Serial.println ("      Comprobacion T Motor");  //------------comprobar R y Tª
  display.print("Motor:");
  display.print(Termistor(),2);
  display.println("C");
  display.setCursor(50,0);
  display.print(m);  
  display.display();  
  
//******Si la temperatura es inferior hay riesgo de hielo (parpadeo de Led azul)
  
  if (Termistor(),2 <  25.50)  {        
    for (int a=0;a<=253;a++) 
 {
  analogWrite (RGBb,a);
  delay(4);
  }
  for (int a=254;a>=0;a--) 
  {
analogWrite (RGBb,a);
delay(3);
}
delay(2000);
//*****************************************************comprobar movimiento Joystick******
valorjoystx = analogRead (ejejoystx);  //valor del eje x de 0 a 1023
Serial.print(valorjoystx); // para comprobar en serial monitor que los valores del eje se mueven
Serial.println("       valor ejex");  // para comprobar en serial monitor que los valores del eje se mueven
Serial.println();

// ahora planteo que el eje se mueva a un lado o a otro
// A derecha

 if(valorjoystx<=200){// caso contrario, si el joystick lo muevo al inicio de su recorrido los leds se encienden en sentido contrario
 analogWrite (11,254); // se enciende el led rojo para indicar que sale de secuencia1temphumedad
 delay(500);
 digitalWrite (11,0);
   display.clearDisplay();
  display.display();
 secuencia2motor();   //************************************* SECUENCIA   2*************secuencia2motor*****
}
} 
}
 }
 
 void secuencia2motor(){
    for (int m=0;m<100;m++){
  Serial.println ("          secuencia2");
  analogWrite (10,254);   // lez verde para indicar que ha llegado a secuencia2motor
  delay(500);
  digitalWrite (10,0);
  display.clearDisplay();
  // text display tests
  display.setTextSize(1);
  display.setTextColor(BLACK);
 
  display.setCursor(0,10);
  Serial.print(analogRead(0));   //********************** comprobar R y Tª
  Serial.println ("      Comprobacion R Termistor");
  Serial.print(Termistor(),2);   //Comprobar T Motor
  Serial.println ("      Comprobacion T Motor");  //------------comprobar R y Tª
  display.print("Motor:");
  display.print(Termistor(),2);
  display.println("C");
  display.setCursor(50,0);
  display.print(m);  
  display.display();  
  delay(1000);

 //*****************************************************comprobar movimiento Joystick******

 
 Serial.print(valorjoystx); // para comprobar en serial monitor que los valores del eje se mueven
Serial.println("       valor ejex--------------");  // para comprobar en serial monitor que los valores del eje se mueven   
valorjoystx = analogRead (ejejoystx);  
   if(valorjoystx>=1000) {
Serial.print(valorjoystx); // para comprobar en serial monitor que los valores del eje se mueven
Serial.println("       valor ejex--------------");  // para comprobar en serial monitor que los valores del eje se mueven
       
    for (int a=0;a<=253;a++) 
 {
  analogWrite (RGBb,a);
  delay(4);
  }
  for (int a=254;a>=0;a--) 
  {
analogWrite (RGBb,a);
delay(3);
//*------------
}
delay(2000);
secuencia1temphumedad();
  }
  }
 }

 
void loop() {

secuencia1temphumedad();
  

}

[/code]

Hola,

Tu código no va a funcionar porque estás malinterpretando la diferencia entre los tipos de variables y cómo se visualizan esas variables a nivel humano…

La función Termistor() devuelve un valor en formato float (que es un valor decimal)… El procesador trata esa variable internamente con todos sus decimales (mantisa mas exponente)…
Lo que te dijo SURBYTE en un post anterior, es que ese valor se puede printear con todos los decimales o sólo con los que te interese… Pero esto sólo aplica a cómo se printean los valores por el puerto serie o en una pantalla. Vamos, que se trata de cómo el arduino nos muestra los datos a los humanos mediante una interfaz HMI, internamente el valor sigue siendo un número decimal con x decimales.

En definitiva, los números reales dentro de tu código contienen todos los decimales…
if (Termistor() < 25.50)

Termistor() devuelve un número que valdrá XX.XXXXXXXXX. Si quiero mostrar ese número por el puerto serie, igual no me interesa que aparezca 25.34522343634122214 y con un 25.35 me es más que suficiente, para esto uso el
print(Termistor(),2).

De acuerdo, entre vuestros dos comentarios ya lo entiendo.

Lo que pongo tras la coma en float no afecta al valor, tan sólo afecta a lo que me muestra en cualquier pantalla. Los cálculos internos siguen conteniendo todos los decimales. Comprendido.

Y tenéis razón, el código ha dejado de funcionar. En algún momento sí me funcionó, pero con algún cambio seguramente en esa parte, ha dejado de funcionar el if.

Mil gracias

Poemoto, en cuanto a tu pregunta de por qué utilizar Termistor() y no Temp... La variable Temp está declarada dentro de la función Termistor() y por tanto solo existe mientras de ejecuta la función. Una vez terminada la función, simplemente deja de existir y no puede ser utilizada desde ninguna otra función.

Saludos,

Juanjo