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!
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.
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.