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….

MQ-7 Carbon Monoxide Sensor

Jan 11
2011

Inicialmente tudo parecia indicar que iria ser mais um sensor que mandava ca para fora o output em V e era so uma questao de os converter para ppm (partes por milhão)…pois…e como nao podia deixar de ser estava redondamente enganado…

Enfim…para quem decidir comprar este sensor cuidado, porque não é tao simples como aparenta, e so apos ter lido com mais atenção o Datasheet dele é que reparei que afinal, nao é so ligar e ja está.

Então que é que é preciso fazer? Segundo os senhores que fizeram o MQ-7 isto é um sensor que funciona por aquecimento a 5V sendo que quando esta a aquecer absorve todos os gases que possam existir ao lado dele mas, e agora vem a parte importante, depois de estar aquecido durante 60 segundos, tem que se baixar para 1.4V durante 90 segundos, e é nesta altura que se pode então tirar os dados de leitura sobre o CO que anda no ar… ora isto é um bocado chato né? entao so posso ter contagens de 2:30 em 2:30 minutos?!?!

Apos ter lido mais um pouco percebi, que ISTO é a maneira indicada, para ter dados mais viáveis e acima de tudo aumentar a vida do sensor, como o projecto em que o estou a meter não vai estar ligado 24x24x7 posso bem viver com estar a constantes 5V e os valores ja me agradam mais, sendo que fiz alguns testes com incenso (ficou ca um cheirinho a limão na garagem que nem vos digo) e com um cigarro e realmente ele detecta que ha fumo nas redondezas, de resto tem um comportamento bastante estável, ou seja não tem variações… por isso siga…

(Depois meto aqui um grafico que fiz com o sensor)

Entao agora que ja decidimos que isto é para funcionar a 5V o que é que vamos fazer?

Simples: Wiring Example é so seguir as instruções.

Eu pessoalmente nao liguei assim, mas porque comprei a Pololu MQ Gas Sensor Carrier e soldei tudo bonitinho e ficou com este aspecto:

Nota: Caso andem a porrada, tal como eu andei, sobre que lado é A e que lado é B, nao percam tempo, porque la perdido no meio do Datasheet menciona algo muito importante, o sensor é assimétrico, ou seja liguem de que maneira ligarem o importante sao os pins do meio que são os que transmitem os dados, isto usando a Breakoutboard que comprei também quando comprei o sensor na Inmotion.pt:

A resistencia, usei uma de 10K que é o que recomendam para começar na Datasheet.

Em seguida, é so colocarem o seguinte codigo no vosso arduino:

int sensorValue; 
 
void setup()
{
  Serial.begin(9600);      // sets the serial port to 9600
}
 
void loop()
{
  sensorValue = analogRead(0);     // read analog input pin 0
  Serial.print(sensorValue, DEC);  // prints the value read
  Serial.print(" ");	   // prints a space between the numbers
  delay(100);              // wait 100ms for next reading
}

E usarem qualquer fonte de fumo para fazer os testes. O ideal é usarem o processing para verem os valores a subir e a descer mas graficamente, como se costuma dizer o Tuga come com os olhos ;).

E pronto, isto é como fazer com 5V permanentes, mas se quiserem fazer com o circuito como manda a datasheet, e perceberem mais de electronica que eu, o que vos recomendo é que deem uma olhadela neste site, Citizen Sensor que tem umas board que envia para PT ja o kit completo para montar por uns modicos $32 USD. E que faz o tal circuito de liga e desliga usando para isso o PWM do arduino.

E escusam de tentar ligar directamente o VCC do sensor ao PWM do arduino e mandar via codigo o HIGH e o LOW, que nao funciona, os pins PWM nao teem mAmps suficientes para aquecer o sensor, teem mesmo que fazer um circuito. Se entretanto tiverem uma maneira mais pratica de fazer o circuito para isto dos 5v vs 1.4V avisem porque estou sempre a procura de novas ideias.

Ate lá, divirtam-se 😉

Ha ja me esquecia…ainda falta a parte de converter de V para PPM, mas isso vou tentar fazer usando um sensor de CO que ja esteja calibrado que é o que aconselham.

