Go Down

Topic: Digitale Eingangsdruck Anzeige für Druckluftanlage (Read 1 time) previous topic - next topic

Tommy56

Nun stellt sich mir die Frage, lt. verkabelungsanleitungen wird dieses ebenfalls auf A4+5 angeschlossen. Die Anschlüsse sind ja schon mit dem I2C Display belegt. Wie kann man das lösen?
Indem man lernt, dass I2C ein Bus ist. Solange beide unterschiedliche Adressen haben, können sie beide am I2C-Bus betrieben werden.

Gruß Tommy
"Wer den schnellen Erfolg sucht, sollte nicht programmieren, sondern Holz hacken." (Quelle unbekannt)

devilor

#16
Sep 26, 2020, 09:22 pm Last Edit: Sep 26, 2020, 09:30 pm by devilor
Moin,
vielen Dank für die Antwort.
Ich habe die RTC nun eingebunden bekommen, sieht auch auf dem Display schon ganz gut aus!

Nun habe ich noch ein anliegen wo ich aktuell nicht weiter komme.

der Druckwert (Sensor-Messwert) hüpft immer in der Zeile hin und Her jenachdem ob < 10 bar oder > 10 bar ist.
Ich habe schon versucht über printdigits es hinzubekommen, dass er wenn <10 eine "Leerzeichen" einfügt.

allerdings bin ich bisher erfolglos geblieben.

Ich füge mal meinen Code an, evtl fällt euch generell ja etwas auf, ansonsten würde ich mich freuen wenn ihr mir noch Tipps zu der "tanzenden" Zahl geben könntet.

Code: [Select]
#include <Time.h>
#include <DS1307RTC.h>
#include <Wire.h>
#include <LiquidCrystal_I2C.h>
int offset = 96.26; // Null Bar kalibrieren
int fullScale = 921.6; // maximaldruck kalibrieren
float pressure; // finaler Druck


// Manche (so wie meins) verwenden auch die Adresse 0x3F
// Setze die pins auf dem I2C-Chip, die für die LCD-Verbindungen verwendet werden:
//                    addr, en,rw,rs,d4,d5,d6,d7,bl,blpol
LiquidCrystal_I2C lcd(0x3F  , 20, 4);


void setup() {
  lcd.init(); //Im Setup wird der LCD gestartet
  lcd.backlight(); //Hintergrundbeleuchtung einschalten (lcd.noBacklight(); schaltet die Beleuchtung aus).
  Serial.begin(9600); //Öffnet den seriellen Port und legt die Baud Rate (9600) für die serielle Übertragung fest.
  setSyncProvider(RTC.get); //Dies ist die Funktion um die Zeit- und Datumsangabe von der RTC zu bekommen
}


void loop() {
  pressure = (analogRead(A0) - offset) * 10.0  / (fullScale - offset); // pressure conversion
  Serial.print("Pressure is  ");
  Serial.print(pressure);
  Serial.println("  bar");
  delay(1000);

  // 0.5 Sekunden warten
  delay(500);

  // Position setzen, Überschrift anzeigen
  lcd.setCursor(3, 0); //setCursor gibt an wo der Text beginnen soll. In diesem Fall beim dritten Zeichen in der ersten Reihe
  lcd.print("EINGANGSDRUCK: ");

  // Position setzen, Druck messen und anzeigen
  lcd.setCursor(6, 1);
  lcd.print(pressure, 1);
  lcd.print(" bar  ");

  lcd.setCursor(0, 3); //setCursor gibt an wo der Text beginnen soll. In diesem Fall beim ersten Zeichen in der vierten Reihe.
  printDigitsH(hour());
  printDigits(minute());
  lcd.print(" ");
  lcd.print("Uhr");
  lcd.print(" ");
  printDigitsDay(day()); // Das Datum soll nun als
  lcd.print("."); // „Tag", „." „Monat" usw. angegeben werden.
  printDigitsMon(month());
  lcd.print(".");
  lcd.print(year());
}

