Code verkleinern

Hallo Community,

gibt's vielleicht eine Möglichkeit, den folgenden Code etwas zu schrumpfen:

#include <Wire.h>

#define startbyte 0x0F
#define I2Caddress 0x07

int sv[2]={135,120};                 // servo positions:0:tilt:13,1:open/close:5
int lmspeed,rmspeed;                                 // left and right motor speed from -255 to +255 (negative value = reverse)
byte lmbrake,rmbrake;                                // left and right motor brake (non zero value = brake)
byte devibrate=50;                                   // time delay after impact to prevent false re-triggering due to chassis vibration
int sensitivity=50;                                  // threshold of acceleration / deceleration required to register as an impact
int lowbat=550;                                      // adjust to suit your battery: 550 = 5.50V
byte i2caddr=7;                                      // default I2C address of T'REX is 7. If this is changed, the T'REX will automatically store new address in EEPROM
byte i2cfreq=0;                                      // I2C clock frequency. Default is 0=100kHz. Set to 1 for 400kHz

void setup()
{
  Serial.begin(9600);
  Wire.begin();                                      // no address - join the bus as master
  Serial.println("Sample Program started!");
}


void loop()
{
  //forward
  Serial.println("Forward");
 
  lmspeed=60;
  rmspeed=60;

  
  MasterSend(startbyte,6,lmspeed,lmbrake,rmspeed,rmbrake,sv[0],sv[1],devibrate,sensitivity,lowbat,i2caddr,i2cfreq);
  delay(50); //50
  for (int i = 0; i < 6; i++) {
     MasterReceive();                                   // receive data packet from T'REX controller
      delay(10); //50
  }
  
    //rechts drehen
  Serial.println("Forward");
 
  lmspeed=0;
  rmspeed=90;

  
  MasterSend(startbyte,6,lmspeed,lmbrake,rmspeed,rmbrake,sv[0],sv[1],devibrate,sensitivity,lowbat,i2caddr,i2cfreq);
  delay(10); //50
  for (int i = 0; i < 6; i++) {
     MasterReceive();                                   // receive data packet from T'REX controller
      delay(10); //50
  }
  
  //forward
  Serial.println("Forward");
 
  lmspeed=60;
  rmspeed=60;

  
  MasterSend(startbyte,6,lmspeed,lmbrake,rmspeed,rmbrake,sv[0],sv[1],devibrate,sensitivity,lowbat,i2caddr,i2cfreq);
  delay(50); //50
  for (int i = 0; i < 6; i++) {
     MasterReceive();                                   // receive data packet from T'REX controller
      delay(10); //50
  }
  
    //rechts drehen
  Serial.println("Forward");
 
  lmspeed=0;
  rmspeed=90;

  
  MasterSend(startbyte,6,lmspeed,lmbrake,rmspeed,rmbrake,sv[0],sv[1],devibrate,sensitivity,lowbat,i2caddr,i2cfreq);
  delay(10); //50
  for (int i = 0; i < 6; i++) {
     MasterReceive();                                   // receive data packet from T'REX controller
      delay(10); //50
  }
  //forward
  Serial.println("Forward");
 
  lmspeed=60;
  rmspeed=60;

  
  MasterSend(startbyte,6,lmspeed,lmbrake,rmspeed,rmbrake,sv[0],sv[1],devibrate,sensitivity,lowbat,i2caddr,i2cfreq);
  delay(50); //50
  for (int i = 0; i < 6; i++) {
     MasterReceive();                                   // receive data packet from T'REX controller
      delay(10); //50
  }
  
    //rechts drehen
  Serial.println("Forward");
 
  lmspeed=0;
  rmspeed=90;

  
  MasterSend(startbyte,6,lmspeed,lmbrake,rmspeed,rmbrake,sv[0],sv[1],devibrate,sensitivity,lowbat,i2caddr,i2cfreq);
  delay(10); //50
  for (int i = 0; i < 6; i++) {
     MasterReceive();                                   // receive data packet from T'REX controller
      delay(10); //50
  }
  //forward
  Serial.println("Forward");
 
  lmspeed=60;
  rmspeed=60;

  
  MasterSend(startbyte,6,lmspeed,lmbrake,rmspeed,rmbrake,sv[0],sv[1],devibrate,sensitivity,lowbat,i2caddr,i2cfreq);
  delay(50); //50
  for (int i = 0; i < 6; i++) {
     MasterReceive();                                   // receive data packet from T'REX controller
      delay(10); //50
  }
  

  //stop
  Serial.println("Stop");
  lmspeed=0;
  rmspeed=0;
  MasterSend(startbyte,6,lmspeed,lmbrake,rmspeed,rmbrake,sv[0],sv[1],devibrate,sensitivity,lowbat,i2caddr,i2cfreq);
  delay(200); 
    
 while(1) { }                                  
}

In Funktionen auslagern. Warum machst du mit while(1) am Ende eine Dauerschleife? Wenn du etwas nur einmal ausführen willst, solltest du das in die setup schreiben.

Und wie geht das mit dem Setup? Und wie meinst du das mit dem Funktionen?

void setup() wird vor der void loop() einmal ausgeführt.

Ja das weiss ich, jedoch nicht, was ich da benutzen muss, damit nur einmal der loop ausgeführt wird.

Und wie meinst du das mit dem in Funktionen auslagern?

Google ist dein Freund. Und unzählige Beispiele.

Hallo,

weist Du es oder nicht? :wink:

Alles was in loop steht wird endlos immer und immer wieder durchgeackert. Alles was in setup steht nur einmal. Deshalb schreibt man in setup alles rein was nur einmal am Anfang ausgeführt werden soll. Zum Bsp. Definition der Ein- und Augänge und deren Pegel-Zustände oder man aktiviert die serielle Schnittstelle usw.

Aber man kann auch seinen eigenen Code in setup unterbringen, wenn er nur einmal ausgeführt werden soll. Dann bleibt loop davon befreit und kann andere Sachen erledigen. Bei Dir wird loop am Ende mit einer while Schleife komplett gestoppt. Sowas macht man eigentlich nicht.

Funktionen sind Programmteile die man mehrfach verwenden kann. Man ruft die Funktion auf, mit Parameterübergabe oder ohne und bekommt ein oder kein Ergebnis zurückgeliefert. Macht den Code in loop übersichtlicher und einfacher lesbar und spart noch Tipparbeit. Dafür muß man sich Gedanken machen die Funktion auch nicht so sturr zu entwerfen.