Go Down

Topic: AnalogRead vor void Loop() einlesen (Read 1 time) previous topic - next topic

Andi81

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

Joghurt

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

uwefed

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

Andi81

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);
}

Joghurt

Geht
Code: [Select]

float tara;

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

void loop() {

?

mkl0815

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

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.

Andi81

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

Udo Klein

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

Warum statt
Code: [Select]

float tara;

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

void loop() {
...


nicht wie folgt:

Code: [Select]


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

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


Check out my experiments http://blog.blinkenlight.net

Joghurt

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

uwefed

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

Udo Klein

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

Check out my experiments http://blog.blinkenlight.net

uwefed

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

Udo Klein

Was gibt das Programm unten aus? Erst denken, dann laufen lassen ;)

Code: [Select]

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

void loop() { 
  for (static uint8_t t=0; t<10; ++t) {
    Serial.println(t, DEC);
  }
}
Check out my experiments http://blog.blinkenlight.net

Udo Klein

#13
Jan 17, 2012, 10:57 pm Last Edit: Jan 17, 2012, 11:08 pm by Udo Klein Reason: 1
Und jetzt die richtig fiese Frage: was gibt das hier aus? Warum?!

Code: [Select]

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

void loop() {
  const int test = analogRead(A0);
  Serial.println(test, DEC);
}
Check out my experiments http://blog.blinkenlight.net

Udo Klein

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

Code: [Select]

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

void loop() {
  const static int test = analogRead(A0);
  Serial.println(test, DEC);
}
Check out my experiments http://blog.blinkenlight.net

Go Up