Desenvolvimento

10 nov, 2017

Internet das Coisas: Luminária da previsão do tempo

Publicidade

Comparada à revolução industrial do início do século 20, o assunto IoT, Internet of things ou “Internet das Coisas”, vem ganhando notoriedade expressiva, sendo considerado pelas empresas de previsão tecnológica, a revolução do século 21.

Esse artigo demonstra uma aplicação prática de IoT apresentando uma forma diferente de visualização da previsão do tempo através de uma luminária moderna de design inovador. Além de indicar a previsão do tempo, a luminária pode indicar outras situações, como a chegada de um e-mail importante, um evento, um alarme, etc.

A ideia

Quando você acorda ou vai sair de casa, qual a forma mais fácil de saber se vai chover?

Antigamente as pessoas possuíam em suas casas o famoso galinho do tempo. Ele conseguia prever com uma boa margem de acerto quando ia chover ou não, porém, sua indicação era quase que imediata a da chegada da chuva, uma vez que ele indicava apenas a umidade do ar.

Hoje com o avanço da tecnologia, existem vários aplicativos de smartphone, onde é possível verificar, em tempo real, a previsão do tempo, se vai chover e quando. Melhor ainda, existe disponível para uso público, diversas API (Application Programming Interface) onde sistemas automáticos podem consumir a informação de previsão do tempo e com isso tomar decisões que podem ser desde acender uma lâmpada como fechar uma janela automatizada.

Pensando nisso, esse projeto tem como objetivo mostrar a potencialidade da Internet das Coisas no uso de uma aplicação simples, não do ponto de vista de tecnologia, pois será utilizado uma API, uma plataforma de IoT, o protocolo de comunicação MQTT e um modulo esp8266, mas sim, do ponto de vista de resolver problemas simples, de criar objetos úteis.

O Circuito

O circuito da luminária utiliza um módulo Wifi ESP8266 NodeMCU, que é uma placa de desenvolvimento que combina o chip ESP8266, uma interface usb-serial e um regulador de tensão 3.3V. A programação pode ser feita usando LUA ou a IDE do Arduino, utilizando a comunicação via cabo micro-usb. Além do módulo ESP8266 utilizaremos um LED RGB juntamente com três resistores de 470 ohms para limitação de corrente.

Figura 2 – Circuito

Código lua do NodeMCU

Para esse projeto, estaremos utilizando o firmware NodeMCU. A plataforma NodeMCU foi criada menos de um ano após o começo das vendas do ESP8266, e é composta por um firmware que roda no ESP8266 transformando-o num ambiente de execução da linguagem Lua contendo uma série de recursos adicionais para uso embarcado. Para gravar os arquivos lua na luminária vamos utilizar o programa ESPlorer. A programação Lua consiste em dois arquivos:

  • init.lua – Contém ações básicas de inicialização do módulo, sendo que será necessário alterar as configurações do acesso a rede wi-fi, no caso SSID e a chave de criptografia.
  • mqtt.lua – Arquivo principal com todas as funções a serem executadas. No início do arquivo, a primeira linha deverá ser alterada. Na linha onde tem a configuração “broker = “X.X.X.X” deverá ser configurado com o endereço IP da Raspberry onde foi instalado o Node-RED.

Código Lua init.lua

wifi.setmode(wifi.STATION)
wifi.sta.config("your_SSID","Your_Key_password")
tmr.alarm(0,1000, 1, function() 
   if wifi.sta.getip()==nil then
      print("connecting ap")
   else
     tmr.alarm(1, 4000, 0, function() dofile ("mqtt.lua")end )    
     tmr.stop(0)
   end
end)

Código Lua mqtt.lua

-- Projeto Luminaria do Tempo
--
--Configuration parameters & initialise variables
--
broker = "X.X.X.X" -- IP da Raspberry onde foi instalado o Node-RED
mqttport = 1883          -- MQTT port (default 1883)
userID = "user"          -- username se for utilizada autenticacao
userPWD  = "senha"       -- user password se for utilizada autenticacao
clientID = "Brain_001"   -- ID do dispositivo

