HomeProdutos › Módulo de relês 8 canais I2C

Módulo de relês 8 canais I2C

Este é o mesmo módulo de oito canais que eu já oferecia (siga o link para maiores detalhes sobre o módulo), agora com o acréscimo de um cabo que faz a interface I2C, reduzindo de oito para dois os pontos de i/o necessários. Até oito módulos idênticos podem ser conectados em paralelo, dando um total de 64 relês, usando os mesmos dois fios.

Posso fornecer com endereços I2C de 0x20 a 0x27. Caso não seja especificado, será enviado com qualquer valor que eu tenha em estoque. O endereço é claramente marcado na interface.

Minha convenção de cores na fiação que conecta ao Arduino (a interface mostrada na foto não segue esse padrão):

  • +5V: vermelho
  • GND: preto
  • SCL (CLOCK): Amarelo ou laranja – Arduino UNO: A5, Arduino Mega: 21;
  • SDA (DATA): qualquer outra cor (geralmente branco) – Arduino UNO: A4, Arduino Mega: 20;

As saídas do conversor são do tipo latch. Assim não há rebote quando você escreve outro valor na interface. Porém é preciso tomar o cuidado de manter um registro em memória de que saídas estão ligadas, para evitar desligá-las acidentalmente ao ligar outro relê. Mas não é nada que um uso simples de operações bitwise como “AND”, “OR” e “XOR” não resolva.

Falando assim parece difícil, mas na verdade é bem fácil quando as rotinas estão prontas. Você consegue ligar um relê com um comando simples do tipo “LigarRele(7)” sem perturbar nenhuma das outras saídas. Exemplo a seguir:


//aqui você coloca o endereço que escrevi na interface
#define ADDRESS 0x23

//Nesta variavel ficará a representação em memória do estado das saídas
//Depois de manipular as saídas na variável jogamos a variável para a interface.
//Assim é evitada a modificação do estado das saídas erradas
byte Saidas = 0;

#include <Wire.h>

void setup()
{
Wire.begin();
//Por precaução, mas não é realmente necessário.
DesligaTudo();
}

void loop()
{

//Testa cada um dos relês, desligando os outros
for (int i=1;i<9;i++){
LigarReleUnico(i);
delay(200);
}
DesligaTudo();
delay(200);

//agora no caminho inverso
for (int i=8;i>0;i--){
LigarReleUnico(i);
delay(200);
}

DesligaTudo();
delay(200);

//Todos os relês serão ligados em sequencia até ficarem todos ligados ...
for (int i=1;i<9;i++){
LigarRele(i);
delay(500);
}

//... e serão desligados na mesma ordem
for (int i=1;i<9;i++){
DesligarRele(i);
delay(500);
}

}

void DesligaTudo()
{
Saidas=0;
sendI2Cneg(Saidas);
}

byte BitPosToDec(byte BitPos)
//Para entender esta função você precisa entender numeração binária
//e o funcionamento do operador SHIFT (<< e >>)
{
int bt=1; //isso "liga" o bit menos significativo do byte
bt = bt << BitPos-1;//move o bit ligado para a esquerda
return(bt);
}

void LigarRele(byte rele)
{
//Esta função liga um relê sem perturbar o estado dos outros
byte x=BitPosToDec(rele);
Saidas = Saidas | x;
sendI2Cneg(Saidas);
}

void DesligarRele(byte rele)
{ //Esta função desliga um relê sem perturbar o estado dos outros
byte x=BitPosToDec(rele);
 // Saidas = Saidas ^ x;
 Saidas = Saidas &(~x); //corrigido em 04/07/2017
sendI2Cneg(Saidas);
}

void LigarReleUnico(byte rele)
{
//Esta função vai desligar qualquer outro relê que já esteja ligado
sendI2Cneg(BitPosToDec(rele));
}

void sendI2Cneg(byte b)
/*Seria mais elegante chamar esta função de "AtualizarSaidas",
mas seria preciso fazer outras modificações que tornariam
o uso mais chato. Preferi deixar assim.
O "neg" vem do fato de que o módulo de relês opera
com lógica negativa e por isso todos os bits precisam ser invertidos
ao enviar. Uma única operação XOR se encarrega disso */
{
Wire.beginTransmission(ADDRESS);

//compatibilizando com o Arduino 1.x
#if (ARDUINO >= 100)
Wire.write(b ^ 255); // XOR
#else
Wire.send(b ^ 255); // XOR
#endif
Wire.endTransmission();

}

