Hola a todos.
Soy nuevo en el foro y también realmente en el mundo Arduino.
Me presento. Mi nombre es Juan Carlos y estoy trabajando en un proyecto donde necesito tomar datos de posición y temperatura de un falso huevo incubado por un ave.
La idea es poner un huevo hueco, de plástico, con un proyecto dentro que mida los datos de posición y temperatura y los grabe en una tarjeta microSD y así extrapolar estos datos para proogramar una incubadora para que ésta trate de emular la incubación natural girando y cambiando la temperatura de los huevos naturales puestos en la incubadora para aumentar la tasa de éxito de eclosión de los mismos.
Estoy usando un Arduino Pro mini de 5 volts, un mpu6050 (giroscopio-acelerómetro), un módulo lector/grabador en tarjeta microSD y 3 termistores NTC.
El problema está en que necesito meter todo el sistema (incluyendo batería) en un huevo de plástico de unos 60 x 40 mm.
He medido consumos y el mpu tirnr unos 5 mA, el arduino unos 17 mA, el módulo de tarjeta microSD unos 5 mA y cada termistor unos 0,3 mA. Total unos 28mA.
Me cabe dentro una batería Li-Po de 300 mA, con lo que tendría a lo sumo unas 10 horas. Pero necesito que me mida al menos 5 ó 6 días, si es más mejor.
He usado la librería lowpower con la función LowPower.powerDown(SLEEP_8S, ADC_OFF, BOD_OFF); y eso me reduce el consumo del arduino mientras está en sleep pero no lo suficiente. Por otra parte esta función no desactiva la alimentación de los sensores así que éstos siguen consumiendo.
He intentado alimentarlos con una salida digital del Arduino y así encenderlos sólo cuando el arduino despierta cada 8 seg.
El problema es que al iniciar el MPU6050 en el setup, la salida digital nunca despierta, así que los sensores nunca se alimentan.
Debo estar haciendo algo mal a este respecto.
¿Podría alguien echar un vistazo al código e indicarme algún error que esté cometiendo?
Muchas gracias por anticipado
#include "I2Cdev.h"
#include "MPU6050.h"
#include "Wire.h"
#include <TimeLib.h>
#include <DS1307RTC.h> // a basic DS1307 library that returns time as a time_t
#include "LowPower.h" //Libreria de ahorro de bateria
#include <SD.h>
#include <math.h> //Libreria termistor
#include "LowPower.h" //Libreria de ahorro de bateria
const int mpuAddress = 0x68; // Puede ser 0x68 o 0x69
MPU6050 mpu(mpuAddress);
int ax, ay, az;
int gx, gy, gz; //Acaba 6050
const int pin = 10; // Usaré este PIN como salida de Vcc para alimentar los sensores
const int Rc = 10000; //valor de la resistencia del termistor - aqui empiea el termistor
const int Vcc = 5;
const int SensorPIN = A3;
float A = 1.11492089e-3;
float B = 2.372075385e-4;
float C = 6.954079529e-8;
float K = 2.5; //factor de disipacion en mW/C // aqui acaba el termistor
File myFile; //Para el archivo que se creara en la microSD
void setup( )
{
Serial.begin( 9600);
while (!Serial) ; // Needed for Leonardo only
setSyncProvider(RTC.get); // the function to get the time from the RTC
setTime(10 , 40 , 00 , 22, 02, 2020); // Pone en hora el reloj RTC (p ej. Las 10:40:00 del dia 22 de Feb de 2020)
if (timeStatus() != timeSet)
Serial.println("Unable to sync with the RTC");
else
Serial.println("RTC has set the system time");
Wire.begin(); //empieza MPU6050
mpu.initialize();
Serial.println(mpu.testConnection() ? F("IMU iniciado correctamente") : F("Error al iniciar IMU")); //acaba MPU6050
Serial.print("Iniciando MicroSD ...");
if (!SD.begin(4)) {
Serial.println("No se pudo inicializar");
return;
}
Serial.println("MicroSD Iniciada correctamente");
if(!SD.exists("datalog.csv"))
{
myFile = SD.open("datalog.csv", FILE_WRITE);
if (myFile) {
Serial.println("Archivo nuevo, Escribiendo encabezado(fila 1)");
myFile.println("Tiempo(Tiempo;Sensor1;Sensor2;Sensor3;sensor4;sensor5");
myFile.close();
} else {
Serial.println("Error creando el archivo datalog.csv");
pinMode(10, OUTPUT); //define el PIN 10 como salida
}
}
}
void loop( )
{
delay (500);//un pequeño retardo para que el sistema despierte correctamente y los sensores puedan dar datos
LowPower.powerDown(SLEEP_8S, ADC_OFF, BOD_OFF); //Ponemos el Arduino en modo sleep durante 8 seg
digitalWrite(10, HIGH); // Pone la salida 8 en High para alimentar los sensores
delay(1000); // espera un segundo en high
digitalWrite(10, LOW); // Apaga la salida 8 y los sensores
// Leer las aceleraciones del MPU6050
mpu.getAcceleration(&ax, &ay, &az);
//Calcular los angulos de inclinacion
float accel_ang_x = atan(ax / sqrt(pow(ay, 2) + pow(az, 2)))*(180.0 / 3.14);
float accel_ang_y = atan(ay / sqrt(pow(ax, 2) + pow(az, 2)))*(180.0 / 3.14);
// Mostrar resultados
float raw = analogRead(SensorPIN); //aqui empieza termistor
float V = raw / 1024 * Vcc;
float R = (Rc * V ) / (Vcc - V);
float logR = log(R);
float R_th = 1.0 / (A + B * logR + C * logR * logR * logR );
float kelvin = R_th - V*V/(K * R)*1000;
float celsius = kelvin - 273.15-1; //aqui acaba el termistor
{
Serial.print(day());
Serial.print("-");
Serial.print(month());
Serial.print("-");
Serial.print(year());
Serial.print(" ");
Serial.print(hour());
Serial.print(":");
Serial.print(minute());
Serial.print(".");
Serial.print(second());
Serial.print("; T = "); //aqui empieza termistor
Serial.print(celsius);
Serial.print("C"); //aqui acaba termistor
Serial.print(F("\; Inclinacion en X:"));
Serial.print(accel_ang_x);
Serial.print(F("; \Inclinacion en Y: "));
Serial.println(accel_ang_y);
myFile = SD.open("datalog.csv", FILE_WRITE);//abrimos el archivo
if (myFile) {
Serial.print("");
myFile.print(day());
myFile.print("-");
myFile.print(month());
myFile.print("-");
myFile.print(year());
myFile.print(" ");
myFile.print(hour());
myFile.print(":");
myFile.print(minute());
myFile.print(".");
myFile.print(second());
myFile.print("; T = "); //aqui empieza termistor
myFile.print(celsius);
myFile.print("C"); //aqui acaba termistor
myFile.print( "; T = " );
myFile.print(F("\; Inclinacion en X:"));
myFile.print(accel_ang_x);
myFile.print(F("; \Inclinacion en Y: "));
myFile.println(accel_ang_y);
myFile.close(); //cerramos el archivo
} else {
Serial.println("Error al abrir el archivo");
}
}
}