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
Hilfe bei Programm/Füllstandsmessung
12.06.2014, 21:56 (Dieser Beitrag wurde zuletzt bearbeitet: 12.06.2014 22:04 von Tropaion.)
Beitrag #1
Hilfe bei Programm/Füllstandsmessung
Hallo Leute!
Ich benötige eure Hilfe bei meine Code!
Zitat:#include <Wire.h>
#include <LCD.h>
#include <LiquidCrystal_I2C.h>

//LCD-Pins definieren
#define I2C_ADDR    0x3F // <<----- Add your address here. Find it from I2C Scanner
#define BACKLIGHT_PIN     3
#define En_pin  2
#define Rw_pin  1
#define Rs_pin  0
#define D4_pin  4
#define D5_pin  5
#define D6_pin  6
#define D7_pin  7
LiquidCrystal_I2C lcd(I2C_ADDR,En_pin,Rw_pin,Rs_pin,D4_pin,D5_pin,D6_pin,D7_pin);

//Ultraschall-Pins definieren
int pingPin = 13;
int inPin = 12;

const int select = 0;
const int enter = 1;
const float pi = 3.14;
long duration, dm, liter;
int menu = 0;
int tiefe = 0;
int radius = 0;
int volumen = 0;

void setup()
{
//Initialisieren des LCD und festlegung der Größe
lcd.begin (16,2);
//Hintergrundbeleuchtung ein
lcd.setBacklightPin(BACKLIGHT_PIN,POSITIVE);
lcd.setBacklight(HIGH);

pinMode(select, INPUT);
pinMode(enter, INPUT);

  while (menu == 0)
  {
  lcd.clear();
  tiefe = tiefe + digitalRead(select);
  menu = menu + digitalRead(enter);
  lcd.home ();
  lcd.print("Einstellungen:");
  lcd.setCursor(0, 1);
  lcd.print("Tiefe ");
  lcd.print(tiefe);
  lcd.print("dm");
  }
  while (menu == 1)
  {
  lcd.clear();
  radius = radius + digitalRead(select);
  menu = menu + digitalRead(enter);
  lcd.home ();
  lcd.print("Einstellungen:");
  lcd.setCursor(0, 1);
  lcd.print("Radius ");
  lcd.print(radius);
  lcd.print("dm");
  }
}

void loop()
{
volumen = tiefe * radius * pi;
if (volumen != 0)
{
lcd.clear();
pinMode(pingPin, OUTPUT);
digitalWrite(pingPin, LOW);
delayMicroseconds(2);
digitalWrite(pingPin, HIGH);
delayMicroseconds(10);
digitalWrite(pingPin, LOW);

pinMode(inPin, INPUT);
duration = pulseIn(inPin, HIGH);

dm = microsecondsToDecimeters(duration);
lcd.home ();
lcd.print("Range: ");
lcd.print(dm);
lcd.print("dm");

liter = volumen - dm;
lcd.setCursor(0, 1);
lcd.print("Fuel: ");
lcd.print(liter);;
lcd.print("Liter");
}
else
{
menu = 0;
}
}

//UNTERPROGRAMME
long microsecondsToDecimeters(long microseconds)
{
//Umrechenung der Zeit in dm
//Ultraschall=340m/s, der Ping ist die Zeit von hin und zurück, also muss man die hälfte nehmen
return microseconds / 29 / 2 / 10;
}
Dies soll ein Füllstandmesser für einen Brunnen werden.
Das Problem ist das die 2 Schleifen, wo die Tiefe und der Durchmesser des Brunnens festgelegt wird, immer übersprungen werden. Weis jemand wieso?
Ich verwende einen Arduino Mega2560, die Eingabe funktioniert über 2 Taster (select und enter) die an jeweils an den AnalogIn Pins 0 und 1 hängen.
Würde mich freuen, wenn mir jemand helfen kann und es bitte auch erklärt Wink
Danke und lg,
Tropaion
Webseite des Benutzers besuchen Alle Beiträge dieses Benutzers finden
Diese Nachricht in einer Antwort zitieren
13.06.2014, 00:39 (Dieser Beitrag wurde zuletzt bearbeitet: 13.06.2014 00:45 von rkuehle.)
Beitrag #2
RE: Hilfe bei Programm/Füllstandsmessung
Moin Tropaion,

