Mudanças entre as edições de "Campainha IoT"

De LHC
Ir para navegação Ir para pesquisar
Linha 170: Linha 170:
 
* Fernando
 
* Fernando
 
* Leandro
 
* Leandro
 +
 +
[[Category:Projetos]]

Edição das 20h30min de 4 de outubro de 2015

Sobre

Campainha IoT

O LHC precisa de uma campainha. A ideia não é ser uma campainha tradicional do tipo "dim-dom", mas uma campainha IoT/Wifi.
Desta maneira é possível saber quando chegar alguém que não possua a chave ou alguma entrega (ex: pizza).


Funcionamento

  • Pressionado o botão da campainha um circuito do tipo "contato de selo" irá alimentar o ESP01.
  • O ESP01 inicializa-se e se associa a rede Wifi. (Para garantir uma associação mais rápida possível o IP é configurado como estático).
  • Uma vez associado a rede o ESP01 envia um HTTP request para um servidor.
  • Recebido o request pelo servidor um processo toca uma música aleatória localizada em um diretório pré-configurado.
  • O ESP01 recebe uma confirmação do servidor que a campainha foi tocada e auto desliga-se enviando uma corrente para o circuito (fecha selo) através do GPIO2.

Componentes

Design

Circuito tipo "contato de selo"

  • 3 Resistores 1K (Marrom, Preto, Vermelho)
  • 1 Resistor 10K (Marrom, Preto, Laranja)
  • 1 Transistor PNP - BC557B
  • 1 Transistor NPN - BC548B

Fonte: (ON - OFF VIA MOMENTARY PUSH-BUTTONS )
Circuito-selo.gif

Notas:

  • A carga do circuito (RL) será o ESP01.
  • O interruptor "on" do circuito é ligado ao Pulsador de Campainha.
  • O pino GPIO2 é ligado no interruptor "off" do circuito.

Circuito Completo

Circuito-completo2.png

Firmware/Software

Cliente (Campainha)

-- Versao 1
--  - Sem timeouts
-- Versao 2
--  - Com timeout, LED de status
-- Versao 3
--  - Manda tensao da bateria pro servidor tambem
 
led_pin = 3
off_pin = 4
status_led = gpio.LOW
status_tmr = nil
ip_servidor = "192.168.50.20"
ip_campainha = "192.168.50.21"
 
function desliga_circuito()
    print("Desligando circuito")
    gpio.mode(off_pin, gpio.OUTPUT)
    gpio.write(off_pin, gpio.HIGH)
    printf("Aparentemente estamos vivos ainda, reiniciar")
    node.restart()
end
 
function pisca_led()
    print("LED de status: " .. status_led)
 
    gpio.write(led_pin, status_led)
 
    if status_led == gpio.LOW then
        status_led = gpio.HIGH
    else
        status_led = gpio.LOW
    end
end
 
-- Se nada acontecer em 10s, desliga o circuito
tmr.alarm(0, 15000, 0, desliga_circuito)
 
function init_pins()
    -- Alta impedancia para evitar problemas
    gpio.mode(off_pin, gpio.INPUT)
    -- LED de status
    gpio.mode(led_pin, gpio.OUTPUT)
    gpio.write(led_pin, status_led)
end
 
function init_wifi()
    tmr.alarm(1, 50, 1, pisca_led)
 
    print("Conectando na rede WiFi")
    wifi.setmode(wifi.STATION)
    wifi.sta.config("LHC", "password")
    print("Configurando IP")
    wifi.sta.setip({ip=ip_campainha,netmask="255.255.255.0",gateway="192.168.50.1"})
 
    while wifi.sta.getip() == nil do
        print("Esperando conseguir IP")
    end
 
    print("Endereco IP: " .. wifi.sta.getip())
 
    tmr.stop(1)
end
 
function manda_request()
    tmr.alarm(1, 100, 1, pisca_led)
 
    function recebeu(conn, data)
        if data:find("TOCOU") ~= nil then
            desliga_circuito()
        else
            node.restart()
        end
    end
 
    -- Avisa ao servidor tambem como que ta a carga da pilha
    tensao = node.readvdd33()
 
    conn = net.createConnection(net.TCP, false)
    conn:on("receive", recebeu)
    conn:connect(9999, ip_servidor)
    conn:send("GET /campainha?pilha=" .. tensao .. " HTTP/1.1\r\n"
       .. "Host: campainha.home.lhc.net.br\r\n"
       .. "Connection: close\r\n"
       .. "Accept: text/plain\r\n\r\n")
end
 
print("Inicializando pinos")
init_pins()
 
print("Inicializando WiFi")
init_wifi()
 
print("Mandando request")
manda_request()

Servidor

import SimpleHTTPServer
import SocketServer
PORT = 8000
Handler = SimpleHTTPServer.SimpleHTTPRequestHandler
httpd = SocketServer.TCPServer(("", PORT), Handler)

print "Server running at port", PORT
httpd.serve_forever()

Roadmap

  • Adicionar um LED na Campainha indicando que o circuito foi ligado. Fazer o LED piscar por alguns segundos antes de desliga-lo indicando que o servidor recebeu o request e tocou a música. Utilizar o GPIO0 para isso.
  • Construir uma Campainha móvel com um Buzzer, um ESP01, e um botão liga/desliga para levar a outras áreas do LHC aonde não seja possível ouvir a música do servidor (ex: Quintal, Marcenaria).
  • Configurar o servidor. Possível fonte de sons

Fotos

Campainha-iot-1.jpg
Campainha-iot-2.jpg
Campainha-iot-3.jpg
Circuito selo.jpg
Circuito e esp.jpg
Suporte pilhas.jpg

Quem

  • Fernando
  • Leandro