ELEVADOR
POR EMAIL!

WHAT?!

Tudo começou com uma idéia bem simples: chamar o elevador por email. Hoje, o email é muito mais uma ferramenta corporativa e ninguém mais usa como usava antes. Lembra quando compartilhávamos os vídeos, imagens e links por email? No more. O inbox e a própria timeline do Facebook, Sms, Whatsapp e outras, são a coqueluche do momento para compartilhar nossa vida com nossos contatos online.

Depois de uma rápida pesquisa e muitas risadas, resolvemos colocar a idéia para rodar. Usar email para chamar o elevador parecia dar uma nova função para algo cada vez mais sem função. Mesmo que a idéia toda não tenha muita função prática, tínhamos que fazer. Mal sabíamos como.

Aliás, esse é um texto cheio de tecnês e a maioria deles é baby talk para o Sheldon. Se não fizerem o menor sentido para você, pule e fique com o video.
O nosso elevador é um daqueles de 50 anos atrás. Por ser tão velho (pro nosso bem ou não), tínhamos acesso a todas as entranhas do equipamento. Desde a sala de máquinas aos painéis de cada andar, já que são fechados com apenas 2 parafusos. Depois que começamos a pensar no todo, percebi que qualquer outro elevador um pouco mais novo dificulta o acesso aos botões, tem central digital e manutenção constante. Tudo que não queríamos. Se fosse pra envolver programações na central, datasheets, problemas de funcionamento no elevador e bate-boca com técnicos, tava fora de cogitação.
O nosso era perfeito para um hack! E seguro. A única coisa que precisávamos era apertar o botão do andar. Só precisávamos de algo wireless que fizesse esse enorme e complicado movimento que os seres humanos levaram séculos para desenvolver. Como não sabiamos com precisão as voltagens e amperagens do negócio, não dava pra fazer um circuito novo para trocar pelo botão. O mais simples era: chavear o botão com relê (lembrando que não altera em nada o funcionamento original do botão).
Fora o problema de acionar o elevador, também teríamos que saber se o elevador já tinha chegado no andar. Qual o ponto de chamar o elevador por email mas não saber se ele já chegou? Não podia ser só um receptor para ativar um relê, mas tinha que mandar dados também. Tem que transmitir, através de um sensor, se o elevador chegou. Daí, que tínhamos um par de Xbees sobrando, para emergências, e logo no primeiro teste dentro da Alice, o sinal nāo pegava depois dos 5m. Como o sinal era fraco, o próprio painel do elevador, feito de metal, era um ótimo isolante e diminuía ainda mais o sinal. Pegava e não pegava. Falhava e voltava. Já que era pra fazer, tinha que ser direito e o sinal tinha que ser estável. Podíamos usar Xbees mais fortes, mas comprar e esperar chegar novos componentes matava a gente de ansiedade de ver o negócio pronto.

Para esse momentos anti-ansiedade, tínhamos mais uma carta na manga, e agora o controle era total: YellowJacket. É o nome de uma pequena abelha, mas também é um Arduino + módulo wifi no menor form factor que existe. Muito menor que um shield ou um Arduino mini Pro + módulo wifi standalone. Sabia que seria útil algum dia. E já estava ali, em cima da mesa.
Para usar e configurar é bem simples, basta colocar o IP, nome da rede wifi, o protocolo de segurança e a senha. Quando ele entra na rede ele pode atuar como client (enviando dados pra server),como server (recebendo e mandando dados para client) ou como socket, fazendo basicamente o que você quiser. O mais fácil e rápido neste caso é o server, já que o client só transmite e o socket é muito low-level e precisaria de um protocolo, coisa que dava preguiça só de pensar.

