• Die Forumsregeln und Nutzungsbedingungen findet ihr in der Navbar unter Impressum !
    Bitte unbedingt beachten!
    Wie überall im Leben gibt es Spielregeln, so auch hier!
    Die Datenschutzerklärung zum DSGVO findet ihr ebenfalls in der Navbar unter Datenschutzerklärung !
    Hinweis nach DSGVO :
    Es ist hier keinerlei Angabe erforderlich. Alle Angaben in diesem Bereich sind öffentlich sichtbar und werden freiwillig gemacht. Mit einem Eintrag in diesem Bereich erkenne ich dieses an, und bestätige die Datenschutzerklärung zur DSGVO für das Forum gelesen zu haben.

    Danke
  • Hallo Gast, beschränke dich hier bitte auf den Bereich der Elektronik. Die Fahrzeuge oder Gebäude, wo diese Elektronik eingebaut wird bitte in dem passenden Fachbereiich behandeln. Auch wenn Teile des Projektes dadurch im Forum doppelt vorhanden sind! Danke.

Arduino Servotester und Meßgerät mit Arduino & Display

Bording

Well-known member
Supermoderator
VIP Unterstützt modelltruck.net 2024
Registriert
08.08.2007
Beiträge
1.949
Hallo,

ich habe mir über die Tage einen Servotester auf Basis eines Arduino Nano gebaut.
Mit Zwei Kanaälen kann man die Impulslänge messen und bei Bedarf ein Servo durchschleifen. Zwei weitere Kanäle sind über je ein Poti ansteuerbar.
Alle Impulslängen werden über das Display angezeigt.

So sieht es innen aus:
IMG_0637.jpg

IMG_0640.jpg
 
Hallo Bert,

klasse gemacht und sehr nützlich. Was jetzt noch fehlt: damit andere sich auch so ein Testgerät bauen können der Sketch und der Schaltplan.

Weiterhin viel Spaß beim Entwickeln und konzipieren mit dem Arduino.

Gruß
Armin de DO1XXY
 
Hallo Armin,

Schaltplan habe ich nicht, die Beschaltung ist im Sketsch beschrieben.
Zusätzlich habe ich 390 Ohm Widerstande and den PWM Pins 5 und 6 als Kurzschlusschutz und 3,9 K Ohm als Schutzwiderstand für die Meßeingänge. Die verbauten Potis sind 10k Ohm linear.
Der Plus kann von den Servos abgeschaltet werden, z.B. wenn ein BEC über 5V liefert. Die Spannungsversorgung erfolgt über die 4 mm Buchsen an der Seite und hat einen LM7805 zur Begrenzung auf 5V.

Code:
/* Servotester mit LCD Anzeige 4x20
2x Messung
2x Ausgang für Servosteller

  LCD Anzeige:
 * LCD RS pin to digital pin 12
 * LCD Enable pin to digital pin 11
 * LCD D4 pin to digital pin 7
 * LCD D5 pin to digital pin 8
 * LCD D6 pin to digital pin 9
 * LCD D7 pin to digital pin 10
 * LCD R/W pin to ground
 * 10K resistor:
 * ends to +5V and ground
 * wiper to LCD VO pin (pin 3)
 */
 

#include <LiquidCrystal.h>
LiquidCrystal lcd(12, 11, 7, 8, 9, 10); //12=RS, 11= Enable, 7=D4, 8=D5; 9=D6, 10=D7

const byte PIN_RC1 = 2; // das ist INT 0 aber Pin 2 wo das Empfängersignal eingelesen wird
const byte PIN_RC2 = 3; // das ist INT 1 aber Pin 3 wo das Empfängersignal eingelesen wird

// alles was im Inteerupt läuft muss als volatile deklariert werden, direkt aus dem RAM
volatile int ReceivedSpeedValues1[8] = {1500, 1500, 1500, 1500, 1500, 1500, 1500, 1500}; // Array mit 8 Werten für die gemessenen Werte
volatile int Summe1 = 12000; // Summe aus dem Array 8x1500, als Anfangswert
volatile int Mittelwert1 =0; // Mittelwert aus der Summe 
volatile int Zeiger1 =0; // Zeiger für das Array, fängt mit 0 an
volatile long LastSpeedChange1 =0;
volatile long nMicros =0;
volatile long nDifference1 =0;
volatile byte errorcount1=0;

