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; } }
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!
resposta enviada para o seu email em julho.
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.
resposta enviada para o seu email.
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?
Respondido para o seu email.
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.
Respondido para o seu email.
Olá, estou interessado nesse módulo. Ele funciona também no Raspberry pi
obrigado
I want to know and how I could buy if I am from another country modules
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.
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.
OBS.: Você não tem portas suficientes em um UNO para acender 24 LEDs. Vai precisar de interfaces i2c para isso também.
Boa noite. Qual o valor deste cabo conversor, já com frete para Santos (11015-230)?
O conversor não é vendido separadamente.
qual o valor junto com a placa de rele?
A mercadoria custa R$79 e você pode pagar com cartão de crédito via MercadoPago aqui:
http://produto.mercadolivre.com.br/MLB-741560126-modulo-de-rels-serial-i2c-8-canais-5v-em-recife-_JM
Direto comigo sai por R$72
Frete:
PAC Valor: R$ 27,80 Prazo de entrega: 7 dia(s) úteis após a postagem
SEDEX Valor: R$ 68,50 Prazo de entrega: 2 dia(s) úteis após a postagem
O exemplo tinha um erro na rotina DesligarRele que foi corrigido
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
Não estou fazendo envio para fora do estado no momento, pois não emito NF.
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.