Control My Garden… v0.2.3

Feb 23
2011

Sei que tenho mais uma vez andado desaparecido daqui do estaminé, mas é porque ao mesmo tempo ando com outros projectos que interagem nao so com o Arduino mas com o nosso dia a dia.

Deem uma olhadela ai no Coisas, Projectos e Ideias 😉

enfim… lembram-se do Save My Plant?

Pois bem, tal como tinha falado espandiu-se ao quintal la de casa e agora chama-se “Control My Garden” e mostra isto:

As funçoes dele sao:

  • Status
  1. Humidade da Terra na SFG
  2. Temperatura no Jardim
  3. Movimento no quintal
  4. Valores actualizados para o Pachube.com ( ver feed do estado do nosso SFG)
  • Automatismos
  1. Rega automatica de todo o quintal
  2. Sensor de Movimento (para manter os animais afastados da horta!!)
  3. Tweets com Reports Diarios do estado da Horta
  4. Tweets em caso de falta de agua ou de movimento no quintal.
  • A implementar:
  1. Nivel da agua nos barris da chuva
  2. Ligar e desligar a bomba que irá tirar a agua dos barris para a horta
  3. Menus no LCD ( para ligar rega, para outros status, etc)
  4. outras ideias 😉

O codigo ja sofreu diversas alteraçoes, e agora estou com um problema de incompatibilidades entre o Twitter lib e o Time lib, ou seja se tenho os alarmes configurados o twitter crasha-me o Arduino se nao tenho alarmes nao tenho uma maneira “precisa” de obter relatorios…

Entretanto hoje adicionei o Pachube.com porque como o pais anda em crise não queremos ter computadores ligados em casa 24×7. Vou testar hoje a noite.

As caixas ainda não estão todas bem colocadas mas isto funciona ao estilo do Gardenbot por módulos, sendo que:

  1. o Cerebro a caixa onde esta o Arduino com um Ethernet over Powerline, que me permite ter o arduino em qualquer parte, seja no telhado, no quintal, na garagem, etc, desde que tenha ponto de electricidade, pumba funciona.
  2. o Centralizador que é a caixa onde se ligam os sensores e que depois segue para o Cerebro
  3. os Sensores que é o conjunto de sensores (humidade, temperatura, movimento, nivel da água)
  4. o LCD que é a imagem que esta ai em cima e esta ligado por um cabo RJ45 ao Cerebro e me da o status do jardim.

Todos este modulos sao ligado atravez de RJ45, basicamente porque tenho la pazadas de cabos de rede compridos e 8 cabos dentro de um so torna-me a vida muito mais facil 😉

Ainda dentro do armario onde temos o Cérebro temos duas valvulas solenoides com os respectivos relays para controlar o sistema da rega que esta em standby devido a incompatibilidade ja antes mencionada entre a Twitter Lib e a Time Lib.

Depois meto aqui um desenho bonito de como tudo esta montado bem como o codigo, se hoje o conseguir por a funcionar a 90%…

NOTA: Cheguei a conclusão que tenho que comprar mais um sensor de movimento e fazer comparações entre os dois sensores porque está me a dar muitos Falsos Verdadeiros devido a excelente sensibilidade do sensor….

LM35 + Ethernet Shield

Feb 15
2011

Depois vou falar mais sobre isto, mas para ja o que vos posso dizer é que ligando o sensor LM35 ao pin 1 aquilo da temperaturas altamente erradas…aparentemente é um incompatibilidade em partilhar o Analog Pin com o sensor e com a Ethernet Shield…

Pensavam que ja nao andava por ca nao era? 😉

Na realidade ando, mas como tenho andado de volta de outros projectos da vida, nao me tem sido possivel dedicar tanto tempo ao Arduino como gostava…posso inclusive dizer que tenho vários projectos parados por falta de tempo….

Para ja estou apenas a trabalhar no “Save My Plant” que passou a chamar-se “Control My Garden” e vai ter funcionalidades um pouco diferentes das do Save My Plant que era mais indicado para plantas indoor, este é mais virado para hortas e quintais com relvas e afins 🙂

