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;
}