Manual

do

Maker

.

com

AFIntelliLight - ESP8266 para embutir na tomada

AFIntelliLight - ESP8266 para embutir na tomada

ESP8266 para embutir na tomada

Escrever sobre ESP8266 se tornou um padrão. Cada dia que passa, mais novidades surgem e são realmente baseadas nas necessidades que se apresentam. Esse módulo da AF Eletrônica é o melhor exemplo disso, e é da industria nacional, o que dá mais orgulho!

Apresentação do AFIntelliLight

afintellilight-dobitaobyte-300x204.webp

Esse módulo diminuto (compare seu tamanho na foto) foi projetado para ser embutido na caixa de interruptores/tomadas. Um slot para ESP8266-01 foi disposto do mesmo lado do relé e logo adiante, o slot para o USB-serial.  Ao lado do ESP8266 você encontrará os botões para colocar o ESP8266 em modo de gravação, de modo que você não precisará sequer removê-lo para gravar um novo firmware ou subir um programa.

O modulo AFIntelliLight tem uma fonte protegida integrada, assim você poderá entrar diretamente com tensão AC (de 100V à 240V @50-60Hz) diretamente, em qualquer lugar do Brasil e em países com frequência de 50Hz.

O nome AFIntelliLight é apenas uma lembrança a um recurso disponível nesse módulo. Repare que ele possui 2 bornes verdes, que podem ser utilizados para acionamento do relé, simplesmente fechando o circuito em ground. Isso possibilita colocar um botão de momento qualquer para acionar o relé (um botão tipo campainha, botão de reset etc). Claro, a reação é tratada pelo ESP8266, portanto é necessário programação, e aproveitando essa apresentação, disponibilizarei o código para que você possa utilizá-lo com nenhum (ou com o mínimo de) esforço.

Programar para o AFIntelliLight

Hoje o AFIntelliLight tem um apk para Android, caso você não pretenda se dar ao trabalho de programar nada. É um programa com mudança de estado parecido com o MQTT Dashboard, mas de comunicação direta com o dispositivo, ou seja, você compra, instala e usa. Todavia, se desejar programá-lo e integrá-lo à sua IoT utilizando MQTT ou se desejar rodar um webserver nele, você encontra os passos aqui no site.

No video abaixo você vê a praticidade de instalação e a operação através do botão pulsador e também pelo aplicativo.

https://www.youtube.com/watch?v=wmiuhFacV5I&feature=youtu.be

Para programá-lo, podemos utilizar o Aptana Studio, Pycharm, ESPlorer, entre outros. Eu gosto de utilizar o ESPlorer porque é uma IDE criada para ESP8266 para programação em Lua e Python. Vou apresentar um pouco mais da IDE antes de seguirmos  para o código, talvez eu consiga lhe mostrar as benéfices propiciadas por ela.

Programar no ESPlorer

Normalmente eu coloco o firmware MicroPython, cujo firmware disponibilizo nesse link do github. Já mostro em outro tópico mais abaixo como fazer o flashing do firmware, não há riscos, você poderá fazê-lo tranquilamente.

Tendo instalado o firmware, você poderá então iniciar a utilização do ESPlorer IDE - uma IDE desenvolvida pelos russos. Faça o download nesse link, então execute-o após sua extração. Eu só utilizo Linux e chamo o programa por linha de comando, abrindo um terminal. O processo pós download é o seguinte:

cd ~/Downloads
unzip ESPlorer.zip
cd ESPlorer
java -jar ESPlorer.jar

E a IDE se abrirá, ainda configurada para utilização com NodeMCU, ou seja, para programação em Lua.

esplorer-300x162.webp

Essa imagem é de outro artigo que escrevi, onde exemplifiquei a utilização da IDE utilizando NodeMCU e por conseqüente, a linguagem Lua (perdoe-me pela trema, mas é incabível a utilização da palavra 'conseqüente' sem ela).

Nessa interface, a única configuração que voce precisará modificar é justamente a escolha do firmware em questão. No nosso caso, devemos selecionar "MicroPython" em "Settings".

esplorer-firmware_selection-300x279.webp

Interrupções com ESP8266

Essa é uma ótima oportunidade para falarmos outra vez sobre interrupções. A vez mais recente que discorremos a respeito foi no "Controle de maturação da cerveja". No caso, a interrupção foi utilizada para reiniciar o ESP8266 após um deep sleep. Agora a interrupção será externa, isto é, uma interrupção de origem periférica, advinda de um botão, por exemplo. Mas como escrever uma interrupção para o ESP8266? - É isso que veremos agora.

Indo por partes, a primeira coisa que você deve ter em mente é que uma interrupção externa deverá adentrar o sistema através de um GPIO. Assim sendo, é necessário configurar o pino do ESP8266 de modo que ele possibilite a recepção de um sinal. Nesse caso, a configuração básica do pino deve ser algo como:

from machine import Pin

pulse = Pin(2,Pin.IN)

Ou seja, criamos um objeto "pulse", que é o GPIO 2, configurado como INPUT.

