-
Notifications
You must be signed in to change notification settings - Fork 6
UFOX EN MODO ULTRA BAJO CONSUMO
Teca IoT edited this page Mar 24, 2021
·
5 revisions
//UFOX EN MODO DE AHORRO MAXIMO DE ENERGIA
//CON BATERIA DE 2800mAH (18650-litio) PUEDE LLEGAR A DURAR HASTA 31 DIAS.
//POR: MARCO ANTONIO CABALLERO MORENO
//V1 21/03/21
///*********************************************
//ESTE EJEMPLO MUESTRA UN METODO PARA PONER A UFOX EN UN MODO DE BAJO CONSUMO EXTREMO.
//LA COMUNICACION USB ES DESABILITADA PARA AHORRAR LO MAXIMO EN ENERGIA.
//ES POSIBLE SEGUIR CONTADO CON COMUNICACION SERIAl PARA EL USUARIO, EMPLEANDO UN PIN DIGITAL DE UFOX, PARA ESTE
//EJEMPLO EL NUMERO 5. SE EMPLEA LA LIBRERIA SOFTWARE SERIAL DE ARDUINO. ES NECESARIO UN MODULO CONVERSOR USB A SERIAL
//EXTERNO COMO: FTDI,CP2102, CH340, ETC..
//
//LA LIBRERIA ARDUINO LOW POWER https://github.com/rocketscream/Low-Power, POR ROCKETSCREAM. PROPORCIONA UN METODO
//SIMPLE PARA ACCERDER A LOS MODOS DE BAJO CONSUMO DEL ATMEGA32U4, ES POSIBLE TEMPORIZAR HASTA UN MAXIMO DE 8
//SEGUNDOS EN MODO SUSPENSION Y SEGUIR ALMACENANDO VARIABLES EN RAM, ESTO RESULTA UTIL PARA EJECUCION CONTINUA Y
//TRANSMISION DE DATOS TEMPORIZADOS SIN REQUERIR A ELECTRONICA ADICIONAL O MODULOS EXTERNOS.
//LA TECNICA EMPLEA UNA VARIABLE CONTADORA "val" QUE SE USA PARA EXTENDER EL TIEMPO EN ESTADO DE SUSPENSION.
//Y LA COMPARA CON LAS VECES QUE SE VA REPETIR EL PROCESO CON LA VARIABLE "tmp". PARA SABER SI SE REALIZAN LAS
//TAREAS O PERMANECERA EN ESTADO DE SUSPENCION. EL TIEMPO EN ESTADO DESUSPENSION SIEMPRE SERA MULTIPLO DE 8 SEGUNDOS.
//EL DISPOSITIVO NO SE REINICIARA LUEGO DE SALIR DEL MODO SUSPENSION, ES DECIR TODAS LAS EJECUCIONES
// SE SEGUIRAN REALIZANDO DENTRO DE LA FUNCION PRINCIPAL LOOP.
//LA FUNCION TASK SE EMPLEA PARA REALIZAR LAS TAREAS TIPICAS DE LECTURA DE SENSORES O CONTROL DE ACTUADORES,
//TRANSMISION Y RECEPCION DE DATOS SIGFOX, ETC.
#include <LowPower.h>
#include <SoftwareSerial.h>
#include <Ufox.h>
#define RXLED 17
SoftwareSerial mySerial(4, 5); //(RX,TX)
Ufox wisol;
int val=0; //variable contador
float tmp = 82 ; //tiempo que permanecera apagado (Minutos) = 82 *8/60 = 10.9 min
void setup()
{
//Serial.begin(9600);
mySerial.begin(9600); //iniciar serial de usuario pin 5-TX
wisol.begin(9600); //iniciar radio wisol
mySerial.println("Iniciando Dispositivo Ufox!");
//while (!Serial) ;
delay(100);
wisol.SLEEP();
pinMode(LED,OUTPUT);
pinMode(RXLED,OUTPUT);
for(int i=0; i<10;i++){
digitalWrite(LED,HIGH);
delay(30);
digitalWrite(LED,LOW);
delay(30);
}
TASK(); //realizar tareas, lectura de sensores, actuadores, enviar por sigfox, recibir de sigfox,etc...
mySerial.print("Apagar UFOX (Min): ");
mySerial.println((tmp*8)/60);
}
void loop()
{
val++;
mySerial.print(".");
if(val >= tmp){
digitalWrite(LED,LOW);
mySerial.println("Despertar UFOX! ");
TASK(); //realizar tareas, lectura de sensor, actuadores, enviar por sigfox, recibir de sigfox,etc...
val=0;
mySerial.print("Apagar UFOX (Min): ");
mySerial.println((tmp*8)/60);
LowPower.powerDown(SLEEP_8S, ADC_OFF, BOD_OFF); //APAGAR
}
LowPower.powerDown(SLEEP_8S, ADC_OFF, BOD_OFF); //APAGAR
}
void TASK(){
wisol.RST(); //despertar radio sigfox
digitalWrite(RXLED,LOW); //encender led (esta negado)
mySerial.println("Enviar dato Sigfox...");
int datos = wisol.VOLT(); //leer la bateria
///hacer cosas imposibles ....
mySerial.println(wisol.SEND(datos)); //enviar dato sigfox y mostrar resultado de envio
mySerial.print("Enviando: ");
mySerial.println(datos);
digitalWrite(RXLED,HIGH);
wisol.SLEEP();//apagar radio sigfox
}