Go Down

Topic: Tankfüllung Restzeit Rechnen und Anzeigen (Read 254 times) previous topic - next topic

papuc111

Apr 23, 2019, 02:42 pm Last Edit: Apr 23, 2019, 03:21 pm by papuc111
Hallo,



Ich habe ein Problem da ich mehrere Wege Ausprobiert aber mein Kopf ist gerade durcheinander.
Hat Jemand mit Ähnliches Thema gearbeitet? Kennt jemand ein Beispiel das es mir zum Problem lösen
weiter Hilft ?

Es Funktioniert alles,
Nun möchte ich es erweitern und zwar so :

Behälter bleibt voll also wird mechanisch ständig nachgefüllt. Aber Irgendwann passiert es, wird durch Irgendeine Grund nicht mehr nachgefüllt. Ab dem Zeit Punkt soll die Timer bzw. Zeit Zähler Anfangen zum Zählen bis auf Pin 3 (%75) Erreicht hat.  
Nehmen wir an es hat 10 min. gedauert und wird gemerkt (MessZeit = x).

Denn Wert nehme ich für Gleichung Rechnen her und lass ich mit dem Formel Berechnen :

%25 = x(in diesen Fall 10Min. bzw. 6000 Sekunden)
%100 = y

y= x.100/25

Am Serial Port oder I2C Display wird Y= Angezeigt damit ich RestZeit weiß.



Pin 2 ist Voll- level (Solange LOW ist soll Zeit Zählen Anfangen)
Pin 3 ist %75 Geladen. (Solange LOW ist soll Zeit Zählen Enden)

Falls Pin 2 LOW aber gleich wieder HIGH wird, soll Zähler auf NULL gehen und Bereit sein
für neues LOOP also von vorne.




Ich will mit micros befehl benutzen (was immer bis  ca. 70 min. erledigt sein wird)



Ich erwarte nicht Jemand für mich alles macht. Ich habe erklärt was ich vor habe und für jeder Hilfe
bin ich dankbar.

Viele Grüße an Arduino Freunde.

papuc111




Hier ist meine Funktionsfähige Sketch:
Code: [Select]




// Anfang Ultraschall Level Anzeige

const int trigPin = 7;
const int echoPin = 6;
const int buzzer = 10;
const int ledPin = 2; // %100    ROT
const int ledviertel = 3 ; // %75  GELB
const int ledmitte  = 4 ;  // %50    GRÜN
const int ledleer = 5 ;    // %20    GRÜN



long duration;
int distance;
int safetyDistance;


void setup() {
pinMode(trigPin, OUTPUT); // Ausgang
pinMode(echoPin, INPUT); // Eingang
pinMode(buzzer, OUTPUT);
pinMode(ledPin, OUTPUT);
pinMode(ledviertel, OUTPUT);
pinMode(ledmitte, OUTPUT);
pinMode(ledleer, OUTPUT);
Serial.begin(9600);
}


void loop() {


// trigPin Low einstellen und loop starten
digitalWrite(trigPin, LOW);
delayMicroseconds(2);

// 10 Microsekunde trigpin an-aus
digitalWrite(trigPin, HIGH);
delayMicroseconds(10);
digitalWrite(trigPin, LOW);
digitalWrite(ledviertel,LOW);
digitalWrite(ledmitte,LOW);
digitalWrite(ledleer,LOW);
// echo lesen
duration = pulseIn(echoPin, HIGH);

// Distance Rechnen
distance= duration*0.034/2;

safetyDistance = distance;
if (safetyDistance <= 10){
 digitalWrite(buzzer, HIGH);
 digitalWrite(ledPin, HIGH);

}
else{
 digitalWrite(buzzer, LOW);
 digitalWrite(ledPin, LOW);

}

if (safetyDistance <= 30){
 
 digitalWrite(ledviertel, HIGH);
 
}
else{
 
 digitalWrite(ledviertel, LOW);
}

if (safetyDistance <= 80){
 
 digitalWrite(ledmitte, HIGH);

}

if (safetyDistance <= 110){
 
 digitalWrite(ledleer, HIGH);
 

}
Serial.print("Distance: ");
Serial.println(distance);


delay(1000);
}