volatile int ReceivedSpeedValues2[8] = {1500, 1500, 1500, 1500, 1500, 1500, 1500, 1500}; // Array mit 8 Werten für die gemessenen Werte
volatile int Summe2 = 12000; // Summe aus dem Array 8x1500, als Anfangswert
volatile int Mittelwert2 =0; // Mittelwert aus der Summe 
volatile int Zeiger2 =0; // Zeiger für das Array, fängt mit 0 an
volatile long LastSpeedChange2 =0;
volatile long nDifference2 =0;
volatile byte errorcount2=0;


#include <Servo.h> 
const byte SERVO_1 = 5; // Servo 1 an Pin 5 
const byte SERVO_2 = 6; // Servo 2 an Pin 6 
const byte POTI_1 = 0; // analoger Eingang auf Pin 23
const byte POTI_2 = 1; // analoger Eingang auf Pin 24
int value_1= 0; //analoger Wert von Servosteller 1
int value_2 =2; //analoger Wert von Servosteller 2


Servo servo_1; // Servoobjekt zur Ansteuerung 
Servo servo_2; // Servoobjekt zur Ansteuerung 


void setup() 
{ 
pinMode(PIN_RC1, INPUT);  // Eingang für Empfängersignal an Pin 2   
digitalWrite(PIN_RC1, HIGH); // Pull Up Widerstand aktivieren
pinMode(PIN_RC2, INPUT);  // Eingang für Empfängersignal an Pin 3  
digitalWrite(PIN_RC2, HIGH); // Pull Up Widerstand aktivieren

attachInterrupt( 0, SpeedPositionInterrupt1, CHANGE); // 0=Interrupt 0,also Pin 2 / NAME der Interruptroutine / springe zum Interrupt wenn der Wert an Pin 2 sich ändert
attachInterrupt( 1, SpeedPositionInterrupt2, CHANGE); // 1=Interrupt 1,also Pin 3 / NAME der Interruptroutine / springe zum Interrupt wenn der Wert an Pin 3 sich ändert

lcd.begin(20, 4); //LCD Display mit 20 Spalten und 4 Zeilen

analogReference(DEFAULT); //Anlogereferenz auf 5V legen
servo_1.attach(SERVO_1); // Zuweisung des Servos an PWM Pin 5 
servo_2.attach(SERVO_2); // Zuweisung des Servos an PWM Pin 6
} 


void SpeedPositionInterrupt1() 
{
	nMicros = micros();  // die aktuelle Prozessorzeit wird in der variablen nMicros abgespeichert, dann geht der Zugriff schneller
	nDifference1  = (nMicros - LastSpeedChange1); // hier wird geprüft wie lange der letzte Pegelwechsel her ist

	if ( (nDifference1 > 700 ) && ( nDifference1 < 2200)) // liegt die Zeitdifferenz zwischen 0,9 und 2,1 ms, so ist es ein HIGH Pegal
	{
		Summe1 -= ReceivedSpeedValues1[Zeiger1]; // Summe = Summe - ReceivedSpeedValues[Zeiger];// substrahiere letzte Messung aus dem Array
		ReceivedSpeedValues1[Zeiger1] = nDifference1; // Array mit 8 Werten für die gemessenen Wert 
		Summe1	+= nDifference1; //Summe = Summe + ReceivedSpeedValues[Zeiger]; // addiere Wert zur Summe  
		Zeiger1	 = ( ( Zeiger1 + 1 ) & 0x07 );	//	Index erhoehen und ggf. von 8 auf 0 springen
		Mittelwert1 = ( Summe1 >> 3 );	//der Befehl >>3 ist bit shift left um drei bit, das ist wie durch 8 teilen
                errorcount1 =0; //setzt der Fehlerzähler zurück wenn ein gültiger Wert geladen wurde
	}
	LastSpeedChange1 = nMicros;      
}