void printDigitsH(int digitsH) //In diesem Abschnitt wird festgelgt, dass bei Zahlen <10 im automatisch eine 0 vor den Ziffern angezeigt wird.
{
  if (digitsH < 10)
    lcd.print('0');
  lcd.print(digitsH);
}
void printDigits(int digits) //In diesem Abschnitt wird festgelgt, dass bei Zahlen <10 im automatisch eine 0 vor den Ziffern angezeigt wird.
{
  lcd.print(":");
  if (digits < 10)
    lcd.print('0');
  lcd.print(digits);
}
void printDigitsDay(int digitsDay) //In diesem Abschnitt wird festgelgt, dass bei Zahlen <10 im automatisch eine 0 vor den Ziffern angezeigt wird.
{
  if (digitsDay < 10)
    lcd.print('0');
  lcd.print(digitsDay);
}
void printDigitsMon(int digitsMon) //In diesem Abschnitt wird festgelgt, dass bei Zahlen <10 im automatisch eine 0 vor den Ziffern angezeigt wird.
{
  if (digitsMon < 10)
    lcd.print('0');
  lcd.print(digitsMon);
}



Tommy56

1. Warum 3 verschiedene printDigitsXXX-Funktionen? Das kannst Du doch auch in eine packen.
2. Genau so baust Du eine für den Druck auf. Nur mit if (xxx < 100)

Gruß Tommy
"Wer den schnellen Erfolg sucht, sollte nicht programmieren, sondern Holz hacken." (Quelle unbekannt)

devilor

#18
Sep 26, 2020, 09:36 pm Last Edit: Sep 26, 2020, 09:38 pm by devilor
zu 1. Ich hatte rumprobiert und hatte immer einen : dazwischen. Aber ich habe es jetzt nach deiner Antwort probiert und es auf eine für die Uhrzeit und eine fürs Datum reduzieren können.

zu 2. Ja das hatte ich versucht, allerdings wie bekomme ich das auf den Messwert des sensors (pressure) bezogen? das habe ich noch nicht geschafft. Ich bin ja noch Anfänger in der Materie

Code: [Select]
#include <Time.h>
#include <DS1307RTC.h>
#include <Wire.h>
#include <LiquidCrystal_I2C.h>
int offset = 96.26; // Null Bar kalibrieren
int fullScale = 921.6; // maximaldruck kalibrieren
float pressure; // finaler Druck


// Manche (so wie meins) verwenden auch die Adresse 0x3F
// Setze die pins auf dem I2C-Chip, die für die LCD-Verbindungen verwendet werden:
//                    addr, en,rw,rs,d4,d5,d6,d7,bl,blpol
LiquidCrystal_I2C lcd(0x3F  , 20, 4);


void setup() {
  lcd.init(); //Im Setup wird der LCD gestartet
  lcd.backlight(); //Hintergrundbeleuchtung einschalten (lcd.noBacklight(); schaltet die Beleuchtung aus).
  Serial.begin(9600); //Öffnet den seriellen Port und legt die Baud Rate (9600) für die serielle Übertragung fest.
  setSyncProvider(RTC.get); //Dies ist die Funktion um die Zeit- und Datumsangabe von der RTC zu bekommen
}


