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 – Teste de alcance!

Dec 18
2010

Como ja tinha combinado com a Faneca, hoje era dia de fazer o teste de alcance dos arduinos com xbee. Mas para isso era necessario que um dos arduinos fosse autonomo, ou seja, battery operated. Por isso mais umas comprinhas eram indispensaveis, aproveitei que tive que sair de casa de manha e passei na loja de electronica da “Esquina” e comprei uma bateria de 9V, o conector, e um conector para o arduino, que nao era do tamanho certo, bolas…mas por sorte tinha ca em casa ja antigo um connector com o tamanho perfeito. Mas enfim isso é para outro post.

Vamos ao teste, fiz dois pequenos codigos para colocar em cada arduino, um que fazia print para a serial port de 5 em 5 segundos de um numero e ia incrementando ate 10000, calculei que nao ia precisar de mais. e realmente tinha razão. E no outro, ou seja o que estava em casa tinha apenas um serial read que ia mostrando os tais numeros.

O teste era simples, saia de casa com o GPS, a levava um radio Motorola Talkabout e ela ficava com o outro e assim que comecassem a aparecer numeros no ecrá era porque estava tudo a funcionar, quando deixassem de aparecer, era porque ja nao tinha sinal, simples nao? e desta vez correu bem… até porque isto era realmente um teste muito profissional. 😉

O primeiro sitio para onde virei o carro perdeu logo sinal ao fim de 21.5 Mts, como podem ver na imagem abaixo neste post.

Antes de continuar convem mencionar que a Faneca estava em casa e eu andava na rua, ou seja temos que ter em consideração as paredes que por acaso sao muito boas, ou seja usando outro exemplo que nao tem nada a ver, eu em casa tenho que ter dois routers wifi, porque o do 1º andar nao tem sinal no R/C. Voltando ao teste, virei a curva e tinha alem da minha casa ainda mais uma casa pelo meio, por isso até nao achei nada mal.

Decidi ir pelo outro lado e realmente é como eles dizem em linha de visao o sinal é muito maior, ou seja, quando estava nos intervalos de casas, podendo ter uma linha recta ate a minha conseguia ter sinal, assim que metia mais uma casa pumba, la se ia o sinal. Ainda tinha mais por onde ir em linha de visao, mas como estava de carro nao dava muito jeito…Mesmo assim consegui uns 72.6Mts. Se amanha ou num destes dias estiver bom tempo, impõe-se um teste num descampado 🙂

Para ja o que posso dizer é que estou bastante satisfeito, porque um dos projectos que tenho para os Xbee, nunca ira ser necessario mais de 100 mts em linha de visao, por isso é perfeito.

 

 

A imagem consegui fazendo no Google Earth, mas os waypoints foram importados de um GPS, por isso “estão” correctos!

Isto nao é um teste profissional e em condiçoes perfeitas, foi apenas para poder ter uma ideia de ate onde posso ir, alem disso pode-se sempre usar outras antenas e afins para aumentar o alcance do respectivo Xbee, podem ver mais no site o SpaceBits onde eles conseguiram alcances, senao estou em erro ate 60KM’s em linha de visão.

Por isso divirtam-se e façam prai testes e mandem os resultados aqui po estaminé…

NOTA: Na realidade podia ter verificado se os dois xbee’s estava a comunicar olhando para as luzes do shield, esta la uma que diz se o xbee esta sincronizado com o COORDINATOR, mas nao tinha a mesma piada 😉

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 😉

Programar o Xbee usando o Arduino

Dec 14
2010

Em primeiro lugar, se tiverem um Arduino que nao seja o UNO, escusam de ler o resto do post porque isto so acontece, aparentemente com o Arduino UNO.

Entao, queriam programar o Xbee com o X-CTU usando o ARduino UNO? Pois bem a resposta é:

NAO É POSSIVEL!!

Ou pele menos eu nao consegui. Fiz todos os testes e mais alguns, li resmas e resmas de paginas e nada, inclusive estive em conferencia com o Filipe Valpereiro da Inmotion.pt ontem a tentarmos tudo…ate que encontrei uma que me disse realmente o que precisava de saber e isto apos ter lido a documentaçao de como instalar o X-CTU e algo muito importante, que podem ou nao ter que instalar, que são os Drivers de FTDI.

À, já agora, convém mencionar também que o X-CTU infelizmente ainda só funciona em Windows, por isso se como eu usarem mac ou linux, terão que recorrer a outra maquina ou então a um VirtualBox, Wine ou VMware.

Voltando à NÃO programaçao com o Arduino Uno.

Bem, para resumir, a instalação não é possivel por que o arduino uno não tem o chip ftdi, como podem ver neste link para um forum que encontrei aqui. Ora, se não tem esse chip entao não pode ser usado como “serial port” para o Xbee shield. Simples nao? bahhhh que gaita… isto obriga-me a ter que adquirir um XBee Explorer USB, ate porque os Xbee’s Pro 2.5 nao veem configurados de fábrica prontos a usar.