// Ende




Tommy56

Setze Deinen Code bitte in Codetags (</>-Button oben links im Forumseditor oder [*code] davor und [*/code] dahinter ohne *).
Das kannst Du auch noch nachträglich ändern.

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

papuc111

Gerade gemacht , danke für die Warnung

Rentner

Hallo,

also irgendwie hab ich nicht ganz begriffen was Du willst. Was ich verstanden habe , und vermute :

Du willst einen Füllstand mit Utraschall messen.
es gibt 4 Schwellwerte bezogen auf die Messung 20%, 50%,75%, 100%.
wenn die Schwellwerte überschritten sind sollen zugehörige LED angehen.
wenn die 100 % unterschritten werden willst du eine Zeit starten bis die 75% erreicht werden.
Aus der Messzeit willst Du die Zeit berechnen wann der Behälter vermutlich leer ist.


Frage

 Klappt die Messung an sich ohne den ganzen anderen Kram ?
warum willst Du die Zeit in microsekunden messen. millis sollte doch reichen .

Warum benutz Du kein Beispiel zu dem Sensor um die Messung zu machen.
Was ist das für ein Sensor, gibts eine Lib dazu. mit Beispielen, dann must Du dich nicht selbst um das Timing des Sensors kümmern.
Hast Du den Umgang mit millis in soweit verstanden das Du in Abhängigkeit von dem Messert < 100%( start) und Messwert <75% (stop) mit millis eine Zeit messen kannst.


Geh von einem Beispiel aus das nur die Messung macht und bau das schrittweise aus. Erst die 4 LED ansteuern . Dann die Zeitmessung von <100% bis < 75%

Heinz




postmaster-ino

Hi

Verstehe ich Dein Vorhaben recht?
- Behälter wird immer nachgefüllt, immer auf 100% gehalten.
- Wenn Behälter auf 75% abgefallen ist, soll die zeitliche Differenz zu den 100% als Grundlage dienen, die Entnahmezeit bis 25%...0% abzuschätzen.
- Ab 25% wird aktiv gemeckert (wobei Das dann nur eine weitere Zeile Code ist).

Mein Vorgehen:
- IMMER den Füllstand prüfen - ist Füllstand 100%, dann die jetzige Zeit merken (also eigentlich laufend)
- Wenn Füllstand 75% zum ersten Mal erreicht hat, die Differenz zwischen Jetzt und der letzten 100%-Zeit ausrechnen - Wert für 25% Entnahme.
- Wenn Füllstand 25% (gemessen ?!?) erreicht hat, Alarm geben
- Ungefähre Füllhöhe kann aus der 3-fachen Differenz-Zeit (wäre Zeit für 75%), der seit Dem vergangenen Zeit (Delta), 75 und Null grob berechnet werden.
map() wäre dafür mein Kandidat - wie genau Das wird, kommt auf einen Versuch an.

Wie Immer: KEIN delay(), loop() will und darf KEINE Zeit brauchen, wir sind nahezu unendlich oft in der loop(), bevor auch nur irgendwo eine Mücke hustet.
Ok, etwas ausgebremst wird der Kram durch pulseIn - also nur noch fast unendlich oft.

MfG
anscheinend ist Es nicht erwünscht, einen Foren-internen Link als 'Homepage' einzubinden, damit JEDER nur einen Klick von combie's Liste zum Thema State-Maschine entfernt ist.
... dann eben nicht ...

papuc111

Hallo,

also irgendwie hab ich nicht ganz begriffen was Du willst. Was ich verstanden habe , und vermute :

Du willst einen Füllstand mit Utraschall messen.
es gibt 4 Schwellwerte bezogen auf die Messung 20%, 50%,75%, 100%.
wenn die Schwellwerte überschritten sind sollen zugehörige LED angehen.
wenn die 100 % unterschritten werden willst du eine Zeit starten bis die 75% erreicht werden.
Aus der Messzeit willst Du die Zeit berechnen wann der Behälter vermutlich leer ist.


