Variables dan un valor incorrecto

Hola a tod@s,

Mi problema es el siguiente, estoy creando un programilla para controlar un invernadero de orquideas que tengo. Este controla extractor, nebulizador, y dos calefacciones. En principio estaba funcionando todo bien hasta que amplié el programa. La cuestión es que reviso la programación y esta bien, pero hay algunas variables que me dan un valor que no deberian de tener. En concreto dos de ellas:

La matriz int tmpIntervarls [13][3]; La declaro antes del setup, le asigno valores en el setup, y cuando accedo a los valores de la ultima posicion me da un valor incorrecto que yo no le he asignado (al final, aunque sea un poco cutre, la ultima posicion no la leo y me quito el problema........)

Bueno y la otra es int tmpCntrlPinStatus; Igualmente la declaro antes del setup y le asigno valor 0 en el setup, bien, cuando la leo me da un valor =4 que yo no le he asignado en ningun momento.

Alguien sabría decirme por que me ocurre esto????? Nunca habia trabajado con C y no entiendo de punteros, memoria y demas, no se si tendrá que ver con eso......estoy algo acostumbrado a lenguajes de nivel mas alto tipo php, javascript etc.....

Muchisimas gracias y un saludo, dejo el código completo

#include <EEPROM.h>
#include <TimeLib.h>
#include <Wire.h>
#include "DS1307.h"
#include <Adafruit_AM2315.h>

DS1307 clock;//define a object of DS1307 class
Adafruit_AM2315 am2315;

const boolean deBug = true;

//Sensor values
int tmpValue;
int hmdtValue;

// Output pins
const int extrPin = 22;// Extractor output pin
const int hmdtPin = 24;// Humidity output pin
const int tmpCntrlPin = 26;// Central heat output pin
const int tmpLclPin = 28;// Local heat output pin

// Output pins Status
int extrPinStatus;// Extractor output pin status
int hmdtPinStatus;// Humidity output pin status
int tmpCntrlPinStatus;// Central heat pin status
int tmpLclPinStatus;// Local heat output pin status

/* Automatic Mode Control
int extrAutoMode = 0; // Extractor automatic mode;
int hmdtAutoMode = 0; //Humidity automatic mode;
int tmpCntrlAutoMode = 0; // Central heat automatic mode;
int tmpLclAutoMode = 0; // Local heat automatic mode;*/

const int tmpCntrlHrStart = 13;// Start central heat hour
const int tmpCntrlMnStart = 10;// Start central heat minute
const int tmpCntrlHrEnd = 22;// Ends central heat hour
const int tmpCntrlMnEnd = 30;// Ends central heat minute

const int tmpLcllHrStart = 22;// Start local heat hour
const int tmpLclMnStart = 01;// Start local heat minute
const int tmpLclHrEnd = 9;// Ends local heat hour
const int tmpLclMnEnd = 30;// Ends local heat minute

const int hmdtHrStart = 8;// Start humidity hour
const int hmdtMnStart = 30;// Start humidity minute
const int hmdtHrEnd = 23;// Ends humidity hour
const int hmdtMnEnd = 31;// Ends humidity minute
const int hmdtMax = 70; // Max humidity value
const int hmdtMin = 40; // Min humidity value
const int tempHmdtMin = 18;// If tempValue < 17 Humidity dont works

const int extrHrStart = 9;// Start extraction hour
const int extrMnStart = 30;// Start extraction minute
const int extrHrEnd = 21;// Ends extraction hour
const int extrMnEnd = 59;// Ends extraction minute
const int tmpExtrMax = 29; // Max temp value (Extractor works 100% time while tempValue > this)
const int tmpExtrMin = 16; // If tempValue < this extractor dont works
int tmpIntervarls [13][3];// Segun temperatura se definiran unos tiempos de trabajo para el extractor