-- ESP-12 GPIO Mapping
gpio12 = 6  -- RGB Verde
gpio14 = 5  -- RGB Azul
gpio13 = 7  -- RBG Vermelho

pwm.setup(gpio12,500,512)
pwm.setup(gpio13,500,512)
pwm.setup(gpio14,500,512)
pwm.start(gpio12)
pwm.start(gpio13)
pwm.start(gpio14)

count = 0  -- Test number of mqtt_do cycles
mqtt_state = 0 -- State control
--

function mqtt_do()
     count = count + 1  -- For testing number of interations before failure
     if mqtt_state < 5 then
          mqtt_state = wifi.sta.status() --State: Waiting for wifi
     elseif mqtt_state == 5 then
          m = mqtt.Client(clientID, 120, userID, userPWD)
          mqtt_state = 10 -- State: initialised but not connected
          m:on("message",
          function(conn, topic, data)
               print(topic .. ":" )  --topic is not examined only printed for the purposes of this test
               if data ~= nil then
                    print(data)
                    a = {} -- array 1
                    b = {} -- array 2
                    c = {} -- array 3
                    d = {} -- array 3
                    op = 0
                    for word in string.gmatch(data, '([^,]+)') do
                    op = op+1
                  if op == 2 then
                     --b[1] = word*1
                     ledVM = word*1
                  elseif op == 3 then
                     --c[1] = word*1
                     ledVD = word*1
                  elseif op == 4 then
                     --d[1] = word*1
                     ledAZ = word*1
                  end
               end
               print (ledVM)
               print (ledVD)
               print (ledAZ)
                    
                    if data == "OFF" then -- Only "OFF" or "ON" is recognised to change GPIO2 state
                         gpio.write(gpio13,gpio.LOW)
                    elseif data == "ON" then
                         gpio.write(gpio13,gpio.HIGH)
                    end

               led(ledVM,ledVD,ledAZ)
                    
               end
          end)
          m:on("offline",
          function(conn)
               print("Offline!")
               mqtt_state = 10  -- State: reset to initialised but not connected
          end)
     elseif mqtt_state == 10 then
          m:connect( broker , mqttport, 0, 
          function(conn)
               print("Connected to MQTT:" .. broker .. ":" .. mqttport .." as " .. clientID )
               m:subscribe("sensor/"..clientID.."/action",0, 
               function(conn)
                    print("subscribed!")
                    mqtt_state = 20 -- Go to publish state
               end)
          end)
     elseif mqtt_state == 20 then
          mqtt_state = 25 -- Publishing...
          if gpio.read(gpio13) == 0 then  -- Read the current state of GPIO2
                io_status = "OFF"
          else
                io_status = "ON"
          end
          m:publish("sensor/"..clientID.."/alive/", "count:"..count.." ", 0, 0,
          function(conn) 
              -- Print confirmation of data published
              print("GPIO14:"..io_status.." #:"..count.." published!")
              mqtt_state = 20  -- Finished publishing - go back to publish state.
          end)
     else print("Publishing..."..mqtt_state)
          mqtt_state = mqtt_state - 1  -- takes us gradually back to publish state to retry
     end
end

function led(r,g,b)
      pwm.setduty(gpio12,g)
      pwm.setduty(gpio14,b)
      pwm.setduty(gpio13,r)
end


--
--Run it!
--
tmr.alarm(0, 2000, 1, function() mqtt_do() end)

Plataforma IoT Node-RED

O Node-RED é uma plataforma de código aberto, construída utilizando o Node.js, que ajuda os desenvolvedores a criarem aplicativos sofisticados para IoT com esforço mínimo. Essa plataforma tem a flexibilidade para ser executada na nuvem, ou em hardware de baixo custo como uma Raspberry Pi.

Para esse projeto, estaremos utilizando uma imagem pronta do Node-RED para Raspberry PI 2 do projeto Thethingbox.io. Essa imagem pode ser “baixada” no site e gravada em um SDcard de 8GB e já estará pronta para uso, inclusive com serviço de MQTT que será utilizado como protocolo de mensageria entre a luminária e o servidor.

