Pages: 1 [2] 3   Go Down
Author Topic: (Erledigt) LCD mit HC-SR04 Formel einbinden?  (Read 1481 times)
0 Members and 1 Guest are viewing this topic.
Wien
Offline Offline
Edison Member
*
Karma: 26
Posts: 1836
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

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
Logged

Offline Offline
Newbie
*
Karma: 0
Posts: 34
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

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:
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
« Last Edit: November 08, 2013, 11:08:50 am by power-dodge » Logged

Offline Offline
Faraday Member
**
Karma: 97
Posts: 3528
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

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
Logged

Offline Offline
Edison Member
*
Karma: 38
Posts: 1152
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

Du hast doch schon alles. Du kannst die Formel einfach so in den Code übernehmen:
Code:
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!
« Last Edit: November 08, 2013, 11:49:54 am by guntherb » Logged

Grüße
Gunther

Offline Offline
Newbie
*
Karma: 0
Posts: 34
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

Hi,

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

Sieht aber vielversprechend aus  smiley

Danke schön  smiley-wink
Logged

Offline Offline
Newbie
*
Karma: 0
Posts: 34
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

Hi,

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

Logged

DE
Online Online
God Member
*****
Karma: 20
Posts: 703
| Germany | NRW |
View Profile
WWW
 Bigger Bigger  Smaller Smaller  Reset Reset

'LUJA soag I  smiley-cool
Logged

Dum spiro, spero - if you find my posting helpful, please click my Karma smiley
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
Do you know A.R.T

Offline Offline
Newbie
*
Karma: 0
Posts: 34
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

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
Logged

Forum Moderator
BZ (I)
Online Online
Brattain Member
*****
Karma: 249
Posts: 21198
+39 349 2158303
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

Du mußt else-if verwenden.
Code:
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
Logged

Offline Offline
Newbie
*
Karma: 0
Posts: 34
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

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:
#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
Logged

Offline Offline
Newbie
*
Karma: 0
Posts: 34
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

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.
« Last Edit: November 09, 2013, 09:36:19 am by power-dodge » Logged

Forum Moderator
BZ (I)
Online Online
Brattain Member
*****
Karma: 249
Posts: 21198
+39 349 2158303
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

Code:
 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:
if (distance >=800)
Ausgabe Wert
else
Ausgabe Text

Noch ein Problem:
Code:
  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
« Last Edit: November 09, 2013, 10:21:23 am by uwefed » Logged

Offline Offline
Newbie
*
Karma: 0
Posts: 34
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

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
Logged

Offline Offline
Edison Member
*
Karma: 38
Posts: 1152
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

Hat Uwe doch geschrieben.

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

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

Code:
  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
Logged

Grüße
Gunther

Offline Offline
Newbie
*
Karma: 0
Posts: 34
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

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-
« Last Edit: November 10, 2013, 12:22:18 pm by power-dodge » Logged

Pages: 1 [2] 3   Go Up
Jump to: