INFO: Dieses Forum nutzt Cookies...
Cookies sind für den Betrieb des Forums unverzichtbar. Mit der Nutzung des Forums erklärst Du dich damit einverstanden, dass wir Cookies verwenden.

Es wird in jedem Fall ein Cookie gesetzt um diesen Hinweis nicht mehr zu erhalten. Desweiteren setzen wir Google Adsense und Google Analytics ein.

Antwort schreiben 
 
Themabewertung:
  • 0 Bewertungen - 0 im Durchschnitt
  • 1
  • 2
  • 3
  • 4
  • 5
Benzinuhr mit stufigem Geber
20.03.2016, 21:19
Beitrag #1
Benzinuhr mit stufigem Geber
Hallo,
ich lasse gerade einen Benzintank bauen. Der hat leider keine Quaderform.
Das Volumen ist ca 65 Liter. Der Geber hat alle 2 Zentimeter einen Readkontakt. Dieser ist intern mit einer Widerstandsdekade verschaltet. Der höchste Wert sind 230Ω. Das heißt:
0 Ω =Leer
23 Ω = 1,3Liter
46 Ω = 4,8Liter
69 Ω = 10,5Liter
92 Ω = 14,8Liter
usw.

Mein Versuch geht nicht.
Code:
#include <LiquidCrystal.h>
LiquidCrystal lcd(12, 11, 5, 4, 3, 2);
const int numRows=2;
const int numCols=16;

const int literPin=A1;

void setup() {

lcd.begin(numCols, numRows);//Start LCD

lcd.setCursor(6,0);  //1. Reihe 7.Zeichen
lcd.print("Liter");  //Schreibt das Wort

}

void loop() {
  int val; //Wert vom Tankgeber
  int Liter;// heißt Liter
val=analogRead(literPin);//Bezogen auf

Liter = map(val, 0, 1023, 0, 65);// Hier habe ich keine Ahnung???

lcd.setCursor(1,0);
lcd.print( Liter);

}

???
Achim

Ich kann kaum etwas lernen, vergesse das auch wieder. Aber wenn ich etwas immer wieder klar vor Augen habe, kann ich verdammt viel damit anfangen
Alle Beiträge dieses Benutzers finden
Diese Nachricht in einer Antwort zitieren
21.03.2016, 09:48
Beitrag #2
RE: Benzinuhr mit stufigem Geber
Erklärungen zu "Map" findest du hier:
https://www.arduino.cc/en/Reference/Map
oder:
http://www.netzmafia.de/skripten/hardwar...erung.html

I2C = weniger ist mehr: weniger Kabel, mehr Probleme. Cool
Alle Beiträge dieses Benutzers finden
Diese Nachricht in einer Antwort zitieren
21.03.2016, 12:49
Beitrag #3
RE: Benzinuhr mit stufigem Geber
Danke für die Links, hotsystems
Code:
map(x, low1, high1, low2, high2)
Abbildung eines Wertes x aus dem Bereich [low1..high1] auf den Bereich [low2..high2]. Es wird keine Begrenzung des Parameters x auf den Bereich [low1..high1] vorgenommen.
[code]
Das würde dann so aussehen, oder?:
Code:
Liter = map(val, 1, 100, 5, 5);//      Zwischen 1-100mV=5 Liter
Liter = map(val, 101, 200, 15, 15);//Zwischen 101-200mV=15Liter
Liter = map(val, 201, 300, 21, 21);
Liter = map(val, 301, 400, 32, 32);
Liter = map(val, 401, 500, 50, 50);
  lcd.setCursor(1, 0); //1. Reihe 2. Feld
  lcd.print( Liter); //Schreibe den Wert für Liter
}

Egal welche Spannung am A1 anliegt, es erscheint die "50" wie eingemeißelt.

?
Achim