Forma alternativa da função BitPosToDec, que pode ser mais fácil de entender

byte BitPosToDec(byte BitPos)
{
switch (BitPos) {
case 1:
return(1);
break;
case 2:
return(2);
break;
case 3:
return(4);
break;
case 4:
return(8);
break;
case 5:
return(16);
break;
case 6:
return(32);
break;
case 7:
return(64);
break;
case 8:
return(128);
break;
}
}

23 Comments.[ Leave a comment ]

  1. Marcio Duchewski Boruchosas Jr.

    Jefferson, obrigado por manter o blog! Muito útil! Você escreve muito bem!

    Você vende estes produtos todos?
    Quanto custa o conjunto e quanto custa cada equipamento separadamente?
    Você envia pelos Correios?

    Grato pela disponibilidade!
    Abraços!

  2. Gentileza, condições de pagto e valores dos módulos de relés. Moro em Recife. Possível retirar em mãos. Grato pela atenção.

  3. Favor me envie preço de dois (Módulo de relês 8 canais I2Cs) e um (Teclado membrana de 16 teclas com interface I2C).
    Será que eu consigo ligar estes tres modulos usando a mesma porta do arduino?

  4. muito bom o artigo.
    preciso de um módulo com 16 reles i2c. é possível?
    se não for usarei 2 de 8 potas.

    favor enviar valores .
    vlw .

    fico no aguardo.

  5. Marcos Paulo Nogueira

    Olá, estou interessado nesse módulo. Ele funciona também no Raspberry pi

    obrigado

  6. I want to know and how I could buy if I am from another country modules

  7. Nery Santos Freitas

    Olá.Preciso acionar 12 LEDS (pinos do Arduino) com seu teclado e enviar a mensagem I2c ao mesmo tempo para o módulo Rele serial.Cada tecla ligaria e desligaria um led enviando também a mensagem serial I2c.É possível?Se eu comprar seus produtos posso ter algum suporte para o que foi descrito?Posso ligar 3 módulos relés?

    Cordialmente,Nery

    • Sim, o que você quer fazer é perfeitamente possível. Você precisa de seis interfaces i2c com endereços distintos. Mas eu só posso dar suporte para aplicação em compras superiores a R$1000.

  8. Nery Santos Freitas

    Desculpe,não informei adequadamente o que gostaria de fazer com seus produtos:

    Seria assim:Ligar um teclado 4×3 com I2c e o módulo de relês 8 canais I2c em um arduino uno,ao pulsar por exemplo a tecla 1,ligaria um pino do arduino e simultaneamente enviaria o protocolo I2C ao módulo de relês acontecendo o mesmo com as outras teclas,outro pulso desligaria o relê correspondente e o pino.Se possível gostaria de ligar três módulos relês perfazendo 24(relês) e três teclados nos quais eu usaria 12 teclas em cada.

  9. Boa noite. Qual o valor deste cabo conversor, já com frete para Santos (11015-230)?

  10. O exemplo tinha um erro na rotina DesligarRele que foi corrigido

  11. Boa tarde, Qual o valor desse kit completo? Você realizaria o envio para São Paulo para o CEP 03152-155? Preciso de 8 kits

  12. Erivaldo santos ferreira

    ola amigo bom dia .. vi o seu conversor i2c tenho um PROJETO para ligar 32 rele via arduino .porem naum ha portas suficientes para tal . gostaria de saber se eh possivel criar 32 enderecos no i2c para usar no modulo rele .? caso haja como faco para adquerir o conversor para os 32 canais ?

    • Você não precisa de 32 endereços i2c. É um endereço para cada módulo de 8 canais. Então você precisa de 32/8 = 4 módulos i2C com diferentes endereços. Cada um deles custa R$49 sem os relês e sem o frete. Cada conjunto completo de módulo de relês i2C 8 canais como o mostrado na página custa R$69 + frete.

Reply to Marcio Duchewski Boruchosas Jr. ¬
Cancel reply

NOTE - You can use these HTML tags and attributes:
<a href="" title=""> <abbr title=""> <acronym title=""> <b> <blockquote cite=""> <cite> <code class="" title="" data-url=""> <del datetime=""> <em> <i> <q cite=""> <s> <strike> <strong> <pre class="" title="" data-url=""> <span class="" title="" data-url="">