Hello:
Sorry for my English,
I have a arduino mini with 4 sensors, two temperature and two humidity, they come trough a demultiplexer M74HC4051, but I think that's not the problem, the arduino starts in sleep mode power down, then wake up and reads the sensors, this time it is ok, go sleep again but when wake up and reread sensors values are not well, it's like the Aref would have changed.
Help please, I tried to put before measurements analogReference(DEFAULT); but it´s the same.
Some sugestions?
02/08/2013 09:15:05 17.8 61.84 17.6 60.76 this are ok
02/08/2013 09:16:05 33.6 64.18 33.2 63.22 from here not
02/08/2013 09:17:05 36.9 64.93 36.5 64.60
02/08/2013 09:18:05 37.6 65.23 37.1 63.94
Here is the code
#include <avr/sleep.h>
#include [color=#006699]"HumidityHIH4030.h"[/color]
#include <[color=#CC6600]Wire[/color].h>
#include <[color=#CC6600]Rtc_Pcf8563[/color].h>
#include <[color=#CC6600]SD[/color].h>
#include <SoftwareSerial.h>
const byte LED = 13;
HumidityHIH4030 Humidity;
Rtc_Pcf8563 rtc; // AÑADIR EL RELOJ
int alarma = 15; // VALOR PARA INICIAR ALARMA
int intervalo = 1; // INTERVALO DE REGISTROS
volatile int registrar = 1; // VARIABLE QUE ACTIVA LA ALARMA
float humidity1; // AÑADIR HUMEDAD 1
float humidity2; // AÑADIR HUMEDAD 2
float tempvmin = 97.185; // MINIMO VOLTAJE TEMPERATURAS PARA ESCALAR
float tempvmax = 672.7248; // MAXIMO VOLTAJE TEMPERATURAS PARA ESCALAR
int temp1; // AÑADIR TEMPERATURA 1
int temp2; // AÑADIR TEMPERATURA 2
float Tempvalue1; // AÑADIR TEMPERATURA 1 EN GRADOS
float Tempvalue2; // AÑADIR TEMPERATURA 2 EN GRADOS
// ESTO SOLO ES PARA DESPERTAR
void wake ()
{
sleep_disable(); // DESACTIVAR EL SLEEP
registrar = 1; // ACTIVA EL REGISTRO DE MEDIDAS
} // AQUI ACABA EL DESPERTAR
// EMPIEZA EL SETUP
void setup ()
{
pinMode (2, INPUT); // PIN 2 COMO ENTRADA
digitalWrite (2, HIGH); // ACTIVA EL PIN D2 COMO DESPERTADOR
rtc.setAlarm(alarma, 99, 99, 99); //PONEMOS LA ALARMA POR PRIMERA VEZ PARA COMENZAR EL CICLO
}
// ACABA EL SETUP
// EMPIEZA EL LOOP
void loop ()
{
//EMPIEZA EL PROCESO DE DORMIR.
pinMode (LED, OUTPUT);
digitalWrite (LED, HIGH);
delay (50);
digitalWrite (LED, LOW);
delay (50);
pinMode (LED, INPUT);
set_sleep_mode (SLEEP_MODE_PWR_DOWN); // MODO DE SLEEP
sleep_enable(); // ACTIVAR MODO
// will be called when pin D2 goes low
attachInterrupt (0, wake, FALLING); // AÑADE EL A0 COMO DESPERTADOR
sleep_cpu (); // AQUI SE DUERME Y SIGUE AL DESPERTAR
// EJECUTA EL WAKE QUE PONE registrar A 1
if (registrar == 1) // SI REGISTRAR ES IGUAL A 1 ENTONCES EJECUTA EL TOMAR_DATOS
{
tomar_datos(); // VOID DE REGISTRO
}
}
// ACABA EL LOOP
// EMPIEZA TOMAR_DATOS
void tomar_datos()
{
detachInterrupt (0); // QUITAR EL A0 COMO DESPERTADOR
pinMode (4, OUTPUT); // RELE DE ALIMENTACION SENSORES Y SD
pinMode (5, OUTPUT); // s2 CANAL CONTROL MULTIPLEXOR SALIDA
pinMode (6, OUTPUT); // s1 CANAL CONTROL MULTIPLEXOR SALIDA
pinMode (7, OUTPUT); // s0 CANAL CONTROL MULTIPLEXOR SALIDA
digitalWrite (4, HIGH); // ACTIVAMOS EL RELE
digitalWrite (5, LOW); // CANAL 0 DEL DESMULTIPLEXADOR
digitalWrite (6, LOW);
digitalWrite (7, LOW);
delay (5000);
temp1 += analogRead (A0); // LEE TEMPERATURA 1 5 VECES Y HACE LA MEDIA
delay (20);
temp1 += analogRead (A0);
delay (20);
temp1 += analogRead (A0);
delay (20);
temp1 += analogRead (A0);
delay (20);
temp1 += analogRead (A0);
temp1 /= 5;
digitalWrite (5, LOW); // CANAL 2 DEL DESMULTIPLEXADOR
digitalWrite (6, HIGH);
digitalWrite (7, LOW);
delay (100);
temp2 += analogRead (A0); // LEE TEMPERATURA 2 5 VECES Y HACE LA MEDIA
delay (20);
temp2 += analogRead (A0);
delay (20);
temp2 += analogRead (A0);
delay (20);
temp2 += analogRead (A0);
delay (20);
temp2 += analogRead (A0);
temp2 /= 5;
Tempvalue1 = map (temp1, tempvmin, tempvmax, -400, 850); // ESCALA TEMPERATURA 1
Tempvalue2 = map (temp2, tempvmin, tempvmax, -400, 850); // ESCALA TEMPERATURA 2
Tempvalue1 = Tempvalue1/10; // PONE DECIMALES A TEMPERATURA 1
Tempvalue2 = Tempvalue2/10; // PONE DECIMALES A TEMPERATURA 2
digitalWrite (5, HIGH); // CANAL 1 DEL DESMULTIPLEXADOR
digitalWrite (6, LOW);
digitalWrite (7, LOW);
delay (100);
Humidity.begin(A0); // ARRANCA LIBRERIA HUMIDITY EN A0
Humidity.setTemperature (Tempvalue1); // PONE TEMPERATURA 1 DE CORRECION
humidity1 = Humidity.getHumidityPercentage(); // RECOJE HUMEDAD 1 CON CORRECION DE TEMPERATURA
digitalWrite (5, HIGH); // CANAL 3 DEL DESMULTIPLEXADOR
digitalWrite (6, HIGH);
digitalWrite (7, LOW);
delay (100);
Humidity.setTemperature (Tempvalue2); // PONE TEMPERATURA 2 DE CORRECION
humidity2 = Humidity.getHumidityPercentage(); // RECOJE HUMEDAD 2 CON CORRECION DE TEMPERATURA
pinMode(10, OUTPUT); // ACTIVA LA TARJETA SD
SD.begin(10); // ARRANCA LA TARJETA
File dataFile = SD.open("datalog1.txt", FILE_WRITE); // ABRE DATALOG.TXT O LO CREA SI NO EXISTE
if (dataFile) // SI ESTA YA ABIERTO, ESCRIBE
{
dataFile.print(rtc.formatDate()); // FECHA
dataFile.print("\t");
dataFile.print(rtc.formatTime()); // HORA
dataFile.print("\t");
dataFile.print(Tempvalue1,1); // TEMPERATURA 1
dataFile.print("\t");
dataFile.print(humidity1,2); // HUMEDAD 1
dataFile.print("\t");
dataFile.print(Tempvalue2,1); // TEMPERATURA 2
dataFile.print("\t");
dataFile.println(humidity2,2); // HUMEDAD 2
dataFile.close(); // CIERRA EL ARCHIVO
}
/*A ELIMINAR EN LA VERSION FINAL DEL PROGRAMA*/
/**/
/**/
Serial.begin (9600);
Serial.print(rtc.formatDate()); // FECHA
Serial.print("\t");
Serial.print(rtc.formatTime()); // HORA
Serial.print("\t");
Serial.print(Tempvalue1,1); // TEMPERATURA 1
Serial.print("\t");
Serial.print(humidity1,2); // HUMEDAD 1
Serial.print("\t");
Serial.print(Tempvalue2,1); // TEMPERATURA 2
Serial.print("\t");
Serial.println(humidity2,2);
delay (1000);
/**/
/**/
/*PONEMOS TODOS LOS CANALES COMO LOW Y COMO INPUT PARA DORMIR.*/
digitalWrite (4, LOW);
digitalWrite (5, LOW);
digitalWrite (6, LOW);
digitalWrite (7, LOW);
digitalWrite (10, LOW);
pinMode (4, INPUT);
pinMode (5, INPUT);
pinMode (6, INPUT);
pinMode (7, INPUT);
pinMode (10, INPUT);
alarma = alarma + intervalo; // AJUSTAMOS EL INTERVALO DE LA PROXIMA ALARMA
if (alarma >= 60) // CORREGIMOS A 0 MINUTOS
{
alarma -= 60;
}
rtc.setAlarm(alarma, 99, 99, 99); //PONEMOS LA ALARMA DE NUEVO
registrar = 0; // PONEMOS EL REGISTRO A 0 DE NUEVO
}
Regards