¡Hola!
No sabía si poner esta consulta aquí o en hardware, ya que trata un poco de cada tema.
¿Se puede hacer que un Arduino Mega 2560 se ponga en "sleep" y se despierte con el mismo pulsador?
He buscado mucho y solo encuentro ejemplos en los que se pone en "sleep" desde el loop y se despierta con un pulsador, pero lo que me gustaría hacer es que con el mismo pulsador se pueda poner a dormir y despertarlo.
¿Es posible?
Muchas gracias.
Jerónimo
Lo que ocurre es que son practicamente dos cosas distintas.
Cuando lo pones a dormir lo usas como pulsador.
Cuando lo despiertas usas una función de sleep que permite despertarlo por interrupción de modo que no son la misma cosa cuando pudieran estar en el mismo pulsador.
Se puede controlar la interrupción para que no lo despierte cuando lo estas durmiendo?
Este es el ejemplo de la Librería LowPower
Se llama asi: powerDownWakeExternalInterrupt.ino o sea lo despierta por interrupción externa
// **** INCLUDES *****
#include "LowPower.h"
// Use pin 2 as wake up pin
const int wakeUpPin = 2;
void wakeUp()
{
// Just a handler for the pin interrupt.
}
void setup()
{
// Configure wake up pin as input.
// This will consumes few uA of current.
pinMode(wakeUpPin, INPUT);
}
void loop()
{
// Allow wake up pin to trigger interrupt on low.
attachInterrupt(0, wakeUp, LOW);
// Enter power down state with ADC and BOD module disabled.
// Wake up when wake up pin is low.
LowPower.powerDown(SLEEP_FOREVER, ADC_OFF, BOD_OFF);
// Disable external pin interrupt on wake up pin.
detachInterrupt(0);
// Do something here
// Example: Read sensor, data logging, data transmission.
}
Tal vez podriamos contener el estado de sleep asi
// **** INCLUDES *****
#include "LowPower.h"
// Use pin 2 as wake up pin
const int wakeUpPin = 2;
bool flag = false; // false No despierta true despierta
bool estado, estadoAnt = false;
void wakeUp()
{
// Just a handler for the pin interrupt.
}
void setup()
{
// Configure wake up pin as input.
// This will consumes few uA of current.
pinMode(wakeUpPin, INPUT_PULLUP); // el ejemplo venia con INPUT
}
void loop()
{
estado = digitalRead(wakeUpPin);
if (estado != estadoAnt)
flag = !flag;
estadoAnt = estado;
// Allow wake up pin to trigger interrupt on low.
if (flag) { // si flag = HIGH entonces entro en sleep
attachInterrupt(0, wakeUp, LOW);
// Enter power down state with ADC and BOD module disabled.
// Wake up when wake up pin is low.
LowPower.powerDown(SLEEP_FOREVER, ADC_OFF, BOD_OFF);
}
else {
// Disable external pin interrupt on wake up pin.
detachInterrupt(0);
}
// haz lo que tengas que hacer acá
// Ejemplo : Leer sensores, guardar datos en SD, transmitirlos
}
1 Like
Hola, surbyte.
¡Muchas gracias por tu respuesta!
Ya lo estoy probando. En seguida volveré con novedades.
Jerónimo
Aquí estoy.
Al compilar me da el siguiente error:
C:\Users\Jeronimo\Documents\Arduino\libraries\Low-Power-master\LowPower.cpp: In member function 'void LowPowerClass::idle(period_t, adc_t, timer5_t, timer4_t, timer3_t, timer2_t, timer1_t, timer0_t, spi_t, usart3_t, usart2_t, usart1_t, usart0_t, twi_t)':
C:\Users\Jeronimo\Documents\Arduino\libraries\Low-Power-master\LowPower.cpp:440:49: error: 'power_usart3_disable' was not declared in this scope
if (usart3 == USART3_OFF) power_usart3_disable();
^
C:\Users\Jeronimo\Documents\Arduino\libraries\Low-Power-master\LowPower.cpp:475:48: error: 'power_usart3_enable' was not declared in this scope
if (usart3 == USART3_OFF) power_usart3_enable();
^
exit status 1
Error compilando para la tarjeta Arduino/Genuino Mega or Mega 2560."
No me atrevo a modificar la librería por mi cuenta. ¿Sabés qué debo hacer?
Muchas gracias.
Jerónimo
Lo primero que debes hacer es leer las normas y editar ese post. Los errores van con etiquetas de código como si fuera código.
A mi me compila
Device: atmega328p
Program: 1236 bytes (3.8% Full)
(.text + .data + .bootloader)
Data: 17 bytes (0.8% Full)
(.data + .bss + .noinit)
[SUCCESS] Took 16.46 seconds
Asi que supongo tienes mal instalada la librería.
Excelente. La voy a descomprimir e incorporar descomprimida.
Perdón por lo del post. Ahora lo edito.
Muchas gracias.
Jerónimo
Me sigue pasando lo mismo.
Detallo los pasos que hice para ver si podés advertir en qué me equivoqué.
- Descargué la librería del link que me pasaste.
- En el IDE de Arduino (1.8.5) fui a Programa/Incluir Librería/Añadir librería .ZIP y eleccioné el archivo descargado (comprimido).
- Puse a compilar.
¿Se te ocurre qué puedo estar haciendo mal?
Jerónimo
Bueno luego de una conversación con @JeronimoJ e investigación posterior, resultó que yo probaba con un NANO y el usaba un MEGA y para el MEGA se presentaba un error.
La solución fue actualizar los AVR del IDE usando esta guia publicada por @pert del foro en inglés
File > Preferences > Additional Boards Manager URLs > http://downloads.arduino.cc/packages/package_avr_3.6.0_index.json > OK
Tools > Board > Boards Manager
Wait for downloads to finish.
Click on "Arduino AVR Boards"
Click "Update"
Wait for update to finish
Click "Close"
Luego de eso compila bien en el MEGA.
Así es.
Y luego de algunos cambios en el código que me pasó surbyte, anduvo como necesitaba.
Pongo aquí el código:
// **** INCLUDES *****
#include "LowPower.h"
// Use pin 2 as wake up pin
const int wakeUpPin = 2;
bool flag = false; // false No despierta true despierta
bool estado, estadoAnt = true;
unsigned long tiempo;
void wakeUp()
{
// Just a handler for the pin interrupt.
}
void setup()
{
Serial.begin(9600);
// Configure wake up pin as input.
// This will consumes few uA of current.
pinMode(wakeUpPin, INPUT_PULLUP); // el ejemplo venia con INPUT
Serial.println("Sistema iniciado.");
}
void loop()
{
estado = digitalRead(wakeUpPin);
if (estado != estadoAnt) {
flag = !flag;
Serial.println(flag?"BOTON ON": "BOTON OFF");
tiempo = millis();
}
estadoAnt = estado;
// Allow wake up pin to trigger interrupt on low.
if (flag) { // si flag = HIGH entonces entro en sleep
attachInterrupt(0, wakeUp, LOW);
// Enter power down state with ADC and BOD module disabled.
// Wake up when wake up pin is low.
Serial.println("Durmiendo...");
Serial.flush();
LowPower.powerDown(SLEEP_FOREVER, ADC_OFF, BOD_OFF);
Serial.println("Despertando.");
Serial.flush();
}
else {
// Disable external pin interrupt on wake up pin.
if (millis() - tiempo > 1000) {
detachInterrupt(0);
}
}
// haz lo que tengas que hacer acá
// Ejemplo : Leer sensores, guardar datos en SD, transmitirlos
}
¡Muchas gracias, surbyte!
Jerónimo
1 Like