INFO: Dieses Forum nutzt Cookies...
Cookies sind für den Betrieb des Forums unverzichtbar. Mit der Nutzung des Forums erklärst Du dich damit einverstanden, dass wir Cookies verwenden.

Es wird in jedem Fall ein Cookie gesetzt um diesen Hinweis nicht mehr zu erhalten. Desweiteren setzen wir Google Adsense und Google Analytics ein.

Antwort schreiben 
 
Themabewertung:
  • 0 Bewertungen - 0 im Durchschnitt
  • 1
  • 2
  • 3
  • 4
  • 5
LCD Langsam
05.09.2016, 16:20 (Dieser Beitrag wurde zuletzt bearbeitet: 05.09.2016 16:30 von MeisterQ.)
Beitrag #1
LCD Langsam
Moin,

ich nutze aktuell ein 20,4 LCD per I²C angeschlossen.

Allerdings bin ich jetzt nicht gerade der beste Programmierer, und jeder kennt ja das "problem" beim LCD mit der ausgabe von Zahlen etc....

Ich will ein paar Zahlen ausgeben lassen, die ich per Funk bekomme.

Code:
void lcdPrint()
{
  lcd.setCursor(0, 0);
  if (motorrpm <= 4)
  {
    lcd.print("Motor: ");
    lcd.print("000");
  }
  if (motorrpm < 100 && motorrpm > 9)
  {
    lcd.print("Motor: ");
    lcd.print("0");
    lcd.print(motorrpm);
  }
  if (motorrpm < 10 && motorrpm > 4)
  {
    lcd.print("Motor: ");
    lcd.print("00");
    lcd.print(motorrpm);
  }
  if (motorrpm > 99)
  {
    lcd.print("Motor: ");
    lcd.print("100");
  }
  lcd.print(" %  ");
  lcd.setCursor(0, 1);
  if (servowinkel < 100 && servowinkel > 9)
  {
    lcd.print("Servo: ");
    lcd.print("0");
    lcd.print(servowinkel);
  }
  if (servowinkel < 10)
  {
    lcd.print("Servo: ");
    lcd.print("00");
    lcd.print(servowinkel);
  }
  if (servowinkel > 99)
  {
    lcd.print("Servo: ");
    lcd.print(servowinkel);
  }
  lcd.print(" Grad");
  lcd.setCursor(0, 2);
  lcd.print("Uptime: ");
  lcd.print(uptime);
  lcd.print(" seconds");
  lcd.setCursor(0, 3);
  lcd.print("Lost packets: ");
  lcd.print(fail);
}

Für 4 Zeilen Textausgabe soviel code macht den Arduino natürlich sehr langsam..

Das bemerke ich auch sofort beim "Trimmen" eines Servos. Dieser ruckelt dann nur so vor sich hin.

Wenn ich den Code-teil auskommentiere, läuft wieder alles flüssig.

Daher meine Frage, wie machen das andere, dass beim LCD wenn eine Zahl z.b. von 3-Stellig auf 2-Stellig fällt, dass man dann nicht die 3. Ziffer der 3-Stelligen Zahl hinter der 2-Stelligen hat?

Wie das bei mir realisiert ist, sieht man ja...
Alle Beiträge dieses Benutzers finden
Diese Nachricht in einer Antwort zitieren
05.09.2016, 17:32 (Dieser Beitrag wurde zuletzt bearbeitet: 05.09.2016 17:35 von Mathias.)
Beitrag #2
RE: LCD Langsam
Kannst mal folgendes versuchen, vielleicht bringt es etwas.
Code:
lcd.print("Motor: ");
    lcd.print("00");
ersetzen durch:
Code:
lcd.print("Motor:00");
oder mit Zeilenumbruch
Code:
lcd.print("Motor:\n00");
Alle Beiträge dieses Benutzers finden
Diese Nachricht in einer Antwort zitieren
05.09.2016, 17:52
Beitrag #3
RE: LCD Langsam
Ein paar Zeilen kann ich mir dadurch ja sparen. Aber wirklich viel macht das natürlich nicht aus :/

Wie lösen das den andere Nutzer?
Alle Beiträge dieses Benutzers finden
Diese Nachricht in einer Antwort zitieren
05.09.2016, 18:46
Beitrag #4
RE: LCD Langsam
Evtl. den I²C Takt erhöhen. Oder bist schon auf 400KHz ?
Alle Beiträge dieses Benutzers finden
Diese Nachricht in einer Antwort zitieren
05.09.2016, 19:41
Beitrag #5
RE: LCD Langsam
Nicht das ich wüsste?

