Go Down

Topic: (Erledigt) LCD mit HC-SR04 Formel einbinden? (Read 1 time) previous topic - next topic

Eisebaer

hi,

die einsilbigkeit ist es ja nicht, es ist nur verwirrend, daß power-dodge seit seinem ersten post die richtige formel reinschreibt, aber immer wieder fragt, wie er es berechnet...

bin immer noch nicht sicher, ob wir sein problem richtig verstanden haben.

gruß stefan

power-dodge

#16
Nov 08, 2013, 05:06 pm Last Edit: Nov 08, 2013, 05:08 pm by power-dodge Reason: 1
Hallo,

sorry fals ich mich falsch ausgedrückt hab.

Ich will verschieden Zylinder messen (Umfang).

Der Mittelpunkt wird festgesetzt , nehmen wir mal ein Beislpiel von 400mm.
Der Sensor misst eine Entfernung von 300mm. Also kann ich jetzt daraus den Radius errechnen.
400-300=100mm. Und daraus eben den Umfang. (Umfang = 2 * pi * Radius)

Daher die Klammern:

(400-300) x 2 x 3,1415 = Umfang : 628.319mm

Deswegen die Formel, im Klammer zu erst danach der rest.

Von mir aus kann man ach so schreiben wenn Ihr das besser verstehen könnt:

(a-b) mal 2 mal pi = Umfang

Damit habe ich leider schwirigkeite, dies in den Code einzubinden, mein Code übrigens:

Code: [Select]
void loop() {
 
 int duration;
 float  distance;
 digitalWrite(trigPin, HIGH);
 delayMicroseconds(1000);
 digitalWrite(trigPin, LOW);
 duration = pulseIn(echoPin, HIGH);
 distance = (duration/2) / 2.91;

   Serial.print(distance,0);
   Serial.println(" mm");


wäre nett wenn jemand mir das mal zeigen könnte.

Danke

Serenifly

Es gibt übrigens ein fertige Pi Konstante in math.h
http://www.nongnu.org/avr-libc/user-manual/group__avr__math.html

Die heißt M_PI

guntherb

#18
Nov 08, 2013, 05:44 pm Last Edit: Nov 08, 2013, 05:49 pm by guntherb Reason: 1
Du hast doch schon alles. Du kannst die Formel einfach so in den Code übernehmen:
Code: [Select]

float Mittelpunkt = 400;  
int duration;
float  distance, Umfang;

void loop() {
 digitalWrite(trigPin, HIGH);
 delayMicroseconds(1000);
 digitalWrite(trigPin, LOW);
 duration = pulseIn(echoPin, HIGH);
 distance = (duration/2.0) / 2.91;
 Umfang = (Mittelpunkt -distance) * 2 * PI;

   Serial.print(distance,0);
   Serial.println(" mm");
   Serial.print(Umfang,0);    
   Serial.println(" mm Umfang");


Edit: ich habe gerade gemerkt, dass die Arduino IDE PI schon kennt, kann man garnicht declarieren!
Grüße
Gunther

power-dodge

Hi,

cool das müsste es sein. Hab gerade alles auseinander gebaut.
Moin teste ich das mal.

Sieht aber vielversprechend aus  :)

Danke schön  ;)

power-dodge

Hi,

konnte net erwarten hab wieder alles zusammen gebaut.
Es funktioniert tadellos! Danke schön!  :)


A.R.Ty

Dum spiro, spero - if you find my posting helpful, please click my Karma :)<br />~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~<br />Do you know A.R.T, the FREE Android Root Tool ?

power-dodge

Mion,

was soll das heißen?

Hab jetzt ein kleines nebeneffeckt...
Es berechnet jetzt alles schön, hab aber eine Regel eingebunden.
Wenn der Sensor über einen bestimmten Wert heraus geht, erscheint eine Meldung auf
dem Display.
Das funktioniert auch teilweise. Denn jetzt wechselt schnell die Anzeige zwischen den beiden.
Text  und die Berechnung.

Wie könnte ich die Berechneung unterbinden? In einem "if".

Danke

uwefed

Du mußt else-if verwenden.
Code: [Select]
if (abstand> max)
print"außer Meßbereich"
else print abstand


Du kannst bei
pulseIn(pin, value, timeout)
auch ein timeout angeben. So verkürzt Du die Meßdauer wenn Du außerhalb des Meßwertes bist.
Bei Timeout wird null zurückgegeben.
Grüße Uwe

power-dodge

Moin,

danke für den Tipp!
Irgendwie klappte das bei mir nicht...

Poste mal mein Code, vielleicht sieht man da mehr.
Ist er überhaupt so ok?

Code: [Select]
#define trigPin 13
#define echoPin 12
#include <LiquidCrystal.h>
LiquidCrystal lcd(8, 9, 4, 5, 6, 7);
#include <Servo.h>
Servo servoMain;

void setup() {
  Serial.begin (9600);
  pinMode(trigPin, OUTPUT);
  pinMode(echoPin, INPUT);
  servoMain.attach(3);
  lcd.begin(16, 2);
  lcd.print("ABC-Linie");
  lcd.setCursor(0, 1);
  lcd.print("Teste Hardware");
  delay(4000);
}

float Mittelpunkt = 400;  //den anpassen
int duration;
float  distance, Umfang;