void SpeedPositionInterrupt2() 
{
	nMicros = micros();  // die aktuelle Prozessorzeit wird in der variablen nMicros abgespeichert, dann geht der Zugriff schneller
	nDifference2  = (nMicros - LastSpeedChange2); // hier wird geprüft wie lange der letzte Pegelwechsel her ist

	if ( (nDifference2 > 700 ) && ( nDifference2 < 2200)) // liegt die Zeitdifferenz zwischen 0,9 und 2,1 ms, so ist es ein HIGH Pegal
	{
		Summe2 -= ReceivedSpeedValues2[Zeiger2]; // Summe = Summe - ReceivedSpeedValues[Zeiger];// substrahiere letzte Messung aus dem Array
		ReceivedSpeedValues2[Zeiger2] = nDifference2; // Array mit 8 Werten für die gemessenen Wert 
		Summe2	+= nDifference2; //Summe = Summe + ReceivedSpeedValues[Zeiger]; // addiere Wert zur Summe  
		Zeiger2	 = ( ( Zeiger2 + 1 ) & 0x07 );	//	Index erhoehen und ggf. von 8 auf 0 springen
		Mittelwert2 = ( Summe2 >> 3 );	//der Befehl >>3 ist bit shift left um drei bit, das ist wie durch 8 teilen
	        errorcount2 =0; //setzt der Fehlerzähler zurück wenn ein gültiger Wert geladen wurde
        }
	LastSpeedChange2 = nMicros;
}


void loop() 
{ 
  // Ansteuerung der Servos
  value_1 = analogRead(POTI_1); // Liest den Analogwert vom Pin 23 zwischen 0 und 1023) 
  value_1 = map(value_1, 0, 1023, 800, 2100); // Skaliert den analogen Eingangswert auf 0,8-2,1 ms 
  servo_1.writeMicroseconds(value_1); // Schreibt den Sollwert vom Servo 
  
  value_2 = analogRead(POTI_2); // Liest den Analogwert vom Pin 24 zwischen 0 und 1023) 
  value_2 = map(value_2, 0, 1023, 800, 2100); // Skaliert den analogen Eingangswert auf 0,8-2,1 ms 
  servo_2.writeMicroseconds(value_2); // Schreibt den Sollwert vom Servo 
  

  // LCD Anzeige
  
  lcd.setCursor(0, 0);  // Zeile 0 für Messung 1
     lcd.print("Impuls 1: ");  
     lcd.setCursor(10, 0);  // 10= Stelle, 0=Zeile
     float displ_1 = Mittelwert1/1000.0; // Wert umrechnen in Nachkommazahl
     lcd.print(displ_1, 3);   // Ausgabe mit 3 Nachkommastellen
     lcd.setCursor(16, 0);  // 16=Stelle, 0=Zeile     
     lcd.print("ms");  
  
  errorcount1++;   //Fehlerzähler 
     if (errorcount1 >=10) //nach 10 Fehlerzählern wird ---- ausgegeben
        {
        lcd.setCursor(10, 0);  // 10= Stelle, 0=Zeile
        lcd.print("-----");  
        }
        
   lcd.setCursor(0, 1);  // Zeile 1 für Messung 2
     lcd.print("Impuls 2: ");  
     lcd.setCursor(10, 1);  // 10= Stelle, 1=Zeile
     float displ_2 = Mittelwert2/1000.0; // Wert umrechnen in Nachkommazahl
     lcd.print(displ_2, 3);  // Ausgabe mit 3 Nachkommastellen
     lcd.setCursor(16, 1);  // 16=Stelle, 1=Zeile     
     lcd.print("ms");  
 
 errorcount2++; //Fehlerzähler
     if (errorcount2 >=10)//nach 10 Fehlerzählern wird ---- ausgegeben
        {
        lcd.setCursor(10, 1);  // 10= Stelle, 0=Zeile
        lcd.print("-----");  
        }   
        
 lcd.setCursor(0, 2);  // Zeile 2 für Ausgabe Servo 1
     lcd.print("Servo 1: ");  
     lcd.setCursor(10, 2);  // 10= Stelle, 2=Zeile
     float displ_3 = value_1/1000.0; // Wert umrechnen in Nachkommazahl
     lcd.print(displ_3, 3);   // Ausgabe mit 3 Nachkommastellen
     lcd.setCursor(16, 2);  // 16=Stelle, 2=Zeile     
     lcd.print("ms");   
      
 lcd.setCursor(0, 3);  // Zeile 3 für Ausgabe Servo 2
     lcd.print("Servo 2: ");  
     lcd.setCursor(10, 3);  // 10= Stelle, 3=Zeile
     float displ_4 = value_2/1000.0; // Wert umrechnen in Nachkommazahl
     lcd.print(displ_4, 3);   // Ausgabe mit 3 Nachkommastellen
     lcd.setCursor(16, 3);  // 16=Stelle, 3=Zeile     
     lcd.print("ms");   
            
 delay (50); //50 ms delay
}
 