Habe Takttechnisch nichts verändert.

Ist mir bislang auch unbekannt.
Alle Beiträge dieses Benutzers finden
Diese Nachricht in einer Antwort zitieren
05.09.2016, 19:53
Beitrag #6
RE: LCD Langsam
Hallo MeisterQ,
interessant wäre zu wissen mit welcher Lib du den Motor steuerst / abfragst bzw. wie du motrrpm und servowinke etc. ermittelst. Wenn das sog. blockierende Funktionen sind dauert es halt.
Ansonsten musst du festsehenden Text nicht immer wieder ausgeben. Einmal reicht und dahinter die aus den Vergleichen kommenden Werte.
Letztlich wäre es gut den kompletten Sketch zu sehen.
Bei den paar Zeichen ist der I2C - Takt uninteressant, es sei den du hast noch andere Komponenten am I2C Bus dran.
grüße Ricardo

Nüchtern betrachtet...ist besoffen besser Big Grin
Alle Beiträge dieses Benutzers finden
Diese Nachricht in einer Antwort zitieren
06.09.2016, 17:03
Beitrag #7
RE: LCD Langsam
Den Motor steuere ich mit keiner Lib. Einfach mit analogWrite. Motorrpm und servowinkel werden per Funk vom Empfänger meiner Funkfernbedienung gesendet.

Ich benutze keinerlei delays.

Feststehend geht nicht, da ich das Display alle 10 Sekunden einmal cleare.

Der I²C Bus ist nur für das Display, sonst hängt nichts dran.

Der gesammte Code nochmal, aber eher uninteressant, da wenn ich den Sketchteil auskommentiere, läuft alles Flüssig.

Code:
// Funkfernbedienung, Sender, 2-Wege Kommunikation

#include <SPI.h>
#include <RF24.h>
#include <LiquidCrystal_I2C.h>

// Identifikationscode für Reciever

#define code 1337

// CE, CSN Pins definieren

//RF24 radio(48, 49); // für Arduino Mega
RF24 radio(8, 7); // für Arduino Nano/Uno/etc

static const uint64_t pipes[6] = {0xF0F0F0F0E1LL, 0xF0F0F0F0D2LL, 0xF0F0F0F0C3LL, 0xF0F0F0F0B4LL, 0xF0F0F0F0A5LL, 0xF0F0F0F096LL};

// I²C Adresse für LCD, Spalten, Zeilen

LiquidCrystal_I2C lcd(0x27, 20, 4);

// Messwerte

int poti1Val;
int poti2Val;
int poti1 = 1;
int poti2 = 0;

// Sonstige

int pong;
int sent = 0;
int motorrpm;
int servowinkel;
unsigned long fail = 0;
unsigned long passed = 0;
unsigned long uptime;

// Wait without delay

const long interval = 10000;
unsigned long previousMillis = 0;
const long interval2 = 1000;
unsigned long previousMillis2 = 0;

// Pins

int beep = 3; // Speaker Pin

// Setup

void setup() {

  // Seriellen Monitor starten (Baudrate 9600)

  Serial.begin(9600);

  // LCD-Setup

  lcd.begin();
  lcd.backlight();
  lcd.clear();

  // RF-24 Setup

  radio.begin();
  radio.setChannel(50);                // Funkkanal - Mögliche Werte: 0 - 127
  radio.setAutoAck(0);
  radio.setRetries(15, 0);
  radio.setPALevel(RF24_PA_LOW);
  // RF24_PA_MIN=-18dBm, RF24_PA_LOW=-12dBm, RF24_PA_HIGH=-6dBm, RF24_PA_MAX=dBm

  // Pipes öffnen

  radio.openWritingPipe(pipes[0]);
  radio.openWritingPipe(pipes[1]);
  radio.openWritingPipe(pipes[2]);
  radio.openReadingPipe(1, pipes[1]);
  radio.openReadingPipe(2, pipes[2]);
  radio.openReadingPipe(3, pipes[3]);

  // Pinmodes definieren

  pinMode(beep, OUTPUT);

}

// Main loop

