Датчик давления и регистратор данных на 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 |
Программное обеспечение
- Arduino IDE
О проекте
Проект создан для записи давления воздуха в ресивере с целью проверки эффективности механического компрессора. Помощь в разработке оказал 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);
}
Необходимые библиотеки
- LiquidCrystal_PCF8574 — GitHub (установить через Sketch → Include Library → Add .ZIP Library)
- RTClib — GitHub (распаковать ZIP, затем добавить внутренний ZIP в библиотеки)
Схемы подключения
I2C-шина (LCD + RTC):
- A5 → SCL
- A4 → SDA
- 5V → VCC
- GND → GND
Датчик давления SKU237545:
- Жёлтый провод → A1 (сигнал)
- Чёрный провод → GND
- Красный провод → 5V
После сборки подключите к ПК и проверьте работу через Serial Monitor.
Производственный процесс
- Цифровые кости на Arduino: генератор случайных чисел с LCD-дисплеем и кнопкой
- DIY USB-геймпад на Arduino: собственный высокопроизводительный контроллер
- Создание анимации и игр на LCD 16×2 с Arduino UNO
- Умные самозавязывающиеся туфли с встроенной сборкой энергии
- Вывод данных BME280 (температура, влажность, давление) на сенсорный экран Nextion
- Измерение расстояния в реальном времени: Ардуино-сонар с визуализацией в Processing
- Pixel Chaser: игра на один тап с NeoPixel Ring и Arduino Nano
- Сборка точного измерительного колеса на Arduino Nano и вращательном энкодере
- Бесшовное управление яркостью светодиодов с помощью Bolt IoT и Arduino UNO
- Пневматические компоненты безопасности: Ключевые применения и руководство по соответствию