void setup() {
// put your setup code here, to run once:
Serial.begin(9600);

clock.begin();
clock.getTime();
setTime(clock.hour,clock.minute,clock.second,clock.dayOfMonth, clock.month, clock.year+2000);

if (! am2315.begin()) {
Serial.println("Sensor not found, check wiring & pullups!");
while (1);
}else{
tmpValue = am2315.readTemperature();
hmdtValue = am2315.readHumidity();
}

pinMode(hmdtPin, OUTPUT);
digitalWrite(hmdtPin, LOW);
pinMode(extrPin, OUTPUT);
digitalWrite(extrPin, LOW);
pinMode(tmpCntrlPin, OUTPUT);
digitalWrite(tmpCntrlPin, LOW);

extrPinStatus = 0;// Extractor output pin status
hmdtPinStatus = 0;// Humidity output pin status
tmpCntrlPinStatus = 0;// Central heat pin status
tmpLclPinStatus = 0;// Local heat output pin status

tmpIntervarls [0][0] = 16; // Para 16 grados Celsius
tmpIntervarls [0][1] = 8;  // El extractor se activara los minutos multiplos de 8 (cada 8 minutos)
tmpIntervarls [0][2] = 20; // Durante 20 segundos
tmpIntervarls [1][0] = 17;
tmpIntervarls [1][1] = 8;
tmpIntervarls [1][2] = 30;
tmpIntervarls [2][0] = 18;
tmpIntervarls [2][1] = 6;
tmpIntervarls [2][2] = 20;
tmpIntervarls [3][0] = 19;
tmpIntervarls [3][1] = 5;
tmpIntervarls [3][2] = 25;
tmpIntervarls [4][0] = 20;
tmpIntervarls [4][1] = 5;
tmpIntervarls [4][2] = 20;
tmpIntervarls [5][0] = 21;
tmpIntervarls [5][1] = 5;
tmpIntervarls [5][2] = 25;
tmpIntervarls [6][0] = 22;
tmpIntervarls [6][1] = 5;
tmpIntervarls [6][2] = 30;
tmpIntervarls [7][0] = 23;
tmpIntervarls [7][1] = 5;
tmpIntervarls [7][2] = 30;
tmpIntervarls [8][0] = 24;
tmpIntervarls [8][1] = 4;
tmpIntervarls [8][2] = 30;
tmpIntervarls [9][0] = 25;
tmpIntervarls [9][1] = 4;
tmpIntervarls [9][2] = 35;
tmpIntervarls [10][0] = 26;
tmpIntervarls [10][1] = 4;
tmpIntervarls [10][2] = 40;
tmpIntervarls [11][0] = 27;
tmpIntervarls [11][1] = 4;
tmpIntervarls [11][2] = 50;
tmpIntervarls [12][0] = 28;
tmpIntervarls [12][1] = 4;
tmpIntervarls [12][2] = 55;
tmpIntervarls [13][0] = 29;
tmpIntervarls [13][1] = 4;
tmpIntervarls [13][2] = 55;
}

void loop() {
// put your main code here, to run repeatedly:
humidityControl();
delay(200);
extractorControl();
delay(200);
tmpCntrlControl();
delay(200);

if(deBug == true){
Serial.print("Hum: "); Serial.println(am2315.readHumidity());
Serial.print("Temp: "); Serial.println(am2315.readTemperature());
delay(1000);
clock.getTime();
Serial.print(clock.hour);
Serial.print(" : ");
Serial.println(clock.minute);
}

}

void humidityControl(){

hmdtValue = am2315.readHumidity();
clock.getTime();
time_t startTime = mkFecha(hmdtHrStart, hmdtMnStart);
time_t endTime = mkFecha(hmdtHrEnd, hmdtMnEnd);
time_t tNow = now();

if(tNow > startTime && tNow < endTime && hmdtValue < hmdtMin && tmpValue > tempHmdtMin){
if(clock.minute%15 == 0 && clock.second<50){

if(hmdtPinStatus == 0 ){
if(extrPinStatus == 1){// Si el extractor está encendido lo apagamos
digitalWrite(extrPin, LOW);
extrPinStatus = 0;
}
digitalWrite(hmdtPin, HIGH);
hmdtPinStatus = 1;
}

}else{
if(hmdtPinStatus == 1 ){
digitalWrite(hmdtPin, LOW);
hmdtPinStatus = 0;
}
}
}else{
if(hmdtPinStatus == 1 ){
digitalWrite(hmdtPin, LOW);
hmdtPinStatus = 0;
}
}
}

