Arduino Aktualisierung zu langsam Gelöst

Hallo Zusammen

ich verwende einen arduino Uno und der serielle monitor und allgemein ist er gefühl langsam. Aktuelle aktualisiert er alle 1- 1,5 sekunden.

#include <Wire.h>
#include <LiquidCrystal_I2C.h>
LiquidCrystal_I2C lcd(0x27, 20, 4);
bool EINATMEN;
bool AUSATMEN;
#define TWI_FREQ 400000

// Motor
int enA = 9;
int in1 = 8;
int in2 = 7;


const float SensorOffset = 102.0;
// the setup routine runs once when you press reset:
void setup() {
  // initialize serial communication at 9600 bits per second:
  Serial.begin(9600);
  lcd.init(); //Im Setup wird der LCD gestartet 
  lcd.backlight();  
  // Motor
  pinMode(enA, OUTPUT);
  pinMode(in1, OUTPUT);
  pinMode(in2, OUTPUT);
}


void loop() {
  //Presuresensor
  // read the input on analog pin 0:
 volatile float sensorValue = (analogRead(A0)-SensorOffset)/100.0+0.7; //Do maths for calibration
  // print out the value you read:
  Serial.print("Air Pressure: ");  
  Serial.print(sensorValue,2);
  Serial.println(" kPa");
  


  // LCD Display
  // Initialisieren LCD display
  lcd.begin(20, 4);
  lcd.setCursor(0, 0);
  lcd.print("Test");
}


//  //Program
//  if (sensorValue < -0.1) {
//   
//    lcd.setCursor(0, 1);
//    lcd.print("Einatmen");
//    Serial.print("Einatmen");
//    AUSATMEN = LOW;
//    EINATMEN = HIGH;
//  }
//  else if (sensorValue > 0.1) {
//    
//    lcd.setCursor(0, 1);
//    lcd.print("Ausatmen");
//    Serial.print("Ausatmen");
//    EINATMEN = LOW;
//    AUSATMEN = HIGH;
//  }
//  else if ((sensorValue > -0.09) && (sensorValue < 0.09)) {
//    
//    lcd.setCursor(0, 1);
//    lcd.print("Nichts");
//    EINATMEN = LOW;
//    AUSATMEN = LOW;
//  }
//// Motor
//if ( EINATMEN == HIGH) {
//   digitalWrite(in1, LOW);
//   digitalWrite(in2, HIGH);
//    
//  }
//  else if (AUSATMEN == HIGH) {
//    digitalWrite(in1, LOW);
//    digitalWrite(in2, LOW);
//   
//  }
//  
//
//}

Was kann ich verbessern oder ändern?

Danke euch

achso das unten ist eigendlich nicht ausgeklammert war nur ein test.

Dann korrigiere bitte Dein Posting.
Warum macht Du lcd.begin() im loop und nicht im setup?

Gruß Tommy

unverändert übernommen:

16:34:13.980 -> AusatmenLaufzeit 1 Durchlauf: 38 ms
16:34:14.012 -> Air Pressure: 0.39 kPa
16:34:14.046 -> AusatmenLaufzeit 1 Durchlauf: 38 ms
16:34:14.079 -> Air Pressure: 0.39 kPa
16:34:14.112 -> AusatmenLaufzeit 1 Durchlauf: 38 ms
16:34:14.145 -> Air Pressure: 0.38 kPa
16:34:14.181 -> AusatmenLaufzeit 1 Durchlauf: 38 ms
16:34:14.212 -> Air Pressure: 0.39 kPa
16:34:14.248 -> AusatmenLaufzeit 1 Durchlauf: 37 ms

Achso. doch ne Änderung war drin.

#include <Wire.h>
#include <LiquidCrystal_I2C.h>
LiquidCrystal_I2C lcd(0x27, 20, 4);
bool EINATMEN;
bool AUSATMEN;
#define TWI_FREQ 400000

// Motor
int enA = 9;
int in1 = 8;
int in2 = 7;


const float SensorOffset = 102.0;
// the setup routine runs once when you press reset:
void setup()
{
  // initialize serial communication at 9600 bits per second:
  Serial.begin(9600);
  lcd.init(); //Im Setup wird der LCD gestartet
  lcd.backlight();
  // Motor
  pinMode(enA, OUTPUT);
  pinMode(in1, OUTPUT);
  pinMode(in2, OUTPUT);
}