void loop() {
  pressure = (analogRead(A0) - offset) * 10.0  / (fullScale - offset); // pressure conversion
  Serial.print("Pressure is  ");
  Serial.print(pressure);
  Serial.println("  bar");
  delay(1000);

  // 0.5 Sekunden warten
  delay(500);

  // Position setzen, Überschrift anzeigen
  lcd.setCursor(3, 0); //setCursor gibt an wo der Text beginnen soll. In diesem Fall beim dritten Zeichen in der ersten Reihe
  lcd.print("EINGANGSDRUCK: ");

  // Position setzen, Druck messen und anzeigen
  lcd.setCursor(6, 1);
  lcd.print(pressure, 1);
  lcd.print(" bar  ");

  lcd.setCursor(0, 3); //setCursor gibt an wo der Text beginnen soll. In diesem Fall beim ersten Zeichen in der vierten Reihe.
  printDigitsDate(hour());
  printDigits(minute());
  lcd.print(" ");
  lcd.print("Uhr");
  lcd.print(" ");
  printDigitsDate(day()); // Das Datum soll nun als
  lcd.print("."); // „Tag", „." „Monat" usw. angegeben werden.
  printDigitsDate(month());
  lcd.print(".");
  lcd.print(year());
}

void printDigitsDate(int digitsDate) //In diesem Abschnitt wird festgelgt, dass bei Zahlen <10 im automatisch eine 0 vor den Ziffern angezeigt wird.
{
  if (digitsDate < 10)
    lcd.print('0');
  lcd.print(digitsDate);
}
void printDigits(int digits) //In diesem Abschnitt wird festgelgt, dass bei Zahlen <10 im automatisch eine 0 vor den Ziffern angezeigt wird.
{
  lcd.print(":");
  if (digits < 10)
    lcd.print('0');
  lcd.print(digits);
}

devilor

#19
Sep 26, 2020, 10:02 pm Last Edit: Sep 26, 2020, 10:03 pm by devilor
Ich habe nun nochmal einen Ansatz versucht, scheint den printdigit auch zu nehmen, allerdings erhalte ich eine Fehlermeldung.

Code: [Select]
exit status 1
too many arguments to function 'void printDigitsDruck(int)'



Der kommt von der "Kommastellen Definition"
Code: [Select]
 // Position setzen, Druck messen und anzeigen
  lcd.setCursor(6, 1);
  printDigitsDruck(pressure, 1);
  //lcd.print(pressure, 1);
  lcd.print(" bar  ");


nehme ich das ", 1" weg ist der Fehler verschwunden, er zeigt auf dem Display dann aber nur noch z.B "5 Bar" an... Eine Kommastelle sollte es schon sein ;)



Code: [Select]
void printDigitsDruck(int digitsDruck)
{
  if (digitsDruck < 10)
    lcd.print(' ');
  lcd.print(digitsDruck);
}

Tommy56

Das kommt davon, wenn man keine Grundlagenkenntnisse hat.

Code: [Select]

float pressure = 95.25;

printDurck(pressure);

...

void printDruck(float druck) {
  lcd.setCursor(6,1);
  if (druck < 100) lcd.print(" ");
  lcd.print(druck,1);
  lcd.print(" bar  ");
}


Gruß Tommy
"Wer den schnellen Erfolg sucht, sollte nicht programmieren, sondern Holz hacken." (Quelle unbekannt)

devilor

#21
Sep 26, 2020, 10:24 pm Last Edit: Sep 26, 2020, 10:31 pm by devilor
Danke für deine Antwort.

Ja ich komme halt nicht aus dem Bereich, möchte aber trotzdem mein Projekt realisieren und versuche zu  verstehen und zu lernen.

Mit deinem Code komme ich allerdings nicht wirklich weiter. Ich bekomme Fehler, Wahrscheinlich füge ich es falsch ein.

Code: [Select]
exit status 1
expected constructor, destructor, or type conversion before '(' token


Die Zeile wird dabei rot.
Code: [Select]
printDurck(pressure);


Sorry wenn ichs noch nicht so recht verstehe.
Wie kommst du denn auf diese "100"? bzw auf "95.25"?

Tommy56

Tippfehler: printDurk --> printDruck

Na Dein Druckwert ist ein float, wenn er Nachkommastellen hat und da habe ich einfach einen hin geschrieben. Das ist natürlich der Wert, den Du ausliest. Etwas denken solltest Du auch selbst, sonst lernst Du ja nichts.