void extractorControl(){
clock.getTime();
tmpValue = am2315.readTemperature();
time_t startTime = mkFecha(extrHrStart, extrMnStart);
time_t endTime = mkFecha(extrHrEnd, extrMnEnd);
time_t tNow = now();
int intervalMinute = 8;
int intervalSecond = 20;
for(int i=0; i < 14; i++){
Serial.println(tmpIntervarls[i][0]);
if(tmpIntervarls[i][0] == (int)am2315.readTemperature()){
intervalMinute = tmpIntervarls[i][1];
intervalSecond = tmpIntervarls[i][2];
}
}

if(tNow > startTime && tNow < endTime && tmpValue >= tmpExtrMin && tmpValue < tmpExtrMax && hmdtPinStatus == 0){
if(clock.minute%intervalMinute == 0 && clock.second<intervalSecond){
if(extrPinStatus == 0 ){
digitalWrite(extrPin, HIGH);
extrPinStatus = 1;
Serial.print("ON");
Serial.print("-");
Serial.print(clock.minute);
Serial.println(" ");
}
}else{
if(extrPinStatus == 1 ){
digitalWrite(extrPin, LOW);
extrPinStatus = 0;
Serial.print("OFF");
Serial.print("-");
Serial.print(clock.minute);
Serial.println(" ");
}
}
}else if(tNow > startTime && tNow < endTime && tmpValue >= tmpExtrMin && tmpValue >= tmpExtrMax && hmdtPinStatus == 0){

if(extrPinStatus == 0 ){
digitalWrite(extrPin, HIGH);
extrPinStatus = 1;
Serial.print("ON");
Serial.print("-");
Serial.print(clock.minute);
Serial.println(" ");
}

}else{
if(extrPinStatus == 1 ){
digitalWrite(extrPin, LOW);
extrPinStatus = 0;
}
}
}

void tmpCntrlControl(){
Serial.println(tmpCntrlPinStatus);
clock.getTime();
time_t startTime = mkFecha(tmpCntrlHrStart, tmpCntrlMnStart);
time_t endTime = mkFecha(tmpCntrlHrEnd, tmpCntrlMnEnd);
time_t tNow = now();

if(tNow > startTime && tNow < endTime && tmpCntrlPinStatus == 0){
digitalWrite(tmpCntrlPin, HIGH);
tmpCntrlPinStatus = 1;
}else{
if(tmpCntrlPinStatus == 1 ){
digitalWrite(tmpCntrlPin, LOW);
tmpCntrlPinStatus = 0;
}
}

}

time_t mkFecha(int hora, int minuto){
clock.getTime();
tmElements_t Fecha;
Fecha.Second = 0;
Fecha.Minute = minuto;
Fecha.Hour = hora;
Fecha.Day = clock.dayOfMonth;
Fecha.Month = clock.month;
Fecha.Year = (clock.year+2000)-1970;
time_t T0 = makeTime(Fecha);
return T0;
}

Hola.

Parece ser que el problema radica en que asignas mas datos al <tmpIntervarls [][]> que capacidad tiene, con lo cual puedes estar sobreescribiendo otras posiciones de memoria:

//... aqui lo dimensionas ...
int tmpIntervarls [13][3];// Segun temperatura se definiran unos tiempos de trabajo para el extractor

// ... aqui lo sobrepasas...
tmpIntervarls [13][0] = 29;
tmpIntervarls [13][1] = 4;
tmpIntervarls [13][2] = 55;