Ich kann kaum etwas lernen, vergesse das auch wieder. Aber wenn ich etwas immer wieder klar vor Augen habe, kann ich verdammt viel damit anfangen
Alle Beiträge dieses Benutzers finden
Diese Nachricht in einer Antwort zitieren
21.03.2016, 13:19
Beitrag #4
RE: Benzinuhr mit stufigem Geber
Hi,
Gretchenfrage, wie schließt du den Tankgeber genau an ? 12V...5V vom Arduino ?
Mach doch mal eine Skizze wie das aussieht.
Und wie versorgst du den Arduino mit Strom ?
lgbk

1+1 = 10 Angel ...und ich bin hier nicht der Suchmaschinen-Ersatz Dodgy...nur mal so als genereller Tipp..
Alle Beiträge dieses Benutzers finden
Diese Nachricht in einer Antwort zitieren
21.03.2016, 15:28
Beitrag #5
RE: Benzinuhr mit stufigem Geber
Hallo Bitklopfer,
ich habe noch nichts gekauft, da ich erstmal auf den Tank warte. Zur Zeit habe ich nur ein Poti dran. Also am A1 Pin dadurch 0 bis 5 Volt. Weitere Gedanken habe ich noch nicht gemacht. Außer, das ich sicherlich einen Nano oder so verwenden werde.
Jetzt hängt der Uno am Usb. Die 5 Volt stehen exakt an. Habe das Meßgerät am Poti.
Code:
Liter = map(val, 0, 1000, 5,50);
So funktioniert es. Vielleicht sollte ich es einfach so lassen und statt Liter "%" schreiben. Dann daneben eine Tabelle hängen:
10%= 8 Liter
20%= 15 Liter
usw.
E kommt ja nicht drauf an. 65 Liter reichen für 3 Wochen Urlaub ohne nachtanken.

Danke
Achim

Ich kann kaum etwas lernen, vergesse das auch wieder. Aber wenn ich etwas immer wieder klar vor Augen habe, kann ich verdammt viel damit anfangen
Alle Beiträge dieses Benutzers finden
Diese Nachricht in einer Antwort zitieren
21.03.2016, 16:15
Beitrag #6
RE: Benzinuhr mit stufigem Geber
Hallo Achim,

so wie dein Programm geschrieben ist, werden die Zeilen mit dem map() immer alle abgearbeitet. Deshalb kommt immer der Wert aus der letzten Zeile zur Anzeige.

Probier mal folgendes:
Code:
#include <LiquidCrystal.h>
LiquidCrystal lcd(12, 11, 5, 4, 3, 2);
const int numRows = 2;
const int numCols = 16;

const int literPin = A1;

void setup() {

  lcd.begin(numCols, numRows);//Start LCD

  lcd.setCursor(6, 0); //1. Reihe 7.Zeichen
  lcd.print("Liter");  //Schreibt das Wort

}

void loop() {
  int val; //Wert vom Tankgeber
  int Liter;// heißt Liter
  val = analogRead(literPin); //Bezogen auf

  if (val >=   0) Liter = map(val,   1, 100,  0,  5);   // Zwischen 1-100    =  0 -  5 Liter
  if (val >= 101) Liter = map(val, 101, 200,  5, 15);   // Zwischen 101-200  =  5 - 15 Liter
  if (val >= 201) Liter = map(val, 201, 300, 15, 21);   // Zwischen 201-300  = 15 - 21 Liter
  if (val >= 301) Liter = map(val, 301, 400, 21, 32);   // Zwischen 301-400  = 21 - 32 Liter
  if (val >= 401) Liter = map(val, 401, 500, 32, 50);   // Zwischen 401-500  = 32 - 50 Liter
  
  lcd.setCursor(1, 0); //1. Reihe 2. Feld
  lcd.print( Liter);   //Schreibe den Wert für Liter
}

Gruß
Arne