ATENÇÃO: Como bombeiro sou obrigado a dizer isto, mas as intoxicaçoes por monoxido de carbono sao das mais perigosas deixando sequelas para SEMPRE, por isso seja com incenso, fumo da lareira ou qualquer outro fumo, façam os testes sempre num local arejado, nao é por terem uma porta aberta que o sensor vai mudar os dados, eu sei porque fiz os dois testes, mas eu sou bombeiro, por isso posso fazer os testes a porta fechada 😛

LCD Nokia 5110

Jan 05
2011

..como tinha prometido, aqui fica o meu post/tutorial de como colocar este rapaz a funcionar…

Ora bem, depois de alguns mails trocados com quem de direito, aka Filipe Valpereiro e Carlos Rodrigues la consegui por isto a funcionar, mas a realidade é que tive “sorte”.

Sorte porquê? porque devido a não ler tudo ate ao fim podia ter queimado o LCD assim sem mais nem menos, é que este menino funciona a 3.3V e quando se diz 3.3V SAO mesmo TODOS OS PINS, nao é so o VCC…e eu como sou toto nao sabia disso. Devia ter lido o Datasheet!!

Mas felizmente nao queimou e a prova disso é que no dia 31 mandei um tweet com uma imagem do LCD a dizer HAPPY NEW YEAR, hehe…para fugir um pouco ao clássico “Hello World”.

Bem ja chega de conversa e vamos ao que interessa. Existem duas maneira de ligar isto a correcta e que funciona, e a menos correcta, mas que continua a funcionar…ainda estou a espera de ter confirmação se é seguro usar assim.

Para ja vao precisar da seguinte lista de material:

  • 1 x Nokia 5110 LCD
  • 6 x Resistencias de 10K
  • 8 x Jumper Cables
  • 1 x Arduino

Nota: se usarem um arduino que funcione a 3.3V nao precisam de resistencias, podem ligar o LCD directamente!

Depois de terem este material todo é so ligarem os pins com a seguinte ordem:

Nota: Estas ligaçoes sao especificamente para o Nokia 5110 LCD se usarem outro convem verem os pins que veem indicados “normalmente” por tras da board do LCD. no meu caso vinham e sao estas:

O que da as seguintes ligaçoes:

  • LCD —– > Arduino
  • 1 ———> 3.3V
  • 2 ———> GND
  • 3 ———> D7
  • 4 ———> D6
  • 5 ———> D5
  • 6 ———> D4
  • 7 ———> D3
  • 8 ———> (Este eu não liguei porque são os leds do LCD, mas por motivos de teste podem ligar em qualquer um desde que o PIN esteja HIGH)

E afinal onde é que colocamos as resistências???

Ok aqui entra a minha duvida, que talvez quem perceba mais de electronica possa esclarecer, ha duas maneiras de ligar, eu para ja estou a usar uma que assume que a board do LCD tenha um Diodo que assegura que nao queima, mas ha maneiras mais correctas segundo me informou tanto o Filipe Valpereiro com o Carlos Rodrigues, estes dois a quem gabo a paciência para me aturarem os mais 😉 eu ja tinha metido um filtro para spam para mim mesmo…hehe..

O melhor mesmo é verem este Tutorial da Sparkfun que explica tudo como devem fazer, e depois se não vos agradar ou quiserem arriscar fazer a minha maneira passem para o parágrafo seguinte.

Eu liguei metendo nada mais nada menos do que uma resistência de 10K entre cada pin do LCD e cada pin do Arduino, e ei esta a funcionar as mil maravilhas, pelo menos por enquanto ainda nao vi fumo, seja ele branco ou de outra cor qualquer… Por isso voces é que sabem, é a vossa responsabilidade!

Note-se que este desenho é apenas a titulo ilustrativo e a minha primeira experiencia, falhada, diga-se de passagem 😉 com o Fritzing, mas da para perceberem a ideia…

Apesar de so estarem 6 resistencias se quiserem ligar o Pin 8 do LCD (LED) ao arduino o esquema é o mesmo, é so meterem la uma resistencia de 10K.