ich glaube du hast bei deiner Schaltung/Code eine Sache nicht beachtet. Auszug aus http://arduino.cc/de/Reference/DigitalRead
Zitat:Wenn ein Pin mit gar nichts verbunden ist (also offen), gibt digitalRead() entweder HIGH oder LOW zurück (und das rein zufällig).
So wie ich dich verstehe, sind die Pins offen wenn die Taster nicht gedrückt sind?
Anders gefragt: hast du die Buttons mit einem Pullup-Widerstand versehen wie hier gezeigt/beschrieben?: http://arduino.cc/en/tutorial/button
Da du die Variable menu aus digitalRead(enter) ermittelst ist, mit Bezug auf das Zitat, nicht eindeutig klar welchen Wert menu annimmt.
Grüße Ricardo

Nüchtern betrachtet...ist besoffen besser Big Grin
Alle Beiträge dieses Benutzers finden
Diese Nachricht in einer Antwort zitieren
15.06.2014, 09:57
Beitrag #3
RE: Hilfe bei Programm/Füllstandsmessung
[qoute]
.....

const int select = 0;
const int enter = 1;
....

pinMode(select, INPUT); <== hier fehlt die PULLUP Option...
pinMode(enter, INPUT); <== hier auch...

....
[/qoute]

Hallo,
ich habe das Ganze nur mal grob Quergelesen, also was mir auffällt ist das du Port 0 und Port 1 für deine Tasten programmiert hast. Wenn du die Analog-Pins 0 und 1 benutzen willst dann must du bei select = A0; schreiben so wie bei enter = A1; sonst finden sich die Tasten nicht.

Das Pullup Thema hat ja schon Riccardo angesprochen.

Noch was zu Port 0 und 1, das sind die 2 Ports über die der Arduino mit dem PC sprich der IDE kommuniziert und sollte daher eigentlich nicht benutzt werden um Konflikte zu vermeiden. Außerdem kann man da drüber die Serial Befehle Variablen und Statusmeldungen auf dem PC anzeigen lassen während das Programm läuft....sehr hilfreich beim debuggen größerer Programme.
lg
bk

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
15.06.2014, 11:43 (Dieser Beitrag wurde zuletzt bearbeitet: 15.06.2014 12:17 von ArduTux.)
Beitrag #4
RE: Hilfe bei Programm/Füllstandsmessung
Zitat:... also was mir auffällt ist das du Port 0 und Port 1 für deine Tasten programmiert hast. Wenn du die Analog-Pins 0 und 1 benutzen willst dann must du bei select = A0; schreiben so wie bei enter = A1; sonst finden sich die Tasten nicht.

Ich sehe da ja ein
Zitat: tiefe = tiefe + digitalRead(select);
menu = menu + digitalRead(enter);

bei mir ist es bei meinem Mega der Pin ab D54-D69 = A0-A15.
Das andere ist ja bei analogRead wo A0 ... angegeben wird.

EDIT: Das mit dem Pull UP/DOWN ist wichtig weil die Board´s an einem nicht definierten I/O ~2-2,5V anliegen. genauen Wert einfach mal Meßen ;)

Zitat:pin54 = oberer Füllstands-Sensor(Enschalter etc.)
pin55 = unterer Füllstands-Sensor(Enschalter etc.)

if (digitalRead(54) == HIGH && digitalRead(55) == HIGH) // BRUNNEN-ALARM VOLL ==> PUMPE PUMPE ZUM NACHFÜLLEN AUS-SCHALTEN?

if (digitalRead(54) == LOW && digitalRead(55) == LOW) // BRUNNEN-ALARM LEER ==> PUMPE PUMPE ZUM NACHFÜLLEN EIN-SCHALTEN?
Für eine genauere Erfassung vom Inhalt könnte ein besserer Sensor verwendet werden => KLICK
Der könnte Analog Erfasst werden, damit Zwischenstände Kontrolieren.

Kein Plan was genau realisiert werden soll.
Gibt ja ne menge was noch Programmiert werden kann speziell bei diesem Projekt.

gruß

In unserer Gesellschaft ist das Gehirn am gerechtestesten Verteilt! Jeder glaubt, er habe genug davon.
Hardware: SainSmart Mega 2560 R3 + 3,2" LCD-Touch-Screen
Alle Beiträge dieses Benutzers finden
Diese Nachricht in einer Antwort zitieren
15.06.2014, 13:29
Beitrag #5
RE: Hilfe bei Programm/Füllstandsmessung
(15.06.2014 11:43)ArduTux schrieb:  
Zitat:... also was mir auffällt ist das du Port 0 und Port 1 für deine Tasten programmiert hast. Wenn du die Analog-Pins 0 und 1 benutzen willst dann must du bei select = A0; schreiben so wie bei enter = A1; sonst finden sich die Tasten nicht.