uint32_t startZeit;
uint32_t endZeit;
void loop()
{
  startZeit=millis();
  //Presuresensor
  // read the input on analog pin 0:
  volatile float sensorValue = (analogRead(A0) - SensorOffset) / 100.0 + 0.7; //Do maths for calibration
  // print out the value you read:
  Serial.print("Air Pressure: ");
  Serial.print(sensorValue, 2);
  Serial.println(" kPa");
  // LCD Display
  // Initialisieren LCD display
  //lcd.begin(20, 4);
  lcd.setCursor(0, 0);
  lcd.print("Test");
  //  //Program
  if (sensorValue < -0.1)
  {
    //
    lcd.setCursor(0, 1);
    lcd.print("Einatmen");
    Serial.print("Einatmen");
    AUSATMEN = LOW;
    EINATMEN = HIGH;
  }
  else if (sensorValue > 0.1)
  {
    lcd.setCursor(0, 1);
    lcd.print("Ausatmen");
    Serial.print("Ausatmen");
    EINATMEN = LOW;
    AUSATMEN = HIGH;
  }
  else if ((sensorValue > -0.09) && (sensorValue < 0.09))
  {
    lcd.setCursor(0, 1);
    lcd.print("Nichts");
    EINATMEN = LOW;
    AUSATMEN = LOW;
  }
  //// Motor
  if ( EINATMEN == HIGH)
  {
    digitalWrite(in1, LOW);
    digitalWrite(in2, HIGH);
  }
  else if (AUSATMEN == HIGH)
  {
    digitalWrite(in1, LOW);
    digitalWrite(in2, LOW);
  }
  endZeit=millis();
  Serial.print(F("Laufzeit 1 Durchlauf: "));
  Serial.print(endZeit-startZeit);
  Serial.println(F(" ms"));
}

Und dann informier Dich mal über das blockweise kommentieren.

Ich hab mal das Problem gehabt, dass bei einem Programm mit dem Seriellen Monitor alles immer länger gedauert hat. Wie ich dann diesen deaktiviert hab, ist alles schneller gegangen. Ich hab aber auch noch ein extra Display, das ich dazu benutze.
MfG,
cloudDev

Wen man mit 200 Baud fährt dauert es eben :wink:

9600 Baud übertragen ca 1000 Byte pro Sekunde, das heißt umgekehrt, daß jedes Byte ca 1mS zur Übertragung braucht.
Abhilfe kann eine schnellere Baudrate sein zB 115200 .

Grüße Uwe

Wen bei mir alles funktioniert, dann wird ganze SerMon Ausgabe kommentiert, wo zu soll die Ressourcen fressen, wen nicht benutzt, und es werden parr Byte Speicher frei, kostet 10 Sek Arbeit, Suchen, Ersetzen :wink:

Das wars danke

Perfekt vielen dank

Besser mit #defines zum Abschalten:

// Bei DEBUG 0 werden die Ausgaben nicht einkompiliert
// 1 oder 0 zum Ein-/Ausschalten
#define DEBUG 1

#if (DEBUG == 0)
  #define dbgp(...)     // Serial.print
  #define dbgpn(...)    // Serial.println
  #define dbgpf(...)    
  #define dbgbeg(...)    // Serial.begin
#else
  #define dbgp(...) Serial.print(__VA_ARGS__)
  #define dbgpn(...) Serial.println(__VA_ARGS__)
#if defined ESP8266	|| defined ESP32
	#define dbgpf(...) Serial.printf(__VA_ARGS__)
#else
  #define dbgpf(x, ... ) {char dbgBuf[80]; snprintf_P( dbgBuf, sizeof(dbgBuf), PSTR( x ), ##__VA_ARGS__ ) ; Serial.println( dbgBuf ); }
#endif
  #define dbgbeg(...) Serial.begin(__VA_ARGS__)
#endif

Gruß Tommy

Das ist sowieso schneller als ich lesen kann. In der Millisekunde, die das Zeichen die Leitung belegt, kann der Arduino munter weiterarbeiten.
Weniger Text auszugeben macht den Arduino schneller. Solange kein Puffer überläuft, ist es völlig egal ob die Geschwindigkeit 115200 oder 9600 (oder 300) ist.
(Wobei --zugegeben-- bei 300 die Gefahr eines Pufferüberlaufs schon groß ist)

Ja aber dann muss das von Anfang an berücksichtig werden, ich bin noch um was zu testen bei SerMon, dadurch geht das Ersetzen schneller.

This topic was automatically closed 180 days after the last reply. New replies are no longer allowed.