Em seguida depois de tudo ligado e conferido, so teem que sacar a LIB Arduino Library ( Thanks to Carlos Rodrigues) instalarem no vosso local do costume, e carregarem o exemplo que vem com a LIB ou simplesmente copiarem o seguinte sketch.

/*
 * PCD8544 - Interface with Philips PCD8544 (or compatible) LCDs.
 *
 * Copyright (c) 2010 Carlos Rodrigues
 *
 * Permission is hereby granted, free of charge, to any person obtaining a copy
 * of this software and associated documentation files (the "Software"), to deal
 * in the Software without restriction, including without limitation the rights
 * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
 * copies of the Software, and to permit persons to whom the Software is
 * furnished to do so, subject to the following conditions:
 *
 * The above copyright notice and this permission notice shall be included in
 * all copies or substantial portions of the Software.
 *
 * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
 * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
 * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
 * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
 * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
 * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
 * THE SOFTWARE.
 */
 
/*
 *
 * Since these LCDs are +3.3V devices, you have to add extra components to
 * connect it to the digital pins of the Arduino (not necessary if you are
 * using a 3.3V variant of the Arduino, such as Sparkfun's Arduino Pro).
 */
 
#include
 
// A custom glyph (a smiley)...
static const byte glyph[] = { B00010000, B00110100, B00110000, B00110100, B00010000 };
 
static PCD8544 lcd;
 
void setup() {
  // PCD8544-compatible displays may have a different resolution...
  lcd.begin(84, 48);
 
  // Add the smiley to position "0" of the ASCII table...
  lcd.createChar(0, glyph);
}
 
void loop() {
  // Just to show the program is alive...
  static int counter = 0;
 
  // Write a piece of text on the first line...
  lcd.setCursor(0, 0);
  lcd.print("Hello, World!");
 
  // Write the counter on the second line...
  lcd.setCursor(0, 1);
  lcd.print(counter, DEC);
  lcd.write(' ');
  lcd.write(0);  // write the smiley
 
  delay(500);
  counter++;
}

E se de facto tiverem tudo bem ligado deverá aparecer um glorioso “Hello World” no vosso lcd com um pequeno smiley e um numero a incrementar.

Confesso que a mim não me aconteceu isso da primeira vez, porque primeiro como ja mencionei estava a ligar a 5V e segundo porque não estava a olhar correctamente para os pins de um lado e de outro.  Por isso em caso de duvida ligem usando este esquema que aqui vos coloco.

Se por acaso, depois quiserem mudar a ordem dos pins no Arduino, teem que alterar directamente na lib PCD8544.h que tem quase no incio algo tipo

// The pins used by this library...
#define PCD8544_SCLK  8  /* clock       (display pin 2) */
#define PCD8544_SDIN  4  /* data-in     (display pin 3) */
#define PCD8544_DC    5  /* data select (display pin 4) */
#define PCD8544_RESET 6  /* reset       (display pin 8) */
#define PCD8544_SCE   7  /* enable      (display pin 5) */

E que como podem constatar este é o meu, e ja foi alterado. mudei o pin 3 para pin 8 uma vez que estou a usar o pin 3 para outra shield.

E pronto, penso que mais simples que isto não pode ser, é mesmo como dizem no site, “Plug and Pray” 😉

Como sempre dúvidas, ajudas e mais importante sugestões são muito bem vindas…

Xbee as aventuras.

Dec 18
2010

Como ja tinha dito num post anterior, aqui ficam as minhas aventuras e desaventuras com os Xbee’s Pro 2.5…

Tudo indicava que nao ia ser dificil, mas como tudo o que ja tenho feito com arduinos, acabou por ter alguma dificuldade, nada de grave, mas mesmo assim deu trabalho.

Um dos principais problemas com os novos xbee’s que nao acontecia com os antigos, é que antes de se usar tem mesmo que se fazer algumas alterações, ou seja tem que se configurar um como ZNET COORDINATOR 2.5 AT e o outro como ZNET 2.5 ROUTER/END DEVICE AT, e apesar de podermos ter um enorme numero de xbees em rede, tem sempre que haver um COORDINATOR.

