Промышленное производство
Промышленный Интернет вещей | Промышленные материалы | Техническое обслуживание и ремонт оборудования | Промышленное программирование |
home  MfgRobots >> Промышленное производство >  >> Manufacturing Technology >> Производственный процесс

Датчик давления и регистратор данных на Arduino для точного мониторинга воздушного давления

Компоненты и материалы

Компонент Количество
Arduino UNO 1
SD-карта Delkin Commercial MLC 1
Датчик давления SKU237545 1
Модуль реального времени (RTC) 1
I2C LCD-дисплей 1
Водонепроницаемый корпус 158×90×60 мм 1
Набор винтов M3 (300 шт.) 1
Провода Dupont (120 шт.) 1

Программное обеспечение

О проекте

Проект создан для записи давления воздуха в ресивере с целью проверки эффективности механического компрессора. Помощь в разработке оказал George Kontaxis (видео).

Устройство отображает дату и давление в барах и PSI на LCD-экране, а также записывает данные на SD-карту в формате CSV с временными метками от RTC.

Программный код

Основной скетч: датчик давления SKU237545 с LCD, RTC и логированием данных

// Created 12 Aug 2018 by Philip Blayney & Jack Davidson
// Based on code by George Kontaxis for SKU237545 Pressure Sensor
// https://www.youtube.com/watch?v=AB7zgnfkEi4

#include <LiquidCrystal_PCF8574.h>
#include <RTClib.h>        // Real Time Clock
#include <SD.h>            // SD card

#define LCD_ADDRESS 0x27
#define LCD_ROWS 2
#define LCD_COLUMNS 16
#define SCROLL_DELAY 150
#define BACKLIGHT 255

LiquidCrystal_PCF8574 lcdI2C;
RTC_DS1307 RTC;

int n = 1;
int val;

#define LOG_INTERVAL 1000    // ms между записями
#define SYNC_INTERVAL 10000  // ms между flush() на SD
uint32_t syncTime = 0;
const int chipSelect = 10;
File logfile;

void error(char *str) {
  Serial.print(F("error: "));
  Serial.println(str);
}

void setup() {
  Serial.begin(9600);
  Serial.println(F("Pressure reading off SKU237545 SENSOR"));

  lcdI2C.begin(LCD_COLUMNS, LCD_ROWS, LCD_ADDRESS, BACKLIGHT);
  lcdI2C.print(F("SKU237545 SENSOR"));
  lcdI2C.setCursor(0,1);
  lcdI2C.print(F(" bar and psi "));
  delay(2000);

  Serial.print(F("Initializing SD card..."));
  pinMode(10, OUTPUT);
  if (!SD.begin(chipSelect)) {
    error("Card failed, or not present");
  }
  Serial.println(F("card initialized."));

  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("couldnt create file");

  lcdI2C.clear();
  lcdI2C.setCursor(0,0);
  lcdI2C.print(F("File No "));
  lcdI2C.print(filename);
  Serial.print(F("Logging to: "));
  Serial.println(filename);

  if (!RTC.begin()) {
    logfile.println("RTC failed");
    Serial.println(F("RTC failed"));
  }

  logfile.println("Date / Time ,pressure ,bar ,reading ,psi,reading ");
  delay(5000);
  lcdI2C.clear();
}

void loop() {
  int sensorVal = analogRead(A1);
  float voltage = (sensorVal * 5.0) / 1024.0;
  float pressure_pascal = (3.0 * ((float)voltage - 0.475)) * 1000000.0; // калибровка
  float pressure_bar = pressure_pascal / 10e5;
  float pressure_psi = pressure_bar * 14.5038;

  Serial.print("Pressure = ");
  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();

  // Запись на 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);

  logfile.print(", "); logfile.print(" Pressure = "); logfile.print(",");
  logfile.print(pressure_bar); logfile.print(","); logfile.print(" bar ");
  logfile.print(","); logfile.print(pressure_psi); logfile.print(","); logfile.print("psi");
  logfile.println();

  // Вывод на 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);

  if ((millis() - syncTime) < SYNC_INTERVAL) return;
  syncTime = millis();
  logfile.flush();
  delay(10);
}

Настройка часов реального времени (RTC)

// Code by 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);
  // Установите нужное время: секунды, минуты, часы, день недели, день, месяц, год
  setDS3231time(0, 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 loop() {
  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(" Day: ");
  const char* days[] = {"", "Sunday", "Monday", "Tuesday", "Wednesday", "Thursday", "Friday", "Saturday"};
  Serial.println(days[dayOfWeek]);
  delay(1000);
}

Необходимые библиотеки

Схемы подключения

I2C-шина (LCD + RTC):

Датчик давления SKU237545:

После сборки подключите к ПК и проверьте работу через Serial Monitor.

Производственный процесс

  1. Цифровые кости на Arduino: генератор случайных чисел с LCD-дисплеем и кнопкой
  2. DIY USB-геймпад на Arduino: собственный высокопроизводительный контроллер
  3. Создание анимации и игр на LCD 16×2 с Arduino UNO
  4. Умные самозавязывающиеся туфли с встроенной сборкой энергии
  5. Вывод данных BME280 (температура, влажность, давление) на сенсорный экран Nextion
  6. Измерение расстояния в реальном времени: Ардуино-сонар с визуализацией в Processing
  7. Pixel Chaser: игра на один тап с NeoPixel Ring и Arduino Nano
  8. Сборка точного измерительного колеса на Arduino Nano и вращательном энкодере
  9. Бесшовное управление яркостью светодиодов с помощью Bolt IoT и Arduino UNO
  10. Пневматические компоненты безопасности: Ключевые применения и руководство по соответствию