Arduino-basierter Drucksensor & Datenlogger für präzise Luftdrucküberwachung
Komponenten und Zubehör
| Komponente | Menge |
|---|---|
| Arduino UNO | 1 |
| Delkin Commercial MLC SD-Karte | 1 |
| Drucksensor SKU237545 | 1 |
| Datenlogger RTC (Echtzeituhr) | 1 |
| I2C LCD-Display | 1 |
| Wasserdichtes Gehäuse (158 × 90 × 60 mm) | 1 |
| M3 Nylon-Schrauben (300 Stück) | 1 |
| Dupont-Kabel (120 Stück, farbig) | 1 |
Apps und Online-Dienste
- Arduino IDE
Projektbeschreibung
Dieses Projekt entstand aus dem Wunsch, den Luftdruck in einem Reservoir aufzuzeichnen, um die Effizienz eines mechanischen Kompressors zu überprüfen. Besonderer Dank gilt George Kontaxis für seine Unterstützung.
Video-Demonstration auf YouTube
Das Display zeigt Datum und Druck in Bar sowie PSI an.
Arduino-Druckmessgerät – Messung von 3 Druckwerten
Programmcode
Hauptprogramm: Drucksensor mit LCD, Echtzeituhr und Datenlogging
// Erstellt am 12. August 2018 von Philip Blayney & Jack Davidson
// Basierend auf Code von George Kontaxis für den SKU237545 Drucksensor
// https://www.youtube.com/watch?v=AB7zgnfkEi4
#include "LiquidCrystal_PCF8574.h"
#include "RTClib.h"
#include
#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
#define SYNC_INTERVAL 10000
uint32_t syncTime = 0;
const int chipSelect = 10;
File logfile;
void error(char *str) {
Serial.print(F("Fehler: "));
Serial.println(str);
}
void setup(void) {
Serial.begin(9600);
Serial.println(F("Druckmessung am SKU237545 SENSOR"));
lcdI2C.begin(LCD_COLUMNS, LCD_ROWS, LCD_ADDRESS, BACKLIGHT);
lcdI2C.print(F("SKU237545 SENSOR"));
lcdI2C.setCursor(0,1);
lcdI2C.print(F(" bar und psi "));
delay(2000);
Serial.print(F("Initialisiere SD-Karte..."));
pinMode(10, OUTPUT);
if (!SD.begin(chipSelect)) {
error("Karte fehlgeschlagen oder nicht vorhanden");
}
Serial.println(F("Karte initialisiert."));
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("Datei konnte nicht erstellt werden");
}
lcdI2C.clear();
lcdI2C.setCursor(0,0);
lcdI2C.print(F("Datei Nr. "));
lcdI2C.print(filename);
Serial.print(F("Logge in: "));
Serial.println(filename);
if (!RTC.begin()) {
logfile.println("RTC fehlgeschlagen");
Serial.println(F("RTC fehlgeschlagen"));
}
logfile.println("Datum / Zeit, Druck, Bar, Rohwert, PSI, Rohwert");
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;
float pressure_bar = pressure_pascal / 10e5;
float pressure_psi = pressure_bar * 14.5038;
Serial.print("Druck = ");
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();
// In Datei schreiben
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("Druck = ");
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 anzeigen
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);
}
Echtzeituhr einstellen (DS3231)
// Code von 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);
// Zeit hier einstellen: Sekunden, Minuten, Stunden, Tag, Datum, Monat, Jahr
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(" Wochentag: ");
const char* days[] = {"", "Sonntag", "Montag", "Dienstag", "Mittwoch", "Donnerstag", "Freitag", "Samstag"};
Serial.println(days[dayOfWeek]);
delay(1000);
}
Benötigte Bibliotheken
Schaltplan
I2C-Verbindungen (LCD & RTC):
- A5 → SCL
- A4 → SDA
- 5V → VCC
- GND → GND
Drucksensor (SKU237545):
- Gelbes Kabel → A1 (Signal)
- Schwarzes Kabel → GND
- Rotes Kabel → 5V
Anschließend an PC anschließen und Funktion prüfen.
Herstellungsprozess
- Arduino Digitaler Würfel: LCD-Würfel mit Zufallszahlen (1–6)
- DIY Arduino USB Gaming Controller – Bauen Sie Ihren eigenen High-Performance Gamepad
- LCD-Animationen & Spiele mit Arduino UNO erstellen
- Intelligente selbstschnürende Schuhe mit integrierter Energiegewinnung
- BME280 Temperatur, Luftfeuchte & Druck auf Nextion Touchscreen anzeigen
- Echtzeit-Entfernungsmessung mit Arduino Sonar & Processing-Visualisierung
- Pixel Chaser: Interaktives One-Tap-LED-Spiel mit Arduino Nano
- Präzises DIY-Messrad mit Arduino Nano und Drehgeber
- Stufenlose LED-Helligkeitssteuerung mit Bolt IoT und Arduino UNO
- Pneumatische Sicherheitskomponenten: Wichtige Anwendungen und Compliance-Richtlinien