Skip to content

Commit 8dfc37e

Browse files
committed
add
1 parent db7eb86 commit 8dfc37e

File tree

4 files changed

+124
-0
lines changed

4 files changed

+124
-0
lines changed

PWMrelay/PWMrelay.h

Lines changed: 71 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,71 @@
1+
#pragma once
2+
#include <Arduino.h>
3+
/*
4+
PWMrelay - библиотека для генерации низкочастотного ШИМ сигнала для реле (для ПИД регуляторов и проч.)
5+
- Настройка периода ШИМ
6+
- Настройка сигнала 0-255 (8 бит)
7+
- Поддержка реле низкого и высокого уровня
8+
- Неблокирующий вызов, не использует таймеры (кроме системного), работает на millis()
9+
*/
10+
11+
class PWMrelay {
12+
public:
13+
PWMrelay(byte pin, bool dir, int period); // пин, уровень реле HIGH/LOW, период
14+
void tick(); // тик, вызывать как можно чаще, сам управляет реле
15+
void setPWM(byte duty); // установить величину ШИМ, 0-255. При значении 0 и 255 тик неактивен!
16+
byte getPWM(); // возвращает величину ШИМ
17+
void setPeriod(int period); // установить период ШИМ в миллисек. (по умолч. 1000мс == 1с)
18+
int getPeriod(); // получить период
19+
void setLevel(bool level); // установить установить уровень реле (HIGH/LOW)
20+
21+
private:
22+
bool _flag = false;
23+
bool _dir = false;
24+
byte _pin = 0;
25+
byte _duty = 0;
26+
int _period = 1000;
27+
int _activePeriod = 0;
28+
uint32_t _tmr = 0;
29+
};
30+
31+
PWMrelay::PWMrelay(byte pin, bool dir = false, int period = 1000) {
32+
_pin = pin;
33+
_dir = !dir;
34+
pinMode(_pin, OUTPUT);
35+
digitalWrite(_pin, _dir); // сразу выкл
36+
PWMrelay::setPeriod(period);
37+
}
38+
39+
void PWMrelay::tick() {
40+
if (_duty != 0 && _duty != 255) {
41+
if (millis() - _tmr >= (_flag ? _activePeriod : (_period - _activePeriod))) {
42+
_tmr = millis();
43+
_flag = !_flag;
44+
digitalWrite(_pin, _flag ^ _dir);
45+
}
46+
}
47+
}
48+
49+
void PWMrelay::setPWM(byte duty) {
50+
_duty = duty;
51+
_activePeriod = (long)_duty * _period / 255;
52+
if (_duty == 0) digitalWrite(_pin, _dir); // выкл
53+
if (_duty == 255) digitalWrite(_pin, !_dir); // вкл
54+
}
55+
56+
byte PWMrelay::getPWM() {
57+
return _duty;
58+
}
59+
60+
void PWMrelay::setPeriod(int period) {
61+
_period = period;
62+
PWMrelay::setPWM(_duty); // на случай "горячей" смены периода
63+
}
64+
65+
int PWMrelay::getPeriod() {
66+
return _period;
67+
}
68+
69+
void PWMrelay::setLevel(bool level) {
70+
_dir = level;
71+
}
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+
}

PWMrelay/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+
#######################################

PWMrelay/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.0
3+
author=AlexGyver <[email protected]>
4+
maintainer=AlexGyver <[email protected]>
5+
sentence=Low-frequency software PWM for relay
6+
paragraph=Allows to control power of AC heaters, etc.
7+
category=Timing
8+
url=https://github.com/AlexGyver/GyverLibs
9+
architectures=*

0 commit comments

Comments
 (0)