Float führt zum absturz ?

hallo,

ich habe hier für meine Steuerung eine kleines Programm geschrieben. Unter anderen wird Strom über einen shunt gemessen. Der Wert wird mit dem Faktor 0.00488 multipliziert, damit ich mir den Strom direkt ansehen kann. Es wird an drei Stellen der Strom gemessen, so das ich drei Werte habe, was auch soweit alles klappt. leider Stürzt der Arduino immer wieder bei der Anzeige des Stroms ab. Es wird dann ein Wert wie z.B. 2.4534 angezeigt und dann resetet er oder bleibt stehen.

Ich hab zum testen das Programm mal auf die Float Berechnung beschränkt, was dann aber natürlich macht was soll.

Hier mal mein vereinfachtes Beispiel :

float ampere = 0;
float ampereumrech = 0.0049 ;

int sensorReadingPumpe1 = 513;



void setup(){
  Serial.begin(115200);
}

void loop(){


  Serial.println("Strom ");

  ampere = sensorReadingPumpe1 * ampereumrech;
  Serial.print("ampere ");
  Serial.println(ampere);
  
  Serial.print("ampere int");
  Serial.println(int(ampere));
  Serial.print("ampereumrech");
  Serial.println(ampereumrech);

  
}

Im Original sieht das dann so aus :

  sensorReadingPumpe1 = analogRead(analogPumpe1);
  Serial.print("Strom ");

  ampere = sensorReadingPumpe1 * ampereumrech;
  Serial.print(ampere);
  
  sensorReadingPumpe2 = analogRead(analogPumpe2);
Serial.print(" ");

  ampere = sensorReadingPumpe2 * ampereumrech;
  Serial.print(ampere);
Serial.print(" ");

  
  sensorReadingPumpe3 = analogRead(analogPumpe3);

  ampere = sensorReadingPumpe3 * ampereumrech;
  Serial.println(ampere);

Es liegt eindeutig daran und ist auch reproduzierbar.

Wer hat eine Idee, was ich falsch mache ?

Gruss Stefan

Du bist sicher, dass der Arduino das nicht schafft? Oder könnte es auch daran liegen, dass dein Terminalprogramm nicht hinterherkommt? Jetzt auf den ersten Blick ist mir auch kein gravierender Fehler aufgefallen, bin mir jedoch nicht ganz schlüssig, ob es im Sinne des Erfinders ist, die analogen eingänge fortlaufend ohne Unterbrechung abzufragen. Zum testen würde ich mal ein Delay (vllt. 200 ms) in die Hauptschleife packen und das Resultat begutachten. Sollte das einen Erfolg bringen, ist diese Pause in der Art natürlich hinderlich, da sollte man dann zur Abfrage über die millis greifen, um die Sensorwerte nicht permanent abzufragen, den restlichen Programmablauf aber nicht zu blockieren.

Hallo,
in meinem “Grossen” Programm, werden die Werte nicht dauernd abgefragt, sonder nur alle 30 Sekunden.

Das Beispiel das ich gepostet habe funktioniert auch aber das richtige Prog nicht. Ich jetzt mal die die Berechnung rausgeworfen und zeige die analog Werte direkt an und da geht es ?

Gruss Stefan

Was sagt denn das Programm bei der Änderung des Datentypen auf "double"?

Hallo,

double ist natürlich noch besser ( bin halt kein Profi beim programmieren).

Der fehler trat dann aber nach dem ich den Teil des Programms übersprungen habe an anderen Stellen auf. Bei der suche habe ich einen Hinweis auf ein Problem mit der String lib gefunden, konnte es aber noch nicht testen. Ich hoffe ich schaffe das heute abend.

Gruss Stefan

Der Fehler mit der String lib betraf eine ältere Version. daran lag es leider nicht.

Scheinbar wir mein Programm zu groß. Wenn ich über 13000 Bytes beim Compilieren komme, tritt der Fehler auf ???

Es ist übrigens ein Atmega 328.

Gruss Stefan

Ich glaube nicht, daß Dein Programm zu groß ist sondern daß die vielen Variablen zuviel Ram verbrauchen und so Bereiche der Systemvariablen überschreiben. Tritt das Problem bei gleichem Programm auch auf einem Arduino Mega auf? Versuche Konstanten mit Progemem ins flash zu bringen oder Konstanten als #define zu definieren; So wird beim compilieren direkt der Wert eingebaut und keine Variable. http://arduino.cc/en/Reference/Define http://www.arduino.cc/en/Reference/PROGMEM

Grüße Uwe

Hi,

mit einem Mega hab ich noch nicht getestet.

Nachdem ich alles umgebaut habe läuft es jetzt erst mal wieder. Der Code ist 14450 bytes gross und beim start sind kanpp 300 bytes frei und nach zwei/drei Durchläufen, sind es dann nur noch 105 bytes. Mit define könnte ich nur eine Variable ersetzen aber PROGMEM werde ich mir mal ansehen.

Danke für den Tip

Stefan

PROGMEM geht leider auch nicht, da ich mir Progmen read_only Variablen erhalten, das nützt mir aber nichts.

Ich hab es mal durch gezählt 19 INT Variablen und dann noch gesammelte Werke :slight_smile:

Messenger message = Messenger(22);
LiquidCrystal_I2C lcd(0x20,16,4);
String readString = String(30);

String phone;
#define MAXSIZE 80
char string[MAXSIZE];

Ich weiß allerdings nicht was die Libarys noch brauchen

#include <MemoryFree.h>
#include <LiquidCrystal_I2C4.h>
#include <Wire.h>
#include <Messenger.h>

Gruss Stefan