Komfortabler und universeller Servotester

Moin Bert,

in meinem und sicher auch dem anderer Forenmitglieder danke für den Sketch. In diesem Sketch steckt einiges an Hirnschmalz, was man als "Laie" diesen paar Zeilen so nicht ansieht. Gut durchdacht und umgesetzt.

Da zeigt sich wieder einmal dass mit einem Arduino (in diesem Fall Arduino Nano) und wenigen externen Bauteilen sehr viel angefangen werden kann. Preiswerter und einfacher lässt sich auf andere Weise kein Serotester aufbauen, der so genau und komfortabel ist.

Gruß und einen guten Rutsch in 2015
Armin de DO1XXY
 
Hallo Bert.
Danke :thx für diesen Thread.
Ein tolles und nützliches Gerät. 10:star :ok
 
Danke für die Blumen und viel Spaß beim Nachbauen.
 
Servus Bert,

vielen Dank für die schön kommentierten Programmzeilen. Damit dürfte es dann recht einfach sein Deinen Servotester an ein 2 Zeiliges Display anzupassen. Nur für ein Servo oder extern beschriften und je zwei Impulse hintereinander ...

PS: Den Arduino Nano hatte ich letztens in einem Buchladen bestellt. Der hat eine ISBN-Nummer und war dann tatsächlich am nächsten Tag da.
 
Servus Bert,

vielen Dank für die schön kommentierten Programmzeilen. Damit dürfte es dann recht einfach sein Deinen Servotester an ein 2 Zeiliges Display anzupassen. Nur für ein Servo oder extern beschriften und je zwei Impulse hintereinander ...

PS: Den Arduino Nano hatte ich letztens in einem Buchladen bestellt. Der hat eine ISBN-Nummer und war dann tatsächlich am nächsten Tag da.

Hallo Milan,

mit einem 2-zeiligen Display wären wir dann beim Servotester im Hosentaschentaschenformat :hfg

Zu dem Arduino aus dem Buchhandel (Amazon?): hast Du ebenfalls einen Arduino Nano von SaintSmart erhalten?

Gruß
Armin de DO1XXY
 
Ich habe hier noch ein paar 4-zeilige Displays liegen, die wollte ich eigentlich für meine Meßschieber an der Drehbank verbauen. Das habe ich dann aber verworfen, so habe ich da noch ein paar Displays liegen.
Die Arduino kaufe ich meist über ebay, gibt auch Händler aus Deutschland die die günstig anbieten. Neulich gab es vom Franzis Verlag eine Werbeaktion mit Gutschein, da bekam man einen Uno mit Zubehör und Buch für knapp 18€, ist aber jetzt schon aus.
 
Servus Bert,

auch wenn alles noch sehr sehr wild aussieht ... nun läuft es. Dein Programm lies sich problemlos auf eine UNO Hardware spielen. Den Uno hatte ich ebenfalls mit einem Buch bestellt. dort passten meine Patchkabel besser. Nach ein paar Versuchen sind nun alle vier Werte auf eine 2x16 Anzeige platziert. Die ms werden durch -- ersetzt, wenn kein Einganssignal anliegt. Die Anzeige stammte aus einer aufgerüsteten Multiplex MC 3010 Fernsteuerung. Die schickere blau Anzeige aus einer IBM AIX Workstation wollte bisher leider noch nichts anzeigen. Evtl. braucht diese eine negative Spannung?