Alles vorkauen werde ich nicht. Du musst die Hinweise verarbeiten und mitdenken.

Gruß Tommy
"Wer den schnellen Erfolg sucht, sollte nicht programmieren, sondern Holz hacken." (Quelle unbekannt)

devilor

Tippfehler: printDurk --> printDruck
Na da hab ich auch vor lauter Bäumen den Wald nicht mehr gesehen. Habe es bestimmt 10 mal gelesen aber den Tippfehler nicht entdeckt!  :D

Mich haben die Werte verwirrt.

Code: [Select]
#include <Time.h>
#include <DS1307RTC.h>
#include <Wire.h>
#include <LiquidCrystal_I2C.h>
int offset = 96.26; // Null Bar kalibrieren
int fullScale = 921.6; // maximaldruck kalibrieren
float pressure; // finaler Druck



// Manche (so wie meins) verwenden auch die Adresse 0x3F
// Setze die pins auf dem I2C-Chip, die für die LCD-Verbindungen verwendet werden:
//                    addr, en,rw,rs,d4,d5,d6,d7,bl,blpol
LiquidCrystal_I2C lcd(0x3F  , 20, 4);


void setup() {
  lcd.init(); //Im Setup wird der LCD gestartet
  lcd.backlight(); //Hintergrundbeleuchtung einschalten (lcd.noBacklight(); schaltet die Beleuchtung aus).
  Serial.begin(9600); //Öffnet den seriellen Port und legt die Baud Rate (9600) für die serielle Übertragung fest.
  setSyncProvider(RTC.get); //Dies ist die Funktion um die Zeit- und Datumsangabe von der RTC zu bekommen
}


void loop() {
  pressure = (analogRead(A0) - offset) * 10.0  / (fullScale - offset); // pressure conversion
  Serial.print("Pressure is  ");
  Serial.print(pressure);
  Serial.println("  bar");
  delay(1000);

  // 0.5 Sekunden warten
  delay(500);

  // Position setzen, Überschrift anzeigen
  lcd.setCursor(3, 0); //setCursor gibt an wo der Text beginnen soll. In diesem Fall beim dritten Zeichen in der ersten Reihe
  lcd.print("EINGANGSDRUCK: ");


  // Position setzen, Druck messen und anzeigen
  lcd.setCursor(6, 1);
  printDruck(pressure);
  //lcd.print(pressure, 1);
  lcd.print(" bar  ");

  lcd.setCursor(0, 3); //setCursor gibt an wo der Text beginnen soll. In diesem Fall beim ersten Zeichen in der vierten Reihe.
  printDigitsDate(hour());
  printDigits(minute());
  lcd.print(" ");
  lcd.print("Uhr");
  lcd.print(" ");
  printDigitsDate(day()); // Das Datum soll nun als
  lcd.print("."); // „Tag", „." „Monat" usw. angegeben werden.
  printDigitsDate(month());
  lcd.print(".");
  lcd.print(year());
}

void printDruck(float druck) {
  lcd.setCursor(6, 1);
  if (druck < 10)
  lcd.print(" ");
  if (druck < 0)
  lcd.setCursor(6, 1);
  lcd.print(druck, 1);
}


void printDigitsDate(int digitsDate) //In diesem Abschnitt wird festgelgt, dass bei Zahlen <10 im automatisch eine 0 vor den Ziffern angezeigt wird.
{
  if (digitsDate < 10)
    lcd.print('0');
  lcd.print(digitsDate);
}
void printDigits(int digits) //In diesem Abschnitt wird festgelgt, dass bei Zahlen <10 im automatisch eine 0 vor den Ziffern angezeigt wird.
{
  lcd.print(":");
  if (digits < 10)
    lcd.print('0');
  lcd.print(digits);
}


so scheint es zu funktionieren, habe leider nicht genug Puste um 10 bar reinzublasen, allerdings genug Vakuum um -0,1 bar zu erzeugen, da bleibt es nun auch auf der richtigen Position!