O objeto "pulse" tem um método chamado "irq". Esse método recebe 2 parâmetros, sendo:

  • trigger - o gatilho;  origem da interrupção. Nesse artigo a interrupção vinha do RTC, do ALARM0.
  • handler - A função ou método que será executada na reação do evento. Vejamos mais a respeito.

Normalmente o handler acaba sendo uma função convencionada "callback". Claro que pode ter o nome que desejar, mas seguindo o legado, vejamos um exemplo da função de callback:

def callback(p):
    print("Mudanca de estado do pino ",p)

Quando ocorrer o evento, essa função será chamada. Agora precisamos preparar o "trigger", que na tradução direta é o gatilho, propriamente dito. A linha que ativará a interrupção no pino 0 fica assim:

pulse.irq(trigger=Pin.IRQ_RISING, handler=callback)

Desse modo, o botão deve ser pressionado e somente quando liberado a interrupção é gerada. Todavia, existem 3 modos de configuração para reagir a um evento do pino:

#Quando o botão é pressionado, na descida já reage
pulse.irq(trigger=Pin.IRQ_FALLING, handler=callback)

#Só reage na liberacao do botao
pulse.irq(trigger=Pin.IRQ_RISING, handler=callback)

#Reage em ambos os estados do pino, gerando 2 interrupcoes nesse caso
pulse.irq(trigger=Pin.IRQ_RISING | Pin.IRQ_FALLING, handler=callback)

Tendo esses conceitos, já podemos iniciar o teste do pulsador da nossa AFIntelliLight.

Declarando o callback

Nosso callback funcionará assim:

from machine import Pin
import time

#criar uma classe
class relay:
  #declaracao do init
  def __init__(self):
    #coisas para acontecer ao instanciar o objeto
    self.turn = 0

    self.rele = Pin(0,Pin.OUT)
    self.rele.high()
  
    self.pulse = Pin(2,Pin.IN)
  
  #metodo de callback das interrupcoes
  def callback(self,p):
      #para as interrupcoes
      self.pulse = Pin(2,Pin.IN,Pin.PULL_UP)
      #debug
      print("Interrupt!")
      #turn eh um modo de contornar a mudanca de estado dupla
      if self.turn == 1:
          val =  self.rele.value()
          if val > 0:
              self.rele.low()
              print("Ligado")
          else:
              self.rele.high()
              print("Desligado")
              
          self.turn = 0
      else:
          self.turn += 1
      #o delay evita uma nova interrupcao seguida
      time.sleep_ms(1000)
      self.pulse = Pin(2,Pin.IN)

  def start(self):  
    #inicia a interrupcao no gatilho de subida, chamando o callback
    self.pulse.irq(trigger=Pin.IRQ_RISING,handler=self.callback)    
     

Você pode tanto copiar esse código aí acima como baixar o arquivo do github, criado para o parceiro AFEletronica, nesse link.

Para utilizá-lo, claro que você precisará instalar o firmware MicroPython. Eu disponibilizo um firmware que compilei para os parceiros, que você encontra aqui.

O tutorial para instalar o firmware está nesse outro artigo, na sessão "Trocando o firmware NodeMCU por MicroPython". Não se preocupe, o procedimento é o mesmo para trocar qualquer firmware.

para habilitar a transferência de arquivos para o ESP8266, sugiro esse outro artigo, na sessão WEBREPL.

Quando você estiver com o programa dentro do MicroPython, bastarão 3 linhas:

import interrupts

control = interrupts.relay()

control.start()

Por fim, conecte um fio ao borne verde da esquerda (cuidado com a corrente alternada!) e toque-a rapidamente no borne da direita. Após um breve delay, o relé será acionado. É o que acontece quando você utiliza um botão de momento; ele fecha e abre o circuito.

Qual a vantagem em utilizar interrupção?

Essa é fácil de responder. Quando você utiliza interrupções, não precisa ficar preso a um loop. Além disso, seu programa pode executar outras tarefas e ao ocorrer uma interrupção, todas as demais tarefas param e o processador vai atender a interrupção.

O outro método de analisar pinos de GPIO é através de polling, verificando o estado de um a um, mas utilizar isso gasta recursos desnecessariamente.

No próximo post relacionado vou disponibilizar uma classe completa para controlá-lo utilizando MQTT.

Onde comprar

Essa belezinha pode ser adquirida na AFEletronica, e clicando aqui você vai direto para a página de especificações do produto. Se desejar fazer zeroconf, então você pode adquirir esse produto com o app Android (consideravelmente mais caro). Se desejar fazer "zerocusto", motive-se a implementar MQTT ou um webserver, que mostrarei no próximo artigo relacionado!

Inscreva-se no nosso canal Manual do Maker no YouTube.

Também estamos no Instagram.

Nome do Autor

Djames Suhanko

Autor do blog "Do bit Ao Byte / Manual do Maker".

Viciado em embarcados desde 2006.
LinuxUser 158.760, desde 1997.