Sensor de Pressão e Data Logger Baseado em Arduino para Monitoramento Preciso da Pressão do Ar
Componentes e Materiais
| Componente | Quantidade |
|---|---|
| Arduino UNO | 1 |
| Cartão SD Delkin Commercial MLC | 1 |
| Sensor de pressão SKU237545 | 1 |
| Data logger RTC (Relógio de Tempo Real) | 1 |
| Display LCD I2C | 1 |
| Caixa de projeto plástica à prova d'água 158 x 90 x 60 mm | 1 |
| Parafusos sextavados M3 de nylon preto (300 unidades) | 1 |
| Fios Dupont multicoloridos (120 unidades) | 1 |
Aplicativos e Serviços Online
- Arduino IDE
Sobre o Projeto
Este projeto surgiu da necessidade de registrar a pressão do ar em um reservatório para verificar a eficiência de um compressor mecânico.
Ajuda de George Kontaxis: Vídeo de referência
O display mostra a data e a pressão em bar e PSI.
Medidor de Pressão Arduino – Leitura de 3 Pressões
Código
Sensor de Pressão SKU237545 com LCD, Relógio de Tempo Real e Data Logging
//criado em 12 de agosto de 2018 por Philip Blayney & Jack Davidson usando código de George Kontaxis para o Sensor de Pressão SKU237545
//https://www.youtube.com/watch?v=AB7zgnfkEi4&feature=youtu.be
#include "LiquidCrystal_PCF8574.h"
#include "RTClib.h" // relógio de tempo real
#include // cartão SD
#define LCD_ADDRESS 0x27 // Define características do LCD
#define LCD_ROWS 2
#define LCD_COLUMNS 16
#define SCROLL_DELAY 150
#define BACKLIGHT 255
// inicialização dos objetos
LiquidCrystal_PCF8574 lcdI2C;
RTC_DS1307 RTC; // define o objeto Real Time Clock
int n = 1;
int val;
// Um data logger simples para os pinos analógicos do Arduino
#define LOG_INTERVAL 1000 // milissegundos entre entradas (reduza para dados mais rápidos)
#define SYNC_INTERVAL 10000 // milissegundos entre chamadas a flush() - para gravar dados no cartão
uint32_t syncTime = 0; // tempo da última sincronização
const int chipSelect = 10; // para o shield de data logging, usamos o pino digital 10 para a linha CS do SD
File logfile;
void error(char *str) {
Serial.print(F("error: "));
Serial.println(str);
}
void setup(void) {
Serial.begin(9600);
Serial.println(F("leitura de pressão do SENSOR SKU237545"));
lcdI2C.begin(LCD_COLUMNS, LCD_ROWS, LCD_ADDRESS, BACKLIGHT);
lcdI2C.print(F("SENSOR SKU237545"));
lcdI2C.setCursor(0,1);
lcdI2C.print(F(" bar e psi "));
delay(2000);
// inicializa o cartão SD
Serial.print(F("Inicializando cartão SD..."));
pinMode(10, OUTPUT);
if (!SD.begin(chipSelect)) {
error("Cartão falhou ou não está presente");
}
Serial.println(F("cartão inicializado."));
char filename[] = "LOGGER00.CSV";
for (uint8_t i = 0; i < 100; i++) {
filename[6] = i/10 + '0';
filename[7] = i%10 + '0';
if (!SD.exists(filename)) {
logfile = SD.open(filename, FILE_WRITE);
break;
}
}
if (!logfile) {
error("não foi possível criar arquivo");
}
lcdI2C.clear();
lcdI2C.setCursor(0,0);
lcdI2C.print(F("Arquivo Nº "));
lcdI2C.print(filename);
Serial.print(F("Registrando em: "));
Serial.println(filename);
// conecta ao RTC
if (!RTC.begin()) {
logfile.println("RTC falhou");
Serial.println(F("RTC falhou"));
}
logfile.println("Data / Hora ,pressão ,bar ,leitura ,psi,leitura");
delay(5000);
lcdI2C.clear();
}
void loop(void) {
int sensorVal = analogRead(A1);
float voltage = (sensorVal * 5.0) / 1024.0;
float pressure_pascal = (3.0 * ((float)voltage - 0.475)) * 1000000.0; // calibrar aqui
float pressure_bar = pressure_pascal / 10e5;
float pressure_psi = pressure_bar * 14.5038;
Serial.print("Pressão = ");
Serial.print(pressure_bar);
Serial.print(" bars ");
Serial.print("psi ");
Serial.print(pressure_psi);
Serial.println();
DateTime now = RTC.now();
delay((LOG_INTERVAL - 1) - (millis() % LOG_INTERVAL));
int H = now.hour();
int M = now.minute();
int S = now.second();
logfile.print(now.year(), DEC);
logfile.print("/");
logfile.print(now.month(), DEC);
logfile.print("/");
logfile.print(now.day(), DEC);
logfile.print(" ");
if (H < 10) logfile.print(0);
logfile.print(now.hour(), DEC);
logfile.print(":");
if (M < 10) logfile.print(0);
logfile.print(now.minute(), DEC);
logfile.print(":");
if (S < 10) logfile.print(0);
logfile.print(now.second(), DEC);
Serial.println();
Serial.print(now.year(), DEC);
Serial.print("/");
Serial.print(now.month(), DEC);
Serial.print("/");
Serial.print(now.day(), DEC);
Serial.print(" ");
if (H < 10) Serial.print(0);
Serial.print(now.hour(), DEC);
Serial.print(":");
if (M < 10) Serial.print(0);
Serial.print(now.minute(), DEC);
Serial.print(F(":"));
if (S < 10) Serial.print(0);
Serial.print(now.second(), DEC);
Serial.println();
lcdI2C.setCursor(0,0);
lcdI2C.print(pressure_bar);
lcdI2C.print("bar ");
lcdI2C.print(pressure_psi);
lcdI2C.print("psi ");
lcdI2C.setCursor(0,1);
lcdI2C.print(now.day(), DEC);
lcdI2C.print("/");
lcdI2C.print(now.month(), DEC);
lcdI2C.print(" ");
if (H < 10) lcdI2C.print(0);
lcdI2C.print(now.hour(), DEC);
lcdI2C.print(":");
if (M < 10) lcdI2C.print(0);
lcdI2C.print(now.minute(), DEC);
lcdI2C.print(":");
if (S < 10) lcdI2C.print(0);
lcdI2C.print(now.second(), DEC);
logfile.print(", ");
logfile.print(" Pressão = ");
logfile.print(",");
logfile.print(pressure_bar);
logfile.print(",");
logfile.print(" bar ");
logfile.print(",");
logfile.print(pressure_psi);
logfile.print(",");
logfile.print("psi");
logfile.println();
if ((millis() - syncTime) < SYNC_INTERVAL) return;
syncTime = millis();
logfile.flush();
delay(10);
}
Configuração do Relógio de Tempo Real
//Código por tronixstuff
#include "Wire.h"
#define DS3231_I2C_ADDRESS 0x68
byte decToBcd(byte val) { return ((val/10*16) + (val%10)); }
byte bcdToDec(byte val) { return ((val/16*10) + (val%16)); }
void setup() {
Wire.begin();
Serial.begin(9600);
// defina a hora inicial aqui:
// DS3231 segundos, minutos, horas, dia, data, mês, ano
setDS3231time(00,43,14,3,14,8,18); // defina a hora desejada aqui
}
void setDS3231time(byte second, byte minute, byte hour, byte dayOfWeek, byte dayOfMonth, byte month, byte year) {
Wire.beginTransmission(DS3231_I2C_ADDRESS);
Wire.write(0);
Wire.write(decToBcd(second));
Wire.write(decToBcd(minute));
Wire.write(decToBcd(hour));
Wire.write(decToBcd(dayOfWeek));
Wire.write(decToBcd(dayOfMonth));
Wire.write(decToBcd(month));
Wire.write(decToBcd(year));
Wire.endTransmission();
}
void readDS3231time(byte *second, byte *minute, byte *hour, byte *dayOfWeek, byte *dayOfMonth, byte *month, byte *year) {
Wire.beginTransmission(DS3231_I2C_ADDRESS);
Wire.write(0);
Wire.endTransmission();
Wire.requestFrom(DS3231_I2C_ADDRESS, 7);
*second = bcdToDec(Wire.read() & 0x7f);
*minute = bcdToDec(Wire.read());
*hour = bcdToDec(Wire.read() & 0x3f);
*dayOfWeek = bcdToDec(Wire.read());
*dayOfMonth = bcdToDec(Wire.read());
*month = bcdToDec(Wire.read());
*year = bcdToDec(Wire.read());
}
void displayTime() {
byte second, minute, hour, dayOfWeek, dayOfMonth, month, year;
readDS3231time(&second, &minute, &hour, &dayOfWeek, &dayOfMonth, &month, &year);
Serial.print(hour, DEC);
Serial.print(":");
if (minute < 10) Serial.print("0");
Serial.print(minute, DEC);
Serial.print(":");
if (second < 10) Serial.print("0");
Serial.print(second, DEC);
Serial.print(" ");
Serial.print(dayOfMonth, DEC);
Serial.print("/");
Serial.print(month, DEC);
Serial.print("/");
Serial.print(year, DEC);
Serial.print(" Dia da semana: ");
switch(dayOfWeek){
case 1: Serial.println("Domingo"); break;
case 2: Serial.println("Segunda"); break;
case 3: Serial.println("Terça"); break;
case 4: Serial.println("Quarta"); break;
case 5: Serial.println("Quinta"); break;
case 6: Serial.println("Sexta"); break;
case 7: Serial.println("Sábado"); break;
}
}
void loop() {
displayTime();
delay(1000);
}
Bibliotecas Necessárias
- LiquidCrystal_PCF8574.h – biblioteca necessária, em Sketch > Incluir Biblioteca > Adicionar .ZIP, depois selecione onde o zip foi baixado: GitHub
- RTClib.h – biblioteca de relógio de tempo real, descompacte o zip primeiro, depois adicione o arquivo zip restante à sua biblioteca: GitHub
Esquemáticos
Conexões I2C:
- A5 para SCL
- A4 para SDA
- 5 volts para VCC
- GND para GND
Conexões do sensor de pressão:
- Fio amarelo para A1
- Fio preto para GND
- Fio vermelho para 5 volts
Conecte ao PC e confirme o funcionamento correto.
Processo de manufatura
- Dados Digital com Arduino: Gere Números Aleatórios 1-6 em LCD 16x2
- Controle USB para Jogos DIY com Arduino – Construa Seu Próprio Gamepad de Alto Desempenho
- Crie Animações e Jogos Envolventes em LCD com Arduino UNO
- Tênis Inteligentes com Auto-Ajuste e Colheita de Energia Integrada
- Exibir Temperatura, Umidade e Pressão do BME280 em Touchscreen Nextion
- Medição de Distância em Tempo Real com Sonar Arduino e Visualização no Processing
- Pixel Chaser: Jogo LED Interativo de Um Toque com Arduino Nano
- Roda de Medição Precisa DIY com Arduino Nano e Encoder Rotativo
- Controle Suave de Brilho de LED com Bolt IoT e Arduino UNO
- Componentes de Segurança Pneumáticos: Aplicações-Chave e Orientação de Conformidade