Ich sehe da ja ein
Zitat: tiefe = tiefe + digitalRead(select);
menu = menu + digitalRead(enter);

bei mir ist es bei meinem Mega der Pin ab D54-D69 = A0-A15.
Das andere ist ja bei analogRead wo A0 ... angegeben wird.

EDIT: Das mit dem Pull UP/DOWN ist wichtig weil die Board´s an einem nicht definierten I/O ~2-2,5V anliegen. genauen Wert einfach mal Meßen Wink

Zitat:pin54 = oberer Füllstands-Sensor(Enschalter etc.)
pin55 = unterer Füllstands-Sensor(Enschalter etc.)

if (digitalRead(54) == HIGH && digitalRead(55) == HIGH) // BRUNNEN-ALARM VOLL ==> PUMPE PUMPE ZUM NACHFÜLLEN AUS-SCHALTEN?

if (digitalRead(54) == LOW && digitalRead(55) == LOW) // BRUNNEN-ALARM LEER ==> PUMPE PUMPE ZUM NACHFÜLLEN EIN-SCHALTEN?
Für eine genauere Erfassung vom Inhalt könnte ein besserer Sensor verwendet werden => KLICK
Der könnte Analog Erfasst werden, damit Zwischenstände Kontrolieren.

Kein Plan was genau realisiert werden soll.
Gibt ja ne menge was noch Programmiert werden kann speziell bei diesem Projekt.

gruß


Oh wo fange ich nun an.
Also das mit den Ports ab D54 wo du schreibst, das kann wohl funktionieren ist aber keine offizielle Portzuordnung laut Mega2560 Portmapping.
Grundsätzlich ist es so das die Atmel CPU ATmega2560 da die Ports F und K hat die sowohl Digital als auch in iherer Zweitfunktion AnalogIn benutzt werden können wobei der Port K auch noch als externe Interruptquelle benutzt werden kann was aber glaub ich bei der Arduino Software nicht integriert ist (INT0 + INT1 ist anderster definiert).

Das mit dem Messen am Eingang ist müßig....man weiß das man definierte Eingangssignale benötigt an einem Digitalport, und da sich hier die benutzung des internen PULLUP anbietet braucht man die Taste nur noch gegen Masse schalten, fertig ist die Laube.

Aber du hast nun wohl unbewußt das eigentliche Problem des Threaderöffners ins Rampenlicht gebracht und zwar das mit dem überspringen der Setupwerte...und zwar damit:
Zitat: tiefe = tiefe + digitalRead(select);
menu = menu + digitalRead(enter);
Wenn ich mir da die Zeilen davor und danach ansehe ist es mir klar warum das keine Eingabe geben wird....die CPU rast da mit Volldampf drüber das man da nicht einmal eine Taste drücken kann...hier ist noch Programmieraufwand erforderlich.
So mal kucken wo es noch klemmt....
lg
bk

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
29.06.2014, 19:25
Beitrag #6
RE: Hilfe bei Programm/Füllstandsmessung
Ok, also das Programm läuft jetzt, danke für eure Hilfe Wink
Zitat:#include <Wire.h>
#include <LCD.h>
#include <LiquidCrystal_I2C.h>

//LCD-Pins definieren
#define I2C_ADDR    0x3F // <<----- Add your address here. Find it from I2C Scanner
#define BACKLIGHT_PIN     3
#define En_pin  2
#define Rw_pin  1
#define Rs_pin  0
#define D4_pin  4
#define D5_pin  5
#define D6_pin  6
#define D7_pin  7
LiquidCrystal_I2C lcd(I2C_ADDR,En_pin,Rw_pin,Rs_pin,D4_pin,D5_pin,D6_pin,D7_pin);

//Tasterpins
const int select = 2;
const int enter = 3;

//Einstellungsvariablen
int tiefe = 0;
int radius = 0;
int menu = 0;
int selectState = 0;
int selectLastState = 0;
int enterState = 0;
int enterLastState = 0;
const float pi = 3.14;

//Ultraschall-Pins definieren
int pingPin = 13;
int inPin = 12;