void loop()
{
  uptime = millis() / 1000;
  messwerte(); // Messwerte auslesen
  if (sent == 0)
  {
    transmit(); // Daten übermitteln
  }
  if (sent == 1)
  {
    recieve(); // Daten empfangen und auswerten
    passed = passed + 1;
  }
  if (sent == 1 && pong != 69)
  {
    transmit(); // Daten übermitteln
    fail = fail + 1;
  }
  //  Serial.println(poti1Val);
  //  Serial.println(poti2Val);
  //  Serial.println(code);
  packets();
}

// Messwerte auslesen und mappen

void packets()
{
  unsigned long currentMillis2 = millis();
  if (currentMillis2 - previousMillis2 >= interval2) {
    previousMillis2 = currentMillis2;
    Serial.print("Recieved: ");
    Serial.println(passed);
    Serial.print("Lost: ");
    Serial.println(fail);
  }
}

void messwerte()
{
  poti1Val = analogRead(poti1);
  poti2Val = analogRead(poti2);
  poti1Val = map(poti1Val, 0, 1023, 170, 10);
  poti2Val = map(poti2Val, 0, 1023, 255, 0);
}

// Inhalte per Funk übertragen

void transmit()
{
  long message[8] = {int(poti1Val), int(poti2Val), (code)};
  radio.stopListening();
  radio.write(&message, sizeof(message));
  //  Serial.println("Sent");
  sent = 1;
}

// Inhalte per Funk empfangen

void recieve()
{
  radio.startListening();
  //  Serial.println("Start listening");
  delay(10);
  if (radio.available()) {
    long got_message[8] = {0, 0, 0, 0, 0, 0, 0, 0};
    bool done = false;
    while (!done) {
      done = radio.read(&got_message, sizeof(got_message));
    }
    motorrpm = got_message[0];
    servowinkel = got_message[1];
    pong = got_message[2];
    //   Serial.println(motorrpm);
    //   Serial.println(servowinkel);
    //   Serial.println(pong);
    lcdPrint();
    if (pong = 69)
    {
      //     Serial.println("Recieved");
      pong = 0;
    }
    sent = 0;
  }
  if (!radio.available())    {
    unsigned long currentMillis = millis();
    if (currentMillis - previousMillis >= interval) {
      previousMillis = currentMillis;
      lcd.clear();
      lcd.setCursor(0, 0);
      lcd.print("No data");
    }
  }
}

// Inhalte auf dem LCD ausgeben

void lcdPrint()
{
  lcd.setCursor(0, 0);
  if (motorrpm <= 4)
  {
    lcd.print("Motor: 000");
    //    lcd.print("000");
  }
  if (motorrpm < 100 && motorrpm > 9)
  {
    lcd.print("Motor: 0");
    //    lcd.print("0");
    lcd.print(motorrpm);
  }
  if (motorrpm < 10 && motorrpm > 4)
  {
    lcd.print("Motor: 00");
    //    lcd.print("00");
    lcd.print(motorrpm);
  }
  if (motorrpm > 99)
  {
    lcd.print("Motor: 100");
    //   lcd.print("100");
  }
  lcd.print(" %  ");
  lcd.setCursor(0, 1);
  if (servowinkel < 100 && servowinkel > 9)
  {
    lcd.print("Servo: 0");
    //   lcd.print("0");
    lcd.print(servowinkel);
  }
  if (servowinkel < 10)
  {
    lcd.print("Servo: 00");
    //    lcd.print("00");
    lcd.print(servowinkel);
  }
  if (servowinkel > 99)
  {
    lcd.print("Servo: ");
    lcd.print(servowinkel);
  }
  lcd.print(" Grad");
  lcd.setCursor(0, 2);
  lcd.print("Uptime: ");
  lcd.print(uptime);
  lcd.print(" seconds");
  lcd.setCursor(0, 3);
  lcd.print("Lost packets: ");
  lcd.print(fail);
}
Alle Beiträge dieses Benutzers finden
Diese Nachricht in einer Antwort zitieren
Antwort schreiben 


Möglicherweise verwandte Themen...
Thema: Verfasser Antworten: Ansichten: Letzter Beitrag
  OLED SSD1306 IC² Aktuallisierungrate Langsam b3ta 25 1.391 31.01.2016 09:26
Letzter Beitrag: b3ta
  Referenzfahrt zu langsam Michi87x 5 979 04.12.2014 09:33
Letzter Beitrag: Michi87x

Gehe zu:


Benutzer, die gerade dieses Thema anschauen: 1 Gast/Gäste