Um dos acrescentos é esta maravilha:

PIR Motion Sensor – Que vai implementar o modulo para “assustar” os animais que possam querer entrar na horta e dar-me cabo dos morangos 🙂

Mais uma vez depois dou mais detalhes…

Save My Plant…v0.5

Jan 14
2011

…por enquando ainda so é a Versão 0.5! E porque? Porque na realidade nem eu sei o que quero fazer com o projecto…

Para terem uma ideia ontem assim do nada decidi adicionar o relay para controlar as luzes e hoje o codigo ja mudou quase todo…

Mas como prometido fica aqui uma pequena descrição do que o projecto ja faz e o que gostava ainda de colocar a fazer…

Ora bem o que já faz é:

  • Status de Manhã e a Noite sobre a Humidade da Planta via Twitter
  • Leituras da Humidade da Planta de 2 em 2 minutos.
  • Liga e desliga as luzes durante determinado tempo.
  • Status do Estado da Luz via Twitter
  • Dados sobre as horas de luz inseridas na BD
  • Alertas Criticos de estado da humidade via Twitter baseado em tres estados (Ver estado da Agua, Falta de Agua, Estado Critico)

O que gostava de colocar a fazer:

  • Validação da quantidade de luz na sala e em caso de falta, acende luz artificial para compensar as 16Horas de luz necessárias.
  • Rega automatica com sensor de quantidade e failsafe, não quero inundar a casa 😛
  • Mais sensores de Humidade, o vaso é grande…
  • Sensor de Temperatura
  • Mais qualquer coisa que me lembre…
  • ..

Para ja esta tudo ligado com cabos espalhados, mas a ideia é fazer uma caixa com tudo la dentro inclusive o Arduino sendo que apenas tem as entradas para o necessario, nomeadamente:

  • 2 x Fichas de 220V (Bomba de Rega e Luz)
  • 1 x Ficha de Alimentaçao do Arduino
  • 1 x Ficha de Rede para ligar o arduino ao Servidor

Apenas um pequeno screen shot de um dos gráficos gerados:

Nota: É engracado notar que quando passa dos 600 para baixo a velocidade com que a terra seca é muito mais rápida, mas ate chegar aos 600 aguenta-se bem umas duas semanas…

Enfim..mais pormenores ficam para a semana que agora vou de fim de semana com a Faneca e deixo @OFaneco a tomar conta da Bonsai… 😉

Sleep Analyzer – Os resultados e conclusões!

Dec 23
2010

Ora bem…

Em primeiro lugar e para quem leu o meu post de ontem, Não, não fiquei electrocutado nem me enrolei durante a noite na catrefada de cabos que tinha a minha volta ontem. Podem ver quais eram neste post.

Ontem la dormi com o meu sensor ultra-mega profissional e preso de maneira ainda mais profissional, agarrado ao meu braço, e as conclusões de facto sao melhores.

A primeira conclusao quando olhei para os graficos foram:  EU mexo-me bastante durante o sono! Mesmo muito, mas efectivamente ja se consegue ver quando é que estou a dormir, quando é que me viro e com alguma atenção ate quase que se consegue ver para que lado me virei, mas para isso ja existem outros testes…

Vamos então aos graficos:

  • X

  • Y

  • Z

Como da para perceber, alem do que ja disse que me mexo muito, é que a altura em que dormi mais tempo seguido e mesmo assim com alguns movimentos, foi entre as 00:18:48 e as 2:15:07 porque a partir dai apesar de ter alguns momentos mais quieto, nota-se que virei muito, seja o braço ou o corpo todo.

Depois ali por volta das 5:48:47 começo a mexer muito mas é normal, porque o meu despertador toca às 5:50:00 e hoje fiz snooze ai umas 3 vezes 😛 ou seja ate o gráfico acabar, já não foi um sono calmo.