Nesse artigo não vou entrar em detalhes no funcionamento do Node-RED, bem como o MQTT que serão mais bem descritos em artigos futuros. Uma vez instalada a imagem basta somente conectar a Raspberry PI 2 na sua rede local onde também deverá estar conectada sua rede WiFi com acesso a Internet.

O fluxo foi baseado no original escrito por Dom Bramley e adaptado para o funcionamento da luminária. Basicamente o fluxo que irá rodar no Node-RED consulta uma API de previsão do tempo (forecast.io), calcula a probabilidade de chuva nas próximas horas e envia para a luminária um mensagem “pwm,R,G,B” conforme o tempo previsto para próxima chuva. A mensagem ao ser recebida pela luminária executará o pwm para cada cor correspondente no LED RGB.

Figura 3 – Plataforma IoT

O código abaixo pode ser importado no ambiente do Node-RED através da função “import clipboard”. Após a importação, você terá que ajustar no box “Get Forecast” a chave do API que você deve obter no site forecast.io, bem como ajustar as coordenadas de latitude e longitude para uma correta previsão.

Fluxo node-red

Luminária pronta para testes

Uma vez concluída as fases de montagem e programação, a placa estará pronta para acender o LED RGB conforme a previsão de chuva. Caso não tenha previsão de chuva nas próximas 12 horas, o Node-RED enviará uma mensagem “pwm, 0,0,1023” para a luminária através do protocolo MQTT. A luminária ao receber essa mensagem irá aplicar 0% de corrente ao led R (Red), 0% ao led G (Green) e 100% ao led B (blue) fazendo-o acender na cor azul. Caso exista a previsão de chuva nas próximas 12 horas e conforme chuva se aproximar em quantidade de horas a mensagem pwm vai se modificado aumentando a porcentagem de vermelho ao azul tornando o led cada vez mais cor de rosa. A cor azul e rosa são em homenagem aos antigos galinhos do tempo que já trabalhavam com essas cores.

Evolução da ideia

Da mesma maneira que ao se fazer a previsão do tempo o sistema envia uma mensagem para a luminária acender uma cor, novas regras poderão ser criadas no Node-RED para sinalização de outros eventos, como exemplo, a chegada de um e-mail, ficando aberto à criatividade uma gama muito grande de opções.

Galeria de fotos e vídeo

Uma vez todos os componentes funcionando basta adicionar o toque final que é uma peça de cristal transparente para melhor visualização da cor do led RGB.

Curso

Se você deseja conhecer mais ou aprofundar seus conhecimentos em IoT possuímos o Curso “Hands On de Internet das Coisas (IoT)” composto por 16 horas presenciais de laboratório. Como forma complementar e com o objetivo de otimizar o tempo do laboratório prático é oferecido um módulo teórico remoto através de ensino a distancia na nossa plataforma de EAD.

Neste curso, uma parceria entre Agile Think® e Saltic, você irá aprender sobre um assunto que está cada vez mais presente nas nossas vidas: a Internet das Coisas. Você entenderá o que é e como funciona, descobrindo algumas de suas aplicações que já fazem parte do nosso dia-a- dia e conhecendo tendências na área. Você implementará soluções para problemas reais e se familiarizará com as tecnologias que possibilitam o desenvolvimento de aplicações nesta área. O conteúdo do curso aborda os seguintes pontos:

  • Transformação Digital e IoT – a origem das coisas.
  • Como converter informações em ações.
  • O que é e qual o conceito por trás da Internet das Coisas.
  • O que fazer com os dados? Uso de Machine Learning.
  • Descubra como os processos de negócios e inovação podem se beneficiar.
  • Aula prática sobre sensores, dispositivos, microcontroladores, protocolos, interfaces,
    plataformas, dashboards.
  • Laboratório Hands On com criação de uma rede com sensores transmitindo informação a
    uma plataforma de IoT local e em Nuvem.