DIY – Leitor de temperatura com Arduino


Olá a todos.

Este é o meu primeiro projecto utilizando um Arduino. É meu objectivo, nesta primeira fase, construir um leitor de temperaturas que apresente fácil e rapidamente os resultados das leituras e que retorne esses mesmos valores de forma periódica a um computador. A ideia principal é, mais para a frente - quando o tempo o permitir, conectar o Arduino à Raspberry Pi (com um webserver instalado) e utilizando uma ferramenta de gráficos como o Jpgraph (http://jpgraph.net/) ou o chartJS (http://www.chartjs.org/) construir gráficos em “tempo real” das medições e apresentar algumas estatísticas.
Uma vez que o sensor de temperatura altera a voltagem do circuíto em função da temperatura, este foi conectado à entrada de 3.3V do Arduino de forma a aumentar a sua sensibilidade.

Partes:

- Arduino (Uno R3 neste caso)
-Jumper Wires
- 220 ohm resistor
- Liquid crystal display
- Potentiometer
- TMP36 temperature sensor
- Breadboard

Ligações:
Nota: Além das ligações apresentadas, o Arduino está conectado ao computador pela porta serial (USB).


Para facilitar as ligações do Liquid crystal display ao Arduino, consultar a tabela abaixo.


Código Arduino:


/* ------------------------------------------------------------------------------- */
// A minha casa digital: aminhacasadigital.blogspot.com
// Por Miguel Borges de Freitas

// incluir biblioteca do liquid crystal

#include <LiquidCrystal.h>
// definir voltagem para o pin do sensor e definir a variavel de medicao de temperatura
#define aref_voltage 3.3
float tempReading;

// Definir as ligaçes ao liquid crystal display e o pin analogico de leitura de temperatura
LiquidCrystal lcd(12, 11, 10, 5, 4, 3, 2);
const int sensorPin = A0;


int backLight = 13;    // pin 13 controla a luz de fundo do visor do LCD

void setup() //funcao de setup
{
  Serial.begin(9600); // inicia comunicaçao serial com o computador
  pinMode(backLight, OUTPUT);
  digitalWrite(backLight, HIGH); // Liga a luz de fundo do LCD - substituir HIGH por LOW para a desligar
  lcd.begin(16,2);              // coluna,linha.16,2 para um 16x2 LCD
  lcd.clear();                  // Limpar o visor
  lcd.setCursor(0,0);           // Colocar o "cursor" na coluna 0 e linha 0 - primeira linha do LCD
  lcd.print("aminhacasadigita");    // Escreve a primeira linha
  lcd.setCursor(0,1);           // Coloca o cursor na segunda linha e escreve a segunda linha
  lcd.print("l.blogspot.com");
  analogReference(EXTERNAL); // Define a referencia dos pins analogicos com uma voltagem externa (ver ligacoes, neste caso pin AREF ligado ao pin de 3.3V
  
}

void loop() // funcao de loop
{
  tempReading = analogRead(sensorPin); // le pin 13
  float voltage = (tempReading * aref_voltage)/1024.0; //calcula voltagem - consultar datasheet do sensor
  float temperature = (voltage - 0.5) * 100 ; // calcula a temperatura (float = numero decimal)
  delay(1000); // espera 1 segundo
  Serial.println(temperature); //envia temperatura para o computador
  lcd.clear(); // limpa o ecra do lcd
  lcd.setCursor(0,0); // cursor para a primeira linha
  lcd.print("Temperatura Sala"); // escreve "Temperatura Sala" na primeira linha
  lcd.setCursor(0,1); // muda para a linha de baixo
  lcd.print(temperature); // escreve a variavel temperatura
  lcd.print(" C"); // adiciona o caracter C (graus celsius) a segunda linha para completar a informaçao com as unidades
}
/* ------------------------------------------------------------------------------- */


Código em python para ler o valor da temperatura no computador:

Para este código funcionar devidamente, deverá instalar a biblioteca pyserial. Mais informações como instalar visitar: http://pyserial.sourceforge.net/. Em alguns sistemas, esta já faz parte do python.
É também importante especificar neste código a porta correcta através da qual o computador está a comunicar com o Arduino (no meu caso /dev/ttyAMC0). Esta porta é facilmente encontrada no Arduino IDE. Grave o ficheiro com um nome à sua escolha e extensão .py ( nome_a_sua_escolha.py).

#!/usr/bin/python
# -*- coding: UTF-8 -*-

import serial
ser = serial.Serial('/dev/ttyACM0', 9600)
while True:
 print 'A temperatura é ' + str(ser.readline())



Para correr o script basta escrever no terminal:

-> python nome_a_sua_escolha.py

Este script não faz mais do que apresentar no terminal os valores da temperatura enviados pelo Arduino. Não tem grande utilidade prática, trata-se apenas de um ponto de partida para criar códigos mais elaborados, armazenando de forma contínua os valores de temperatura.

Deixo algumas fotos do circuíto em funcionamento; os dados que faltavam para provar que não se pode com este calor :)








Até à próxima,

Miguel Borges de Freitas





7 comentários:

  1. Isto dá para fazer só com o Raspeberry Pi, ou tem que se comprar o modulo Arduino á parte ?

    ResponderEliminar
  2. Podes fazer com o raspberry pi também, usando os pins GPIO. Usei o arduino porque há bastante tempo que pretendia aprender e encontras facilmente muita informação sobre o assunto. A linguagem e a comunidade é bem mais vasta se comparares com a raspi.
    Além disso não tenho cabos para ligar à raspi, talvez mais tarde faça um tutorial.

    ResponderEliminar
  3. Obrigado, tive a ver e para ligar os pins GPIO do PI basta usar um cabo ide floppy e corta-se um dos terminais....

    ResponderEliminar
  4. Não precisas necessariamente desse cabo. Precisas de ter uma breadboard para montares o circuíto e alguns "jumper cables" macho-fêmea para ligares a breadboard à rpi

    ResponderEliminar
  5. Parabéns pelo artigo! ;) Bom artigo para começar no blog :p Já tenho raspberry mas arduino não, no entanto é uma das coisas que já estou para comprar há algum tempo no entanto desisti da ideia por depois ser preciso comprar vários componentes.
    Tenho a oportunidade de arranjar um arduino emprestado para fazer umas brincadeiras e acho que vou começar com esta :)
    Espero mais posts sobre o assunto!

    Cumprimentos!

    ResponderEliminar
  6. Muitos parabéns pelo belíssimo artigo :D
    Eu queria fazer uma coisa deste genero mas era para me dar a temperatura ambiente da divisão onde o raspberry se encontra acham que dá?

    Cumprimentos

    ResponderEliminar