Mas ainda antes disto tudo, temos que arranjar maneira de configurar os mesmos, e para isso precisamos de um software muito importante que é o X-CTU, que é um software gratuito, mas que tem o enorme inconveniente de so funcionar em windows…tambem podem usar em wine, li de casos de quem tenha instalado VirtualBox no macOS e depois tenha instalado Linux e corrido o x-ctu com Wine…ora que grande volta que foram dar, mas hei, como eu costumo dizer, “Funciona!!” e isso é o que interessa. Eu no meu caso usei com Windows em VirtualBox.

Abrindo o X-CTU aparecia o meu primeiro problema, que era nao conseguir fazer update de firmwares e softwares que ficam guardados no X-CTU para upgrade respectivo do xbee que cada um tiver. É ainda importante sacar os drivers para FTDI que estao tambem na pagina que mencionei acima do X-CTU porque o windows por qualquer motivo nao reconhecer a emulaçao de serial port que a Xbee USB Explorer faz.

Tendo isto tudo instalado vamos entao proceder a cofiguraçao do Xbee.

Coloca-se o primeiro xbee e faz-se o Test/Query apenas para verificarmos que modelo de xbee temos e se a comunicação entre os dois devices esta a correr bem. ATENÇÃO ao BaudRate que tem que estar a 9600. Em seguida vamos ao tab Modem Configuration e fazemos Read, se tudo correr bem ele deverá logo reconhecer o xbee que temos e dar-nos a informaçao toda que temos sobre o xbee. Caso nao dê que foi o meu caso, podem tentar fazer o que esta neste link – Aqui, na realidade isto nao acontece ser fizerem os updates todos que era algo que eu ainda nao tinha feito porque a rede do meu virtualbox estava mal configurada. Mas testem e depois digam qualquer coisa.

Enfim agora que ja temos os xbees a comunicar com o X-CTU vamos a configuraçao:

  • 1º XBEE
  1. ZNET COORDINATOR 2.5 AT
  2. PAN ID: (aqui podem colocar o que quiserem, desde que os outros xbees na rede tenham o mesmo numero)
  3. BD: (aqui podem mudar, mas nao metam mais de 57600) eu no meu caso deixei os 9600, torna-se mais simples.
  • 2º XBEE
  1. ZNET 2.5 ROUTER/END DEVICE AT
  2. PAN ID: (aqui podem colocar o que quiserem, desde que os outros xbees na rede tenham o mesmo numero)
  3. BD: (aqui podem mudar, mas nao metam mais de 57600) eu no meu caso deixei os 9600, torna-se mais simples.

No final de cada xbee é so escolher na drop down que diz Version e escolher a mais recente e fazer write. Atençao que o firware do COORDINATOR é diferente da do ROUTER/END device, nao se assustem, é mesmo assim.

Existem muitos outros parametros que podem mudar entretanto, mas eu tinha feito isso e depois nada funcionava, por isso para este primeiro teste aconselho a não mudarem mais nada, se depois tiverem tudo a funcionar, vão alterando e descobrindo, e claro mandem vir informaçao ;).

Apos isto tudo feito é so seguirem este Tutorial do Arduino Xbee e em principio tudo estará a funcionar. Simples nao? Pois agora que ja passei um dia inteiro a ler e a procurar ja acho simples, mas confesso que nao foi assim tão facil de inicio.

Aproveito tambem para reforçar como ja tinha dito no outro post que as minhas configurações, foram feitas usando um XBee Explorer USB, porque os meus arduinos sao UNO, mas quem tiver outros pode fazer, mediante um pequeno truque, a configuraçao utilizando o arduino.

Todas estas configurações podem ser feitas por AT comands, eu nao os fiz, mas nos links que anexo mostram como fazer, uma vez que nao usei, prefiro nao falar muito nisso. Isto caso nao queriam ter trabalho com o X-CTU é a soluçao ideal, mas tem a desvantagem que nao da para fazer upgrades de firmware.