Frage

 Klappt die Messung an sich ohne den ganzen anderen Kram ?
warum willst Du die Zeit in microsekunden messen. millis sollte doch reichen .

Hallo Rentner,
genau wie Vermutest habe ich vor. Die Prozente muss ich nach individuelle Messung feststellen.
Mit Ultraschall  kann ich meine Leveln exact messen also klappt es.

Eigentlich was Postmaster-ino geschrieben hat, hat meine vorhaben besser beschrieben.

Also :

Verstehe ich Dein Vorhaben recht?
- Behälter wird immer nachgefüllt, immer auf 100% gehalten.
- Wenn Behälter auf 75% abgefallen ist, soll die zeitliche Differenz zu den 100% als Grundlage dienen, die Entnahmezeit bis 25%...0% abzuschätzen.
- Ab 25% wird aktiv gemeckert (wobei Das dann nur eine weitere Zeile Code ist).


Ich will Praktisch Erste 25% Zeitlich messen und dann mit dem Restzeit für den Rest inhalt (75%) Berechnen. Es muss zu mir einen schätz Zeit geben.


Mein Vorgehen:
- IMMER den Füllstand prüfen - ist Füllstand 100%, dann die jetzige Zeit merken (also eigentlich laufend)
- Wenn Füllstand 75% zum ersten Mal erreicht hat, die Differenz zwischen Jetzt und der letzten 100%-Zeit ausrechnen - Wert für 25% Entnahme.
- Wenn Füllstand 25% (gemessen ?!?) erreicht hat, Alarm geben
- Ungefähre Füllhöhe kann aus der 3-fachen Differenz-Zeit (wäre Zeit für 75%), der seit Dem vergangenen Zeit (Delta), 75 und Null grob berechnet werden.
map() wäre dafür mein Kandidat - wie genau Das wird, kommt auf einen Versuch an.

Wie Immer: KEIN delay(), loop() will und darf KEINE Zeit brauchen, wir sind nahezu unendlich oft in der loop(), bevor auch nur irgendwo eine Mücke hustet.
Ok, etwas ausgebremst wird der Kram durch pulseIn - also nur noch fast unendlich oft.

MfG
Das klingt ganz logisch und bringt mir neue Ideen für die Programmierung.

Vielen Dank

Mfg

Tommy56

Wenn Du laufend zufördern willst, vermisse ich einen Schutz gegen Überfüllung.

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

papuc111

Wenn Du laufend zufördern willst, vermisse ich einen Schutz gegen Überfüllung.

Gruß Tommy
Danke für die Warnung , es gibt separaten Überfüllung Schutz. Also am Hals von schlauch gibt es einen Sensor das es Überfüllung merkt und stoppt die Weitergabe bis auf Sensor eine HIGH signal gibt .

Was ich machen will , hat mit vorhandenes System nicht zu tun. Ich will nur mit meine Schaltung unabhängig von Vorhandenes System eine Anzeige haben für den Fall was meine Tank leer wird will ich wann es ungefähr leer wird. Oder besser gesagt wie lange Zeit habe ich noch zum manuell nachfüllen.

Viele Grüße

Papuc




Rentner

Hallo,

ich vermute es könnte um die Regentonne im Garten gehen :) , nette Spielerei, nicht schlecht wenn man weiss wann sie vermutlich dann leer ist, und man eine Brieftaube, an Petrus schicken muss, damit es dann mal wieder regnet. Oder hat der jetzt eine E-mail Adresse. ? :)

Also es gibt wie immer viele Lösungen, hier ein Ansatz ohne Anspruch auf Vollständigkeit, aber getestet. Er basiert auf einem Beispiel der New-Ping Lib. Damit wird normal der Abstand vom Sensor gemessen. Zusätzlich wird eine MAX_DISTANCE benötigt = leer, und eine MIN_DISTANCE= Voll bezogen auf den Sensor. Das muss man noch anpassen auf die realen Gegebenheiten des Tanks. Es gibt noch einen kleinen delay von 50 ms drin für den Ping , ich denke für die Anwendung ist das ok.



Heinz.

Code: [Select]

