(Erledigt) LCD mit HC-SR04 Formel einbinden?

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

Hi,

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

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

Hat Uwe doch geschrieben.

uwefed:

if (distance >=800)

Ausgabe Wert
else
Ausgabe Text

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

  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

Danke schön!

So einfach aber doch so schwer :cold_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-

Cooool - ich finde die "Antriebsübersetzung per Paketschnur" sehr gelungen :smiley:

Ja ne...

Und das Rädchin ist vom Baumarkt, das ist so eine Rolle fürd irgendwo drunter
schrauben. Und das Band wird an dem Laser mit einer Schlauschelle befestigt...

Edit: Das letzte Beispiel funktioniert tadellos.

Danke auch dafür!

Gruß

power-dodge:
Hi,

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

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

Das ist eine Fehlerquelle erster Sahne. Die Idee "im Moment gehts gut so, das werde ich später ändern" hat zur Folge daß der Fehler bis zum Schluß überlebt.
Gewöhne Dir nicht diesen schlechten Programmierstil an. Ein Wert einer Variablen die von 0 bis 200 geht darf nirgens eine undefinierten Zustand haben.

Bist Du sicher daß das

Irgendwie reagiert es nicht sofort, manchmal auch verzögert.

Nicht genau diesen Grund hat?

Grüße Uwe

Hallo,

ja das kann schon sein. Hab es jetzt alles geändert gehabt.
"Totewinkel" habe ich aber keine mehr.

Ich muss später sowieso auf anderer Stelle alles passend umstellen und programieren.

Danke trotzdem für die guten Tipps, das ist übrigens mein Erstes Projekt und
mein erster Programmier versuch. Daher vielleicht waren meine Fragen in euren Augen
etwas "dämlich"

Der nutzer "guntherb" hat mir aber trotzdem unter die Arme geriffen und alles ausführich
erklert. Danke dir noch mal an dieser Stelle!!! War echt nett von dir!

Natürlcih auch ein dickes danke schön an alle andere!

Bitte, gerne geschehen!
auch ich habe hier schon viel Hilfe bekommen.

Was mit aber trotzdem noch interessieren würde:
Was genau ist der tiefere Sinn dieser Maschine?????

edit: wegen deiner Versorgungsprobleme: Es sieht so aus, wie wenn deine Netzteile zu schwach wären um den Strom für das Servo zu liefern. Das Netzteil sollte min. 500mA, besser 1A können.

Hi,

klar kannst du gerne wissen. Es ist für die Arbeit gedacht.
Da mache ich mal damit Verbesserungsvorschlag um Matterial zu sparen...
Nur darf ich leider nichts über die Maschienen etc. erzählen, Industriespionage
oder wie nennt sich das.

Wenn es fuktioniert, wird es der Firma Matterialkosten ersparen etc.

Mal sehen, nicht das die mich mit dem Teil verhauen ]:D.

Hab den Code jetzt etwas mehr erweitert (mehr "feingefühl"):

