segunda-feira, 19 de abril de 2010

Program-Me Diet Police

Está precisando perder peso mas não consegue? Chegou o Program-Me Diet Police.




Ele monitora e denuncia (via Twitter) os seus ataques à geladeira para seus amigos, familiares e até para o seu médico se o caso for mais grave! Dessa forma a turma toda te dá uma ajuda para controlar o peso. :)

Como funciona:

O circuito é bem simples, basta um Arduino, um shield ethernet ou Wi-Fi e um sensor reed desses utilizados em alarmes residenciais.



O sensor reed é um interruptor magnético formado por dois contatos metálicos montados dentro de uma cápsula de vidro preenchida com um gás inerte.









Quando submetido a um campo magnético os contatos se encostam estabelecendo um curto circuito entre os terminais do componente.





O campo magnético neste caso é gerado por um bloquinho que contém um imã permanente (lado direito da figura) que normalmente é fixado no batente da porta ou janela que queremos monitorar.






No nosso circuito vamos conectar o sensor reed entre a porta digital 3 (INT1) do Program-Me e o terra (GND) conforme diagrama abaixo:



Montamos então o sensor na porta da geladeira conforme imagem abaixo.



Toda vez que a porta for aberta, o bloco com o imã permanente se afastará do sensor reed que abrirá seu circuito e então será gerada uma interrupção (INT1) para o Arduino. No tratamento da interrupção programamos para que seja enviado um tweet para a conta que criamos para esta finalidade. Ai é só divulgar a conta no Twitter para os amigos.

A seguir temos o sketch (programa) completo para esta aplicação utilizando um shield Wi-Fi.



// Simples programa que envia um TWEET toda vez que recebe uma interrupção na porta 3 (INT1).

#include
#define WIRELESS_MODE_INFRA 1
#define WIRELESS_MODE_ADHOC 2

// Parametros de configuracao do shield WI_FI ----------------------------------------
unsigned char local_ip[] = {192,168,10,190}; // Endereco IP do Shield Wi-Fi
unsigned char gateway_ip[] = {192,168,10,1}; // Endereco IP do roteador ou gateway
unsigned char subnet_mask[] = {255,255,255,0}; // mascara de rede local
const prog_char ssid[] PROGMEM = {"GLOBALCODE"}; //identificador da rede
unsigned char security_type = 1; // 0 - open; 1 - WEP; 2 - WPA; 3 - WPA2

// WPA/WPA2 passphrase
const prog_char security_passphrase[] PROGMEM = {"**********"}; // maximo 64 caracteres

// chaves WEP 128-bit
prog_uchar wep_keys[] PROGMEM = { 0x58, 0xCA, 0x25, 0xAB, 0xE5, 0x88, 0xD0, 0x21, 0xE1, 0x9B, 0x39, 0xEA, 0xD9, // Key 0
0x58, 0xCA, 0x25, 0xAB, 0xE5, 0x88, 0xD0, 0x21, 0xE1, 0x9B, 0x39, 0xEA, 0xD9, // Key 1
0x58, 0xCA, 0x25, 0xAB, 0xE5, 0x88, 0xD0, 0x21, 0xE1, 0x9B, 0x39, 0xEA, 0xD9, // Key 2
0x58, 0xCA, 0x25, 0xAB, 0xE5, 0x88, 0xD0, 0x21, 0xE1, 0x9B, 0x39, 0xEA, 0xD9 // Key 3
};

// configuracao do modo wireless
// infrastructure - conexao com AP
// adhoc - conexao com outro dispositivo WiFi
unsigned char wireless_mode = WIRELESS_MODE_INFRA;
int quantidadeAberturas =0;
unsigned char ssid_len;
unsigned char security_passphrase_len;
// Fim dos parametros de configuracao Wireless ----------------------------------------


// string de autenticacao da conta no TWITTER
char* auth = "YXJkdWlubzpkaWV0cG9saWNl"; // Base64 encoded USERNAME:PASSWORD
#define REED 3

// Esta funcao gera a mensagem que sera enviada no tweet

