Skip to content

Commit b9c6c0a

Browse files
committed
add
1 parent 37d97d7 commit b9c6c0a

File tree

20 files changed

+1185
-0
lines changed

20 files changed

+1185
-0
lines changed

README.md

Lines changed: 176 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,176 @@
1+
![License: MIT](https://img.shields.io/badge/License-MIT-green.svg)
2+
![author](https://img.shields.io/badge/author-AlexGyver-informational.svg)
3+
# GyverPower
4+
GyverPower - библиотека для управления энергопотреблением МК AVR
5+
- Управление системным клоком
6+
- Включение/выключение периферии:
7+
- BOD
8+
- Таймеры
9+
- I2C/UART/SPI
10+
- USB
11+
- ADC
12+
- Сон в разных режимах (список ниже)
13+
- Сон на любой период
14+
- Калибровка таймера для точных периодов сна
15+
- Корректировка millis()
16+
17+
### Совместимость
18+
- Atmega2560/32u4/328
19+
- Attiny85/84/167
20+
21+
### Документация
22+
К библиотеке есть [расширенная документация](https://alexgyver.ru/GyverPower/)
23+
24+
## Содержание
25+
- [Установка](#install)
26+
- [Инициализация](#init)
27+
- [Использование](#usage)
28+
- [Пример](#example)
29+
- [Версии](#versions)
30+
- [Баги и обратная связь](#feedback)
31+
32+
<a id="install"></a>
33+
## Установка
34+
- Библиотеку можно найти по названию **GyverPower** и установить через менеджер библиотек в:
35+
- Arduino IDE
36+
- Arduino IDE v2
37+
- PlatformIO
38+
- [Скачать библиотеку](https://github.com/GyverLibs/GyverPower/archive/refs/heads/main.zip) .zip архивом для ручной установки:
39+
- Распаковать и положить в *C:\Program Files (x86)\Arduino\libraries* (Windows x64)
40+
- Распаковать и положить в *C:\Program Files\Arduino\libraries* (Windows x32)
41+
- Распаковать и положить в *Документы/Arduino/libraries/*
42+
- (Arduino IDE) автоматическая установка из .zip: *Скетч/Подключить библиотеку/Добавить .ZIP библиотеку…* и указать скачанный архив
43+
- Читай более подробную инструкцию по установке библиотек [здесь](https://alexgyver.ru/arduino-first/#%D0%A3%D1%81%D1%82%D0%B0%D0%BD%D0%BE%D0%B2%D0%BA%D0%B0_%D0%B1%D0%B8%D0%B1%D0%BB%D0%B8%D0%BE%D1%82%D0%B5%D0%BA)
44+
45+
<a id="init"></a>
46+
## Инициализация
47+
Нет
48+
49+
<a id="usage"></a>
50+
## Использование
51+
```cpp
52+
void hardwareEnable(uint16_t data); // включение указанной периферии (см. ниже "Константы периферии")
53+
void hardwareDisable(uint16_t data); // выключение указанной периферии (см. ниже "Константы периферии")
54+
void setSystemPrescaler(prescalers_t prescaler); // установка делителя системной частоты (см. ниже "Константы делителя")
55+
void bodInSleep(bool en); // Brown-out detector в режиме сна (true вкл - false выкл) по умолч. отключен!
56+
void setSleepMode(sleepmodes_t mode); // установка текущего режима сна (см. ниже "Режимы сна")
57+
void autoCalibrate(void); // автоматическая калибровка таймера сна, выполняется 2 секунды
58+
uint16_t getMaxTimeout(void); // возвращает реальный период "8 секунд", выполняется ~8 секунд
59+
void calibrate(uint16_t ms); // ручная калибровка тайм-аутов watchdog для sleepDelay (ввести макс период из getMaxTimeout)
60+
void sleep(sleepprds_t period); // сон на фиксированный период (см. ниже "Периоды сна")
61+
uint8_t sleepDelay(uint32_t ms); // сон на произвольный период в миллисекундах (до 52 суток), возвращает остаток времени для коррекции таймеров
62+
void correctMillis(bool state); // корректировать миллис на время сна sleepDelay() (по умолчанию включено)
63+
void wakeUp(void); // помогает выйти из sleepDelay прерыванием (вызывать в будящем прерывании)
64+
void adjustInternalClock(int8_t adj); // подстройка частоты внутреннего генератора (число -120...+120)
65+
66+
// РЕЖИМЫ СНА для setSleepMode()
67+
IDLE_SLEEP - Легкий сон, отключается только клок CPU и Flash, просыпается от любых прерываний
68+
ADC_SLEEP - Легкий сон, отключается CPU и system clock, АЦП начинает преобразование при уходе в сон (см. пример ADCinSleep)
69+
POWERDOWN_SLEEP - Наиболее глубокий сон, отключается всё кроме WDT и внешних прерываний, просыпается от аппаратных (обычных + PCINT) или WDT за 1000 тактов (62 мкс)
70+
STANDBY_SLEEP - Глубокий сон, идентичен POWERDOWN_SLEEP + system clock активен, пробуждение за 6 тактов (0.4 мкс)
71+
POWERSAVE_SLEEP - Глубокий сон, идентичен POWERDOWN_SLEEP + timer 2 активен (+ можно проснуться от его прерываний), можно использовать для счета времени (см. пример powersaveMillis)
72+
EXTSTANDBY_SLEEP - Глубокий сон, идентичен POWERSAVE_SLEEP + system clock активен, пробуждение за 6 тактов (0.4 мкс)
73+
74+
// ПЕРИОДЫ СНА для sleep()
75+
SLEEP_16MS
76+
SLEEP_32MS
77+
SLEEP_64MS
78+
SLEEP_128MS
79+
SLEEP_256MS
80+
SLEEP_512MS
81+
SLEEP_1024MS
82+
SLEEP_2048MS
83+
SLEEP_4096MS
84+
SLEEP_8192MS
85+
SLEEP_FOREVER - вечный сон без таймера
86+
87+
// КОНСТАНТЫ ДЕЛИТЕЛЯ для setSystemPrescaler()
88+
PRESCALER_1
89+
PRESCALER_2
90+
PRESCALER_4
91+
PRESCALER_8
92+
PRESCALER_16
93+
PRESCALER_32
94+
PRESCALER_64
95+
PRESCALER_128
96+
PRESCALER_256
97+
98+
// КОНСТАНТЫ ПЕРИФЕРИИ для hardwareDisable() и hardwareEnable()
99+
PWR_ALL - всё железо
100+
PWR_ADC - АЦП и компаратор
101+
PWR_TIMER1 - Таймер 0
102+
PWR_TIMER0 - Таймер 1
103+
PWR_TIMER2 - Таймер 2
104+
PWR_TIMER3 - Таймер 3
105+
PWR_TIMER4 - Таймер 4
106+
PWR_TIMER5 - Таймер 5
107+
PWR_UART0 - Serial 0
108+
PWR_UART1 - Serial 1
109+
PWR_UART2 - Serial 2
110+
PWR_UART3 - Serial 3
111+
PWR_I2C - Wire
112+
PWR_SPI - SPI
113+
PWR_USB - USB
114+
PWR_USI - Wire + Spi (ATtinyXX)
115+
PWR_LIN - USART LIN (ATtinyXX)
116+
```
117+
118+
<a id="example"></a>
119+
## Пример
120+
Остальные примеры смотри в **examples**!
121+
```cpp
122+
// демо возможностей библиотеки
123+
124+
#include <GyverPower.h>
125+
126+
void setup() {
127+
pinMode(13, OUTPUT); // настраиваем вывод со светодиодом на выход
128+
Serial.begin(9600);
129+
130+
// калибровка таймаутов для максимальной точности sleepDelay (подробнее в примере WDT_calibration)
131+
//Serial.println(getMaxTimeout()); // вывести реальный макс. период
132+
//calibrate(8935); // ввести реальный макс. период
133+
//calibrate(getMaxTimeout()); // автоматически посчитать и откалибровать
134+
135+
power.autoCalibrate(); // автоматическая калибровка ~ 2 секунды , средняя но достаточная точность
136+
137+
// отключение ненужной периферии
138+
power.hardwareDisable(PWR_ADC | PWR_TIMER1); // см раздел константы в GyverPower.h, разделяющий знак " | "
139+
140+
// управление системной частотой
141+
power.setSystemPrescaler(PRESCALER_2); // см константы в GyverPower.h
142+
143+
// настройка параметров сна
144+
power.setSleepMode(STANDBY_SLEEP); // если нужен другой режим сна, см константы в GyverPower.h (по умолчанию POWERDOWN_SLEEP)
145+
power.bodInSleep(false); // рекомендуется выключить bod во сне для сохранения энергии (по умолчанию false - выключен!!)
146+
147+
// пример однократного ухода в сон
148+
Serial.println("go to sleep");
149+
delay(100); // даем время на отправку
150+
151+
power.sleep(SLEEP_2048MS); // спим ~ 2 секунды
152+
153+
Serial.println("wake up!");
154+
delay(100); // даем время на отправку
155+
}
156+
157+
void loop() {
158+
// пример циклического сна
159+
power.sleepDelay(1500); // спим 1.5 секунды
160+
161+
digitalWrite(13, !digitalRead(13)); // инвертируем состояние на пине
162+
}
163+
```
164+
165+
<a id="versions"></a>
166+
## Версии
167+
- v1.2 - фикс калибровки
168+
- v1.3 - фикс для 32U4
169+
- v1.4 - добавлен adjustInternalClock
170+
- v1.5 - совместимость с аттини
171+
- v1.6 - ещё совместимость с аттини
172+
173+
<a id="feedback"></a>
174+
## Баги и обратная связь
175+
При нахождении багов создавайте **Issue**, а лучше сразу пишите на почту [[email protected]](mailto:[email protected])
176+
Библиотека открыта для доработки и ваших **Pull Request**'ов!
Lines changed: 41 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,41 @@
1+
// демо возможностей библиотеки
2+
3+
#include <GyverPower.h>
4+
5+
void setup() {
6+
pinMode(13, OUTPUT); // настраиваем вывод со светодиодом на выход
7+
Serial.begin(9600);
8+
9+
// калибровка таймаутов для максимальной точности sleepDelay (подробнее в примере WDT_calibration)
10+
//Serial.println(getMaxTimeout()); // вывести реальный макс. период
11+
//calibrate(8935); // ввести реальный макс. период
12+
//calibrate(getMaxTimeout()); // автоматически посчитать и откалибровать
13+
14+
power.autoCalibrate(); // автоматическая калибровка ~ 2 секунды , средняя но достаточная точность
15+
16+
// отключение ненужной периферии
17+
power.hardwareDisable(PWR_ADC | PWR_TIMER1); // см раздел константы в GyverPower.h, разделяющий знак " | "
18+
19+
// управление системной частотой
20+
power.setSystemPrescaler(PRESCALER_2); // см константы в GyverPower.h
21+
22+
// настройка параметров сна
23+
power.setSleepMode(STANDBY_SLEEP); // если нужен другой режим сна, см константы в GyverPower.h (по умолчанию POWERDOWN_SLEEP)
24+
power.bodInSleep(false); // рекомендуется выключить bod во сне для сохранения энергии (по умолчанию false - выключен!!)
25+
26+
// пример однократного ухода в сон
27+
Serial.println("go to sleep");
28+
delay(100); // даем время на отправку
29+
30+
power.sleep(SLEEP_2048MS); // спим ~ 2 секунды
31+
32+
Serial.println("wake up!");
33+
delay(100); // даем время на отправку
34+
}
35+
36+
void loop() {
37+
// пример циклического сна
38+
power.sleepDelay(1500); // спим 1.5 секунды
39+
40+
digitalWrite(13, !digitalRead(13)); // инвертируем состояние на пине
41+
}
Lines changed: 34 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,34 @@
1+
#include <GyverPower.h>
2+
3+
void setup() {
4+
Serial.begin(9600);
5+
pinMode(13, OUTPUT); // шоб мигать
6+
7+
// WDT будит МК ото сна, его таймер не очень точный (с завода) и нуждается в калибровке.
8+
// Калибровка таймаутов для максимальной точности sleepDelay
9+
10+
// ====== ВАРИАНТ 1 (ручная калибровка 8 секунд) ======
11+
Serial.println(power.getMaxTimeout()); // вывести реальный макс. период (выполняется ~8 секунд)
12+
delay(500); // задержка для вывода текста
13+
14+
// допустим вывело 8321
15+
power.calibrate(8321); // калибруем по реальному периоду
16+
// можно жёстко задать результат getMaxTimeout() в скетче (как выше) или пихнуть в EEPROM
17+
18+
19+
// ====== ВАРИАНТ 2 (автокалибровка 8 секунд) ======
20+
// автоматически посчитать и откалибровать (выполняется ~8 секунд)
21+
// каждый раз при запуске скетча
22+
power.calibrate(power.getMaxTimeout());
23+
24+
25+
// ====== ВАРИАНТ 3 (быстрая автокалибровка) ======
26+
power.autoCalibrate(); // автоматическая калибровка ~2 секунды
27+
// калибрует менее точно, чем вариант с 8-ю секундами. Можно оставить на каждый запуск программы
28+
}
29+
30+
void loop() {
31+
// пример циклического сна
32+
power.sleepDelay(1500); // спим ровно 1.5 секунды (мы откалиброваны!)
33+
digitalWrite(13, !digitalRead(13)); // инвертируем состояние на пине
34+
}
Lines changed: 34 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,34 @@
1+
// Делаем свой счётчик времени сна
2+
// допустим таймер 0 у нас используется для других целей, но нам
3+
// нужно хотя бы приблизительно считать время и выполнять по нему действия
4+
5+
#include <GyverPower.h>
6+
7+
uint32_t myMillis = 0; // наш миллис
8+
9+
void setup() {
10+
power.autoCalibrate(); // автоматическая калибровка ~2 секунды
11+
}
12+
13+
void loop() {
14+
static uint32_t tmr1, tmr2;
15+
16+
// "таймер" на 2 секунды
17+
if (myMillis - tmr1 > 2000) {
18+
tmr1 += 2000;
19+
// действие 1
20+
}
21+
22+
// "таймер" на 10 секунд
23+
if (myMillis - tmr2 > 10000) {
24+
tmr2 += 10000;
25+
// действие 2
26+
}
27+
28+
// спим 1 секунду (1000 мс)
29+
// sleepDelay возвращает остаток сна в мс, если он есть
30+
byte left = power.sleepDelay(1000);
31+
32+
// прибавляем и корректируем наш миллис
33+
myMillis += 1000 - left;
34+
}
Lines changed: 19 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,19 @@
1+
// управление периферией МК
2+
#include <GyverPower.h>
3+
4+
void setup() {
5+
Serial.begin(9600);
6+
// можно выборочно включать-выключать периферийные блоки МК, разделитель - |
7+
// список констант смотри в GyverPower.h / Константы периферии
8+
9+
// отключили АЦП, таймеры 1 и 0
10+
power.hardwareDisable(PWR_ADC | PWR_TIMER1 | PWR_TIMER0);
11+
12+
// включили ADC обратно
13+
power.hardwareEnable(PWR_ADC);
14+
}
15+
16+
void loop() {
17+
Serial.println(millis());
18+
// отключили таймер 0 - миллис не тикает...
19+
}
Lines changed: 38 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,38 @@
1+
// просыпаемся по аппаратному прерыванию из sleep
2+
#include <GyverPower.h>
3+
4+
void setup() {
5+
Serial.begin(9600);
6+
7+
// кнопка подключена к GND и D3
8+
pinMode(3, INPUT_PULLUP);
9+
10+
// подключаем прерывание на пин D3 (Arduino NANO)
11+
attachInterrupt(1, isr, FALLING);
12+
13+
// глубокий сон
14+
power.setSleepMode(POWERDOWN_SLEEP);
15+
}
16+
17+
// обработчик аппаратного прерывания
18+
void isr() {
19+
// в отличие от sleepDelay, ничего вызывать не нужно!
20+
}
21+
22+
void loop() {
23+
Serial.println("go sleep");
24+
delay(300);
25+
26+
// правильно будет вот тут включать прерывание
27+
// attachInterrupt(1, isr, FALLING);
28+
29+
// спим ~8 секунд, но можем проснуться по кнопке
30+
power.sleep(SLEEP_8192MS);
31+
// тут проснулись, по кнопке или через указанный период
32+
33+
// а вот тут сразу отключать
34+
// detachInterrupt(1);
35+
36+
Serial.println("wake up!");
37+
delay(300);
38+
}
Lines changed: 45 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,45 @@
1+
// просыпаемся по аппаратному прерыванию из sleepDelay
2+
3+
#include <GyverPower.h>
4+
5+
// sleepDelay состоит из нескольких sleep, и команда wakeUp()
6+
// позволяет окончательно проснуться по прерыванию.
7+
// Без неё мы будем "досыпать" некоторое время
8+
9+
void setup() {
10+
Serial.begin(9600);
11+
12+
// кнопка подключена к GND и D3
13+
pinMode(3, INPUT_PULLUP);
14+
15+
// подключаем прерывание на пин D3 (Arduino NANO)
16+
attachInterrupt(1, isr, FALLING);
17+
18+
// глубокий сон
19+
power.setSleepMode(POWERDOWN_SLEEP);
20+
}
21+
22+
// обработчик аппаратного прерывания
23+
void isr() {
24+
// дёргаем за функцию "проснуться"
25+
// без неё проснёмся чуть позже (через 0-8 секунд)
26+
power.wakeUp();
27+
}
28+
29+
void loop() {
30+
Serial.println("go sleep");
31+
delay(300);
32+
33+
// правильно будет вот тут включать прерывание
34+
// attachInterrupt(1, isr, FALLING);
35+
36+
// спим 12 секунд, но можем проснуться по кнопке
37+
power.sleepDelay(12000);
38+
// тут проснулись по кнопке или через указанный период
39+
40+
// а вот тут сразу отключать
41+
// detachInterrupt(1);
42+
43+
Serial.println("wake up!");
44+
delay(300);
45+
}

0 commit comments

Comments
 (0)