[Solucionado] con la lectura/escritura de variables

Hola a todos, no se como captar vuestra atencion para que os animeis a responder jeje, espero que os interese el tema de por si.

hace unos meses estuve pensando en hacer un controladsor de clima con un arduino nano para controlar todas las constantes vitales de mi cultivo ecologico. Me pase un tiempo tomando datos y leyendo otros posts de alguien que automatizo su invernadero con arduino.
Bien el programa que he diseñado en principio deberia funcionar, y funciona. El problema es cuando llamo a una funcion que es la que se encarga de leer todos los valores de los sensores y los guarde en variables, este no lle nada y no lo guarda. Plantee la idea de que TODOS los sensores estaban dañados o que no hice bien las conexiones entre la placa y los sensores, y los probe uno a uno.

En fin espero que les echeis un vistazo y que intenteis averiguar que puede ser.
PD: Tambien he pensado en que las variables no pueden guardarse porque no estan declaradas en la funcion en si, pero no crea que sea eso porque no me da error de compilacion.

Muchas gracias.

PD2: Aqui dejo un fragmento del codigo el cual me causa los problemas. El que necesite el codigo entero que me mande un MP ya que ocupa unas 400 lineas y tampoco es plan de ensuciar el post xD

#define DEBUG 1

//Version del Programica 
#define v 0.2

//Definimos los pines de entrada digital
#define agua_pin 2 
#define start_input 3 

//Definimos los pines de entradas analogicas
#define temp_pin A0
#define LDR_pin A1
#define hum_pin A2 //Numero del pin analogico que usaremos para leer la humedad del suelo
#define pulsador A3

//Pines A4 y A5 SDA SCL RESERVADOS PARA LA PANTALLA LCD
//Pines 10, 11, 12, 13 reservados para el modulo ETHERNET

//Definimos los pines de las salidas
#define bomba 4 // Numero de pin para a salida de la bomba de agua
#define vent 5 //Pin para los ventiladores disipadores de calor

//Definimos los LED's
#define LED_bomba 6 //Led para indicar de que la bomba esta funcionando
#define LED_luz 7 //led verifica la iluminacion
#define LED_hum 8

//Incluimos las librerias del DHT
#include "DHT.h"
//Iniciamos las variables del dht
#define DHTPIN 9
#define DHTTYPE DHT11 
DHT dht(DHTPIN, DHTTYPE);

//Definimos laslibrerias
#include <SPI.h>
#include <Wire.h>

//Librerias para el LCD
#include <LCD.h>
#include <LiquidCrystal_I2C.h>

//Libreria del bargraph
#include <LcdBarGraphX.h>

//Librerias para conexion a ethernet
#include <Ethernet.h>


//Declaración de la direcciones MAC e IP. También del puerto 80
byte mac[]={0xDE,0xAD,0xBE,0xEF,0xFE,0xED}; //MAC
IPAddress ip(192,168,10,177); //IP
EthernetServer servidor(80);
String readString=String(30);

//Variables globales
int temp;
int LDR = LDR_pin;
byte riego;
int hum_suelo;

//Declaramos los valores iniciales para el primer ciclo.
byte H = 67;
byte T = 22;


//Declaramos las variables para el LCD
byte dir = 0x27;   // Ese 0x significa que es hexadecimal, no decimal
LiquidCrystal_I2C             lcd( dir, 2, 1, 0, 4, 5, 6, 7);

//Declaramos la instancia para el bar graph
LcdBarGraphX lbg(&lcd, 0, 1);  // -- creating bargraph instance, format is (&lcd, lcdNumCols, start X, start Y). So (&lcd, 16, 0, 1) would set the bargraph length to 16 columns and start the bargraph at column 0 on row 1.



void setup() 
{
  //Iniciamos con las direcciones de red asignadas
  Ethernet.begin(mac, ip);
  servidor.begin();
  Serial.begin(9600);
  
  //Declaramos variables
  int temp_luz;
  dht.begin();
  

  //Declaramos entradas
  pinMode(temp, INPUT);
  pinMode(LDR, INPUT);
  pinMode(temp_luz, INPUT);
  pinMode(hum_suelo,INPUT);
  pinMode(agua_pin, INPUT);
  pinMode(start_input, INPUT);
  pinMode(pulsador, INPUT);
  
  //Declaramos las salidas
  pinMode(vent, OUTPUT);
  pinMode(bomba, OUTPUT);
  pinMode(LED_bomba, OUTPUT);
  pinMode(LED_luz, OUTPUT);

  lcd.begin (16,2);    // Inicializar el display con 16 caraceres 2 lineas
  lcd.setBacklightPin(3,POSITIVE);
  lcd.setBacklight(HIGH);

  start();
  }

  void loop() 
  {
    #if DEBUG
    debug(); 
    #endif
    ethernet();
    pantalla();
    automatizacion();
    if(pulsador == HIGH){        //Si el pulsador X esta pulsado que acceda al menu del selector, siempre y cuando no este realizando ninguna tarea
      selector();
  }

    }

    //Subprograma de automatizacion del invernadero
    void automatizacion() 
    {    
    int hum_suelo = analogRead(hum_pin);
    int temp = dht.readTemperature();
    int temp_luz = analogRead(temp_pin);
    int LDR = analogRead(LDR_pin);    //definimos el pin analogico del ldr que vamos a utilizar para medir la intensidad de luz
    int h = dht.readHumidity();// Lee la humedad
    int nivel_agua = digitalRead(agua_pin);
}
void pantalla() {
  
  lcd.clear();
  lcd.print("H:");
  lcd.print(dht.readHumidity());
  lcd.setCursor(8,0);
  lcd.print("T:");
  lcd.print(temp);
  lcd.setCursor(0,1);
  lcd.print("LDR:");
  lcd.print(LDR);
  lcd.setCursor(9,1);
  lcd.print("HS:");
  lcd.print(hum_suelo);

}

Las variables declaradas dentro de una función "mueren" cuando esta termine; a lo que se le denomina que están en un contexto ("scope" en inglés) "local".
Para que persistan aún fuera de cualquier función, deben estar en contexto "global"; para esto tienes dos opciones:

  • Declarar las variables junto con las instancias de las librerías (el punto es que tienen que estar fuera de cualquier función).
  • Dejar las declaraciones donde están, pero agregarles la palabra static antes del tipo de dato.

Hola Lucario, las variables que utilizo en mas de una función están declaradas como globales, así que eso en principio no debería ser.
Ademas, en la función automatizacion() declaro las variables dentro y las opero en el mismo sitio, por lo que no debería haber problema.

No se me ocurre que puede ser...

Lucario448:
Las variables declaradas dentro de una función "mueren" cuando esta termine; a lo que se le denomina que están en un contexto ("scope" en inglés) "local".
Para que persistan aún fuera de cualquier función, deben estar en contexto "global"; para esto tienes dos opciones:

  • Declarar las variables junto con las instancias de las librerías (el punto es que tienen que estar fuera de cualquier función).
  • Dejar las declaraciones donde están, pero agregarles la palabra static antes del tipo de dato.

Tenias toda la razon, habia declarado variables con el mismo nombre dentro y fuera de la funcion por lo que no me daba error de compilacion ya que es lo que no interferian al estar en otra funcion, pero no pasaban los datos al LCD.

Al fin!!
Muchas gracias