Por isso amigos, se estavam a pensar poupar 20 euritos, ja foram…tem mesmo que ser! A nao ser que… sim é verdade quem tiver ai para casa perdido um Arduino Duemilanove, podem usar estes mesmo para programar os xbee’s usando o X-CTU. Quem me manda a mim querer o topo de gama, bah!

Podem ver Aqui como o fazer, seus sortudos…

Boa sorte, e ja agora se descobrirem uma maneira de usar o X-CTU com o Arduino Uno avisem, porque há muita gente a precisar de o fazer… 20 euros sempre são 20 euros pa…a crise anda aí 😉

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…

Sensor de Temperatura

Dec 03
2010

Ja falei nele varias vezes sempre a dizer que havia de colocar aqui um post sobre o Tal sensor de temperatura que veio com o Kit que comprei na Inmotion pois bem aqui fica.

Depois de muito batalhar com o mesmo sensor, la consegui por o gajo a funcionar, é simples é so usar um esquema de um sensor de luz, algo que também falarei em breve,  e basicamente aquilo deita ca para fora os dados em mV e pumba, temos a temperatura. Facil. nao? ERRADO… não é assim tao facil, mas ao fim de muito pesquisar na net e de uma grande ajuda do Nuno e com o datasheet do (NTC_Thermistor) do respectivo componente enviado pelo Filipe la consegui por o bixo a deitar ca para fora a temperatura em graus centígrados.

Ora bem em primeiro lugar vamos ver o que precisamos:

  1. Arduino
  2. NTC Thermistor
  3. 1 Resistencia de 10Kohm
  4. Uma breadboard ou qualquer outra
  5. Cabos diversos. 3 bastam

Para fazermos as ligações fica aqui uma imagem tirada do livro “Getting Started with Arduino”. Espero mais uma vez nao ser processado por direitos de autor…

Apesar de na imagem estar representado um LDR aka Sensor de Luz, o esquema de ligação é o mesmo, por isso nao se assustem. Em seguida podem usar o codigo que indico para verem o que acontece. Apesar de no codigo estar defenido um Led, nao o indiquei nas peças necessarias, porque iremos usar o Led que vem onboard com o arduino.

// Example 06A: Blink LED at a rate specified by the
// value of the analogue input
#define LED 13
// the pin for the LED
int val = 0;	// variable used to store the value // coming from the sensor
void setup() { 
 
pinMode(LED, OUTPUT); // LED is as an OUTPUT
                  // Note: Analogue pins are
                  // automatically set as inputs
} 
 
void loop() {
val = analogRead(0); // read the value from the sensor
digitalWrite(13, HIGH); // turn the LED on
delay(val); // stop the program for some time
digitalWrite(13, LOW); // turn the LED off
delay(val); // stop the program for // some time
}

O que voces irão ver com este codigo é precisamente o que é indicado no inicio do post, ou seja o led vai piscar mais ou menos consoante a temperatura obtida pelo sensor. Podem testar aquecendo o sensor, nao usem um isqueiro como eu da primeira vez, que ia queimando os cabos…
Bem, agora que ja vimos como isto funciona, vamos alterar um pouco o codigo para percebermos que valores é o que sensor está a dar.

int analoginput=1;
 
void setup() {
  pinMode(analoginput, INPUT);
  Serial.begin(9600);
}
 
void loop()
{
  Serial.println(analogRead(analoginput));
  delay(1000);
}

Com este codigo sem mais nada o que vão conseguir ver é os mV do sensor a passar no Serial Port. Será, se tiverem tudo bem montado, algo parecido com

808
800
793
791
793
795
797

e por ai fora…bem…isto nao nos diz muito, e ainda por cima se aquecerem o sensor, vão verificar que os valores diminuem em vez de aumentarem… por isso é que me deu luta, mas ao fim de algum tempo lá consegui encontrar um código que em conjugação com a datasheet me permitiu converter para graus. Aqui deixo a parte do codigo que faz isso e vou tentar explicar…

 
#include <math.h>; //penso que esta lib nao é obrigatoria, mas testem das duas maneiras.
 
int value=0;
int analoginput=0;
int R1=1000;  // Valor da Resistencia
int Vin=5;
float tmp=0.0;
float Vout=0.0;
float f=0.0;
 
void setup() {
 pinMode(analoginput, INPUT);
 Serial.begin(9600);
}
 
void loop()
{
 //Serial.println(analogRead(0));
 Vout=1023-analogRead(0); // Invert the number because of setup
 //Serial.println(Vout);
 Vout=(Vout/1024.0)*5;
 Serial.println(Vout);
 f=1000*exp(-20000/298.15); // 298.15K = 25C, 20000 é o valor standard para o NTC a 25º com uma resistencia de 10Kohms
 tmp=(R1*Vin)/Vout-R1;
 value=(20000/log(tmp/f))-273.15;
 Serial.println(value+7);
 delay(1000);
}

Simples não? ok eu sei que não é assim tão simples, mas basicamente os valores mais importantes são o R no qual é definida a resistência que esta no circuito e o 20000 que é o valor que vem indicado na datasheet para uma temperatura media de 25º.
Também importante é o +7 que aposto que se lerem o código vão ficar a pensar, mas porque raio é que este gajo meteu aqui um +7, ele nao percebe nada disto…bem a parte de não perceber nada disto é verdade, mas pronto… na realidade o +7 é o que gosto de chamar uma “VALENTE martelada” porque meti um termometro “oficial” ao lado do meu e 7º era a diferença de graus que estava a obter. Sei que deve haver uma maneira mais correcta de fazer isto, mas para já este funciona e da-me os valores mais ou menos correctos.

