Tutorial para controlar o novo Dimmer Shield via ethernet, utilizando um shield Ethernet Shield w5100, um arduíno UNO e um smartphone.
ATENÇÃO: Neste projeto utiliza conexão direta à rede elétrica, se for feito ligação de forma inadequada pode causar CHOQUE ELÉTRICO e INCÊNDIO. Só execute este projeto caso você tenha conhecimento com instalações elétricas!
Neste tutorial vamos utilizar um novo Dimmer Shield, um arduino UNO, um shield Ethernet Shield W5100 e um smartphone android.
*Antes de prosseguir com esse tutorial, olhe este link, da primeira atualização do blog, para ver como é a ligação elétrica e para configurar os jumpers de seleção dos pinos dos botões e de disparo do TRIAC.
Descrição:
O novo Dimmer Shield é um shield para arduíno. É utilizado para controlar a potência de aparelho elétricos doméstico, por exemplo, lâmpada incandescente, lâmpadas fluorescente ou LED dimerizáveis, ventilador de mesa e de teto, liquidificador, entre outros.
http://produto.mercadolivre.com.br/MLB-775276602-dimmer-shield-arduino-110vac-e-220vac-ate-trs-canais-_JM
O Ethernet Shield é um módulo para utilizar com arduino. Este módulo permite conectar o Arduino a um roteador e transmitir dados por um cabo Ethernet, com isso é possível ler ou mandar informações do Arduino a partir de outro ponto em sua rede. A Figura 2 mostra o shield utilizado.
Neste tutorial as portas digitais de comunicação do arduino com o Ethernet Shield foram D10, D11, D12 e D13. Diante disso, não será possível utilizar essas portas para outra aplicação.
O endereço IP é definido pelo código de programa. O endereço IP tem que ter as iniciais do endereço local do roteador WiFi, ou seja, no roteador do tutorial é 192.168.0.1, no número sublinhado será inserido o endereço do shield ethernet, para este exemplo será utilizado 155, ficando desta forma: 192.168.0.155.
Obs.: Verificar no roteador se o ip está disponível! Pode existir outro equipamento com este endereço, pode ser um tablet, smartphone, notebook, entre outros. Diante disso não vai funcionar a comunicação.
Código de programação:
Segue o código de programação utilizado neste tutorial. Observar os comentários, para fazer as alterações de acordo com os jumpers na placa, e alterar o endereço IP, caso não esteja disponível na sua rede. Copiar e colar na IDE do arduino e depois fazer o upload do código.
//------------------------------Inicio do programa---------------------------------------
//André Kuhn - Automação
//Email - andrekuhn.automacao@gmail.com
//Código para o Dimmer ser controlado pela internet local
#include //Incluindo a biblioteca de Comunicação SPI
#include //Incluindo a biblioteca de Comunicação Ethernet
//Inserindo o endereço MAC do ethernet shield
byte mac[] = {0xDE, 0xAD, 0xBE, 0xEF, 0xFE, 0xED };
//Inserindo o endereço IP do ethernet shield, verificar a disponibilidade
//do endereço na rede local
IPAddress ip(192, 168, 0, 155);
//Inicializando a biblioteca Ethernet Server com o endereço IP e a porta
//que você deseja usar porta padrão é 80 para o HTTP
EthernetServer server(80);
//Pino digital responsável pelo chaveamento do TRIAC, o novo Dimmer Shield
//pode utilizar os pinos digitais 3, 5 e 6, é necessário alterar o jumper na
//placa. Para utilizar no antigo Dimmer Shield, o pino é o 3.
int load = 3;
//Porcentagem inicial em 40%, variável com valor da 0 a 100.
volatile int power = 40;
///////////////////////////////////////////////////////////////////////////////////////////////////////////////
//Declarando os pinos de leitura dos botões B0 e B1 do novo Dimmer Shield,
//o botão B0 podem ser A0, A1 e A2, e o botão B1 as entradas A3, A4 e A5.
//Para este tutorial os pinos será B0 -> A2 e B1 -> A5.
//*****Pois o A0 e A1, do meu ethernet shield está em nível alto o*********
//*****tempo todo, acredito que seja defeito no shield ethernet.***********
//*****Diante disso, coloquei os pinos A2 e A5, para os botões B0********
//*****e B1, respectivamente.*************************************
//*****Lembrar da alteração dos jumpers na placa.********************
//No antigo Dimmer Shield os pinos dos botões são fixos, pino 4 e 5.
int botao_0 = A2, botao_1 = A5;
/////////////////////////////////////////////////////////////////////////////////////////////////////////////
//Criando variável para receber o comando vindo pelo ethernet shield, e
//definindo com valor inicial zero.
int comandoEthernet = 0;
//Inicializando a função de configuração das portas digitais e analógicas
void setup()
{
//Declarando o pino digital load (digital 3) como saída
pinMode(load, OUTPUT);
//Inicializa interrupção. O número zero indica a porta 2 do arduino,
//zero_cross_int é a função que será chamada toda vez que pino 2 do
//Aeduino, "subir" (RISING) de valor de 0 para 1.
attachInterrupt(0, zero_cross_int, RISING);
//Inicialiazando a comunicação Ethernet e o servidor:
Ethernet.begin(mac, ip);
server.begin();
//Declarando o pino do botão 0 como entrada
pinMode(botao_0, INPUT);
//Declarando o pino do botão 1 como entrada
pinMode(botao_1, INPUT);
//Colocando o pino do botão 0 em nível baixo (0 volt)
digitalWrite(botao_0, LOW);
//Colocando o pino do botão 1 em nível baixo (0 volt)
digitalWrite(botao_1, LOW);
}
//Função responsável por executar a lógica de programação
void loop()
{
//Escuta para a chegada dos clientes.
EthernetClient client = server.available();
//Se o cliente estiver conectado, executa esta condição.
if (client)
{
//Fazendo a impressão do cabeçalho de página html.
client.println("HTTP/1.1 200 OK");
client.println("Content-Type: text/html");
client.println("Connection: close");
client.println();
client.println("");
client.println("");
client.println("
Figura 2 - Ethernet Shield W5100
O endereço IP é definido pelo código de programa. O endereço IP tem que ter as iniciais do endereço local do roteador WiFi, ou seja, no roteador do tutorial é 192.168.0.1, no número sublinhado será inserido o endereço do shield ethernet, para este exemplo será utilizado 155, ficando desta forma: 192.168.0.155.
Obs.: Verificar no roteador se o ip está disponível! Pode existir outro equipamento com este endereço, pode ser um tablet, smartphone, notebook, entre outros. Diante disso não vai funcionar a comunicação.
Aplicativo Dimmer Shield Ethernet:
O aplicativo "Dimmer Shield Ethernet - 1 ch" está disponível gratuitamente no Play Store do Android. O funcionamento é fazendo uma determinada requisição via endereço ip do ethernet shield mais uma barra e o comando, ou seja, o endereço ip vai está na caixa de texto inserido pelo usuário. Neste tutorial o ip do shield será "192.168.0.177". Quando alguns dos quatro botões é pressionado, ele acessa o endereço ip mais um comando, segue a tabela abaixo:
Botão
"- intensidade" <=> http://192.168.0.177/?Diminuir
"+ intensidade" <=> http://192.168.0.177/?Aumentar
"Desligar" <=> http://192.168.0.177/?Desligar
"Ligar" <=> http://192.168.0.177/?Ligar
A figura 3 mostra o passo a passo de pesquisar o aplicativo e instalar no smartphone. No play store do android, coloque o nome "Dimmer Shield Ethernet" na caixa de texto 'Pesquisar no Google Play'. Na janela de descrição do aplicativo pressione INSTALAR, e depois de instalado clique em ABRIR.
A figura 4 mostra a interface do aplicativo. O campo do endereço IP está vazio, é necessário inserir conforme o endereço do ethernet shield, que foi configurado via código inserido no arduino, no nosse tutorial foi o 192.168.0.155. Após a inserção do endereço, pressionar o botão "Salvar IP".
Botão
"- intensidade" <=> http://192.168.0.177/?Diminuir
"+ intensidade" <=> http://192.168.0.177/?Aumentar
"Desligar" <=> http://192.168.0.177/?Desligar
"Ligar" <=> http://192.168.0.177/?Ligar
A figura 3 mostra o passo a passo de pesquisar o aplicativo e instalar no smartphone. No play store do android, coloque o nome "Dimmer Shield Ethernet" na caixa de texto 'Pesquisar no Google Play'. Na janela de descrição do aplicativo pressione INSTALAR, e depois de instalado clique em ABRIR.
Figura 3 - Passo a passo de pesquisar e instalar o aplicativo no android
Figura 4 - Interface do aplicativo "Dimmer Shield Ethernet - 1 ch"
Código de programação:
Segue o código de programação utilizado neste tutorial. Observar os comentários, para fazer as alterações de acordo com os jumpers na placa, e alterar o endereço IP, caso não esteja disponível na sua rede. Copiar e colar na IDE do arduino e depois fazer o upload do código.
//------------------------------Inicio do programa---------------------------------------
//André Kuhn - Automação
//Email - andrekuhn.automacao@gmail.com
//Código para o Dimmer ser controlado pela internet local
#include
#include
//Inserindo o endereço MAC do ethernet shield
byte mac[] = {0xDE, 0xAD, 0xBE, 0xEF, 0xFE, 0xED };
//Inserindo o endereço IP do ethernet shield, verificar a disponibilidade
//do endereço na rede local
IPAddress ip(192, 168, 0, 155);
//Inicializando a biblioteca Ethernet Server com o endereço IP e a porta
//que você deseja usar porta padrão é 80 para o HTTP
EthernetServer server(80);
//Pino digital responsável pelo chaveamento do TRIAC, o novo Dimmer Shield
//pode utilizar os pinos digitais 3, 5 e 6, é necessário alterar o jumper na
//placa. Para utilizar no antigo Dimmer Shield, o pino é o 3.
int load = 3;
//Porcentagem inicial em 40%, variável com valor da 0 a 100.
volatile int power = 40;
///////////////////////////////////////////////////////////////////////////////////////////////////////////////
//Declarando os pinos de leitura dos botões B0 e B1 do novo Dimmer Shield,
//o botão B0 podem ser A0, A1 e A2, e o botão B1 as entradas A3, A4 e A5.
//Para este tutorial os pinos será B0 -> A2 e B1 -> A5.
//*****Pois o A0 e A1, do meu ethernet shield está em nível alto o*********
//*****tempo todo, acredito que seja defeito no shield ethernet.***********
//*****Diante disso, coloquei os pinos A2 e A5, para os botões B0********
//*****e B1, respectivamente.*************************************
//*****Lembrar da alteração dos jumpers na placa.********************
//No antigo Dimmer Shield os pinos dos botões são fixos, pino 4 e 5.
int botao_0 = A2, botao_1 = A5;
/////////////////////////////////////////////////////////////////////////////////////////////////////////////
//Criando variável para receber o comando vindo pelo ethernet shield, e
//definindo com valor inicial zero.
int comandoEthernet = 0;
//Inicializando a função de configuração das portas digitais e analógicas
void setup()
{
//Declarando o pino digital load (digital 3) como saída
pinMode(load, OUTPUT);
//Inicializa interrupção. O número zero indica a porta 2 do arduino,
//zero_cross_int é a função que será chamada toda vez que pino 2 do
//Aeduino, "subir" (RISING) de valor de 0 para 1.
attachInterrupt(0, zero_cross_int, RISING);
//Inicialiazando a comunicação Ethernet e o servidor:
Ethernet.begin(mac, ip);
server.begin();
//Declarando o pino do botão 0 como entrada
pinMode(botao_0, INPUT);
//Declarando o pino do botão 1 como entrada
pinMode(botao_1, INPUT);
//Colocando o pino do botão 0 em nível baixo (0 volt)
digitalWrite(botao_0, LOW);
//Colocando o pino do botão 1 em nível baixo (0 volt)
digitalWrite(botao_1, LOW);
}
//Função responsável por executar a lógica de programação
void loop()
{
//Escuta para a chegada dos clientes.
EthernetClient client = server.available();
//Se o cliente estiver conectado, executa esta condição.
if (client)
{
//Fazendo a impressão do cabeçalho de página html.
client.println("HTTP/1.1 200 OK");
client.println("Content-Type: text/html");
client.println("Connection: close");
client.println();
client.println("");
client.println("");
client.println("
//Um requerimento final HTTP com uma linha branca
boolean currentLineIsBlank = true;
//Criando variável vars, do tipo string.
String vars;
//Enquanto o cliente estiver conectado, executa o loop while
while (client.connected())
{
//Se tiver alguma requisição do cliente, executa esta condição.
if (client.available())
{
//Lendo a requisição do cliente, e armazenando na variável c.
char c = client.read();
//Fazendo a concatenação dos caracteres e armazenando na string vars.
vars.concat(c);
//Fazendo a leitura da requisição e verificando o tipo de comando
//enviado pelo cliente.
if (vars.endsWith("/?Diminuir")) comandoEthernet = 1;
else if (vars.endsWith("/?Aumentar")) comandoEthernet = 2;
else if (vars.endsWith("/?Desligar")) comandoEthernet = 3;
else if (vars.endsWith("/?Ligar")) comandoEthernet = 4;
//Se chegou ao fim da linha (recebeu um caractere de nova linha) e a
//linha estiver em branco, o pedido http terminou.
if (c == '\n' && currentLineIsBlank)
{
break;
}
//Se o caracter c é igual a '\n', executa esta condição
if (c == '\n')
{
//Começando uma nova linha
currentLineIsBlank = true;
}
//Se senão, e c é igual a '\r', executa esta condição
else if (c != '\r')
{
// you've gotten a character on the current line
currentLineIsBlank = false;
}
}
}
// give the web browser time to receive the data
delay(1);
// close the connection:
client.stop();
}
//Verificando se o botão 0 foi pressionado ou se a variável comandoEthernet
//é igual a "1"
if ((digitalRead(botao_0) == HIGH) || (comandoEthernet == 1))
{
//Se power (porcentagem) for maior que 0, executa
if (power > 0)
{
//Faz a subtração do power anterior com 10 (decremento de 10)
power = power - 10;
}
comandoEthernet = 0;
delay(100); //Espera de 100 milisegundos
}
//Verificando se o botão 1 foi pressionado ou se a variável comandoEthernet
//é igual a "2"
if ((digitalRead(botao_1) == HIGH) || (comandoEthernet == 2))
{
//Se power (porcentagem) for menor que 100, executa
if (power < 100)
{
//Faz a soma do power anterior com 10 (incremento de 10)
power = power + 10;
}
comandoEthernet = 0;
delay(100); //Espera de 100 milisegundos
}
//Verificando se a variável comandoEthernet é igual a "3"
if (comandoEthernet == 3)
{
//power recebe valor 0, desliga a carga (0%)
power = 0;
comandoEthernet = 0;
}
//Verificando se a variável comandoEthernet é igual a "4"
if (comandoEthernet == 4)
{
//power recebe valor 100, liga a carga (100%)
power = 100;
comandoEthernet = 0;
}
}
//Função executada quando o Dimmer Shield detecta a passagem por zero da
//tensão alternada (senóide)
void zero_cross_int()
{
//Cálculo do ângulo de disparo: 60Hz -> 8,33ms (1/2 ciclo)
//(8333us - 8,33us) / 100 = 83 (aproximadamente)
//O powertime é o tempo que o TRIAC permanescerá desligado quando é
//detectado o ponto 0 da senóide e varia de 0 a 8300 microsegundos
int powertime = (83 * (100 - power));
//Se o powertime for menor ou igual a 300 microsegundos, dar o comando
//de ligar a lâmpada (carga) - potência total fornecida
if (powertime <= 830)
{
//Liga o pulso do sinal ao TRIAC para que ele passe a conduzir,
//coloca o pino digital "load" em nível alto
digitalWrite(load, HIGH);
}
//Se o powertime for menor ou igual a 8000 microsegundos, dar o comando
//de desligar a lâmpada (carga) - potência zero fornecida
else if (powertime >= 8000)
{
//Desliga o pulso do sinal ao TRIAC para que ele não conduza,
//coloca o pino digital "load" em nível baixo
digitalWrite(load, LOW);
}
//Se o powertime estiver entre 300 microsegundos a 8000 microsegundos
else if ((powertime > 830) && (powertime < 8000))
{
//Mantém o circuito desligado por powertime microssegundos (espera
//powertime microssegundos)
delayMicroseconds(powertime);
//Envia sinal ao TRIAC para que ele passe a conduzir, coloca o pino
//digital "load" em nível alto
digitalWrite(load, HIGH);
//Espera 8,33 microssegundos para que o TRIAC perceba o pulso
delayMicroseconds(8.33);
//Desliga o pulso do TRIAC, coloca o pino digital "load" em nível baixo
digitalWrite(load, LOW);
}
}
//---------------------------------fim do programa-----------------------------------------
Testando a aplicação utilizando o navegador web do PC:
Para fazer o teste utilizando o navegador web do PC, basta inserir os seguintes endereços entre as aspas e pressionar ENTER, após o pressionamento, a tela ficará branca e o controle do dimmer vai alterar.
"192.168.0.155/?Ligar" => Ligar a carga no máximo
"192.168.0.155/?Deligar" => Desligar a carga
"192.168.0.155/?Aumentar" => Aumentar o dimmer
"192.168.0.155/?Diminuir" => Diminuir o dimmer
A figura 5 mostra os testes.
Figura 5 - Teste da aplicação
Testando a aplicação pelo aplicativo Dimmer Shield Ethernet:
A figura 6, 7 e 8 mostram as ligações elétricas e as conexões do Dimmer Shield, e do Ethernet Shield no arduino.
Figura 6 - Ligação elétrica, aplicativo Dimmer Shield Ethernet, roteador WiFi e circuito de controle
Figura 7 - Conexão do Dimmer Shield e Ethernet Shield no Arduino UNO
Figura 8 - Ligação elétrica, roteador WiFi e circuito de controle
6 comentários:
Boa tarde,
Caro André, estou para adquirir esse shield e estava olhando o código no seu blog e fiquei em dúvida sobre a parte abaixo:
"//Se o powertime estiver entre 300 microsegundos a 8000 microsegundos
else if ((powertime > 830) && (powertime < 8000))
{
//Mantém o circuito desligado por powertime microssegundos (espera
//powertime microssegundos)
delayMicroseconds(powertime);
//Envia sinal ao TRIAC para que ele passe a conduzir, coloca o pino
//digital "load" em nível alto
digitalWrite(load, HIGH);
//Espera 8,33 microssegundos para que o TRIAC perceba o pulso
delayMicroseconds(8.33);
//Desliga o pulso do TRIAC, coloca o pino digital "load" em nível baixo
digitalWrite(load, LOW);"
Da forma que está, entendo que o pulso para nível alto vai durar sempre 8,33 us e o que vai variar é o tempo para ele entrar, pois controlamos apenas o tempo no nível baixo. Minha dúvida é: os dois tempos (nível baixo e nível alto), não deveriam dividir os 8,33 ms ou 8333 us de duração da meia onda? Desde já agradeço a atenção.
Boa tarde Robsandro,
O controle do Dimmer Shield se baseia na passagem do ponto zero da sinal de tensão da rede elétrica (senoide). Então o controle será realizado a cada semiciclo deste sinal.
Na frequência de 60Hz, o período de um ciclo é 16,666 ms (16666 us), e o semiciclo de 8,333 ms (8333 us).
Então na linha:
...
else if ((powertime > 830) && (powertime < 8000))
...
O controle do disparo do TRIAC só será executado se o valor do "powertime" estiver entre os valores 830 us e 8000 us. Este último, arredondei do tempo de 8333 us. E o primeiro tempo de 830 us, é o tempo que o Arduino possa realizar a varredura do código do programa, abaixo disso, apresenta erros no controle (na prática, a lampada fica piscando).
Este tempo é encontrado usando a equação:
...
int powertime = (83 * (100 - power));
...
Onde o "power" pode variar de 0 a 100 (porcento)
Então quando o powertime é menor que 830 us, significa que desejo que a lampada fica 100% acessa.
E acima de 8000 us, deixar a lâmpada desligada.
A linha:
...
//Espera 8,33 microssegundos para que o TRIAC perceba o pulso
delayMicroseconds(8.33);
...
Só é pra garantir que o tempo do gatilho no gate do TRIAC, seja efetivado por completo.
Após este tempo, o gatilho é desabilitado. Acontecendo novamente no próximo semi-ciclo da onda, e assim por diante.
Qualquer duvida entre em contato.
Abraço.
Caro André,
Muito obrigado pelo rápido retorno, vou fazer o pedido e implementar o seu código.
Um abraço.
Por nada meu velho.
Qualquer dúvida entre em contato.
Abraço.
Postar um comentário