if (distance >=0 && distance <= 10){
     servoMain.write(106);
     }
  if (distance >=10 && distance <= 20){
  servoMain.write(104);
     }  
  if (distance >=20 && distance <= 30){
     servoMain.write(102);
     }
  if (distance >=30 && distance <= 40){
  servoMain.write(100);
     } 
  if (distance >=40 && distance <= 50){
     servoMain.write(98);
     }
  if (distance >=50 && distance <= 60){
  servoMain.write(96);
     }  
  if (distance >=60 && distance <= 70){
     servoMain.write(94);
     }
  if (distance >=70 && distance <= 80){
  servoMain.write(92);
     } 
  if (distance >=80 && distance <= 90){
     servoMain.write(90);
     }
  if (distance >=90 && distance <= 100){
  servoMain.write(88);
     }  
  if (distance >=100 && distance <= 110){
     servoMain.write(86);
     }
  if (distance >=110 && distance <= 120){
  servoMain.write(84);
     } 
  if (distance >=120 && distance <= 130){
     servoMain.write(82);
     }
  if (distance >=130 && distance <= 140){
  servoMain.write(80);
     }  
  if (distance >=140 && distance <= 150){
     servoMain.write(78);
     }
  if (distance >=150 && distance <= 160){
     servoMain.write(76);
     }
  if (distance >=160 && distance <= 170){
  servoMain.write(74);
     }  
  if (distance >=170 && distance <= 180){
     servoMain.write(72);
     }
  if (distance >=180 && distance <= 190){
  servoMain.write(70);
     } 
  if (distance >=190 && distance <= 200){
     servoMain.write(68);
     }
  if (distance >=200 && distance <= 210){
  servoMain.write(66);
     }  
  if (distance >=210 && distance <= 220){
     servoMain.write(64);
     }
  if (distance >=220 && distance <= 230){
  servoMain.write(62);
     } 
  if (distance >=230 && distance <= 240){
     servoMain.write(60);
     }
  if (distance >=240 && distance <= 250){
  servoMain.write(58);
     }  
  if (distance >=250 && distance <= 260){
     servoMain.write(56);
     }
  if (distance >=260 && distance <= 270){
  servoMain.write(54);
     } 
  if (distance >=270 && distance <= 280){
     servoMain.write(52);
     }
  if (distance >=280 && distance <= 290){
  servoMain.write(50);
     }  
  if (distance >=290 && distance <= 300){
     servoMain.write(48);
     }
  if (distance >=300 && distance <= 310){
     servoMain.write(46);
     }
  if (distance >=310 && distance <= 320){
  servoMain.write(44);
     }  
  if (distance >=320 && distance <= 330){
     servoMain.write(42);
     }
  if (distance >=330 && distance <= 340){
  servoMain.write(40);
     } 
  if (distance >=340 && distance <= 350){
     servoMain.write(38);
     }
  if (distance >=350 && distance <= 360){
  servoMain.write(36);
     }  
  if (distance >=360 && distance <= 370){
     servoMain.write(34);
     }
  if (distance >=370 && distance <= 380){
  servoMain.write(32);
     } 
  if (distance >=380 && distance <= 390){
     servoMain.write(30);
     }
  if (distance >=390 && distance <= 400){
  servoMain.write(28);
     }  
  if (distance >=400 && distance <= 410){
     servoMain.write(26);
     }
  if (distance >=410 && distance <= 420){
  servoMain.write(24);
     } 
  if (distance >=420 && distance <= 430){
     servoMain.write(22);
     }
  if (distance >=430 && distance <= 440){
  servoMain.write(20);
     }  
  if (distance >=440 && distance <= 450){
     servoMain.write(18);
     }
  if (distance >=450 && distance <= 460){
     servoMain.write(16);
     }
  if (distance >=460 && distance <= 470){
  servoMain.write(14);
     }  
  if (distance >=470 && distance <= 480){
     servoMain.write(12);
     }
  if (distance >=480 && distance <= 490){
  servoMain.write(10);
     } 
  if (distance >=490 && distance <= 500){
     servoMain.write(8);
     }
  if (distance >=500 && distance <= 510){
  servoMain.write(6);
     }  
  if (distance >=510 && distance <= 520){
     servoMain.write(4);
     }

Danke dir noch mal.

Gruß

Möchtest du anstelle der unendlich vielen IFs nicht lieber die Funktion map() verwenden?

int angle = map(distance, 0, 540, 106, 4);
servoMain.write(angle);

macht doch das gleiche, oder?

guntherb:
Möchtest du anstelle der unendlich vielen IFs nicht lieber die Funktion map() verwenden?
macht doch das gleiche, oder?

Fast.
Gunther's Vorschlag hat "Maximales Feingefühl" :wink:

Hallo,

wenn die größe des kleines Rades genau so groß wäre wie des Laser´s.
Dann würde es funktionieren...

Das kleine Rädchen dreht sich mehr wie das größere. Es war nur zum testen gedacht.
Funktioniert bis jetzt ganz gut.
Später wenn erforderlich ist muss ich alles noch anpassen, dann müssten sich die Werte von
einander trennen in etwa so:

200mm = 20°
210mm = 22°
220mm = 25°
230mm = 28°
(Außer man könnte eine prozentuelle Steigerung einbinden oder so)

viellecht so ähnlich... Aber als Beispiel funktieoniert es noch einwandfrei.

Gruß