Notas e Conclusões Finais:

  1. Uma vez que o sensor nao estava bem preso ao corpo os dados podem ser influenciados.
  2. Devia ter mais do que um sensor, por exemplo na perna. Esta parte é para o proximo teste 😉
  3. Vou tentar convencer a Faneca a deixar-me fazer-lhe o teste para compararmos os dados obtidos.
  1. Desta vez usei os dados todos para gerar os gráficos e espantosamente ate foram gerados com “alguma” rapidez no Excel 2011 para Mac, considerando que são 378491*4 Entradas (Time;X;Y;Z) = o que originou um .csv com 8.3MB.
  2. Porque tantas entradas? Porque mudei o delay para 50 millisegundos a escrever num sd card, e sim, ele aguenta-se bem, apesar de que se nota que falha ali algumas entradas.
  3. Um ponto  testar é para a próxima colocar a enviar directamente para a BD dando-me assim uma maior quantidade de dados por segundo.

Para acabar:  No geral estou bastante satisfeito com os resultados, e como ja passei de volta de este projecto durante uma semana, esta na hora de partir para outros projectos ficando este sempre como um projecto a acabar.

Fiquem para ver os novos projectos e comentem este com ideias e sugestões 😉

No final de contas, o que vos quero dizer é “BONS SONHOS” 😉

Sleep Analyzer – 2º Prototipo

Dec 22
2010

O segundo prototipo ja esta feito, eu sei continua a ser algo muito arcaico mas penso que com esta versão vou poder ter mais dados.

Hoje passei na Dimofel para comprar uma breadboard pequena para fazer uma especie de sensor “remoto”, e depois quando ia para comprar cabos, lembrei-me que o sensor tem nada mais nada menos do que 8 ligações, e eis que se fez luz, quais sao os cabos que tenho prai a pazada que tem oito cabos la dentro? isso mesmo um cabo UTP…

Depois de um bocado a montar tudo e mais uma vez com a excelente ajuda da Faneca, la consegui ligar os cabos todos e por isto a funcionar. A ajuda da Faneca, foi porque como sabem sou “Estupidamente Daltónico”.

Este foi o resultado, a bolsa tem o “patrocinio” da Meo e veio do Codebits2010.

Agora a parte engraçada vai ser arranjar maneira de por o sensor agarrado ao braço, e isto porque me esqueci/nao tive tempo de ir comprar uma daquelas bandas dos iPods para jogging. Ora lá terei que recorrer ao melhor amigo do engenhocas, que é?

Isso mesmo, fita cola em quantidades massivas, so espero durante a noite nao ter que ir ao WC :S senao la se vao os dados todos pelo cano abaixo…

Amanha ja devo ter dados mais concretos dos movimentos que faço durante a noite. É so verem em Projectos – > Sleep Analyzer

Agora vou dormir que tenho sono… Ate amanhã.

ps: a Faneca esta preocupada que eu fique “electrocutado”…

Sleep Analyzer – O Projecto

Dec 22
2010

Ja esta ai ao lado o projecto “finalizado” mas com alguns pormenores ainda a resolver..

Como sempre sugestoes e ideias sao excelentemente bem vindas.

Mais uma vez quero agradecer a Faneca pelo excelente logotipo que me fez para este projecto.

SleepAnalyzer

ps: depois falo mais, mas agora tenho que ir para um almoço de natal 😉

Save My Plant

Dec 16
2010

Ora ai está…

Brevemente…toda a informção sobre um dos meus projectos.

Inicialmente o nome deste projecto era para ser “Save a Plant…By Twitter” mas apos conversa com a Faneca chegamos a conclusão que assim ficava melhor.

O logotipo é da autoria da minha Faneca!

Fiquem atentos, nos proximos dias irá sair toda a info de como fiz, o que li, o que ainda nao fiz e o que gostava de fazer, mas nao tenho orçamento 😉

Temperatura+Arduino+Mysql=RDDTool

Dec 10
2010

