Управление реле

Материал из Умный дом
Перейти к: навигация, поиск

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

  1. include <avr/io.h>
  2. include <util/delay.h>
  3. include <stdlib.h>
  1. define RELAY1 D,5
  2. define RELAY2 D,6
  3. define RELAY3 D,7


  1. define CONCAT(a, b) a ## b
  2. define RELAY_PIN(port) CONCAT(PIN, port)
  3. define RELAY_PORT(port) CONCAT(PORT, port)
  4. define RELAY_DDR(port) CONCAT(DDR, port)
  1. define set_bit(reg,value) reg |= (_BV(value))
  2. define unset_bit(reg,value) reg &= ~(_BV(value))
  3. define test_bit(reg,value) (reg & (1 << value))


  1. define _RELAY_ON(port,pin) {set_bit(RELAY_DDR(port),pin); unset_bit(RELAY_PORT(port),pin);}
  2. define RELAY_ON(x) _RELAY_ON(x)
  1. define _RELAY_OFF(port,pin) {set_bit(RELAY_PORT(port),pin); unset_bit(RELAY_DDR(port),pin); }
  2. define RELAY_OFF(x) _RELAY_OFF(x)
  1. define _RELAY_STATUS(port,pin) test_bit(RELAY_PIN(port),pin)
  2. 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>