Torsionsstab

Hi
ich bin neu in der Programmierscene und ich habe als Projekt einen Torsionsstab ausgewählt. Dazu wird ein Alurohr eingespannt und mit ehilfe eines DMS ausgelesen.

Ich habe nun diesen Code geschrieben :

//LiquidCrystal Bibliothek
#include <LiquidCrystal.h>
 
                                                        // Benutzte Pins am Arduino und deklarierung der Zahlen
                                                        // LCD PINS
LiquidCrystal lcd(8, 9, 4, 5, 6, 7);
                                                        // PINS und deklarierung des DMS
float sensorPin = A0;                                   // Input Pin des DMS 
float sensorValue = 0;                                  // variable um den Wert des Sensors zu Speichern und später auszugeben


void setup()
{
                                                        //LCD
 lcd.begin(16, 2);                                      // Start der Bibliothek
 lcd.setCursor(0,0);                                    // Ausgabe bei Zeile 1, Spalte 0
 lcd.print("");                         // Ausgabe der Message

  
   Serial.begin(9600);                                  // Baudrate bestimmen

}
  
void loop()                                             // Schleife starten
{

                                                        // Wert des Sensors auslesen
  sensorValue = analogRead(sensorPin);          
  delay(1000);                                          // Es soll jede Sekunde neu der Wert ausgegeben werden
  Serial.print("sensor = " );                          //Deklarierung des Ausgabewertes
  Serial.println(sensorValue);   
 
 lcd.setCursor(0,1);                                    // Curser bei Zeile 2, 1. Spalte
 lcd.print(sensorValue);                                // Sensorwert auf das Display ausgeben
 
        


 
 
 }

Der LCD gibt jedoch nur den Wert in einer Zeile aus. Wenn ich nun noch Spannung vor dem ausgegebenen Wert haben möchte, was müsste ich dann verändern ?

float sensorPin = A0;                                   // Input Pin des DMS
float sensorValue = 0;

verwende byte bzw int

Der LCD gibt jedoch nur den Wert in einer Zeile aus. Wenn ich nun noch Spannung vor dem ausgegebenen Wert haben möchte, was müsste ich dann verändern ?

Dann schreibst Du es einfach vorher

lcd.setCursor(0,1);                                    // Curser bei Zeile 2, 1. Spalte
 lcd.print("sensor = " );  
 lcd.print(sensorValue);

Grüße Uwe

danke für die schnelle antwort!
das mit den bytes werde ich mal ausprobieren bei integer hat dies nicht funktioniert. Wenn ich den DMS mit dem Poti genullt habe hat der Serielle Monitor den Wert 0 angezeigt der LCD jedoch nicht dieser lag dann bei knappen 100.

tobiibot:
Wenn ich den DMS mit dem Poti genullt habe hat der Serielle Monitor den Wert 0 angezeigt der LCD jedoch nicht dieser lag dann bei knappen 100.

Du musst auch berücksichtigen, dass das lcd.print den Rest der Zeile hinter der Ausgabe nicht löscht. Ist der ausgegebene Wert mal 3-Stellig gewesen, und dann wird nur ein 1- oder 2-stelliger Wert ausgegeben, bleibt die 2. bzw. 3. Ziffer im LCD stehen, und es sieht nach einer ganz anderen Zahl aus. Das Löschen der 'alten' Ziffern musst Du selbst machen, z.B. indem Du immer hinter der Zahl ein " " ausgibst.

also hinter dem sensorvalue noch ein " " tippen ?

lcd.setCursor(0,1);                                    // Curser bei Zeile 2, 1. Spalte
 lcd.print("sensor = " ); 
 lcd.print(sensorValue " ");

Oder muss ich dafür noch eine eigene Zeile anlegen ?

Das musst Du mit einem eigenen lcd.print machen:

 lcd.print("sensor = " );
 lcd.print(sensorValue);
 lcd.print("  " );

du könntest es so versuchen:

 lcd.setCursor(0,1);                                    // Curser bei Zeile 2, 1. Spalte
 lcd.print(F("sensor = " ));
 if (sensorValue<1000)lcd.print(' ');
 if (sensorValue<100)lcd.print(' ');
 if (sensorValue<10)lcd.print(' ');
 lcd.print(sensorValue);

tobiibot:
danke für die schnelle antwort!
das mit den bytes werde ich mal ausprobieren bei integer hat dies nicht funktioniert. Wenn ich den DMS mit dem Poti genullt habe hat der Serielle Monitor den Wert 0 angezeigt der LCD jedoch nicht dieser lag dann bei knappen 100.

Du solltest int bzw. unsigned int nehmen. Byte reicht nur bis 255. Analogread liefert einen Wert bis 1023. Kommt es zu Werten über 255, wird bei byte die Zahl modulo 255 genommen, was bestimmt sehr störend wäre.

um Missverständnisse mit int und byte zu vermeiden hier nochmal der gesamte Sketch:

//LiquidCrystal Bibliothek
#include <LiquidCrystal.h>
                                                
LiquidCrystal lcd(8, 9, 4, 5, 6, 7);         // LCD PINS
                                             // PINS und deklarierung des DMS
const byte sensorPin = A0;                   // Input Pin des DMS
uint16_t sensorValue = 0;                    // variable um den Wert des Sensors zu Speichern und später auszugeben

void setup()
{
 LCDlcd.begin(16, 2);                        // Start der Bibliothek
 lcd.setCursor(0,0);                         // Ausgabe bei Zeile 0, Spalte 0
 lcd.print("Setup");                         // Ausgabe der Message
 Serial.begin(9600);                         // Baudrate bestimmen
}
 
void loop()                                  // Schleife starten
{                                                     
  sensorValue = analogRead(sensorPin);       // Wert des Sensors auslesen
  Serial.print("sensor = " );                //Deklarierung des Ausgabewertes
  Serial.println(sensorValue);   
  lcd.print(F("sensor = " ));                //Deklarierung des Ausgabewertes
 
  lcd.setCursor(0,1);                        // Curser bei Zeile 2, 1. Spalte
  if (sensorValue<1000)lcd.print(' ');
  if (sensorValue<100)lcd.print(' ');
  if (sensorValue<10)lcd.print(' ');
  lcd.print(sensorValue);   
  delay(1000);                               // Es soll jede Sekunde neu der Wert ausgegeben werden
 
 }

Es gibt noch die Funktion lcd.clear();
Damit wird das komplette LCD gelöscht.
Es ist aber besser leerzeichen hinter den zahlen zu schreiben, weil das Display flackert bei lcd.clear() und es dauert etwas länger.