Pages: [1] 2   Go Down
Author Topic: AnalogRead vor void Loop() einlesen  (Read 1376 times)
0 Members and 1 Guest are viewing this topic.
0
Offline Offline
Jr. Member
**
Karma: 0
Posts: 57
Arduino rocks
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

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.smiley-cool/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
Logged

Weinsberg, Germany
Offline Offline
God Member
*****
Karma: 3
Posts: 773
A Coder's Tale
View Profile
WWW
 Bigger Bigger  Smaller Smaller  Reset Reset

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

Forum Moderator
BZ (I)
Online Online
Brattain Member
*****
Karma: 270
Posts: 21865
+39 349 2158303
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

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

0
Offline Offline
Jr. Member
**
Karma: 0
Posts: 57
Arduino rocks
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

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

Weinsberg, Germany
Offline Offline
God Member
*****
Karma: 3
Posts: 773
A Coder's Tale
View Profile
WWW
 Bigger Bigger  Smaller Smaller  Reset Reset

Geht
Code:
float tara;

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

void loop() {
?
Logged

Offline Offline
Edison Member
*
Karma: 21
Posts: 1419
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

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

0
Offline Offline
Jr. Member
**
Karma: 0
Posts: 57
Arduino rocks
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

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
Logged

0
Offline Offline
Faraday Member
**
Karma: 24
Posts: 3496
20 LEDs are enough
View Profile
WWW
 Bigger Bigger  Smaller Smaller  Reset Reset

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

Warum statt
Code:
float tara;

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

void loop() {
...

nicht wie folgt:

Code:

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

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

Logged

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

Weinsberg, Germany
Offline Offline
God Member
*****
Karma: 3
Posts: 773
A Coder's Tale
View Profile
WWW
 Bigger Bigger  Smaller Smaller  Reset Reset

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

Forum Moderator
BZ (I)
Online Online
Brattain Member
*****
Karma: 270
Posts: 21865
+39 349 2158303
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

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
Logged

0
Offline Offline
Faraday Member
**
Karma: 24
Posts: 3496
20 LEDs are enough
View Profile
WWW
 Bigger Bigger  Smaller Smaller  Reset Reset

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

Logged

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

Forum Moderator
BZ (I)
Online Online
Brattain Member
*****
Karma: 270
Posts: 21865
+39 349 2158303
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

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

0
Offline Offline
Faraday Member
**
Karma: 24
Posts: 3496
20 LEDs are enough
View Profile
WWW
 Bigger Bigger  Smaller Smaller  Reset Reset

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

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

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

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

0
Offline Offline
Faraday Member
**
Karma: 24
Posts: 3496
20 LEDs are enough
View Profile
WWW
 Bigger Bigger  Smaller Smaller  Reset Reset

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

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

void loop() {
  const int test = analogRead(A0);
  Serial.println(test, DEC);
}
« Last Edit: January 17, 2012, 05:08:24 pm by Udo Klein » Logged

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

0
Offline Offline
Faraday Member
**
Karma: 24
Posts: 3496
20 LEDs are enough
View Profile
WWW
 Bigger Bigger  Smaller Smaller  Reset Reset

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

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

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

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

Pages: [1] 2   Go Up
Jump to: