Споживання енергії є найважливішою проблемою для пристрою, який працює безперервно протягом тривалого часу без вимкнення. Тож для подолання цієї проблеми майже кожен контролер оснащений режимом сну, який допомагає розробникам розробляти електронні гаджети для оптимального споживання енергії. Режим сну переводить пристрій в режим енергозбереження, вимикаючи невикористаний модуль.
Раніше ми пояснювали режим глибокого сну в ESP8266 для енергозбереження. Сьогодні ми дізнаємося про режими сну Arduino та продемонструємо енергоспоживання за допомогою Ammeter. Режим сну Arduino також називається режимом енергозбереження Arduino або режимом очікування Arduino.
Режими сну Arduino
Режими сну дозволяють користувачеві зупинити або вимкнути невикористані модулі в мікроконтролері, що значно зменшує споживання енергії. Arduino UNO, Arduino Nano та Pro-mini постачаються з ATmega328P та мають детектор виснаження (BOD), який контролює напругу живлення під час режиму сну.
У ATmega328P є шість режимів сну:
Для входу в будь-який режим сну нам потрібно ввімкнути біт сну в Реєстрі керування режимом сну (SMCR.SE). Потім біти вибору режиму сну вибирають режим сну серед режимів очікування, зменшення шуму АЦП, вимкнення, енергозбереження, очікування та зовнішнього режиму очікування
Внутрішній або зовнішній Arduino перериває або скидання може вивести Arduino з режиму сну.
Режим очікування
Для переходу в режим очікування в режимі очікування запишіть біти SM контролера '000'. Цей режим зупиняє центральний процесор, але дозволяє працювати SPI, 2-провідний послідовний інтерфейс, USART, Watchdog, лічильники та аналоговий компаратор. Режим очікування в основному зупиняє процесор CLK та CLK FLASH. Пробудження Arduino можна здійснити будь-коли, використовуючи зовнішнє або внутрішнє переривання.
Код Arduino для режиму очікування в режимі очікування:
LowPower.idle (SLEEP_8S, ADC_OFF, TIMER2_OFF, TIMER1_OFF, TIMER0_OFF, SPI_OFF, USART0_OFF, TWI_OFF);
Існує бібліотека для встановлення різних режимів низької енергії в arduino. Отже, спочатку завантажте та встановіть бібліотеку за вказаним посиланням і використовуйте наведений вище код, щоб перевести Arduino в режим очікування. Використовуючи наведений вище код, Arduino перейде у вісім секунд і автоматично прокинеться. Як ви можете бачити в коді, режим очікування вимикає всі таймери, SPI, USART і TWI (2-провідний інтерфейс).
Режим зменшення шуму АЦП
Для використання цього режиму сну напишіть біт SM на '001'. Режим зупиняє центральний процесор, але дозволяє ADC, зовнішнє переривання, USART, 2-провідний послідовний інтерфейс, Watchdog та лічильники. Режим придушення шуму АЦП в основному зупиняє CLK CPU, CLK I / O і CLK FLASH. Ми можемо вивести контролер з режиму зменшення шуму АЦП такими методами:
- Зовнішній скидання
- Скидання системи сторожової системи
- Сторожове переривання
- Коричневий скидання
- Збіг адреси двопровідного послідовного інтерфейсу
- Зовнішнє переривання рівня на INT
- Переривання зміни PIN-коду
- Таймер / переривання лічильника
- SPM / EEPROM готове переривання
Режим відключення живлення
Режим відключення зупиняє всі згенеровані годинники і дозволяє працювати лише асинхронні модулі. Це можна ввімкнути, записавши SM-біти в '010'. У цьому режимі зовнішній генератор вимикається, але 2-провідний послідовний інтерфейс, сторожовий контролер та зовнішнє переривання продовжують працювати. Його можна відключити лише одним із наведених нижче способів:
- Зовнішній скидання
- Скидання системи сторожової системи
- Сторожове переривання
- Коричневий скидання
- Збіг адреси двопровідного послідовного інтерфейсу
- Зовнішнє переривання рівня на INT
- Переривання зміни PIN-коду
Код Arduino для періодичного режиму відключення:
LowPower.powerDown (SLEEP_8S, ADC_OFF, BOD_OFF);
Код використовується для ввімкнення режиму відключення живлення. Використовуючи наведений вище код, Arduino перейде у вісім секунд і автоматично прокинеться.
Ми також можемо використовувати режим відключення живлення з перериванням, коли Arduino переходить у режим сну, але прокидається лише тоді, коли передбачено зовнішнє або внутрішнє переривання.
Код Arduino для режиму переривання живлення:
void loop () { // Дозволити шпильці пробудження викликати переривання на низькому рівні. attachInterrupt (0, wakeUp, LOW); LowPower.powerDown (SLEEP_FOREVER, ADC_OFF, BOD_OFF); // Вимкнути зовнішнє переривання штифта під час пробудження. detachInterrupt (0); // Зробіть щось тут }
Режим енергозбереження
Щоб увійти в режим енергозбереження, нам потрібно написати SM-штифт на '011'. Цей режим сну подібний до режиму відключення, лише за одним винятком, тобто якщо таймер / лічильник увімкнено, він залишатиметься в робочому стані навіть під час сну. Пристрій можна прокинути за допомогою переповнення таймера.
Якщо ви не використовуєте лічильник часу / часу, рекомендується використовувати режим вимкнення живлення замість режиму економії енергії.
Режим очікування
Режим очікування ідентичний режиму вимкнення, єдиною різницею між ними є зовнішній генератор, який постійно працює в цьому режимі. Щоб увімкнути цей режим, напишіть SM-штифт на '110'.
Розширений режим очікування
Цей режим подібний до режиму енергозбереження, лише за одним винятком, коли осцилятор продовжує працювати. Пристрій перейде в режим розширеного режиму очікування, коли ми напишемо SM-штифт на '111'. Для виходу з розширеного режиму очікування пристрою знадобиться шість тактових циклів.
Нижче наведено вимоги до цього проекту після підключення схеми згідно з принциповою схемою. Завантажте код режиму сну в Arduino за допомогою Arduino IDE. Arduino перейде в режим очікування в режимі очікування. Потім перевірте споживання струму в амперметрі USB. В іншому випадку ви також можете використовувати затискач для того ж.
Потрібні компоненти
- Arduino UNO
- DHT11 Датчик температури та вологості
- USB-амперметр
- Макет
- Підключення проводів
Щоб дізнатися більше про використання DHT11 з Arduino, перейдіть за посиланням. Тут ми використовуємо USB-амперметр для вимірювання напруги, споживаної Arduino в режимі сну.
USB-амперметр
USB-амперметр - це пристрій підключення і відтворення, який використовується для вимірювання напруги та струму від будь-якого порту USB. Ключ підключається між джерелом живлення USB (USB-порт комп'ютера) та USB-пристроєм (Arduino). Цей пристрій має резистор 0,05 Ом, суміщений із штифтом живлення, через який він вимірює значення струму, який подається. Пристрій постачається з чотирма семи сегментними дисплеями, які миттєво відображають значення струму та напруги, споживаних приєднаним пристроєм. Ці значення перевертаються з інтервалом кожні три секунди.
Специфікація:
- Діапазон робочої напруги: від 3,5 до 7 В.
- Максимальний струм: 3А
- Компактний розмір, легкий у перенесенні
- Зовнішнє постачання не потрібне
Застосування:
- Тестування USB-пристроїв
- Перевірка рівня навантаження
- Налагодження зарядних пристроїв
- Заводи, електроніка та товари особистого користування
Кругова діаграма
У наведеному вище налаштуванні для демонстрації режимів глибокого сну Arduino Arduino підключено до амперметра USB. Потім USB-амперметр підключається до USB-порту ноутбука. Вивід даних датчика DHT11 прикріплений до виводу D2 Arduino.
Пояснення коду
Повний код проекту з відео наведено в кінці.
Код починається з включення бібліотеки для датчика DHT11 та бібліотеки LowPower . Щоб завантажити бібліотеку Low Power, перейдіть за посиланням. Потім ми визначили номер виводу Arduino, до якого підключений вивід даних DHT11, і створили об'єкт DHT.
#включати
У функції налаштування порожнечі ми ініціювали послідовний зв'язок за допомогою serial.begin (9600), тут 9600 - це швидкість передачі даних. Ми використовуємо вбудований світлодіод Arduino як індикатор режиму сну. Отже, ми встановили штифт як вихідний, а цифровий запис низький.
void setup () { Serial.begin (9600); pinMode (LED_BUILTIN, OUTPUT); digitalWrite (LED_BUILTIN, LOW); }
У функції порожнистої петлі ми робимо вбудований світлодіод HIGH та зчитуємо дані температури та вологості з датчика. Тут, DHT.read11 (); команда зчитування даних з датчика. Після обчислення даних ми можемо перевірити значення, зберігаючи їх у будь-якій змінній. Тут ми взяли дві змінні типу плаваючого типу "t" і "h" . Таким чином, дані про температуру та вологість друкуються послідовно на послідовному моніторі.
цикл void () { Serial.println ("Отримати дані з DHT11"); затримка (1000); digitalWrite (LED_BUILTIN, HIGH); int readData = DHT.read11 (dataPin); // DHT11 float t = DHT.temperature; поплавок h = DHT. вологість; Serial.print ("Температура ="); Serial.print (t); Serial.print ("C -"); Serial.print ("Вологість ="); Serial.print (h); Serial.println ("%"); затримка (2000);
Перш ніж увімкнути режим сну, ми друкуємо "Arduino: - Я йду на сон " і робимо вбудований світлодіод низьким. Після цього режим сну Arduino вмикається за допомогою команди, згаданої нижче в коді.
Нижче код включає режим очікування періодичного сну Arduino в режимі очікування та забезпечує вісім секунд сну. Це перетворює АЦП, таймери, SPI, USART, двопровідний інтерфейс у стан ВИМК.
Потім він автоматично пробуджує Arduino зі сну через 8 секунд і друкує “Arduino: - Гей, я щойно прокинувся”.
Serial.println ("Arduino: - Я йду дрімати"); затримка (1000); digitalWrite (LED_BUILTIN, LOW); LowPower.idle (SLEEP_8S, ADC_OFF, TIMER2_OFF, TIMER1_OFF, TIMER0_OFF, SPI_OFF, USART0_OFF, TWI_OFF); Serial.println ("Arduino: - Гей, я щойно прокинувся"); Serial.println (""); затримка (2000); }
Отже, використовуючи цей код, Arduino буде прокидатися лише 24 секунди за хвилину і залишатиметься в режимі сну протягом решти 36 секунд, що значно зменшить енергію, споживану метеостанцією Arduino.
Отже, якщо ми використовуємо Arduino в режимі сну, ми можемо приблизно подвоїти час роботи пристрою.