(Erledigt) LCD mit HC-SR04 Formel einbinden?

Hi,

immer noch die gleiche:

(40-gemessener Wert) x 2 x 3.1415= Ergebnisse an den

Display senden.

Also:

(40-30) x 2 x 3.1415 =

Mhm, ich weiss jetzt nicht ob wir uns da genau verstanden haben:
Du möchtest von runden Gegenständen den Durchmesser ermitteln um daraus was zu berechnen.

Wenn Du also in einer Messumgebung den Sensor LINKS hast (nach rechts zeigend) kannst Du die Gegenstände RECHTS an einer Leiste anschlagen und dann den (ja bekannten) Abstand bis zu dieser Kante MINUS dem aktuell gemessenen Wert des Gegenstandes misst - daraus kannst Du dann einfach den Radius (Differenz / 2) und alles mögliche Andere berechnen

Hi,

ja genau das will ich machen :).

Weiß jetzt nicht wie das einbinden soll, den ich muss doch mal "pi" berechnen 3,14 bla bla bla...
Für ein Beispiel wäre ich sehr dankbar.

Gruß

z.B.:

  • Abstand vom Sensor bis Kante = 500 mm
  • Durchmesser des aktuell gemessenen Gegenstands = 120 mm
int PIN_Entferungssensor = A0;
int Entfernung_Kante = 500;
int Entfernung_aktuell = 0;
int Durchmesser_aktuell = 0;

Entfernung_aktuell = analogRead(PIN_Entferungssensor); //  = 380 mm

Serial.print("Aktueller Abstand     = ");
Serial.println(Entfernung_aktuell);

Durchmesser_aktuell =  (Entfernung_Kante - Entfernung_aktuell);    // = 120 mm
Serial.print("Aktueller Durchmesser = ");
Serial.println(Durchmesser_aktuell);

So in etwa sollte das aussehen - Umfang usw. berechnen kannste ja wohl alleine, da gibbet Formeln im Netz zu.

power-dodge:
Weiß jetzt nicht wie das einbinden soll, den ich muss doch mal "pi" berechnen 3,14 bla bla bla...

Pi mußt du doch nicht berechnen.

const float PI = 3.1415926;

er meinte bestimmt MIT Pi rechnen: r * Pi 8)

A.R.Ty:
er meinte bestimmt MIT Pi rechnen: r * Pi 8)

Na gut, wenn du meinst, dass er das gemeint haben könnte:

const float PI = 3.1415926;
float A, r;
A = r * r * PI;

:roll_eyes:

Bei manchen Usern finde ich anstrengend zu erraten, was sie eigentlich gemeint haben könnten.
power-dodge, sei doch mal etwas weniger einsilbig.

power-dodge, sei doch mal etwas weniger einsilbig.

Jau, Menno - immer her mit den Infos, um so weniger Rückfragen und um so schneller und überhaupt... :fearful:

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

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:

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

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

Du hast doch schon alles. Du kannst die Formel einfach so in den Code übernehmen:

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!

Hi,

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

Sieht aber vielversprechend aus :slight_smile:

Danke schön :wink:

Hi,

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

'LUJA soag I 8)

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

Du mußt else-if verwenden.

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

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?

#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

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.

  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

if (distance >=800)
Ausgabe Wert
else 
Ausgabe Text

Noch ein Problem:

  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