Enfim…este post ja se alongou muito, mas espero que de para perceber alguma coisa e ja sabem duvidas e sugestões, como sempre são bem vindas…inclusive melhores sensores de temperatura a preços acessíveis 🙂

TwitterLibrary e os tweets…

Nov 29
2010

Mandar um tweet a dizer “Ola eu sou um Arduino!” simples nao?

Errado…nao é assim tao facil, e em parte deve-se a o Twitter ter mudado o metodo de autenticaçao de Basic para OAUTH.

Depois de muito pesquisar, la encontrei o que precisava, ou seja uma lib para o arduino de nome TwitterLibrary

  • Twitter Library is a library for Arduino to tweet on Twitter via the Arduino Ethernet Shield. It is convenient to making a bot for Twitter which posts messages automatically from various sensors.

La saquei a TwitterLibrary e joguei-me a ela de unhas e dentes, para rapidamente partir os dentes todos quando bati de frente com um dos problemas principais nos dias de hoje, que é as coisas andam depressa demais, ou seja esta lib nao é compativel com o Arduino v0021, que por acaso é que se tem que usar para quem tem Arduinos Uno que é o meu caso, porra, la esta mais algo a correr mal, ja estava prestes a mandar a Eth shield pela janela, mas lembrei-me dos 35€ que larguei por ela e começei a procurar melhor.

Apos muita cabeçada  la encontrei este post “Problem with NeoCat’s Twitter Library” nos foruns do Arduino que dizia mesmo o que me estava a acontecer, e se lerem tudo vao perceber que é normal isto nao dar com o 0021, mas que ja ha um workaround e esse workaround passa por sacar uma versao do EthernetDNS que esta “martelada” para funcionar com versões acima da 0019.

Mas afinal o que é este EthernetDNS? Ora, é mesmo o que o nome indica, é uma lib que permite ao arduino resolver nomes de DNS, ainda nao mexi muito nela, mas ja fiz os exemplos que permitem ao arduino via Serial Connection fazer uma query DNS, podem ver mais info sobre esta lib em EthernetDNS, tambem la teem a EthernetDHCP, que tambem ja testei e funciona, bem, pelo menos funcionou uma vez..das outras já não..bolas…

Voltando a twitter lib, aquilo é simples, é so seguir o que esta no post do forum que indiquei e no site da lib na pagina do arduino e pumba, la estão voces a enviar tweets.

Ha, mas esperem, antes de enviar tweets, convem seguir uns passos importantes mencionado na pagina que é para a geraçao de um token que permite ultrapassar o problema da autenticação OAUTH do twitter. Podem gerar esse token em:

Tweet Library for Arduino mas cuidado, que as libs que estão no site onde geram os tokens, nao funcionam, agora nao sei se era do meu lado, ou se simplesmente os links nao estao ok. Experimentem e depois digam qualquer coisa.

A melhor maneira de experimentar enviar um tweet inicial é fazer o exemplo que vem com a lib.

Entretanto ja consegui que o meu arduino mande tweets com informaçao que saca de um sensor de temperatura, falta-me agora tirar aquilo do Void Loop {} e meter aquilo num void normal e depois invocar no loop.

Fica aqui o codigo que estou a usar para mandar o tweet do sensor. Nao liguem a parte de obter os dados do sensor que isso tambem foi outra guerra que colocarei aqui ainda durante esta semana.

#include 
#include 
#include 
#include 
#include 
 
// Ethernet Shield Settings
byte mac[] = { 0xDE, 0xAD, 0xBE, 0xEF, 0xFE, 0xED };
 
// substitute an address on your own network here
byte ip[] = { 192, 168, 1, 177 };
 
// Your Token to Tweet (get it from http://arduino-tweet.appspot.com/)
Twitter twitter("YOUR TOKEN");
 
// Message to post
 
//char msg[] = "Hello, World!";
 
// Varios dados
int analoginput=0;
int value=0;
int R1=1000;
int Vin=5;
float tmp=0.0;
float Vout=0.0;
float f=0.0;
 
void setup()
{
  delay(1000);
  Ethernet.begin(mac, ip);
  Serial.begin(9600);
 
  pinMode(analoginput, INPUT);
 
  Serial.println("connecting ...");
}
 
void loop()
{
 
  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;
   char buffer[80];
   sprintf(buffer, "A temperatura da sala e: %d", value ); // Converte de int para char
    if (twitter.post(buffer)) {
    int status = twitter.wait(&amp;Serial);
    if (status == 200) {
      Serial.println("OK.");
    } else {
      Serial.print("failed : code ");
      Serial.println(status);
    }
  } else {
    Serial.println("connection failed.");
  }
  delay(300000);
}

Testem e divirtam-se! Alterações e sugestões como sempre sao bem vinda.

Follow Me