Antes de entrar nos detalhes do software e hardware, veja um esquema do nosso plano:
Tudo começa no email. Quando alguém envia um email com subject "venha" para elevador@alicewonders.ws esse email "espera" no server. Um aplicativo em Flash, rodando em qualquer máquina, fica em loop verificando a caixa de email. Assim que detecta um email com o subject correto, o aplicativo acessa o IP do Yellowjacket, dentro da caixa do botão do elevador com a instrução "venha". O Arduino então aciona o relê e o elevador vem! O mesmo programa em Flash agora verifica em loop se o elevador chegou. Quando o elevador chega, um reed switch (sensor magnético mecânico que é acionado por um imã na roda de números dos andares, muda a variável elevadorChegou para 1. Quando isto acontece, o Flash envia um email com o subject: cheguei, em resposta para todos que enviaram um email.
Logo nos primeiros testes, o primeiro problema que apareceu foi com a library WiServer que é usada pelo YellowJacket e outros shields wifi para funcionar. Quando você faz o download dela pelo site da AsyncLabs, ela funciona em modo síncrono, ou seja, as coisas funcionam linearmente. Neste modo, primeiro o módulo se conecta e autentica na rede, depois o Arduino e outras coisas começam a funcionar. Se a conexão com a rede cai, ou o sinal enfraquece, tudo para no Arduino para que o módulo tente se conectar novamente. O Arduino fica congelado e não pode fazer nada até o módulo fazer a conexão voltar. Infelizmente, nos nossos testes, depois que a conexão cai, nunca mais volta. Acho que é alguma limitação do módulo ou da library. Procurando no Google, obviamente, outros tinham o mesmo problema.

Imagine o incômodo: você instala um microprocessador dentro do painel do elevador, e qualquer oscilação na rede wifi, faz o módulo perder a conexão com o mundo e travar. Para colocá-lo na rede de novo, tinha que desmontar (normalmente depois das 20h para não interromper o elevador no andar) e apertar o botão Reset do Arduino.

Não dava pra ser assim, tinha que rodar infinitamente e perfeitamente. Por isso, fizemos o seguinte:

Com a ajuda desse cara HRUSKA, adaptamos a library para funcionar de modo assíncrono, ou seja, as coisas funcionam em paralelo. Se a conexão cair, o Arduino fica esperando o módulo se conectar novamente por 90 segundos e se não voltar dá um reset no negócio todo. Assim, garantíamos que a conexão ia voltar. Veja no esquemático que o pino 6 está ligado ao pino de reset do Arduino. Quando queremos um hard reset no módulo e no Arduino, é só colocar o pino 6 para HIGH e voilá: famoso “desliga e liga da tomada”.

Então, se não tem conexão, o módulo fica dando reset de 90 em 90 segundos até encontrar alguma. Usamos o pino Analógico 5 (A5) ligado com um resistor pull-up ao pino de Reset. Veja na imagem:
Obs: para se conectar, autenticar e registrar o IP, o módulo leva de 45-60 segundos.

Se você for usar essa library para outros projetos ou outro hardware, faça o download da versão atualizada aqui . Essa library assíncrona dá muito mais controle para qualquer aplicação. (Veja no código a aplicação)

Outro detalhe: a cada 90 segundos, o módulo faz um request para google.com, assim o módulo e a nossa rede interna mantém tudo funcionando e ninguém “dorme” em serviço. Parece que se não fizer nada, o módulo entra em standby e a rede não reconhece mais o IP apesar dele se manter conectado.

Depois desses ajustes, não tivemos mais problemas e a conexão estava rock-solid!
Veja o código do Arduino completo:
Sobre a alimentação: Já que não podíamos usar baterias (elas não cabem no espaço apertado e, obviamente, elas se esgotam) fizemos nossa própria mini-fonte regulada, gerando uma tensão DC de 8v limpinha (Já que o Arduino trabalha com mínimo de 7v para regular para 5v), direto da tensão AC do elevador de 12v dentro do painel, no próprio andar.
O código do Arduino estava pronto e tudo funcionando perfeitamente, agora era hora do Flash! (Amamos o Flash e por isso resolvemos ressucitá-lo! Esse negócio de que Flash morreu, foi só para a web! Ainda é incrivelmente fácil e flexível para um milhão de outras aplicações fora da web. Além de poder fazer uma interfacezinha maneira, não precisamos ficar presos ao Terminal ou scripts Phyton!)
O plano para o Flash era o seguinte: usar uma library para se conectar no servidor de email, baixar mensagens, enviar instruções para o módulo no painel do elevador, aguardar o módulo retornar a informação se o elevador chegou e, por último, enviar o email de resposta.
O código é bem auto-explicativo e não tivemos muitos problemas com a execução. O Arduino se comunica com o Flash enviando as variáveis através de um web request simples. Quando o Flash acessa o endereço do módulo (ex. http://192.168.0.150), o YellowJacket retorna um HTML simples com as variáveis no formato: variavel1=1&variavel2=0. Podemos também controlar o módulo chamando outras URLs como por exemplo 192.168.0.150/reset ou 192.168.0.150/chama.

Se mais de uma pessoa chamar o elevador na mesma hora (ou depois que alguém já chamou mas ainda não chegou), o aplicativo guarda a lista de emails e reponde a todos que chamaram, assim ninguém fica sem resposta!

Veja o código do Flash:
Acho que é isso. Vou adicionar mais detalhes e sugestōes conforme elas chegarem. Temos algumas próximas idéias de gerar um widget e/ou app (c/ notification para Mountain Lion) para também chamar o elevador.

Quer trocar idéias?
www.facebook.com/eric.winck ou eric@alicewonders.ws

Valeu a todos que participaram! Especialmente: Ale pelas ilustrações, Carlos pelo desenvolvimento em Flash, Powerball pelo hardware e eletrônica e Gustavo pelo design de interface!











Uma observação: Sempre soubemos que não haveria risco nenhum para qualquer pessoa que estivesse usando o elevador enquanto a nossa geringonça estivesse funcionando. Em termos práticos, o módulo só chama o elevador como as pessoas fazem normalmente apertando o botão e não interfere no circuito principal de funcionamento.