void setup()
{
  //Initialisieren des LCD und festlegung der Größe
  lcd.begin (16,2);
  
  //Hintergrundbeleuchtung ein
  lcd.setBacklightPin(BACKLIGHT_PIN,POSITIVE);
  lcd.setBacklight(HIGH);
  
  //Taster
  pinMode(select, INPUT);
  pinMode(enter, INPUT);
}

void loop()
{
//Einstellungen
if(menu <= 2)
{
enterState = digitalRead(enter);
if(enterState != enterLastState)
{
  if(enterState == HIGH)
  {
    menu++;
  }
}
enterLastState = enterState;
}

if(menu == 0)
{
selectState = digitalRead(select);
if(selectState != selectLastState)
{
  if(selectState == HIGH)
  {
    tiefe++;
  }
}
selectLastState = selectState;

lcd.clear();
lcd.home();
lcd.print("Einstellungen");
lcd.setCursor(0, 1);
lcd.print("Tiefe: ");
lcd.print(tiefe);
lcd.print("dm");
delay(100);
}

if(menu == 1)
{
selectState = digitalRead(select);
if(selectState != selectLastState)
{
  if(selectState == HIGH)
  {
    radius++;
  }
}
selectLastState = selectState;

lcd.clear();
lcd.home();
lcd.print("Einstellungen");
lcd.setCursor(0, 1);
lcd.print("Radius: ");
lcd.print(radius);
lcd.print("dm");
delay(100);
}
//Füllstand
if(menu == 3)
{
//Variablen
long duration, liter, volumen, range;
volumen = radius * radius * pi * tiefe;

//Ultraschall
//Variablen
//Schwingungen senden
pinMode(pingPin, OUTPUT);
digitalWrite(pingPin, LOW);
delayMicroseconds(2);
digitalWrite(pingPin, HIGH);
delayMicroseconds(10);
digitalWrite(pingPin, LOW);
//Zeit bis zur Rückmeldung der Schwingung
pinMode(inPin, INPUT);
duration = pulseIn(inPin, HIGH);
//Umrechnen in dm
range = microsecondsToDm(duration);
liter = volumen - radius * radius * pi * range;

lcd.clear();
lcd.home();
lcd.print("Range: ");
lcd.print(range);
lcd.print("dm");
lcd.setCursor(0, 1);
lcd.print("Fuel: ");
lcd.print(liter);
lcd.print("Liter");
delay(1000);
}

}

//UNTERPROGRAMME
long microsecondsToDm(long microseconds)
{
//Umrechenung der Zeit in cm
//Ultraschall=340m/s, der Ping ist die Zeit von hin und zurück, also muss man die hälfte nehmen
return microseconds / 29 / 2 / 10;
}
  
Webseite des Benutzers besuchen Alle Beiträge dieses Benutzers finden
Diese Nachricht in einer Antwort zitieren
Antwort schreiben 


Möglicherweise verwandte Themen...
Thema: Verfasser Antworten: Ansichten: Letzter Beitrag
Photo Hilfe bei meinem Arduino Projekt Niklas 10 321 23.09.2017 21:05
Letzter Beitrag: Niklas
  Arduino Zumo, Felerhaftes Programm (2) Werner Lage 2 391 18.09.2017 06:51
Letzter Beitrag: Werner Lage
  Ublox Neo 6M und Nextion ! Bitte um Hilfe. b3ta 19 1.068 13.07.2017 14:52
Letzter Beitrag: Tommy56
  Anfänger sucht erfahrene Hilfe Customizer 21 1.383 11.07.2017 21:37
Letzter Beitrag: Customizer
  Arduino Zumo, Felerhaftes Programm ? Werner Lage 1 268 20.06.2017 13:57
Letzter Beitrag: Tommy56
  Bitte um Hilfe Arduino Nano-MAX7219-PIR_Sensor Opa_Klaus 35 1.960 20.05.2017 21:11
Letzter Beitrag: Opa_Klaus
  Brauche Hilfe für meine Abfüllanlage/ millis() Slash96 8 760 10.05.2017 21:04
Letzter Beitrag: MicroBahner
Question Problem beim Hochladen auf AtTiny45. Hilfe -.- Jonas Lindenblatt 17 1.303 16.04.2017 12:58
Letzter Beitrag: Jonas Lindenblatt
  Zeitschaltuhr Hilfe für RTC Anfänger 4Jordy 4 666 24.03.2017 15:23
Letzter Beitrag: MicroBahner
Rainbow Programm mit Tastr unterbrechen Schwinge117 12 795 02.03.2017 21:17
Letzter Beitrag: Tommy56

Gehe zu:


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