Skip to content

Commit 80a55d9

Browse files
committed
add
1 parent 3632ee6 commit 80a55d9

File tree

7 files changed

+241
-0
lines changed

7 files changed

+241
-0
lines changed

README.md

Lines changed: 89 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,89 @@
1+
![License: MIT](https://img.shields.io/badge/License-MIT-green.svg)
2+
![author](https://img.shields.io/badge/author-AlexGyver-informational.svg)
3+
# PWMrelay
4+
PWMrelay - библиотека для генерации низкочастотного ШИМ сигнала для реле (для ПИД регуляторов и проч.)
5+
- Настройка периода ШИМ
6+
- Настройка сигнала 0-255 (8 бит)
7+
- Поддержка реле низкого и высокого уровня
8+
- Неблокирующий вызов, не использует таймеры (кроме системного), работает на millis()
9+
10+
### Совместимость
11+
Совместима со всеми Arduino платформами (используются Arduino-функции)
12+
13+
### Документация
14+
К библиотеке есть [расширенная документация](https://alexgyver.ru/PWMrelay/)
15+
16+
## Содержание
17+
- [Установка](#install)
18+
- [Инициализация](#init)
19+
- [Использование](#usage)
20+
- [Пример](#example)
21+
- [Версии](#versions)
22+
- [Баги и обратная связь](#feedback)
23+
24+
<a id="install"></a>
25+
## Установка
26+
- Библиотеку можно найти по названию **PWMrelay** и установить через менеджер библиотек в:
27+
- Arduino IDE
28+
- Arduino IDE v2
29+
- PlatformIO
30+
- [Скачать библиотеку](https://github.com/GyverLibs/PWMrelay/archive/refs/heads/main.zip) .zip архивом для ручной установки:
31+
- Распаковать и положить в *C:\Program Files (x86)\Arduino\libraries* (Windows x64)
32+
- Распаковать и положить в *C:\Program Files\Arduino\libraries* (Windows x32)
33+
- Распаковать и положить в *Документы/Arduino/libraries/*
34+
- (Arduino IDE) автоматическая установка из .zip: *Скетч/Подключить библиотеку/Добавить .ZIP библиотеку…* и указать скачанный архив
35+
- Читай более подробную инструкцию по установке библиотек [здесь](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)
36+
37+
<a id="init"></a>
38+
## Инициализация
39+
```cpp
40+
PWMrelay relay(пин);
41+
```
42+
43+
<a id="usage"></a>
44+
## Использование
45+
```cpp
46+
PWMrelay(int pin, bool dir = false, int period = 1000); // пин, уровень реле HIGH/LOW, период
47+
void tick(); // тик, вызывать как можно чаще, сам управляет реле
48+
void setPWM(byte duty); // установить величину ШИМ, 0-255. При значении 0 и 255 тик неактивен!
49+
byte getPWM(); // возвращает величину ШИМ
50+
void setPeriod(int period); // установить период ШИМ в миллисек. (по умолч. 1000мс == 1с)
51+
int getPeriod(); // получить период
52+
void setLevel(bool level); // установить установить уровень реле (HIGH/LOW)
53+
```
54+
55+
<a id="example"></a>
56+
## Пример
57+
Остальные примеры смотри в **examples**!
58+
```cpp
59+
#include "PWMrelay.h"
60+
PWMrelay relay(13); // реле на 13 пине
61+
62+
// или так
63+
// PWMrelay relay(13, HIGH); // реле высокого уровня на 13 пине
64+
// PWMrelay relay(13, HIGH, 2000); // реле высокого уровня на 13 пине, период 2 секунды
65+
66+
void setup() {
67+
Serial.begin(9600);
68+
69+
relay.setLevel(HIGH); // можно поменять уровень реле (HIGH/LOW)
70+
71+
relay.setPeriod(1000); // можно поменять период, миллисекунды
72+
73+
relay.setPWM(20); // задаём сигнал ШИМ 0-255
74+
}
75+
76+
void loop() {
77+
// вызываем в лупе, данная функция сама управляет реле
78+
relay.tick();
79+
}
80+
```
81+
82+
<a id="versions"></a>
83+
## Версии
84+
- v1.2 - исправлены мелкие ошибки с совместимостью
85+
86+
<a id="feedback"></a>
87+
## Баги и обратная связь
88+
При нахождении багов создавайте **Issue**, а лучше сразу пишите на почту [[email protected]](mailto:[email protected])
89+
Библиотека открыта для доработки и ваших **Pull Request**'ов!

examples/fewRelay/fewRelay.ino

Lines changed: 13 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,13 @@
1+
#include "PWMrelay.h"
2+
PWMrelay heater1(4);
3+
PWMrelay heater2(5);
4+
5+
void setup() {
6+
heater1.setPWM(20); // задаём сигнал ШИМ 0-255
7+
heater2.setPWM(120); // задаём сигнал ШИМ 0-255
8+
}
9+
10+
void loop() {
11+
heater1.tick();
12+
heater2.tick();
13+
}

examples/pwmRelay/pwmRelay.ino

Lines changed: 21 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,21 @@
1+
#include "PWMrelay.h"
2+
PWMrelay relay(13); // реле на 13 пине
3+
4+
// или так
5+
// PWMrelay relay(13, HIGH); // реле высокого уровня на 13 пине
6+
// PWMrelay relay(13, HIGH, 2000); // реле высокого уровня на 13 пине, период 2 секунды
7+
8+
void setup() {
9+
Serial.begin(9600);
10+
11+
relay.setLevel(HIGH); // можно поменять уровень реле (HIGH/LOW)
12+
13+
relay.setPeriod(1000); // можно поменять период, миллисекунды
14+
15+
relay.setPWM(20); // задаём сигнал ШИМ 0-255
16+
}
17+
18+
void loop() {
19+
// вызываем в лупе, данная функция сама управляет реле
20+
relay.tick();
21+
}

keywords.txt

Lines changed: 23 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,23 @@
1+
#######################################
2+
# Syntax Coloring Map For PWMrelay
3+
#######################################
4+
5+
#######################################
6+
# Datatypes (KEYWORD1)
7+
#######################################
8+
9+
PWMrelay KEYWORD1
10+
11+
#######################################
12+
# Methods and Functions (KEYWORD2)
13+
#######################################
14+
tick KEYWORD2
15+
setPWM KEYWORD2
16+
getPWM KEYWORD2
17+
setPeriod KEYWORD2
18+
getPeriod KEYWORD2
19+
setLevel KEYWORD2
20+
21+
#######################################
22+
# Constants (LITERAL1)
23+
#######################################

library.properties

Lines changed: 9 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,9 @@
1+
name=PWMrelay
2+
version=1.2
3+
author=AlexGyver <[email protected]>
4+
maintainer=AlexGyver <[email protected]>
5+
sentence=Low-frequency software PWM for relay
6+
paragraph=Low-frequency software PWM for relay
7+
category=Device Control
8+
url=https://github.com/GyverLibs/PWMrelay
9+
architectures=*

src/PWMrelay.cpp

Lines changed: 43 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,43 @@
1+
#include "PWMrelay.h"
2+
3+
PWMrelay::PWMrelay(int pin, bool dir, int period) {
4+
_pin = pin;
5+
_dir = !dir;
6+
pinMode(_pin, OUTPUT);
7+
digitalWrite(_pin, _dir); // сразу выкл
8+
PWMrelay::setPeriod(period);
9+
}
10+
11+
void PWMrelay::tick() {
12+
if (_duty != 0 && _duty != 255) {
13+
if (millis() - _tmr >= (_flag ? _activePeriod : (_period - _activePeriod))) {
14+
_tmr = millis();
15+
_flag = !_flag;
16+
digitalWrite(_pin, _flag ^ _dir);
17+
}
18+
}
19+
}
20+
21+
void PWMrelay::setPWM(byte duty) {
22+
_duty = duty;
23+
_activePeriod = (long)_duty * _period / 255;
24+
if (_duty == 0) digitalWrite(_pin, _dir); // выкл
25+
if (_duty == 255) digitalWrite(_pin, !_dir); // вкл
26+
}
27+
28+
byte PWMrelay::getPWM() {
29+
return _duty;
30+
}
31+
32+
void PWMrelay::setPeriod(int period) {
33+
_period = period;
34+
PWMrelay::setPWM(_duty); // на случай "горячей" смены периода
35+
}
36+
37+
int PWMrelay::getPeriod() {
38+
return _period;
39+
}
40+
41+
void PWMrelay::setLevel(bool level) {
42+
_dir = level;
43+
}

src/PWMrelay.h

Lines changed: 43 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,43 @@
1+
/*
2+
PWMrelay - библиотека для генерации низкочастотного ШИМ сигнала для реле (для ПИД регуляторов и проч.)
3+
Документация: https://alexgyver.ru/pwmrelay/
4+
GitHub: https://github.com/GyverLibs/PWMrelay
5+
Возможности:
6+
- Настройка периода ШИМ
7+
- Настройка сигнала 0-255 (8 бит)
8+
- Поддержка реле низкого и высокого уровня
9+
- Неблокирующий вызов, не использует таймеры (кроме системного), работает на millis()
10+
11+
AlexGyver, [email protected]
12+
https://alexgyver.ru/
13+
MIT License
14+
15+
Версии:
16+
v1.1 - убрана реализация из .h
17+
v1.2 - исправлены мелкие ошибки с совместимостью
18+
*/
19+
20+
#ifndef PWMrelay_h
21+
#define PWMrelay_h
22+
#include <Arduino.h>
23+
24+
class PWMrelay {
25+
public:
26+
PWMrelay(int pin, bool dir = false, int period = 1000); // пин, уровень реле HIGH/LOW, период
27+
void tick(); // тик, вызывать как можно чаще, сам управляет реле
28+
void setPWM(byte duty); // установить величину ШИМ, 0-255. При значении 0 и 255 тик неактивен!
29+
byte getPWM(); // возвращает величину ШИМ
30+
void setPeriod(int period); // установить период ШИМ в миллисек. (по умолч. 1000мс == 1с)
31+
int getPeriod(); // получить период
32+
void setLevel(bool level); // установить установить уровень реле (HIGH/LOW)
33+
34+
private:
35+
bool _flag = false;
36+
bool _dir = false;
37+
byte _pin = 0;
38+
byte _duty = 0;
39+
int _period = 1000;
40+
int _activePeriod = 0;
41+
uint32_t _tmr = 0;
42+
};
43+
#endif

0 commit comments

Comments
 (0)