Управление реле
Материал из Умный дом
								
												
				Удобное управление состоянием 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>