Vielen Dank für deine Geduld.

devilor

#24
Oct 03, 2020, 11:52 am Last Edit: Oct 03, 2020, 11:55 am by devilor
Hallo,

[...] Verbinde alle Massepunkte möglichst Sternförmig.
Moin nochmal. Ich habe nun meinen zweiten Step-down regler bekommen. Einen habe ich auf 5V für den Sensor, das RTC Modul und das LCD eingestellt, den zweiten habe ich auf 7V eingestellt für das Board.
Ich habe alles ins Gehäuse gebaut.

Ich habe mir nun 2 "Verteilerleisten" gebaut. einmal 5V und einmal GND (Masse). -> s. Bild
Nun habe ich alles angeschlossen, die Massen beider Spannungsregler sowie aller Geräte zusammengeführt. Die 7V direkt über den VIN Pin sowie die Masse vom Board mit auf die Verteilerleiste ( wo auch alle anderen, incl die des 5V Spannungsregler draufliegen)
Versorgt wird alles von einem Mean Well HDR-30-12 Hutschienen Netzteil.

Als ich gestern die Druckluft angeschlossen hatte zeigte das Display bei knapp 11 Bar nur 8,3Par an  :smiley-confuse:  Ich weiß nur nicht warum, zuvor waren es 11 Bar was auch stimmte ( mit Manuellen Manometer verglichen)
Wenn alles eine Weile Stromlos ist verliert das RTC scheinbar die Zeit / Datum, das Display zeigt dann nur noch 0 Uhr 1970 an.
Batterie habe ich schon getauscht.

Hat jemand noch eine Idee?
PS: Sieht aufgrund meiner Suche jetzt wieder sehr wüst aus in dem Gehäuse...

devilor

Ich bekomme dann im Seriellen Monitor beim Readtest den "Fehler"

"The DS1307 is stopped.  Please run the SetTime
example to initialize the time and begin running."

michael_x

Quote
Please run the SetTime example to initialize the time and begin running
Und?
Hast du versucht, die Uhr zu starten und eine sinnvolle Zeit einzustellen?
Läuft die Uhr danach?
Läuft diese weiter, auch "wenn alles eine Weile stromlos ist", nur über die Backup-Batterie der Uhr?

(Wenn die Antworten : "Hmm, ja, ja, nein" sind, ist die Batterie nicht richtig eingelegt oder leer.)

Oder willst du dich erstmal um die Druckmessung kümmern?


devilor

#27
Oct 05, 2020, 11:30 am Last Edit: Oct 06, 2020, 07:43 pm by devilor
Die Uhr war gestellt lief auch erst. Nach 1-2 Stunden hat sie die Zeit verloren. Batterie sitzt und ist voll.

Bei der druckmessung scheint irgendwas im argen zu sein. Bevor ich es ins Gehäuse gebaut habe lief es mit dem gleichen Programm.
Nun gibt der Sensor bei ca. 10.5-10.7 bar (nach Manueller Anzeige) eine Signalspannung von 3.6-3,7V aus. Da es ein 1.2MPA Sensor mit einem Messbereich von 0,5-4,5V ist sollten das doch ~ 10Bar darstellen..richtig?

devilor

#28
Oct 06, 2020, 07:46 pm Last Edit: Oct 06, 2020, 10:28 pm by devilor Reason: Link zum Sensor hinzu, ergänzung des posts.
So ich habe heute einen nagelneuen Drucksensor bekommen.
Leider mit dem gleichen Ergebnis. Bei Abschaltdruck was ca. 10,5 Bar sein sollten zeigt mein Display nach wie vor 8,7Bar an. Am Sensor scheint es ja also nicht zu liegen.

Ich habe am Code eigentlich nichts geändert außer die RTC hinzu, ich habe auch schon mehrfach den Code durchgeschaut, finde allerdings keinen Fehler.

Achso: Sensor ist dieser hier!

