Sensor de Presión y Registrador de Datos Basado en Arduino para Monitoreo Preciso de Presión de Aire
Componentes y Suministros
| Componente | Cantidad |
|---|---|
| Arduino UNO | 1 |
| Tarjeta SD Delkin Commercial MLC | 1 |
| Sensor de presión SKU237545 | 1 |
| Módulo RTC para registrador de datos | 1 |
| Pantalla LCD I2C | 1 |
| Caja de proyecto plástica transparente resistente al agua (158 x 90 x 60 mm) | 1 |
| Tornillos hexagonales de nailon negro M3 (300 unidades) | 1 |
| Cables Dupont multicolores ELEGOO (120 unidades) | 1 |
Aplicaciones y Servicios en Línea
- Arduino IDE
Sobre este Proyecto
Este proyecto surgió de la necesidad de registrar la presión del aire acumulada en un depósito para verificar la eficiencia de un compresor mecánico. Cuenta con la ayuda de George Kontaxis.
El sistema muestra en pantalla la fecha y la presión en bar y PSI. Se trata de un manómetro Arduino capaz de leer tres presiones diferentes.
Código
Sensor de Presión SKU237545 con LCD, Reloj en Tiempo Real y Registro de Datos
// Creado el 12 de agosto de 2018 por Philip Blayney y Jack Davidson
// Utilizando código de George Kontaxis para el Sensor de Presión SKU237545
// https://www.youtube.com/watch?v=AB7zgnfkEi4&feature=youtu.be
#include "LiquidCrystal_PCF8574.h"
#include "RTClib.h" // Reloj en tiempo real
#include // Tarjeta SD
#define LCD_ADDRESS 0x27
#define LCD_ROWS 2
#define LCD_COLUMNS 16
#define SCROLL_DELAY 150
#define BACKLIGHT 255
// Inicialización de objetos
LiquidCrystal_PCF8574 lcdI2C;
RTC_DS1307 RTC;
int n = 1;
int val;
// Registrador simple para pines analógicos de Arduino
#define LOG_INTERVAL 1000 // Milisegundos entre entradas
#define SYNC_INTERVAL 10000 // Milisegundos entre llamadas a flush()
uint32_t syncTime = 0;
const int chipSelect = 10;
File logfile;
void error(char *str) {
Serial.print(F("error: "));
Serial.println(str);
}
void setup(void) {
Serial.begin(9600);
Serial.println(F("Lectura de presión del SENSOR SKU237545"));
lcdI2C.begin(LCD_COLUMNS, LCD_ROWS, LCD_ADDRESS, BACKLIGHT);
lcdI2C.print(F("SENSOR SKU237545"));
lcdI2C.setCursor(0,1);
lcdI2C.print(F(" bar y psi "));
delay(2000);
// Inicializar tarjeta SD
Serial.print(F("Inicializando tarjeta SD..."));
pinMode(10, OUTPUT);
if (!SD.begin(chipSelect)) {
error("Tarjeta fallida o no presente");
}
Serial.println(F("Tarjeta inicializada."));
// Crear nuevo archivo
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("No se pudo crear archivo");
}
lcdI2C.clear();
lcdI2C.setCursor(0,0);
lcdI2C.print(F("Archivo No "));
lcdI2C.print(filename);
Serial.print(F("Registrando en: "));
Serial.println(filename);
// Conectar RTC
if (!RTC.begin()) {
logfile.println("RTC falló");
Serial.println(F("RTC falló"));
}
logfile.println("Fecha/Hora,Presión,Bar,Lectura,PSI,Lectura");
delay(5000);
lcdI2C.clear();
}
void loop(void) {
int sensorVal = analogRead(A1);
float voltage = (sensorVal * 5.0) / 1024.0;
float pressure_pascal = (3.0 * (voltage - 0.475)) * 1000000.0; // Calibrar aquí
float pressure_bar = pressure_pascal / 10e5;
float pressure_psi = pressure_bar * 14.5038;
Serial.print("Presión = ");
Serial.print(pressure_bar);
Serial.print(" bar ");
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();
// Escribir en tarjeta SD
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);
// Mostrar en LCD
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);
// Guardar datos de presión
logfile.print(", ");
logfile.print("Presión = ");
logfile.print(",");
logfile.print(pressure_bar);
logfile.print(",");
logfile.print(" bar ");
logfile.print(",");
logfile.print(pressure_psi);
logfile.print(",");
logfile.print("psi");
logfile.println();
// Sincronización periódica
if ((millis() - syncTime) < SYNC_INTERVAL) return;
syncTime = millis();
logfile.flush();
delay(10);
}
Configuración del Reloj en Tiempo 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);
// Configurar hora inicial: segundos, minutos, horas, día, fecha, mes, año
setDS3231time(00, 43, 14, 3, 14, 8, 18);
}
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(" Día de la semana: ");
switch(dayOfWeek) {
case 1: Serial.println("Domingo"); break;
case 2: Serial.println("Lunes"); break;
case 3: Serial.println("Martes"); break;
case 4: Serial.println("Miércoles"); break;
case 5: Serial.println("Jueves"); break;
case 6: Serial.println("Viernes"); break;
case 7: Serial.println("Sábado"); break;
}
}
void loop() {
displayTime();
delay(1000);
}
Bibliotecas Necesarias
- LiquidCrystal_PCF8574.h: Biblioteca para LCD I2C. Disponible en: GitHub
- RTClib.h: Biblioteca para reloj en tiempo real. Disponible en: GitHub
Esquemáticos
Conexiones I2C (LCD y RTC)
- A5 → SCL
- A4 → SDA
- 5V → VCC
- GND → GND
Conexiones del Sensor de Presión
- Cable amarillo → A1
- Cable negro → GND
- Cable rojo → 5V
Verificación Final
Conectar al PC y confirmar el correcto funcionamiento del sistema.
Proceso de manufactura
- Proyecto Dados Digitales Arduino: Construye tu Propio Generador de Números Aleatorios con LCD
- Mando USB para juegos DIY con Arduino – Construye tu propio gamepad de alto rendimiento
- Crea Animaciones y Juegos en LCD 16×2 con Arduino UNO
- Zapatillas Inteligentes Autoajustables con Cosecha de Energía Integrada
- Visualiza Temperatura, Humedad y Presión BME280 en Pantalla Táctil Nextion
- Medición de Distancia en Tiempo Real con Sonar Arduino y Visualización en Processing
- Pixel Chaser: Juego LED Interactivo de Un Toque con Arduino Nano
- Construir una rueda medidora DIY precisa con Arduino Nano y encoder rotativo
- Control de brillo LED sin interrupciones con Bolt IoT y Arduino UNO
- Control Arduino UNO desde Python 3 – Envío de Comandos y Demo LED
- Componentes neumáticos de seguridad: Aplicaciones clave y guía de cumplimiento