Энергосберегающий спящий режим Arduino
Я пытаюсь использовать этот пример ссылка
источник:
#include <avr/sleep.h>
/* Sleep Demo Serial
* -----------------
* Example code to demonstrate the sleep functions in an Arduino.
*
* use a resistor between RX and pin2. By default RX is pulled up to 5V
* therefore, we can use a sequence of Serial data forcing RX to 0, what
* will make pin2 go LOW activating INT0 external interrupt, bringing
* the MCU back to life
*
* there is also a time counter that will put the MCU to sleep after 10 secs
*
* NOTE: when coming back from POWER-DOWN mode, it takes a bit
* until the system is functional at 100%!! (typically <1sec)
*
* Copyright (C) 2006 MacSimski 2006-12-30
* Copyright (C) 2007 D. Cuartielles 2007-07-08 - Mexico DF
*
* This program is free software: you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
* the Free Software Foundation, either version 3 of the License, or
* (at your option) any later version.
*
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
*
* You should have received a copy of the GNU General Public License
* along with this program. If not, see <http://www.gnu.org/licenses/>.
*
*/
int wakePin = 2; // пин, используемый для пробуждения
int sleepStatus = 0; // переменная для хранения запроса на сон
int count = 0; // прилавок
void wakeUpNow() // здесь прерывание обрабатывается после пробуждения
{
// выполнить здесь код после пробуждения перед возвратом в функцию loop()
// таймеры и код с использованием таймеров (serial.print и т. д.) здесь не работают.
// нам действительно не нужно выполнять здесь какие-либо специальные функции, так как мы
// просто хотим, чтобы вещь проснулась
}
void setup()
{
pinMode(wakePin, INPUT);
Serial.begin(9600);
/* Now it is time to enable an interrupt. In the function call
* attachInterrupt(A, B, C)
* A can be either 0 or 1 for interrupts on pin 2 or 3.
*
* B Name of a function you want to execute while in interrupt A.
*
* C Trigger mode of the interrupt pin. can be:
* LOW a low level trigger
* CHANGE a change in level trigger
* RISING a rising edge of a level trigger
* FALLING a falling edge of a level trigger
*
* In all but the IDLE sleep modes only LOW can be used.
*/
attachInterrupt(0, wakeUpNow, LOW); // используем прерывание 0 (вывод 2) и запускаем функцию
// wakeUpNow, когда контакт 2 получает НИЗКИЙ уровень
}
void sleepNow() // здесь мы переводим arduino в режим сна
{
/* Now is the time to set the sleep mode. In the Atmega8 datasheet
* http://www.atmel.com/dyn/resources/prod_documents/doc2486.pdf на стр. 35
* there is a list of sleep modes which explains which clocks and
* wake up sources are available in which sleep mode.
*
* In the avr/sleep.h file, the call names of these sleep modes are to be found:
*
* The 5 different modes are:
* SLEEP_MODE_IDLE -the least power savings
* SLEEP_MODE_ADC
* SLEEP_MODE_PWR_SAVE
* SLEEP_MODE_STANDBY
* SLEEP_MODE_PWR_DOWN -the most power savings
*
* For now, we want as much power savings as possible, so we
* choose the according
* sleep mode: SLEEP_MODE_PWR_DOWN
*
*/
set_sleep_mode(SLEEP_MODE_PWR_DOWN); // здесь устанавливается спящий режим
sleep_enable(); // включает бит сна в регистре mcucr
// так что сон возможен.
/* Now it is time to enable an interrupt. We do it here so an
* accidentally pushed interrupt button doesn't interrupt
* our running program. if you want to be able to run
* interrupt code besides the sleep function, place it in
* setup() for example.
*
* In the function call attachInterrupt(A, B, C)
* A can be either 0 or 1 for interrupts on pin 2 or 3.
*
* B Name of a function you want to execute at interrupt for A.
*
* C Trigger mode of the interrupt pin. can be:
* LOW a low level triggers
* CHANGE a change in level triggers
* RISING a rising edge of a level triggers
* FALLING a falling edge of a level triggers
*
* In all but the IDLE sleep modes only LOW can be used.
*/
attachInterrupt(0,wakeUpNow, LOW); // используем прерывание 0 (вывод 2) и запускаем функцию
// wakeUpNow, когда контакт 2 получает НИЗКИЙ уровень
sleep_mode(); // здесь устройство действительно усыплено!!
// ПРОГРАММА ПРОДОЛЖАЕТСЯ С ЭТОГО ПОСЛЕ ПРОБУЖДЕНИЯ
sleep_disable(); // первое, что нужно сделать после пробуждения ото сна:
// отключить сон...
detachInterrupt(0); // отключает прерывание 0 на выводе 2, поэтому
// код wakeUpNow не будет выполнен
// в обычное время работы.
}
void loop()
{
// вывести информацию о счетчике
Serial.print("Awake for ");
Serial.print(count);
Serial.println("sec");
count++;
delay(1000); // ждем секунду
// вычисляем последовательный ввод
if (Serial.available()) {
int val = Serial.read();
if (val == 'S') {
Serial.println("Serial: Entering Sleep mode");
delay(100); // эта задержка необходима, сон
// иначе функция спровоцирует серийную ошибку!!
count = 0;
sleepNow(); // здесь вызывается функция сна
}
if (val == 'A') {
Serial.println("Hola Caracola"); // классическое фиктивное сообщение
}
}
// проверяем, должен ли он перейти в спящий режим из-за времени
if (count >= 10) {
Serial.println("Timer: Entering Sleep mode");
delay(100); // эта задержка необходима, сон
// иначе функция спровоцирует серийную ошибку!!
count = 0;
sleepNow(); // здесь вызывается функция сна
}
}
Я использую тестер для проверки действительно эффективного энергосбережения; Читал только энергосбережение 2 мА. Возможно ли, что Arduino Mega сохраняет только это в спящем режиме? Или я что-то не так делаю?
@Francesco Valla, 👍2
Обсуждение1 ответ
Лучший ответ:
У меня есть страница об энергосбережении. О первом предложении на этой странице — не использовать «плату» Arduino (особенно с микросхемой интерфейса USB, светодиодом питания и регулятором напряжения). Они все берут власть - много. Эти платы предназначены для создания прототипов, а не для использования в полевых условиях с низким энергопотреблением.
Что-то вроде этого было бы лучше:
Конечно, это не чип Atmega2560. Они поставляются только для поверхностного монтажа, и их будет сложно припаять самостоятельно. Возможно, вы сможете получить плату Atmega2560 в минимальной форме. Или перейдите на меньший процессор, который вы можете собрать самостоятельно. Atmega644P поставляется с протоколом PDIP, с которым достаточно легко работать.
Если вам не нужна вся эта оперативная и программная память, вы можете перейти на Atmega328P, с которым легко работать и который при определенных обстоятельствах может снизить энергопотребление до 100 нА.
Возможно, вы могли бы сделать то, что предложил Эдгар Боне, и вырезать дорожки на вашей плате Mega2560, но имейте в виду, что если вы сделаете это, вы не сможете впоследствии запрограммировать плату через интерфейс USB. Однако вы все равно можете программировать через сокет ICSP, если у вас есть подходящий программатор.
Что вы там используете в качестве резонатора?
Этот — не помню, откуда взял.
В Arduino Uno есть резонатор для основной микросхемы (а не кристалл), поэтому использование резонатора допустимо.
Хорошая информация. Что ты там используешь в качестве резонатора? Единственный, который я знаю, использует xtal+2cap, @dhimaspw
Смотрите измененный ответ., @Nick Gammon
- Запуск Arduino mega от источника питания 5 В
- Почему Arduino сбрасывается во время управления двигателями?
- Будет ли адаптер питания 12В постоянного тока, 1А подавать слишком большую мощность и повредит Arduino Mega 2560?
- Мощность 5В от l298n до 5В pin arduino
- Питание Arduino не от USB?
- Максимальный предел мощности Arduino
- Выходная мощность и управление выводом Mega 2560
- Проблемы со скоростью шагового двигателя Nema 17
Вам нужен голый чип ATmega, если вы хотите работать с низким энергопотреблением. В противном случае вы будете постоянно питать мост последовательного порта 16U2 — USB, стабилизатор 3,3 В и индикатор питания., @Edgar Bonet
как я могу отключить последовательный usb-мост, регулятор 3,3 и питание светодиода?, @Francesco Valla
Отпаяв их или перерезав их дорожки., @Edgar Bonet