Seht ihr ob bzw. wo es im Programm einen Fehler gibt?

Code: [Select]
#include <Time.h>
#include <DS1307RTC.h>
#include <Wire.h>
#include <LiquidCrystal_I2C.h>
int offset = 96.26; // Null Bar kalibrieren
int fullScale = 921.6; // maximaldruck kalibrieren
float pressure; // finaler Druck



// Manche (so wie meins) verwenden auch die Adresse 0x3F
// Setze die pins auf dem I2C-Chip, die für die LCD-Verbindungen verwendet werden:
//                    addr, en,rw,rs,d4,d5,d6,d7,bl,blpol
LiquidCrystal_I2C lcd(0x3F  , 20, 4);


void setup() {
  lcd.init(); //Im Setup wird der LCD gestartet
  lcd.backlight(); //Hintergrundbeleuchtung einschalten (lcd.noBacklight(); schaltet die Beleuchtung aus).
  Serial.begin(9600); //Öffnet den seriellen Port und legt die Baud Rate (9600) für die serielle Übertragung fest.
  setSyncProvider(RTC.get); //Dies ist die Funktion um die Zeit- und Datumsangabe von der RTC zu bekommen
}


void loop() {
  pressure = (analogRead(A0) - offset) * 10.0  / (fullScale - offset); // pressure conversion
  Serial.print("Pressure is  ");
  Serial.print(pressure);
  Serial.println("  bar");
//  delay(1000);

  // 0.3 Sekunden warten
  delay(300);

  // Position setzen, Überschrift anzeigen
  lcd.setCursor(4, 0); //setCursor gibt an wo der Text beginnen soll. In diesem Fall beim dritten Zeichen in der ersten Reihe
  lcd.print("SYSTEMDRUCK:");


  // Position setzen, Druck messen und anzeigen
  lcd.setCursor(6, 1);
  printDruck(pressure);
  //lcd.print(pressure, 1);
  lcd.print(" bar  ");

  lcd.setCursor(0, 3); //setCursor gibt an wo der Text beginnen soll. In diesem Fall beim ersten Zeichen in der vierten Reihe.
  printDigitsDate(hour());
  printDigits(minute());
  lcd.print(" ");
  lcd.print("Uhr");
  lcd.print(" ");
  printDigitsDate(day()); // Das Datum soll nun als
  lcd.print("."); // „Tag", „." „Monat" usw. angegeben werden.
  printDigitsDate(month());
  lcd.print(".");
  lcd.print(year());
}

void printDruck(float druck) {
  lcd.setCursor(6, 1);
  if (druck < 10)
  lcd.print(" ");
  if (druck < 0)
  lcd.setCursor(6, 1);
  lcd.print(druck, 1);
}


void printDigitsDate(int digitsDate) //In diesem Abschnitt wird festgelgt, dass bei Zahlen <10 im automatisch eine 0 vor den Ziffern angezeigt wird.
{
  if (digitsDate < 10)
    lcd.print('0');
  lcd.print(digitsDate);
}
void printDigits(int digits) //In diesem Abschnitt wird festgelgt, dass bei Zahlen <10 im automatisch eine 0 vor den Ziffern angezeigt wird.
{
  lcd.print(":");
  if (digits < 10)
    lcd.print('0');
  lcd.print(digits);
}


Danke schonmal :)

Ich bin langsam echt ratlos.. Habe nun die ganze Sensorverkabelung nochmal auseinander genommen, da ich diese ja ca. 10cm verlängern musste. Daran lag es auch nicht.
Gerade nochmal den nagelneuen Sensor incl. neuem ( dem Sensor beiliegendem) Kabel in Originallänge getestet, das gleiche. Spannung am A0 kommen 3,72V An bei Abschaltdruck, was ca. 10,5 bar sein sollten lt. Manometer.

PS: Die RTC Uhr läuft nun seit Tagen Problemlos.


Go Up