Epa…tanta coisa num so titulo… a realidade é que é mesmo tudo isso que tenho andado a montar nos últimos dias. Isto porque temporariamente tive que, devido a falta de peças, abandonar o projecto Good Morning Dave, e focar-me mais no projecto “Save a Plant…by Twitter”.

Para aqueles que me seguem no twitter, ja perceberem que o arduino ja esta a mandar tweets com alguns bitaques, nomeadamente, as horas e a temperatura da sala, por isso ja posso dizer que a primeira parte do projecto “Save a Plant…by Twitter” estava feita, ou seja a parte do Twitter.

Por isso a segunda parte da ideia era de colocar os dados dos varios sensores numa base de dados para poder com esses dados gerar uns graficos todos bonitos, e poder fazer umas estatisticas caso seja necessario. Nao sou fã de estatisticas, mas ei, porque nao prevenir ja.

Mais uma vez, tudo parecia facil, era so montar um Webclient no Arduino e invocar um php ou um cgi que fazia a parte da inserção dos dados na BD(mysql)…mais uma vez erradoooo….

Eu em casa, por motivos de poupança de electricidade não tenho nada de servidores ligados, e isto porque um dia recebi um acerto da EDP de 370€ de luz e achei que estava na altura de NÃO ter servidores em casa, por isso surgia aqui o primeiro problema, que era onde é que vou por uma BD de mysql  e correr os scripts. Bem, a hipótese mais simples era usar este mesmo site, uma vez que tem tudo o que preciso, posso correr scripts, tenho BD!

Surgia aqui o meu segundo problema…DNS, por isso rapidamente abandonei a ideia de usar este estaminé. Num outro post falarei de porque abandonei o DNS.

Bem..tem que ser, vamos instalar um linux ca por casa com Mysql+Php+Perl+Apache+RDDTool+alltherest.

Esta foi a parte facil, demorou cerca de 1 hora e pumba tinha o servidor pronto, agora era so começar a inserir os dados na BD.

Para quem nunca usou o arduino para inserir dados extraidos de um sensor numa base de dados, o melhor é começar por fazer um webclient usando um dos exemplos e depois esquecer tudo aquilo que viu..wait!!?! say what!?!? pois isso mesmo, é que um dos maiores problemas que tenho tido com os exemplos é que sao quase sempre apontados para coisas com a Serial Port e eu quero mesmo é coisas que nao usem a Serial Port mas sim variaveis and stuff..

Depois de muito pesquisar e muito bater com a cabeça eis o codigo que usei para retirar os dados do sensor de temperatura que ja falei anteriormente e inserir na BD.

#include 
#include 
#include 
#include 
 
byte mac[] = { 0xDE, 0xDE, 0xBE, 0xEF, 0xFE, 0xED };
byte ip[] = { 192, 168, 2, 177 };
byte server[] = { 192, 168, 2, 70 }; // DB
 
Client client(server, 80);
 
// Time Settings
byte SNTP_server_IP[]    = { 81, 92, 212, 46 }; // 3.pt.pool.ntp.org
time_t prevDisplay = 0; // when the digital clock was displayed
const  long timeZoneOffset = 0L; // set this to the offset in seconds to your local time;
 
// Temperature
int analoginput=0;
int value=0;
int R1=1000;
int Vin=5;
float tmp=0.0;
float Vout=0.0;
float f=0.0;
int lastTempReport = 0;
int currentTempReport = 0;
 
// Clock
int hora, minutos, ano, mes, dia;
 
int ID=69; //sensor ID
 
void setup()
{
  Ethernet.begin(mac, ip);
  Serial.begin(9600);
 
   //Clock Begin
  Serial.println("waiting for sync");
  setSyncProvider(getNtpTime);
  while(timeStatus()== timeNotSet)
    ; // wait until the time is set by the sync provider
 
}
 
void loop()
{
      addDB();
}
 