void currentTime() {
WiServer.print("A geladeira foi aberta mais uma vez ");
// WiServer.printTime(millis());
}

// Requisicao que envia o tweet usando a funcao currentTime
TWEETrequest sentMyTweet(auth, currentTime);


void setup() {
// Inicializa o WiServer (passamos NULL para a funcao de servidor de pagina pois nesta aplicacao nao necessitamos servir paginas web)
WiServer.init(NULL);

// habilitamos a serial para debug e solicitamos ao Wiserver para gerar mensagens de log (opcional)
Serial.begin(57600);
WiServer.enableVerboseMode(true);

pinMode(REED,INPUT); //configuramos a porta 3 do Program-Me como entrada para o sensor reed
digitalWrite(REED,HIGH); // habilitamos os resistores de pull-up da porta 3.
attachInterrupt(1, interrupcao, RISING); // associamos a interrupcao INT1 (borda de subida) com a funcao "interrupcao"
}

void loop(){
// executa o WiServer
WiServer.server_task();
delay(10);
attachInterrupt(1, interrupcao, RISING );
}

void interrupcao() {
quantidadeAberturas=quantidadeAberturas + 1; //atualiza informacao de quantidade de aberturas da porta
detachInterrupt(1); //desabilita interrupcao durante envio do tweet
Serial.println("send TWEET"); //coloca mensagem na serial indicando que um tweet esta sendo enviado.
sentMyTweet.submit(); // envia o tweet
}



Um detalhe importante no sketch é que as informações de login da conta no Twitter devem ser colocados no formato “Base64 encoded”.

Ex: para o login “arduino” e senha “dietpolice” teríamos o seguinte:


//USERNAME:PASSWORD
//arduino:dietpolice convertido para Base64 ficaria : YXJkdWlubzpkaWV0cG9saWNl

Então a linha do sketch referente ao login no Twitter ficaria da seguinte forma:

// string de autenticacao da conta no TWITTER
char* auth = "YXJkdWlubzpkaWV0cG9saWNl"; // Base64 encoded


Para codificar as credenciais de login do Twitter para o formato Base64 existem várias páginas na web que facilitam essa tarefa.

Exemplo:
http://www.motobit.com/util/base64-decoder-encoder.asp

A tela abaixo mostra um log de debug da serial do Program-Me no momento em que um tweet é enviado :




Bem pessoal é isso, a ideia do monitoramento da geladeira é apenas uma forma de chamar a atenção, mas na verdade existem aplicações bem mais interessantes que podem ser implementadas utilizando o mesmo circuito, como por exemplo, monitoramento de acesso a certas dependências de uma empresa, alarmes residenciais e comerciais, e até mesmo monitoramento de um veículo (neste caso um shield GSM seria necessário). Também podemos substituir o sensor reed por um sensor de temperatura e gerar um tweet quando a temperatura de um ambiente alcançar um determinado valor.

[ ]s

José Luiz

5 comentários:

  1. Muito bom como sempre! Adorei esta implementação, e fica nítido que tem muitas outra possibilidades mais sérias com a mesma infra.

    Very good. Thank you.

    ResponderExcluir
  2. Mto legal o post, só uma pergunta, qual foi esse shield de wireless que você usou, e onde acho desse para comprar ? :D

    ResponderExcluir
  3. O shield utilizado é o Wishield 1.0 da Asynclabs.

    Você encontra ele a venda no sites abaixo:

    versão nova 2.0
    http://www.asynclabs.com/store?page=shop.browse&category_id=6

    versão 1.0 (igual a do POST)
    http://www.robotshop.com/asynclabs-wifi-shield-arduino.html

    ResponderExcluir
  4. show de bola...
    da para fazer muita coisa mesmo...
    não vejo a hora de chegar os Program-ME que encomendei para fazer umas brincadeiras.

    ResponderExcluir
  5. O problema (como sempre) é encontrar no Brasil a um bom (acessível) preço esse cara. No e-bay a versão 2.0 está 55 doletas =(
    Acho que vou ter que fazer com PICs mesmo meu dispositivo acessado pela rede doméstica.

    ResponderExcluir