Klasse, dass Du neben der Servoansteuereung auch noch die Impulsmessung implementiert hast. Das macht das ganze zu einem schönen Projekt um damit etwas herum zu spielen. Nochmals Danke.

Servotester_3291k.jpg
 
Hallo Berts & Milan,

eine weitere Option in der Anzeige wäre es auch noch die Gradzahl des Servostellweges anzeigen zu lassen. Dazu muss lediglich der gegebene Wert in ms auf die Gradzahl umgerechnet werden. Allerdings weiß ich nicht wie genau die reale Angabe ms/Grad ist, oder ob es sich um bei der Zurodung der Zeit im ms um Werte mit größerer Toleranz handelt. In diesem Fall müsste wohl der Wert des Potis im Servo eingelesen werden.

Gruß
Armin.

P.S. ich baue den Tester mit einem Arduino Mini und einer blau/weißen 16x2 Anzeige im Hosentaschenformat.

Gruß
Armin de DO1XXY
 
Hallo,

ich habe meinen Servotester noch etwas optimiert.

Code:
/* Servotester mit LCD Anzeige 4x20
2x Messung
2x Ausgang für Servosteller

  LCD Anzeige:
 * LCD RS pin to digital pin 12
 * LCD Enable pin to digital pin 11
 * LCD D4 pin to digital pin 7
 * LCD D5 pin to digital pin 8
 * LCD D6 pin to digital pin 9
 * LCD D7 pin to digital pin 10
 * LCD R/W pin to ground
 * 10K resistor:
 * ends to +5V and ground
 * wiper to LCD VO pin (pin 3)
 */
 

#include <LiquidCrystal.h>
LiquidCrystal lcd(12, 11, 7, 8, 9, 10); //12=RS, 11= Enable, 7=D4, 8=D5; 9=D6, 10=D7

const byte PIN_RC1 = 2; // das ist INT 0 aber Pin 2 wo das Empfängersignal eingelesen wird
const byte PIN_RC2 = 3; // das ist INT 1 aber Pin 3 wo das Empfängersignal eingelesen wird

// alles was im Inteerupt läuft muss als volatile deklariert werden, direkt aus dem RAM
volatile int ReceivedSpeedValues1[8] = {1500, 1500, 1500, 1500, 1500, 1500, 1500, 1500}; // Array mit 8 Werten für die gemessenen Werte
volatile int Summe1 = 12000; // Summe aus dem Array 8x1500, als Anfangswert
volatile int Mittelwert1 =0; // Mittelwert aus der Summe 
volatile int Zeiger1 =0; // Zeiger für das Array, fängt mit 0 an
volatile long LastSpeedChange1 =0;
volatile long nMicros =0;
volatile long nDifference1 =0;
volatile byte errorcount1=0;

volatile int ReceivedSpeedValues2[8] = {1500, 1500, 1500, 1500, 1500, 1500, 1500, 1500}; // Array mit 8 Werten für die gemessenen Werte
volatile int Summe2 = 12000; // Summe aus dem Array 8x1500, als Anfangswert
volatile int Mittelwert2 =0; // Mittelwert aus der Summe 
volatile int Zeiger2 =0; // Zeiger für das Array, fängt mit 0 an
volatile long LastSpeedChange2 =0;
volatile long nDifference2 =0;
volatile byte errorcount2=0;

#include <Servo.h> 
const byte SERVO_1 = 5; // Servo 1 an Pin 5 
const byte SERVO_2 = 6; // Servo 2 an Pin 6 
const byte POTI_1 = 0; // analoger Eingang auf Pin 23
const byte POTI_2 = 1; // analoger Eingang auf Pin 24
int value_1= 0; //analoger Wert von Servosteller 1
int value_2 =2; //analoger Wert von Servosteller 2


Servo servo_1; // Servoobjekt zur Ansteuerung 
Servo servo_2; // Servoobjekt zur Ansteuerung 