void loop() {
  digitalWrite(trigPin, HIGH);
  delayMicroseconds(500);
  digitalWrite(trigPin, LOW);
  duration = pulseIn(echoPin, HIGH);
  distance = (duration/2.0) / 2.91;
  Umfang = (Mittelpunkt -distance) * 2 * PI;
  delay(300);

    Serial.print(distance,0);
    Serial.println(" mm");
    Serial.print(Umfang,0);   
    Serial.println(" mm Umfang");

  if (distance >=10 && distance <= 50){
     servoMain.write(1);
     }
  if (distance >=50 && distance <= 70){
  servoMain.write(20);
     } 
  if (distance >=90 && distance <= 110){
     servoMain.write(25);
     }
  if (distance >=130 && distance <= 150){
  servoMain.write(30);
     }
  if (distance >=170 && distance <= 190){
     servoMain.write(35);
     }
  if (distance >=210 && distance <= 230){
  servoMain.write(40);
     } 
  if (distance >=250 && distance <= 270){
     servoMain.write(45);
     }
  if (distance >=290 && distance <= 310){
  servoMain.write(50);
     }
  if (distance >=330 && distance <= 350){
     servoMain.write(55);
     }
  if (distance >=370 && distance <= 390){
  servoMain.write(60);
     } 
  if (distance >=410 && distance <= 430){
     servoMain.write(65);
     }
  if (distance >=450 && distance <= 470){
  servoMain.write(70);
     }
  if (distance >=490 && distance <= 510){
     servoMain.write(75);
     }
  if (distance >=530 && distance <= 550){
  servoMain.write(80);
     } 
  if (distance >=570 && distance <= 590){
     servoMain.write(85);
     }
  if (distance >=610 && distance <= 1500){
  servoMain.write(105);
     }
  lcd.clear();
  lcd.setCursor(0,0);
  lcd.print("Umfang: ");
  lcd.print(Umfang,0);
  lcd.setCursor(0, 1);
  lcd.print("Ohne Gewaehr");
  delay(300);
  if (distance >800){
  lcd.clear();
  lcd.setCursor(0,0);
  lcd.print("Keine Trommel");
  lcd.setCursor(0, 1);
  lcd.print("Augeschutz");
  delay(300);
  }
}


Danke schön

power-dodge

#25
Nov 09, 2013, 03:22 pm Last Edit: Nov 09, 2013, 03:36 pm by power-dodge Reason: 1
Oder ich setze eine "if" vor dem Messen?
Was unter 800 ist wird dann gemacht.

Müsste doch gehen war?

Edit: Nein immer noch das selbe.

uwefed

#26
Nov 09, 2013, 04:19 pm Last Edit: Nov 09, 2013, 04:21 pm by uwefed Reason: 1
Code: [Select]
 lcd.clear();
 lcd.setCursor(0,0);
 lcd.print("Umfang: ");
 lcd.print(Umfang,0);
 lcd.setCursor(0, 1);
 lcd.print("Ohne Gewaehr");
 delay(300);
 if (distance >800){
 lcd.clear();
 lcd.setCursor(0,0);
 lcd.print("Keine Trommel");
 lcd.setCursor(0, 1);
 lcd.print("Augeschutz");
 delay(300);
 }


Du gibst zuerst die Werte aus und DANN kontrollierst Du ob distance >800 UND druckst Du den anderen Text.

Du muß ENTWEDER Wert ausgeben
ODER  anderen Text.

also

Code: [Select]
if (distance >=800)
Ausgabe Wert
else
Ausgabe Text


Noch ein Problem:
Code: [Select]
  if (distance >=170 && distance <= 190){
     servoMain.write(35);
     }
  if (distance >=210 && distance <= 230){
  servoMain.write(40);
     } 

Was passiert wenn zB distance 200 ist?

Grüße Uwe

power-dodge

Hi,

bei 200 passiert erst mal nichts. Dies ist noch ein Test ;-)
Das kann ich ja alles belibt ändern, nur das mit dem Display noch und alles ist fertig  :smiley-yell:

Und wie muss ich das machen mit dem Display?
Irgendwie blicke ich da nicht ganz durch, sorry

guntherb

Hat Uwe doch geschrieben.


Code: [Select]
if (distance >=800)
Ausgabe Wert
else
Ausgabe Text


Du mußt deine IF Abfrage vor deine erste Ausgabe auf dem LCD setzen.

Code: [Select]

  if (distance >800){
    lcd.clear();
    lcd.setCursor(0,0);
    lcd.print("Keine Trommel");
    lcd.setCursor(0, 1);
    lcd.print("Augeschutz");
    delay(300);
  } else {
    lcd.clear();
    lcd.setCursor(0,0);
    lcd.print("Umfang: ");
    lcd.print(Umfang,0);
    lcd.setCursor(0, 1);
    lcd.print("Ohne Gewaehr");
    delay(300);
}


Damit durchläufst du entweder den Pfad mit der Fehlermeldung ODER den Pfad mit der WErteausgabe
Grüße
Gunther

power-dodge

#29
Nov 09, 2013, 07:11 pm Last Edit: Nov 10, 2013, 06:22 pm by power-dodge Reason: 1
Danke schön!

So einfach aber doch so schwer  :smiley-roll-sweat:.

Was ich auch nicht verstehe ist, ist die Stromversorgung des Arduino´s.
Am USB läuft es ziemlich gut, wenn der Motor dreht wird das Display etwas dunkler.
Ein Netzteil mit 5V, da läuft fast nichts. Ein Labornetzteil mit 9V da auch nicht...

Naja soweit so gut funktioniert schon alles, den neuen Code spiele ich gleich drauf...
Hoffe es funktioniert mal, wie es soll.

Danke noch mal für alles-

Go Up