void addDB() {
 temperatura();
  int currentHumReport=10;
  Serial.print("CurrentHumReport");
  Serial.println(currentHumReport);
  delay(1000);
   char date[144] ="";
   char horas[144] ="";
   ano=(year());
   mes=(month());
   dia=(day());
   hora=(hour());
   minutos=(minute());
 
   sprintf(date, "%.2d-%.2d-%.2d", ano, mes, dia);
   sprintf(horas, "%.2d:%.2d", hora, minutos);
  if (client.connect()) {
    Serial.println("connected");
    delay(1000);
    client.print("GET /cgi-bin/sensor/inserir.cgi?date=");
        Serial.print("GET /cgi-bin/sensor/inserir.cgi?date=");
    client.print(date);
        Serial.print(date);
    client.print("&time=");
        Serial.print("&time=");
    client.print(horas);
        Serial.print(horas);
    client.print("&id=");
        Serial.print("&id=");
    client.print(ID);
        Serial.print(ID);
    client.print("&temperatura=");
        Serial.print("&temperatura=");
    client.print(currentTempReport);
        Serial.print(currentTempReport);
    client.print("&humidade=");
        Serial.print("&humidade=");
    client.print(currentHumReport);
        Serial.print(currentHumReport);
    client.println(" HTTP/1.1");
        Serial.println(" HTTP/1.1");
    client.println("Host: arduino.rechena.com");
        Serial.println("Host: arduino.rechena.com");
    client.println("User-Agent: Arduino");
        Serial.println("User-Agent: Arduino");
    client.println("Accept: text/html");
        Serial.println("Accept: text/html");
    client.println("Connection: close");
        Serial.println("Connection: close");
    client.println();
        Serial.println();
  }
  else {
    while (client.connected() && client.available()) {
      char c = client.read();
      Serial.print(c);
    }
  client.stop();
  delay(5000);
}
}
 
void temperatura () {
 
  Vout=1023-analogRead(0); // Invert the number because of setup
  Vout=(Vout/1024.0)*5;
  f=1000*exp(-20000/298.15); // 298.15K = 25C, 20000 seems to be the B value for a standard 1kOhm NTC
  tmp=(R1*Vin)/Vout-R1;
  value=(20000/log(tmp/f))-273.15;
   currentTempReport = value+7;
}
 
/*-------- NTP code ----------*/
 
unsigned long getNtpTime()
{
  sendNTPpacket(SNTP_server_IP);
  delay(1000);
  if ( UdpBytewise.available() ) {
    for(int i=0; i < 40; i++)
       UdpBytewise.read(); // ignore every field except the time
    const unsigned long seventy_years = 2208988800UL + timeZoneOffset;
    return getUlong() -  seventy_years;
  }
  return 0; // return 0 if unable to get the time
}
 
unsigned long sendNTPpacket(byte *address)
{
  UdpBytewise.begin(123);
  UdpBytewise.beginPacket(address, 123);
  UdpBytewise.write(B11100011);   // LI, Version, Mode
  UdpBytewise.write(0);    // Stratum
  UdpBytewise.write(6);  // Polling Interval
  UdpBytewise.write(0xEC); // Peer Clock Precision
  write_n(0, 8);    // Root Delay & Root Dispersion
  UdpBytewise.write(49);
  UdpBytewise.write(0x4E);
  UdpBytewise.write(49);
  UdpBytewise.write(52);
  write_n(0, 32); //Reference and time stamps
  UdpBytewise.endPacket();
}
 
unsigned long getUlong()
{
    unsigned long ulong = (unsigned long)UdpBytewise.read() << 24;
    ulong |= (unsigned long)UdpBytewise.read() << 16;
    ulong |= (unsigned long)UdpBytewise.read() << 8;
    ulong |= (unsigned long)UdpBytewise.read();
    return ulong;
}
 
void write_n(int what, int how_many)
{
  for( int i = 0; i < how_many; i++ )
    UdpBytewise.write(what);
}

