Manufactura industrial
Internet industrial de las cosas | Materiales industriales | Mantenimiento y reparación de equipos | Programación industrial |
home  MfgRobots >> Manufactura industrial >  >> Manufacturing Technology >> Proceso de manufactura

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

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

Esquemáticos

Conexiones I2C (LCD y RTC)

Conexiones del Sensor de Presión

Verificación Final

Conectar al PC y confirmar el correcto funcionamiento del sistema.

Proceso de manufactura

  1. Proyecto Dados Digitales Arduino: Construye tu Propio Generador de Números Aleatorios con LCD
  2. Mando USB para juegos DIY con Arduino – Construye tu propio gamepad de alto rendimiento
  3. Crea Animaciones y Juegos en LCD 16×2 con Arduino UNO
  4. Zapatillas Inteligentes Autoajustables con Cosecha de Energía Integrada
  5. Visualiza Temperatura, Humedad y Presión BME280 en Pantalla Táctil Nextion
  6. Medición de Distancia en Tiempo Real con Sonar Arduino y Visualización en Processing
  7. Pixel Chaser: Juego LED Interactivo de Un Toque con Arduino Nano
  8. Construir una rueda medidora DIY precisa con Arduino Nano y encoder rotativo
  9. Control de brillo LED sin interrupciones con Bolt IoT y Arduino UNO
  10. Control Arduino UNO desde Python 3 – Envío de Comandos y Demo LED
  11. Componentes neumáticos de seguridad: Aplicaciones clave y guía de cumplimiento