AnalogRead vor void Loop() einlesen

Hi Leute!
Hab folgendes Problem: Meine Küchenwaage, welche vom Arduino ausgelesen wird, weicht bei jedem Mal einschalten um 1-2 gramm ab.
Der Grund:
Gewicht = (sensorValue-51.8)/0.2173; //In meiner Funktion muss ich den Wert 51,8 subtrahieren. Der Wert ist mein analogRead bei 0 gramm auf der Waage. (0,2173 gibt die Steigung der Funktion an)

Um mein Problem zu beheben müsste ich jetzt beim Einschalten diesen Wert auslesen und in den loop() übernehmen.
Wie geht das? Jedes Mal wenn ich einen analogRead vor dem Loop mache und diesen übernehme ist dieser null... und nicht um die 51.

Ich hoffe es ist einigermaßen verständlich...

Grüße Andi

Hast Du die Übergabevariable ausserhalt der loop() deklariert?

und auch außerhalb setup().
Grüße Uwe

Also so hätt ich das gedacht:

float Gewicht = 0;
int masse = 0;

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

float tara = analogRead(A0); //hier würde ich den Wert einlesen...

void loop() {
float sensorValue = 0;
for (int i = 0; i < 500; i++) {

sensorValue = sensorValue + analogRead(A0);
}
sensorValue = sensorValue/500;
Gewicht = (sensorValue-tara)/0.2173; //und hier würd ich ihn verwenden
masse = Gewicht;
Serial.print(sensorValue);
Serial.print("; ");
Serial.print(masse);
Serial.println(" gramm ");
delay(1000);
}

Geht

float tara;

void setup() {
  Serial.begin(9600);
  tara = analogRead(A0);   //hier würde ich den Wert einlesen...
}

void loop() {

?

Ha, zu langsam.
Meine Lösung sah identisch aus ... :slight_smile:

Aber zur Ergänzung / Info:
Variablen ausserhalb der Funktionen zu definieren sorgt dafür, das diese in allen Teilen Deines Programms sichtbar sind und verwendet werden können. Allerdings wird kein Code ausserhalb der Funktionen setup() und loop() ausgeführt (außer es werden zusätzlich Funktionen explizit aufgerufen oder per Interrupt getriggert).
Mario.

Jaa!
Vielen Dank!
Hab zwar meine Funktion etwas anpassen müssen (weiß auch nicht warum) aber jetzt gehts!
Wenns immer so einfach wäre...
Danke nochmals!
Grüße Andi

Globale Variablen sind aber unfein, vor allem wenn man sie gar nicht braucht:

Warum statt

float tara;

void setup() {
  Serial.begin(9600);
  tara = analogRead(A0);   //hier würde ich den Wert einlesen...
}

void loop() {
...

nicht wie folgt:

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

void loop() {
    static float  tara = analogRead(A0);   //hier würde ich den Wert einlesen...
...

Würde da dann nicht trotzdem bei jedem Durchgang den tara-Wert setzen?

Udo das verstehe ich jetzt nicht.
Die Tara ist mit leerer Waage zu machen.
Wieso machst Du sie vor jedem Meßzyklus ohne daß man weiß wann die Tara genommen wird?
Grüße Uwe

static Variablen werden nur einmal initialisiert. Ich mache das also nicht bei jedem Durchgang. http://de.wikibooks.org/wiki/C-Programmierung:_static_%26_Co.

Wußte gar nicht; wieder was dazugelernt. Danke Uwe

Was gibt das Programm unten aus? Erst denken, dann laufen lassen :wink:

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

void loop() {  
  for (static uint8_t t=0; t<10; ++t) {
    Serial.println(t, DEC);
  }
}

Und jetzt die richtig fiese Frage: was gibt das hier aus? Warum?!

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

void loop() {
  const int test = analogRead(A0); 
  Serial.println(test, DEC);
}

So und um jetzt für echte Verwirrung zu sorgen: ist der Output vom folgenden Code OK oder eher ein Compilerfehler? Warum ]:smiley:

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

void loop() {
  const static int test = analogRead(A0); 
  Serial.println(test, DEC);
}

Konstanten sind immer Global?

Nein, man darf selbstverständlich lokale Konstanten haben.