Barógrafo digital com Arduino

barograph-digital-22681-356887

Neste projeto vamos tratar de aprender como criar um barógrafo digital. O barógrafo é um instrumento que permite medir e registar variações barométricas, medindo a pressão atmosférica, registando-a continuamente e formando um gráfico de pressão no tempo. Para exibição deste gráfico iremos introduzir um LCD gráfico no projeto.

Para este projeto é preciso a biblioteca do Graphic LCD, disponível aqui.

Neste projeto, ao contrário dos anteriores, iremos usar o Arduino Mega, em vez do Arduino UNO.

Material:

ARDUINO MEGA;
1 Sensor de pressão SCP1000;
3 resistências de 10kΩ;
1 resistência de 1KΩ;
1 resistência de 150Ω;
1 potenciómetro de 10kΩ;
1 Graphic LCD 128×64.

Montagem:

Fonte: Arduino Básico
Fonte: Arduino Básico

Não ligue o circuito até que tudo esteja devidamente ligado. Só quando verificar calmamente as ligações é que o convém ligar, isto porque é fácil danificar o Graphic LCD se estiver conectado da forma errada.

Código Arduino:

<pre lang="”c++”">#include &lt;glcd.h&gt;
#include "fonts/allFonts.h"

#define SLAVESELECT 53
#define SPICLOCK 52
#define DATAOUT 51 // MOSI
#define DATAIN 50 // MISO
#define UBLB(a,b) ( ( (a) &lt;&lt; 8) | (b) )
#define UBLB19(a,b) ( ( (a) &lt;&lt; 16 ) | (b) )

#define PRESSURE 0x1F
#define PRESSURE_LSB 0x20
#define TEMP 0x2
#define INTERVAL 900

int dots[124], dotCursor = 0, counter = 0;
char rev_in_byte;
int temp_in;
float hPa;
unsigned long pressure_lsb;
unsigned long pressure_msb;
unsigned long temp_pressure;
unsigned long pressure;

void setup() {
GLCD.Init();
GLCD.ClearScreen();
GLCD.SelectFont(System5x7, BLACK);
byte clr;

pinMode(DATAOUT, OUTPUT);
pinMode(DATAIN, INPUT);
pinMode(SPICLOCK,OUTPUT);
pinMode(SLAVESELECT,OUTPUT);
digitalWrite(SLAVESELECT,HIGH);

SPCR = B01010011;
clr=SPSR;
clr=SPDR;
delay(10);

write_register(0x03,0x09);
write_register(0x03,0x0A);

GLCD.DrawRect(1,1,125,44);
for (int x=0; x&lt;46; x+=11) {
GLCD.SetDot(0,1+x, BLACK);
GLCD.SetDot(127,1+x, BLACK);
}
for (int x=0; x&lt;128; x+=5) {
GLCD.SetDot(1+x,0, BLACK);
}
for (int x; x&lt;124; x++) {dots[x]=1023;}
getPressure();
drawPoints(dotCursor);
}
void loop() {
getPressure();
GLCD.CursorToXY(0, 49);
GLCD.print("hPa:");
GLCD.CursorToXY(24,49);
GLCD.print(hPa);
temp_in = read_register16(TEMP);
float tempC = float(temp_in)/20.0;
float tempF = (tempC*1.8) + 32;
GLCD.CursorToXY(0,57);
GLCD.print("Temp:");
GLCD.CursorToXY(28, 57);
GLCD.print(tempC);
delay(1000);

GLCD.CursorToXY(84,49);
GLCD.print("TREND:");
GLCD.CursorToXY(84,57);
printTrend();
counter++;
if (counter==INTERVAL) {drawPoints(dotCursor);}
}
void drawPoints(int position) {
counter=0;
dots[dotCursor] = int(hPa);
GLCD.FillRect(2, 2, 123, 40, WHITE);
for (int x=0; x&lt;124; x++) {
GLCD.SetDot(125-x,44-((dots[position]-980)), BLACK);
position--;
if (position&lt;0) {position=123;}
}
dotCursor++;
if (dotCursor&gt;123) {dotCursor=0;}
}

void getPressure() {
pressure_msb = read_register(PRESSURE);
pressure_msb &amp;= B00000111;
pressure_lsb = read_register16(PRESSURE_LSB);
pressure_lsb &amp;= 0x0000FFFF;
pressure = UBLB19(pressure_msb, pressure_lsb);
pressure /= 4;
hPa = float(pressure)/100;
}

void printTrend() {
int dotCursor2=dotCursor-1;
if (dotCursor2&lt;0) {dotCursor2=123;}
int val1=dots[dotCursor2];
int dotCursor3=dotCursor2-1;
if (dotCursor3&lt;0) {dotCursor3=123;}
int val2=dots[dotCursor3];
if (val1&gt;val2) {GLCD.print("RISING ");}
if (val1==val2) {GLCD.print("STEADY ");}
if (val1&lt;val2) {GLCD.print("FALLING");}
}

char spi_transfer(char data) {
SPDR = data;
while (!(SPSR &amp; (1&lt;&lt;SPIF)))
{
};
return SPDR;
}

char read_register(char register_name) {
char in_byte;
register_name &lt;&lt;= 2;
digitalWrite(SLAVESELECT,LOW);
spi_transfer(register_name);
in_byte = spi_transfer(0x00);
digitalWrite(SLAVESELECT,HIGH);
delay(10);
return(in_byte);
}

unsigned long read_register16(char register_name) {
byte in_byte1;
byte in_byte2;
float in_word;
register_name &lt;&lt;= 2;
digitalWrite(SLAVESELECT,LOW);
spi_transfer(register_name);
in_byte1 = spi_transfer(0x00);
in_byte2 = spi_transfer(0x00);
digitalWrite(SLAVESELECT,HIGH);
in_word = UBLB(in_byte1,in_byte2);
return(in_word);
}

void write_register(char register_name, char register_value) {
register_name &lt;&lt;= 2;
register_name |= B00000010;

digitalWrite(SLAVESELECT,LOW);
spi_transfer(register_name);
spi_transfer(register_value);
digitalWrite(SLAVESELECT,HIGH);
}

Agora pessoal, é só pegar no vosso arduino, dar uma vista de olhos a este tutorial e começar a desenvolver o vosso projecto! Se ainda não tiveres o material necessário para o projecto, encontra-o aqui na nossa loja Boxelectronica ou na lista abaixo:

Arduino Mega;
Sensor Barométrico;
Potenciómetro 10k;
Graphic LCD;
Resistências.