E-BIKE WARNER

Liebe Kollegen,
Ich habe zwei Ultraschall Sensoren jeweils auf ein Servo Motor. Die S-Motoren sind ständig in Bewegung. Irgendwie ist der Arduino zu langsam. Das Script sollte auf dem Display eine Warnung anzeigen wenn ein Objekt sich näher als zwei Meter nähert. Das funktioniert auch jedoch sehr langsam so das die Meldung auf dem Display immer flackert.
Hat jemand eine Idee?
Siehe weiter unten.

Danke!!!

// (c)2016 Sinan 
//Velo Sensor

#include <Wire.h>
#include <LiquidCrystal_I2C.h>
#include <Servo.h>

// Inicializa o display no endereco 0x27
LiquidCrystal_I2C lcd(0x27,2,1,0,4,5,6,7,3, POSITIVE);

//Lesen vom Serial eingang
String SerialEingabe;

//Ultraschall Sensor 1 Pins
#define trigPin 8
#define echoPin 9
//Ultraschall Sensor 2 Pins
#define trigPin2 10
#define echoPin2 11

//Berechnung
long dauer;
int distanz;
int ausgabedistanz;
long dauer2;
int distanz2;
int ausgabedistanz2;

int distanzLinkerSensor;
int distanzRechterSensor;

//Servo Pins
#define servo1pin 2
#define servo2pin 3

//Servo Variablen
Servo myservo1;
Servo myservo2; 

void setup()
{
//Bitrate Serieler Anschluss 
Serial.begin(9600);

//Initiallisieren und Hinderhrundbeleuchtung einschalten
lcd.begin (16,2);

pinMode(trigPin, OUTPUT); 
pinMode(echoPin, INPUT); 

pinMode(trigPin2, OUTPUT);
pinMode(echoPin2, INPUT);

myservo1.attach(servo1pin);
myservo2.attach(servo2pin);


}

void loop()
{
 SerialEingabe = Serial.read();

 ausgabedistanz = berechnungSensor1();
 ausgabedistanz2 = berechnungSensor2();
 
 
 lcd.clear(); 
 servos();

}


void servos()
{
   for(int i=40;i<=140;i+=8) //linker und rechter servo -links bewegen
   { 
       myservo1.write(i);
       delay(15);
       myservo2.write(i);
       delay(15);
       
       distanzLinkerSensor=berechnungSensor1();
       distanzRechterSensor=berechnungSensor2();
 
       Serial.print("Linker Sensor: ");
       Serial.println(distanzLinkerSensor);

       Serial.println("");

       Serial.print("Rechter Sensor: ");
       Serial.println(distanzRechterSensor);

      if(distanzLinkerSensor<200)
      {  
         lcd.setCursor(0,0);
         lcd.print("Gefahr von Links");
      }

    }


      if(distanzRechterSensor<200)
      {
         lcd.setCursor(0,1);
         lcd.print("Gefahr von Rechts");
      }
    
    for(int i=140;i>=40;i-=8) //linker und rechter servo - rechts bewegen
    {
       myservo1.write(i);
       delay(15);
       myservo2.write(i);
       delay(15);
    }
}



int berechnungSensor1()
{
 digitalWrite(trigPin,LOW);
 delayMicroseconds(2);
 digitalWrite(trigPin,HIGH);
 delayMicroseconds(5);
 digitalWrite(trigPin,LOW);
 
 dauer = pulseIn(echoPin,HIGH);
 distanz=dauer*0.034/2; //Schallgeschwindigkeit gemäss Physik Buch (formel s=v*t*0.5 hin und retur). Bei gelegenheit google nach ultraschall gschw. suchen
 ausgabedistanz=distanz;

 return ausgabedistanz;
}

int berechnungSensor2()
{

 digitalWrite(trigPin2,LOW);
 delayMicroseconds(2);
 digitalWrite(trigPin2,HIGH);
 delayMicroseconds(5);
 digitalWrite(trigPin2,LOW);

 dauer2 = pulseIn(echoPin2,HIGH);
 distanz2=dauer2*0.034/2;
 ausgabedistanz2=distanz2;

 return ausgabedistanz2;
}

Das Flackern liegt daran, da du das Display immer löschst.
Du brauchst nur die Werte überschreiben.

Und setze deinen Sketch bitte in Code-Tags, Schaltfläche </> oben links im Editor.
Damit wird der Sketch gut lesbar.

Zusätzlich summieren sich die delays auf 750 ms je Durchgang, eine 3/4 Sekunde. Außerdem ist das Drehen der Servos reiner Aktionismus, da nur in einer Stellung gemessen wird. Zur Zeit machst Du drehen, drehen, drehen ... messen. Besser wäre drehen, messen, drehen, messen, drehen, messen.

Außerdem ist pulseIn() eine blockierende Funktion die falls kein Echo eines Gegenstand zurückkommt, 1000mS wartet, bevor sie Timeout gibt.
Grüße Uwe