ExclamationMit zunehmender Anzahl qualifizierter Informationen bei einer Problemstellung, erhöht sich zwangsläufig die Gefahr auf eine zielführende Antwort.Exclamation
Alle Beiträge dieses Benutzers finden
Diese Nachricht in einer Antwort zitieren
21.03.2016, 17:44
Beitrag #7
RE: Benzinuhr mit stufigem Geber
Danke Arne,
es funktioniert.
Leuchtet ja auch ein, dass da noch eine Funktion: "Wenn>Dann", kommen muß.

Mir fällt schwer eine Logik in diesen Sketchen zu finden. Alleine die Schreibweise, Klein, groß, nicht zusammengesetzt, zusammengesetztes Wort ist für mich ein Kuriosum. Im Arduino Kochbuch sind fast alle Sketche mit irgendeinem Geblinke verbunden. Dabei sind doch die meisten Funktionen nur einmalig. Eine Temperatur wird nach den Umgebungsumständen erreicht, dann soll geschaltet werden. Was hat das mit 5x Blinken und 4X nicht, in der Erklärung "Blink ohne delay" zu tun.
Aber du hast das ja mal anders aufgerollt. Dankeschön!
Gibt es da echt nur millis keine Second/Minute? Dann sind alleine 10 Minuten schon
600.000 ms ?
OK, aber die Benzinuhr bekomme ich so in den Griff.

Achim
.

Ich kann kaum etwas lernen, vergesse das auch wieder. Aber wenn ich etwas immer wieder klar vor Augen habe, kann ich verdammt viel damit anfangen
Alle Beiträge dieses Benutzers finden
Diese Nachricht in einer Antwort zitieren
21.03.2016, 18:19
Beitrag #8
RE: Benzinuhr mit stufigem Geber
Bitteschön!

Die Logik ist für ungeübte auf etwas unübersichtlich weil eingekürzt.
Richtig ausgeschrieben würde eine Zeile der if-Bedinungen so aussehen:
Code:
if (val >= 101){
    Liter = map(val, 101, 200,  5, 15);   // Zwischen 101-200  =  5 - 15 Liter
  }
Wenn aber nur eine Anweisung nach der if-Abfrage kommt kann man die Klammern {} weglassen.

Aber auch ein Zeilenumbruch ohne {} ist möglich.
Code:
if (val >= 101)
    Liter = map(val, 101, 200,  5, 15);   // Zwischen 101-200  =  5 - 15 Liter

An die Groß/Kleinschreibung muss man sich leider gewöhnen. Das ist ein Feature der Programmiersprache. Big Grin
Besonders bei Variablennamen muss man aufpassen. int variable1; ist eine andere als int Variable1;
Damit kann man sich das Leben ganz schön schwer machen wenn man sich keinen Standard bei der Schreibweise angewöhnt.
Auch Leerzeichen in Namen gehen nicht. int variable 1; klappt nicht, aber ein _ ist da gerne gesehen. int variable_1; geht also.

Der Arduino kennt leider nur millis(); für Millisekunden und micros(), für Mikrosekunden.

Wenn man Sekunden. Minuten oder Stunden braucht, muss man sich die auf Basis der millis(); selbst erstellen. Ungetestet sieht das so aus:
Code:
unsigned long Sekunde     = 0;
unsigned long Minute      = 0;
unsigned long Stunde      = 0;
unsigned long last_millis = 0;

void setup() {

}

void loop() {

  if (millis() >= last_millis + 1000) {
    last_millis = millis();
    Sekunde++;
    if (Sekunde > 59) {
      Sekunde = 0;
      Minute++;
      if (Minute > 59) {
        Minute = 0;
        Stunde++;
      }
    }
  }

}

Gruß
Arne

ExclamationMit zunehmender Anzahl qualifizierter Informationen bei einer Problemstellung, erhöht sich zwangsläufig die Gefahr auf eine zielführende Antwort.Exclamation
Alle Beiträge dieses Benutzers finden
Diese Nachricht in einer Antwort zitieren
Antwort schreiben 


Gehe zu:


Benutzer, die gerade dieses Thema anschauen: 1 Gast/Gäste