void setup() 
{ 
pinMode(PIN_RC1, INPUT);  // Eingang für Empfängersignal an Pin 2   
digitalWrite(PIN_RC1, HIGH); // Pull Up Widerstand aktivieren
pinMode(PIN_RC2, INPUT);  // Eingang für Empfängersignal an Pin 3  
digitalWrite(PIN_RC2, HIGH); // Pull Up Widerstand aktivieren

attachInterrupt( 0, SpeedPositionInterrupt1, CHANGE); // 0=Interrupt 0,also Pin 2 / NAME der Interruptroutine / springe zum Interrupt wenn der Wert an Pin 2 sich ändert
attachInterrupt( 1, SpeedPositionInterrupt2, CHANGE); // 1=Interrupt 1,also Pin 3 / NAME der Interruptroutine / springe zum Interrupt wenn der Wert an Pin 3 sich ändert

lcd.begin(20, 4); //LCD Display mit 20 Spalten und 4 Zeilen

analogReference(DEFAULT); //Anlogereferenz auf 5V legen
servo_1.attach(SERVO_1); // Zuweisung des Servos an PWM Pin 5 
servo_2.attach(SERVO_2); // Zuweisung des Servos an PWM Pin 6
} 


void SpeedPositionInterrupt1() 
{
	nMicros = micros();  // die aktuelle Prozessorzeit wird in der variablen nMicros abgespeichert, dann geht der Zugriff schneller
	nDifference1  = (nMicros - LastSpeedChange1); // hier wird geprüft wie lange der letzte Pegelwechsel her ist

	if ( (nDifference1 > 700 ) && ( nDifference1 < 2200)) // liegt die Zeitdifferenz zwischen 0,9 und 2,1 ms, so ist es ein HIGH Pegal
	{
		Summe1 -= ReceivedSpeedValues1[Zeiger1]; // Summe = Summe - ReceivedSpeedValues[Zeiger];// substrahiere letzte Messung aus dem Array
		ReceivedSpeedValues1[Zeiger1] = nDifference1; // Array mit 8 Werten für die gemessenen Wert 
		Summe1	+= nDifference1; //Summe = Summe + ReceivedSpeedValues[Zeiger]; // addiere Wert zur Summe  
		Zeiger1	 = ( ( Zeiger1 + 1 ) & 0x07 );	//	Index erhoehen und ggf. von 8 auf 0 springen
		Mittelwert1 = ( Summe1 >> 3 );	//der Befehl >>3 ist bit shift left um drei bit, das ist wie durch 8 teilen
                errorcount1 =0; //setzt der Fehlerzähler zurück wenn ein gültiger Wert geladen wurde
	}
	LastSpeedChange1 = nMicros;      
}


void SpeedPositionInterrupt2() 
{
	nMicros = micros();  // die aktuelle Prozessorzeit wird in der variablen nMicros abgespeichert, dann geht der Zugriff schneller
	nDifference2  = (nMicros - LastSpeedChange2); // hier wird geprüft wie lange der letzte Pegelwechsel her ist

	if ( (nDifference2 > 700 ) && ( nDifference2 < 2200)) // liegt die Zeitdifferenz zwischen 0,9 und 2,1 ms, so ist es ein HIGH Pegal
	{
		Summe2 -= ReceivedSpeedValues2[Zeiger2]; // Summe = Summe - ReceivedSpeedValues[Zeiger];// substrahiere letzte Messung aus dem Array
		ReceivedSpeedValues2[Zeiger2] = nDifference2; // Array mit 8 Werten für die gemessenen Wert 
		Summe2	+= nDifference2; //Summe = Summe + ReceivedSpeedValues[Zeiger]; // addiere Wert zur Summe  
		Zeiger2	 = ( ( Zeiger2 + 1 ) & 0x07 );	//	Index erhoehen und ggf. von 8 auf 0 springen
		Mittelwert2 = ( Summe2 >> 3 );	//der Befehl >>3 ist bit shift left um drei bit, das ist wie durch 8 teilen
	        errorcount2 =0; //setzt der Fehlerzähler zurück wenn ein gültiger Wert geladen wurde
        }
	LastSpeedChange2 = nMicros;
}