//... y aqui tambien...
for(int i=0; i < 14; i++){
Serial.println(tmpIntervarls[i][0]);
if(tmpIntervarls[i][0] == (int)am2315.readTemperature()){
intervalMinute = tmpIntervarls[i][1];
intervalSecond = tmpIntervarls[i][2];
}

Si necesitas esas asignaciones deberias redimensional el array:

int tmpIntervarls [14][3];// Segun temperatura se definiran unos tiempos de trabajo para el extractor

Saludos.

Te acomodé un poco las cosas pq para mi estaban muy desprolijas

#include <EEPROM.h>
#include <TimeLib.h>
#include <Wire.h>
#include "DS1307.h"
#include <Adafruit_AM2315.h>

DS1307 clock;//define a object of DS1307 class
Adafruit_AM2315 am2315;

const boolean deBug = true;

//Sensor values
int tmpValue;
int hmdtValue;

// Output pins
const int extrPin = 22;// Extractor output pin
const int hmdtPin = 24;// Humidity output pin
const int tmpCntrlPin = 26;// Central heat output pin
const int tmpLclPin = 28;// Local heat output pin

// Output pins Status
int extrPinStatus;// Extractor output pin status
int hmdtPinStatus;// Humidity output pin status
int tmpCntrlPinStatus;// Central heat pin status
int tmpLclPinStatus;// Local heat output pin status

/* Automatic Mode Control
int extrAutoMode = 0; // Extractor automatic mode;
int hmdtAutoMode = 0; //Humidity automatic mode;
int tmpCntrlAutoMode = 0; // Central heat automatic mode;
int tmpLclAutoMode = 0; // Local heat automatic mode;*/

const int tmpCntrlHrStart   = 13;// Start central heat hour
const int tmpCntrlMnStart   = 10;// Start central heat minute
const int tmpCntrlHrEnd     = 22;// Ends central heat hour
const int tmpCntrlMnEnd     = 30;// Ends central heat minute

const int tmpLcllHrStart    = 22;// Start local heat hour
const int tmpLclMnStart     = 01;// Start local heat minute
const int tmpLclHrEnd       = 9;// Ends local heat hour
const int tmpLclMnEnd       = 30;// Ends local heat minute

const int hmdtHrStart       = 8;// Start humidity hour
const int hmdtMnStart       = 30;// Start humidity minute
const int hmdtHrEnd         = 23;// Ends humidity hour
const int hmdtMnEnd         = 31;// Ends humidity minute
const int hmdtMax           = 70; // Max humidity value
const int hmdtMin           = 40; // Min humidity value
const int tempHmdtMin = 18;// If tempValue < 17 Humidity dont works

const int extrHrStart = 9;// Start extraction hour
const int extrMnStart = 30;// Start extraction minute
const int extrHrEnd = 21;// Ends extraction hour
const int extrMnEnd = 59;// Ends extraction minute
const int tmpExtrMax = 29; // Max temp value (Extractor works 100% time while tempValue > this)
const int tmpExtrMin = 16; // If tempValue < this extractor dont works
;// Segun temperatura se definiran unos tiempos de trabajo para el extractor
int tmpIntervarls [14][3] = {{16, 8,20},
                             {17, 8,30},
                             {18, 6,20},
                             {19, 5,25},
                             {20, 5,20},
                             {21, 5,25},
                             {22, 5,30},
                             {23, 5,30},
                             {24, 5,30},
                             {25, 5,35},
                             {26, 5,40},
                             {27, 5,50},
                             {28, 5,55},
                             {29, 5,55}};


void setup() {
    // put your setup code here, to run once:
    Serial.begin(9600);

    clock.begin();
    clock.getTime();
    setTime(clock.hour,clock.minute,clock.second,clock.dayOfMonth, clock.month, clock.year+2000);

    if (! am2315.begin()) {
        Serial.println("Sensor not found, check wiring & pullups!");
        while (1);
    } else {
        tmpValue = am2315.readTemperature();
        hmdtValue = am2315.readHumidity();
    }

    pinMode(hmdtPin, OUTPUT);
    digitalWrite(hmdtPin, LOW);
    pinMode(extrPin, OUTPUT);
    digitalWrite(extrPin, LOW);
    pinMode(tmpCntrlPin, OUTPUT);
    digitalWrite(tmpCntrlPin, LOW);

    extrPinStatus       = 0;// Extractor output pin status
    hmdtPinStatus       = 0;// Humidity output pin status
    tmpCntrlPinStatus   = 0;// Central heat pin status
    tmpLclPinStatus     = 0;// Local heat output pin status
}

void loop() {
    // put your main code here, to run repeatedly:
    humidityControl();
    delay(200);
    extractorControl();
    delay(200);
    tmpCntrlControl();
    delay(200);

    if (deBug == true){
        Serial.print("Hum: "); Serial.println(am2315.readHumidity());
        Serial.print("Temp: "); Serial.println(am2315.readTemperature());
        delay(1000);
        clock.getTime();
        Serial.print(clock.hour);
        Serial.print(" : ");
        Serial.println(clock.minute);
    }
}

void humidityControl(){

    hmdtValue = am2315.readHumidity();
    clock.getTime();
    time_t startTime = mkFecha(hmdtHrStart, hmdtMnStart);
    time_t endTime = mkFecha(hmdtHrEnd, hmdtMnEnd);
    time_t tNow = now();

    if(tNow > startTime && tNow < endTime && hmdtValue < hmdtMin && tmpValue > tempHmdtMin){
        if (clock.minute%15 == 0 && clock.second<50) {
            if (hmdtPinStatus == 0 ){
                if (extrPinStatus == 1){// Si el extractor está encendido lo apagamos
                    digitalWrite(extrPin, LOW);
                    extrPinStatus = 0;
                }
                digitalWrite(hmdtPin, HIGH);
                hmdtPinStatus = 1;
            }

            } else {
            if (hmdtPinStatus == 1 ) {
                digitalWrite(hmdtPin, LOW);
                hmdtPinStatus = 0;
            }
        }
        } else{
        if (hmdtPinStatus == 1 ){
            digitalWrite(hmdtPin, LOW);
            hmdtPinStatus = 0;
        }
    }
}

void extractorControl(){
    clock.getTime();
    tmpValue = am2315.readTemperature();
    time_t startTime = mkFecha(extrHrStart, extrMnStart);
    time_t endTime = mkFecha(extrHrEnd, extrMnEnd);
    time_t tNow = now();
    int intervalMinute = 8;
    int intervalSecond = 20;
    for (int i=0; i < 14; i++){
        Serial.println(tmpIntervarls[i][0]);
        if (tmpIntervarls[i][0] == (int)am2315.readTemperature()){
            intervalMinute = tmpIntervarls[i][1];
            intervalSecond = tmpIntervarls[i][2];
        }
    }

    if(tNow > startTime && tNow < endTime && tmpValue >= tmpExtrMin && tmpValue < tmpExtrMax && hmdtPinStatus == 0){
        if (clock.minute%intervalMinute == 0 && clock.second<intervalSecond){
            if (extrPinStatus == 0 ) {
                digitalWrite(extrPin, HIGH);
                extrPinStatus = 1;
                Serial.print("ON");
                Serial.print("-");
                Serial.print(clock.minute);
                Serial.println(" ");
            }
            } else{
            if (extrPinStatus == 1 ){
                digitalWrite(extrPin, LOW);
                extrPinStatus = 0;
                Serial.print("OFF");
                Serial.print("-");
                Serial.print(clock.minute);
                Serial.println(" ");
            }
        }
    }else if(tNow > startTime && tNow < endTime && tmpValue >= tmpExtrMin && tmpValue >= tmpExtrMax && hmdtPinStatus == 0){

    if (extrPinStatus == 0 ){
        digitalWrite(extrPin, HIGH);
        extrPinStatus = 1;
        Serial.print("ON");
        Serial.print("-");
        Serial.print(clock.minute);
        Serial.println(" ");
    }

    }else{
        if (extrPinStatus == 1 ){
            digitalWrite(extrPin, LOW);
            extrPinStatus = 0;
        }
    }
}

void tmpCntrlControl(){
    Serial.println(tmpCntrlPinStatus);
    clock.getTime();
    time_t startTime = mkFecha(tmpCntrlHrStart, tmpCntrlMnStart);
    time_t endTime = mkFecha(tmpCntrlHrEnd, tmpCntrlMnEnd);
    time_t tNow = now();

    if (tNow > startTime && tNow < endTime && tmpCntrlPinStatus == 0){
        digitalWrite(tmpCntrlPin, HIGH);
        tmpCntrlPinStatus = 1;
        } else{
        if (tmpCntrlPinStatus == 1 ){
            digitalWrite(tmpCntrlPin, LOW);
            tmpCntrlPinStatus = 0;
        }
    }

}

time_t mkFecha(int hora, int minuto){
    clock.getTime();
    tmElements_t Fecha;
    Fecha.Second = 0;
    Fecha.Minute = minuto;
    Fecha.Hour = hora;
    Fecha.Day = clock.dayOfMonth;
    Fecha.Month = clock.month;
    Fecha.Year = (clock.year+2000)-1970;
    time_t T0 = makeTime(Fecha);
    return T0;
}

Muchisimas gracias Alfaville !!!!!!!!!!!!! Joe, tan poquita cosa y lo que puede llegar a incordiar, además que no tengo depurador para esto y Arduino no me decia nada........
Lo he corregido y efectivamente ahora todos los parametros estan bien. Mil gracias de nuevo Alfaville :wink: :wink: :wink:

Gracias surbyte!!!!!!!!!!! La verdad es que soy un poco desorganizado con el código, estoy acostumbrado a hacerlo solo para mi......... Muchas gracias!!!!!!!!!! :slight_smile: :slight_smile:

Hola N3XUS

Las gracias no se merecen, al menos por mi parte, lo importante es que tu hagas lo mismo por quien lo pueda necesitar.

Saludos.