- Режими на заспиване Arduino
- Необходими компоненти
- USB амперметър
- Електрическа схема
- Обяснение на кода
Консумацията на енергия е критичен проблем за устройство, което работи непрекъснато дълго време, без да е изключено. Така че, за да се преодолее този проблем, почти всеки контролер идва с режим на заспиване, който помага на разработчиците да проектират електронни джаджи за оптимална консумация на енергия. Режимът на заспиване поставя устройството в режим на пестене на енергия, като изключва неизползвания модул.
По-рано обяснихме режима на дълбоко заспиване в ESP8266 за пестене на енергия. Днес ще научим за режимите на заспиване Arduino и ще демонстрираме консумацията на енергия с помощта на Ammeter. Режимът на заспиване на Arduino се нарича още режим на спестяване на енергия Arduino или режим на готовност на Arduino.
Режими на заспиване Arduino
Режимите на заспиване позволяват на потребителя да спира или изключва неизползваните модули в микроконтролера, което значително намалява консумацията на енергия. Arduino UNO, Arduino Nano и Pro-mini се предлагат с ATmega328P и разполагат с Brown-out детектор (BOD), който следи захранващото напрежение по време на режим на заспиване.
В ATmega328P има шест режима на заспиване:
За влизане в който и да е от режима на заспиване трябва да активираме бита за заспиване в регистъра за контрол на заспиването (SMCR.SE). След това битовете за избор на режим на заспиване избират режима на заспиване между Idle, ADC намаляване на шума, Power-Down, Power-Save, Standby и External Standby.
Вътрешен или външен Arduino прекъсва или Reset може да събуди Arduino от режим на заспиване.
Режим на готовност
За да влезете в режим на неактивен сън, напишете SM бита на контролера '000'. Този режим спира процесора, но позволява да работи SPI, 2-жичен сериен интерфейс, USART, Watchdog, броячи, аналогов компаратор. Режимът на готовност по същество спира CLK CPU и 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-жичен интерфейс).
ADC режим за намаляване на шума
За да използвате този режим на заспиване, напишете SM бита на '001'. Режимът спира процесора, но позволява на ADC, външно прекъсване, USART, двужилен сериен интерфейс, Watchdog и броячи. Режимът за намаляване на шума ADC по принцип спира CLK CPU, CLK I / O и CLK FLASH. Можем да събудим контролера от режима за намаляване на шума ADC по следните методи:
- Външно нулиране
- Нулиране на системата за наблюдение
- Прекъсване от пазач
- Кафяво нулиране
- 2-жичен адрес на сериен интерфейс
- Прекъсване на външно ниво на INT
- Прекъсване на смяната на ПИН
- Прекъсване на таймера / брояча
- SPM / EEPROM готов прекъсване
Режим на изключване
Режимът за изключване спира всички генерирани часовници и позволява само работата на асинхронни модули. Може да се активира, като се напишат SM битовете в '010'. В този режим външният генератор се изключва, но двужилният сериен интерфейс, пазач и външно прекъсване продължават да работят. Той може да бъде деактивиран само по един от методите по-долу:
- Външно нулиране
- Нулиране на системата за наблюдение
- Прекъсване от пазач
- Кафяво нулиране
- 2-жичен адрес на сериен интерфейс
- Прекъсване на външно ниво на INT
- Прекъсване на смяната на ПИН
Код на 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 амперметър е plug and play устройство, използвано за измерване на напрежението и тока от всеки USB порт. Донгълът се включва между USB захранването (компютърен USB порт) и USB устройството (Arduino). Това устройство има резистор 0,05 ohm, съвпадащ със захранващия щифт, през който измерва стойността на изтегления ток. Устройството се предлага с четири седем сегментни дисплея, които незабавно показват стойностите на тока и напрежението, консумирани от свързаното устройство. Тези стойности се обръщат на интервал от всеки три секунди.
Спецификация:
- Диапазон на работното напрежение: 3.5V до 7V
- Максимален ток: 3А
- Компактен размер, лесен за носене
- Не е необходимо външно захранване
Приложение:
- Тестване на USB устройства
- Проверка на нивата на натоварване
- Отстраняване на грешки за зарядни устройства
- Фабрики, електроника и лична употреба
Електрическа схема
В горната настройка за демонстриране на режими на дълбоко заспиване Arduino, Arduino е включен в USB амперметъра. След това USB амперметърът се включва в USB порта на лаптопа. ПИН за данни на сензора DHT11 е прикрепен към D2 извода на Arduino.
Обяснение на кода
Пълният код за проекта с видео е даден в края.
Кодът започва с включване на библиотеката за сензора DHT11 и библиотеката LowPower . За изтегляне на библиотеката с ниска мощност следвайте връзката. След това дефинирахме номера на пина на Arduino, към който е свързан пинът за данни на DHT11, и създадохме DHT обект.
#include
Във функцията за настройка на void ние инициирахме серийната комуникация, използвайки serial.begin (9600), тук 9600 е скоростта на предаване. Използваме вградения светодиод на Arduino като индикатор за режим на заспиване. И така, зададохме пина като изход, а цифровото записване ниско.
void setup () { Serial.begin (9600); pinMode (LED_BUILTIN, OUTPUT); digitalWrite (LED_BUILTIN, LOW); }
Във функцията void loop правим вградения LED 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: - Отивам на дрямка“ и правим вградения LED Low. След това режимът на заспиване Arduino се активира с помощта на командата, спомената по-долу в кода.
По-долу кодът позволява неактивен режим на периодичен сън на Arduino и дава сън от осем секунди. Той превръща ADC, таймери, SPI, USART, 2-жичен интерфейс в състояние OFF.
След това автоматично събужда 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 в режим на заспиване, можем приблизително да удвоим времето на работа на устройството.