Wie mache ich meinen Code effizienter?

Moin.

Ich schreibe gerade an einem Code von einer Wetterstation. Im laufe der Zeit bin ich jedoch darauf gestoßen, dass man doch bitte C-strings anstatt die string klasse und pointer verwenden soll, etc. .
Hier seht ihr einen Ausschnitt, bei dem ich die Inputs engegen nehme. Ich würde den Code gerne so effizient wie möglich machen, also schönen Code schreiben bzw. möglichst viel Speicher und RAM sparen.

const int magnet_pin = 2;  //digital
const int voltage_pin = 2;  //analog
const unsigned long package_frequency = 10000; 

class Windrad {

  float _voltage;
  int _measure_times;
  unsigned long _prev_millisVoltage;

  int _revolutions;
  bool _cooldown = false;

  unsigned long _prev_millisPackage;
  

  public:
    bool package_available;
    String package;

    Windrad();
    void checkInputs();
        
};

Windrad::Windrad() {
  pinMode(magnet_pin, INPUT);
}

void Windrad::checkInputs() {
  if (millis() - _prev_millisVoltage > 100) {
    _voltage += analogRead(voltage_pin);
    _measure_times++;
    _prev_millisVoltage = millis();
  }

  if (digitalRead(magnet_pin) and _cooldown == false) {
    _revolutions++;
    _cooldown = true;
  }
  else if (!digitalRead(magnet_pin) and _cooldown == true){
    _cooldown = false;
  }

  if (millis() - _prev_millisPackage >= package_frequency) {
    package_available = true;
    package = String(_voltage/_measure_times) + "," + String(_revolutions);
    
    _voltage = 0;
    _measure_times = 0;
    _revolutions = 0;
    _prev_millisPackage = millis();
  }
}

Windrad windrad;

void setup() {
  Serial.begin(9600);
  Serial.println("\nWetterstation");
}

void loop() {
  windrad.checkInputs();

  if (windrad.package_available) {
    Serial.println(windrad.package);
    windrad.package_available = false;
  }

}

wenn noch unklarheiten sind würde ich den Code noch kurz erläutern. Verbesserungen erwünscht!

LG
Johann

Solche Fragmente helfen nicht wirklich bei der Problemlösung.
Welche Hardware?

Gruß Tommy

Ich benutze einen Arduino UNO, wobei ein Datenloggershield mit RTC und ein NRF Funkmodul für das restliche Projekt verbaut sind.

LG
Johann

leiste dir eine lokale Variable und spar dir einen call von millis()

lies nach was es bedeutet das F-Makro zu nutzen und überarbeite

sowas und ähnliches:

Serial.println("\nWetterstation");

und schmeiss weg die Arduino String

Ok danke.

Wie sieht es eigentlich mit C-Strings und der String-klasse aus? Ich habe gehört, dass die Stringklasse in c++ eine erfreuliche erneuerung ist und die umständlichen c-strings ablöst. Auf Arduinoforen habe ich aber gelesen, dass wegen des dynamischen Speichers c-strings attraktiver sind, da die dynamischen strings der Sting-klasse dir den Arbeitsspeicher zerschießen... was sollte ich nun verwenden und wie?

Wenn Du einen Rechner mit viel RAM hast, kannst Du durchaus mit Strings arbeiten. Bei den kleinen MC ist das eher nicht zu empfehlen, da deren Speicher schnell fragmentiert.
Wenn Du weißt, was Du tust, kannst Du mit reserve() einiges abfangen, aber nur dann.
Die C-Zeichenketten sind auch besser von den Funktionen her unterstützt.

Gruß Tommy

In Konstruktoren sollte man keine Hardware Zugriffe vornehmen,
da diese u.U. noch nicht initialisiert ist, wenn der Konstruktor ausgeführt wird.

Du solltest eine begin() Funktion für solche Initialisierungen benutzen.+

Warum sammelst du int-Werte in einer float-Variable?

Solche Sequenzen von object.attribute machen schon optisch deutlich,
dass das eine Funktion des Objekts sein sollte.

Die Kosten dafür sind auf dem AVR Prozessoren u.U. sehr hoch.

Und die Handhabung ist auch praktisch nur beim Zusammenfügen von Strings einfacher. Was z.B. das Konvertieren und Formatieren von Texten geht kannst du mit C Strings viel mehr, viel einfacher erledigen. Das Aufsplitten von Texten ist mit der String Klasse auch komplizierter.