// ---------------------------------------------------------------------------
// Example NewPing library sketch that does a ping about 20 times per second.
// ---------------------------------------------------------------------------

#include <NewPing.h>

#define TRIGGER_PIN  8  // Arduino pin tied to trigger pin on the ultrasonic sensor.
#define ECHO_PIN     9  // Arduino pin tied to echo pin on the ultrasonic sensor.
#define MAX_DISTANCE 100 // Maximum distance we want to ping for (in centimeters). Maximum sensor distance is rated at 400-500cm.
#define MIN_DISTANCE 4    // Abstand voll bis Sensor
// Pinzuweisung der LED´s
byte led20 = 2;   // LED 20%
byte led50 = 3;   // LED 50%
byte led75 = 4;   // LED 75%
byte led100 = 5;  // LED 100%

// Füllstand für die Schaltschwelle
const int levelmin = 20;
const int levelhalb = 50;
const int level75 = 75;
const int levelvoll = 100;

bool flag;  // Hilfsmerker
int level;  // Füllstand
uint32_t startzeit, messzeit;
uint32_t delayvoll;   // Verzögerung entprellen voll Messung

// Instanz New Ping
NewPing sonar(TRIGGER_PIN, ECHO_PIN, MAX_DISTANCE); // NewPing setup of pins and maximum distance.

void setup() {
  Serial.begin(115200); // Open serial monitor at 115200 baud to see ping results.
  pinMode(led20, OUTPUT);
  pinMode(led50, OUTPUT);
  pinMode(led75, OUTPUT);
  pinMode(led100, OUTPUT);

}

void loop() {
  delay(50);   // Wait 50ms between pings (about 20 pings/sec). 29ms should be the shortest delay between pings.
  //  auslesen und scalieren auf 0-100%
  level = map(sonar.ping_cm(), MIN_DISTANCE, MAX_DISTANCE, 100, 0);

  if (level > levelmin)digitalWrite(led20, HIGH);
  else digitalWrite(led20, LOW);

  if (level > levelhalb)digitalWrite(led50, HIGH);
  else digitalWrite(led50, LOW);

  if (level > level75)digitalWrite(led75, HIGH);
  else {
    digitalWrite(led75, LOW);
    if (!flag) {  // einmal messen
      messzeit = millis() - startzeit;    // Messzeit berechnen
      flag = true;  // es ist gemessen
    }
  }

  if (level >= levelvoll) {
    if (millis() - delayvoll > 1000UL) { // Voll entprellen
      digitalWrite(led100, HIGH);
      startzeit = millis(); // Messzeit reset
      flag = false;
      messzeit = 0;
    }
  }
  else {
    digitalWrite(led100, LOW);
    delayvoll = millis();   // reset entprellen
  }

  Serial.print("Level: ");
  Serial.print(level); // Send ping, get distance in cm and print result (0 = outside set distance range)
  Serial.print("%");
  Serial.print ("  Messzeit ");
  Serial.print(messzeit);
  Serial.print ("  Behälter vermutlich leer in ");
  Serial.print(messzeit / 1000 * 3); Serial.println("Sekunden");

}


 


papuc111

#9
Apr 24, 2019, 04:44 am Last Edit: Apr 24, 2019, 04:45 am by papuc111
Rentner ich bin sprachlos.

Besten Dank für deine Mühe.

Ich werde es testen und Berichte hier das Ergebnis.

Viele Grüße
Papuc

papuc111

#10
Apr 25, 2019, 08:43 pm Last Edit: Apr 25, 2019, 08:55 pm by papuc111

Rentner ich bin sprachlos.

Besten Dank für deine Mühe.

Ich werde es testen und Berichte hier das Ergebnis.

Viele Grüße
Papuc
Es Funktioniert schon und lässt sich gut Einstellen. Mein nächstes Ziel ist Zeitstempel mit einem Uhr Modul.

Ein Modul habe ich bereits Bestellt und ich bin gespannt ob ich es hinkriege.

Rentner

Hallo,

schön das es soweit klappt , und danke für die Rückmeldung.

Gruß Heinz

Go Up