void loop() 
{ 
  // Ansteuerung der Servos
  value_1 = analogRead(POTI_1); // Liest den Analogwert vom Pin 23 zwischen 0 und 1023) 
  value_1 = map(value_1, 0, 1023, 800, 2100); // Skaliert den analogen Eingangswert auf 0,8-2,1 ms 
  servo_1.writeMicroseconds(value_2); // Schreibt den Sollwert vom Servo 
  
  value_2 = analogRead(POTI_2); // Liest den Analogwert vom Pin 24 zwischen 0 und 1023) 
  value_2 = map(value_2, 0, 1023, 800, 2100); // Skaliert den analogen Eingangswert auf 0,8-2,1 ms 
  servo_2.writeMicroseconds(value_2); // Schreibt den Sollwert vom Servo 
  

  // LCD Anzeige
  
  lcd.setCursor(0, 0);  // Zeile 0 für Messung 1
     lcd.print("Impuls 1: ");  
  if (errorcount1 <10)    //30.10.2016 sonst flackert die Anzeige - nur wenn ein Signal da ist
     {  
     lcd.setCursor(10, 0);  // 10= Stelle, 0=Zeile
     float displ_1 = Mittelwert1/1000.0; // Wert umrechnen in Nachkommazahl
     lcd.print(displ_1, 3);   // Ausgabe mit 3 Nachkommastellen
     }
     lcd.setCursor(16, 0);  // 16=Stelle, 0=Zeile     
     lcd.print("ms");  
  
  errorcount1++;   //Fehlerzähler 
     if (errorcount1 >=10) //nach 10 Fehlerzählern wird ---- ausgegeben
        {
        lcd.setCursor(10, 0);  // 10= Stelle, 0=Zeile
        lcd.print("-----");  
        errorcount1 = 11;      //30.10.2016 sonst gibt es beim byte einen Überlauf und die Anzeige flackert
        }
      
   lcd.setCursor(0, 1);  // Zeile 1 für Messung 2
     lcd.print("Impuls 2: ");  
   if (errorcount2 <10)     //30.10.2016 sonst flackert die Anzeige - nur wenn ein Signal da ist
     {  
     lcd.setCursor(10, 1);  // 10= Stelle, 1=Zeile
     float displ_2 = Mittelwert2/1000.0; // Wert umrechnen in Nachkommazahl
     lcd.print(displ_2, 3);  // Ausgabe mit 3 Nachkommastellen
     }
     lcd.setCursor(16, 1);  // 16=Stelle, 1=Zeile     
     lcd.print("ms");  
 
 errorcount2++; //Fehlerzähler
     if (errorcount2 >=10)//nach 10 Fehlerzählern wird ---- ausgegeben
        {
        lcd.setCursor(10, 1);  // 10= Stelle, 0=Zeile
        lcd.print("-----");  
         errorcount2 = 11;      //30.10.2016 sonst gibt es beim byte einen Überlauf und die Anzeige flackert
        }   
        
 lcd.setCursor(0, 2);  // Zeile 2 für Ausgabe Servo 1
     lcd.print("Servo 1: ");  
     lcd.setCursor(10, 2);  // 10= Stelle, 2=Zeile
     float displ_3 = value_1/1000.0; // Wert umrechnen in Nachkommazahl
     lcd.print(displ_3, 3);   // Ausgabe mit 3 Nachkommastellen
     lcd.setCursor(16, 2);  // 16=Stelle, 2=Zeile     
     lcd.print("ms");   
      
 lcd.setCursor(0, 3);  // Zeile 3 für Ausgabe Servo 2
     lcd.print("Servo 2: ");  
     lcd.setCursor(10, 3);  // 10= Stelle, 3=Zeile
     float displ_4 = value_2/1000.0; // Wert umrechnen in Nachkommazahl
     lcd.print(displ_4, 3);   // Ausgabe mit 3 Nachkommastellen
     lcd.setCursor(16, 3);  // 16=Stelle, 3=Zeile     
     lcd.print("ms");   
            
// delay (50); //50 ms delay  30.10.2016 rausgenommen
}

Bugfixes:
1. wenn kein Impulsmesser angeschlossen war flackerte die Anzeige, weil erst Nullen und dann ---- geschrieben wurden.
2. mache Servos vertrugen die 50ms delay am Ende des Programms nicht, die zitterten dann. Hab ich rausgenommen.
 

Servonaut
Zurück
Oben Unten