Como podem ver o código é bastante simples. E funciona, a parte da BD não vou explicar com muito detalhade, ate porque o que não falta por ai são howtos de mysql e podem querer usar outras BD’s. Mas assim por alto tem uma tabela com um ID, Data, Hora, SensorID, Temperatura, Humidade. Algo importante é que o ID seja do tipo auto-increment, porque facilita bastante depois o tirar os dados para inserir nos gráficos de RDDTool.

Para a parte de tirar os dados da BD tambem nao vou falar nisso porque eu usei perl, muitos preferem php, python, etc, por isso em vez de criar uma guerra, usem cada um o seu. Se quiserem que mande os scripts e o export da bd que usei, avisem ai nos comentários ou email. Aviso que não é um codigo bonito, mas funciona 😉

Um pormenor importante, eu insiro da hora e data na BD directamente do arduino, podem cortar este passo e usar o proprio script que invocam no servidor, sempre torna o sketch do arduino mais leve, mas eu como quero depois usar este sketch para outros projectos onde me convém ter a hora e data directamente no arduino, vou usar assim, e não noto muita diferença em ter e não ter a hora/data no arduino. Também nao uso tudo directamente no void loop() por motivos de arrumação, assim quando quero fazer testes basta retirar a invocação do void especifico do loop e pumba esta a funcionar, ou nao…

Os graficos:

Nao é mais do que um rrdtool que recebe dois valores, um da temperatura e um da humidade e gera o grafico. Mas ei, funciona e faz gráficos, claro que se pode melhorar alguns pormenores, mas isto ainda é um prototipo do prototipo.

Peças necessarias:

1- Arduino

2- Sensor de Temperatura

3- Ethernet Shield

4 – Servidor com mysql+rrdtool+apache+etc

5- Tempo e paciencia.

No geral é tão simples quanto isto:

1 – Saca os dados do sensor
2- Formata os dados dos sensores
3- Insere os dados na BD do servidor
4- Formata os dados no servidor
5- Gera um grafico.

Como sempre, convém avisar que não percebo nada disto, e não me responsabilizo de usarem o meu código e derem cabo de qualquer coisa no vosso servidor ou no vosso arduino ;). Duvidas e sugestões, como sempre são muito bem vindas.

No futuro a ideia é usar o SD card do ethernet shield como backup caso a BD esteja em baixo, ou simplesmente tirar a BD da equação e guardar tudo no SD card e ir uma vez por dia via script buscar os dados ao SD card…

Good Morning Dave…

Dec 02
2010

Apenas uma brincadeira, para mostrar que o projecto Good Morning Dave esta em desenvolvimento e ja tem a parte “melancólica” da coisa feita…

A voz é tirada de um Anuncio da Apple, pelo menos é o que dizia no video do youtube…espero nao ter problemas com direitos de autor…

Divirtam-se

O código para fazer isto no arduino é das coisas mais básicas e vem no livro “Getting started with Arduino, para quem não tem o livro, pode ver os exercícios aqui – Makezine .

Projecto – Good Morning Dave

Nov 25
2010

Bem…

Para os que conhecem o filme, ja reconheceram de certeza a frase que menciono em cima, para os que nao conhecem, deviam ter vergonha, aqui fica o link – 2001 A Space Odyssey.

Bem, mas vamos ao que interessa.

O projecto  nao é nada mais nada menos do que um HAL9999 (vao ver o link do filme novamente se nao perceberam) que quando chegamos a casa nos sauda…Daí o “Good Morning Dave”.

E o que é que isto tem a ver com o Arduino?

É simples, tudo isto irá ser construido com a ajuda dessa maravilha da prototipagem que é o Arduino

Peças necessárias:

1- Arduino Uno

2- RFID Reader ID-20

3- RFID Tag – Key Fob

4- Muita Leitura (Google)

5- Alguma paciencia

6 – E mais alguns promenores que ainda me falham, nomeadamente como é que vou por o servidor da sala a falar, quem é que vou usar para gravar as vozes, etc etc etc…

Mas para ja é um começo…

Vamos ver como corre… stay tunned…

Follow Me