Управление реле
Материал из Умный дом
Удобное управление состоянием Low Level Relay
Список функций
relay_on(char) - включает реле с соответствующим номером, принимает значение char от 1 до 3 (можно отредактировать в коде) relay_off(char) - включает реле relay_switch(char) - переключает состояние реле.
Используемые библиотеки
#include <avr/io.h>#include <stdlib.h>
Настройка
В начале кода необходимо определить Port,Pin, к которому подключено реле, например:
#define RELAY1 D,5#define RELAY2 D,6#define RELAY3 D,7
КОД-пример
<syntaxhighlight lang="c" line>
- include <avr/io.h>
- include <util/delay.h>
- include <stdlib.h>
- define RELAY1 D,5
- define RELAY2 D,6
- define RELAY3 D,7
- define CONCAT(a, b) a ## b
- define RELAY_PIN(port) CONCAT(PIN, port)
- define RELAY_PORT(port) CONCAT(PORT, port)
- define RELAY_DDR(port) CONCAT(DDR, port)
- define set_bit(reg,value) reg |= (_BV(value))
- define unset_bit(reg,value) reg &= ~(_BV(value))
- define test_bit(reg,value) (reg & (1 << value))
- define _RELAY_ON(port,pin) {set_bit(RELAY_DDR(port),pin); unset_bit(RELAY_PORT(port),pin);}
- define RELAY_ON(x) _RELAY_ON(x)
- define _RELAY_OFF(port,pin) {set_bit(RELAY_PORT(port),pin); unset_bit(RELAY_DDR(port),pin); }
- define RELAY_OFF(x) _RELAY_OFF(x)
- define _RELAY_STATUS(port,pin) test_bit(RELAY_PIN(port),pin)
- define RELAY_STATUS(x) _RELAY_STATUS(x)
void relay_on(char relay){
switch (relay){
case 1:{
RELAY_ON(RELAY1)
break;
}
case 2:{
RELAY_ON(RELAY2)
break;
}
case 3:{
RELAY_ON(RELAY3)
break;
}
}
}
void relay_off(char relay){
switch (relay){
case 1:{
RELAY_OFF(RELAY1)
break;
}
case 2:{
RELAY_OFF(RELAY2)
break;
}
case 3:{
RELAY_OFF(RELAY3)
break;
}
}
}
void relay_sw(char relay) {
switch (relay){
case 1:{
RELAY_STATUS(RELAY1)?relay_on(relay):relay_off(relay);
break;
}
case 2:{
RELAY_STATUS(RELAY2)?relay_on(relay):relay_off(relay);
break;
}
case 3:{
RELAY_STATUS(RELAY3)?relay_on(relay):relay_off(relay);
break;
}
}
} int main(){
char i=0;
while(1){
for (i=1; i<4; i++){
relay_on(i);
}
_delay_ms(1000);
for (i=1; i<4; i++){
relay_off(i);
}
_delay_ms(1000);
}
} </syntaxhighlight>