Ficam aqui os links de onde tirei a informação:

XBeeTM ZNet 2.5/XBee-PROTM ZNet 2.5 OEM RF Modules

Xbee-Setup.pdf

Sacar Firmware caso nao consigam fazer update do X-CTU

Mais alguma info

Como sempre, eu andei a pesca e correu bem, mas se tiverem algum azar com o vosso xbee, nao me posso responsabilizar, porque como sempre eu digo, EU nao percebo nada disto 😉

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 😉

Peças novas e a sua soldadura!

Dec 14
2010

Ora bem…

Chegaram na segunda feira, depois de umas atribuladas voltas a procura da estaçao de correios certa, os meus XBee Pro 50mW Series 2.5 Wire Antenna e as respectivas Arduino Stackable Header – 6 Pin e as Arduino Stackable Header – 8 Pin!

Nao vou para ja fazer uma revisao sobre isto porque ainda nao as consegui usar devidamente…afinal falta-me algo, para poder programar os XBee…

Num post mais a frente, falarei sobre os Xbee. ja agora a peça é um XBee Explorer USB.

Bem, mas antes de poder usar os xbee’s e as respectivas shield’s que ja tinha falado num post anterior, avizinhava-se uma longa noite de soldadura porque são qualquer coisa como 64 soldaduras nas duas placas para ter os terminais soldados.

Depois de muitos videos youtube, la vi como é que “teoricamente” se soldava e meti mãos a obra… o resultado foi melhor do que o que estava a espera, passados 30 minutos ja tinha a primeira placa toda soldada, e mais ou menos 1 hora depois tinha as placas ligadas nos arduinos com umas belas soldaduras…

Um Howto muito importante que eu vi esta no site da sparkfun.com e explica como fazer o assembling destes shields. Vejam o GPS Shield Assembly Guide, apesar de ser para o GPS Shield, o principio é o mesmo.

E como nao podia deixar de ser, aproveitei quando fui soldar o segundo shield para fazer um pequeno timelapse…

Divirtam-se:

Mais para a frente ja vou colocar um post sobre a programação e a parte de realmente usar o xbee para comunicar entre dois arduinos.

Como sempre, eu não percebo nada disto, por isso não me responsabilizo por coisas que possam danificar o vosso material, mas ei, eu também estou a aprender 😉

Ethernet Shield – Problemas

Dec 10
2010

Logo a seguir a ter escrito o post anterior Temperatura+Arduino+Mysql=RDDTool deparei-me com o LED do meu arduino, que ate à cinco minutos estava a actualizar perfeitamente, completamente acesso e os logs do webservice parados…Mas o que poderia estar a correr mal uma vez que o sketch que estava a usar ainda ontem funcionava sem problemas. La me decidi a ir ao google uma vez que isto ja me tinha acontecido algo parecido mas nunca pensei que fosse realmente da parte do hardware e não do software, aka código feito por mim.

E relamente encontrei logo nas primeiras pesquisas um forum onde alguem se queixava do mesmo problema e assim que removia o micro-SD card da slot que começava tudo a funcionar sem problemas…e não é que aconteceu mesmo isso? Assim que removi o cartão o shield começou imediatamente a funcionar sem qualquer problemas e ja esta assim a cerca de 2 horas.

Entretanto ja tentei meter novamente o cartao e pumba, voltou a crashar, nao sei se crashar será bem o termo correcto, será se calhar preferivel chamar-lhe “freezar” porque é o que faz, assim que removo o cartao começa novamente a funcionar sem problemas. Já mandei alguns mails e estou a espera de respostas. A parte mais estranha é que nem sequer estou a usar as libs para o cartão, a sdFatLib.

Por isso, para quem tem a nova EthernetShield com SD card, cuidado se por acaso de repente aquilo ficar “freezado”, testem sempre remover o cartão, para confirmar se é do cu ou das calças

Boa sorte…

Ja agora se alguém tiver uma solução para isto, por favor digam-me qualquer coisa. Como sempre a gerência agradece.

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…

Follow Me