INFO: Dieses Forum nutzt Cookies...
Cookies sind für den Betrieb des Forums unverzichtbar. Mit der Nutzung des Forums erklärst Du dich damit einverstanden, dass wir Cookies verwenden.

Es wird in jedem Fall ein Cookie gesetzt um diesen Hinweis nicht mehr zu erhalten. Desweiteren setzen wir Google Adsense und Google Analytics ein.

Antwort schreiben 
 
Themabewertung:
  • 0 Bewertungen - 0 im Durchschnitt
  • 1
  • 2
  • 3
  • 4
  • 5
Lokale Variable an loop zurück - Fehler
26.02.2019, 21:04 (Dieser Beitrag wurde zuletzt bearbeitet: 26.02.2019 21:05 von Haukini.)
Beitrag #1
Lokale Variable an loop zurück - Fehler
Moin zusammen,

versuche gerade eine Waage zu bauen und die Daten auf einer SD-Karte abzulegen.

Aktuell habe ich das Problem, dass ich die Variable i global definiere, mit in die Funktion nehme, aber ich sie mit return nicht zurück in den main Teil bekomme.

Kann mir einer sagen wo das Problem liegt?

Anbei der Code:

Code:
//    Anschluss Real-time-clock       I²C - SDA/SCL --> "Pin14/15"
//    Aschnluss Hx711                 I²C - SCK-Pin5 | DT-Pin4
//    Anschluss SD Karte:             Ethernet Shield
//

#include <Wire.h>
#include <DS3231.h>
#include <HX711_ADC.h>
#include <SPI.h>
#include <SD.h>

const int chipSelect = 4;             // SD Karte

DS3231 clock;                         // Echtzeituhr
RTCDateTime dt;                       // Echtzeituhr

HX711_ADC LoadCell(4, 5); // DT = Pin 4, SCK = Pin 5      // Wägezelle
int wl = 20;                          // Durchgänge der Wiegezelle
int i = 0;
int gew = 0;

//--------------------------------------------------------------------

void setup()
{
  Serial.begin(9600);                     // Serieller Monitor
  Serial.println("Setup loop");;

  if (!SD.begin(chipSelect)) {
    Serial.println("Card failed, or not present");
    // don't do anything more:
    return;
  }
  Serial.println("card initialized.");

  clock.begin();                          // Beginne Uhr
  clock.setDateTime(__DATE__, __TIME__);

  LoadCell.begin(); // start connection to HX711
  LoadCell.start(10); // load cells gets 10ms of time to stabilize
  LoadCell.setCalFactor(104.24); // calibration factor for load cell => strongly dependent on your individual setup
}

//--------------------------------------------------------------------

void loop()
{
  dt = clock.getDateTime();
  if ((dt.second==1) || (dt.second==11) || (dt.second==21) || (dt.second==31) || (dt.second==41) || (dt.second==51)|| (dt.second==6) || (dt.second==26) || (dt.second==36) || (dt.second==46) || (dt.second==56)) {
  printDatum();
  wiegen(i,wl);
  Serial.print("loop");
  Serial.print(i);
  printGewicht(i);
  speichern(gew);
  delay(1000);
}                                                                 // if
}                                                                 // loop

//--------------------------------------------------------------------

int wiegen(int i,int wl) {
  
  for (int zw=0; zw <= wl; zw++) {
  LoadCell.update(); // retrieves data from the load cell
  i = LoadCell.getData(); // get output value  

  Serial.print("");
  Serial.print(zw);
  Serial.print(":");
  Serial.print(i);
  Serial.print("g; ");
  delay(120);
  }
   return i;
}

(...)


Vielen Dank für eure Hilfe! =)Angel[/code]
Alle Beiträge dieses Benutzers finden
Diese Nachricht in einer Antwort zitieren
26.02.2019, 21:36 (Dieser Beitrag wurde zuletzt bearbeitet: 26.02.2019 21:41 von Tommy56.)
Beitrag #2
RE: Lokale Variable an loop zurück - Fehler
Entweder Du nimmst den einfachen Weg:
Code:
int wiegen(int wl) {
int i = 0;  
  for (int zw=0; zw <= wl; zw++) {
  LoadCell.update(); // retrieves data from the load cell
  i = LoadCell.getData(); // get output value  

  Serial.print("");
  Serial.print(zw);
  Serial.print(":");
  Serial.print(i);
  Serial.print("g; ");
  delay(120);
  }
   return i;
}

mit dem Aufruf:
void loop()
{
  i = wiegen(wl);

oder den etwas komplexeren über Pointer:
Code:
void wiegen(int *i,int wl) {
  
  for (int zw=0; zw <= wl; zw++) {
  LoadCell.update(); // retrieves data from the load cell
  *i = LoadCell.getData(); // get output value  

  Serial.print("");
  Serial.print(zw);
  Serial.print(":");
  Serial.print(*i);
  Serial.print("g; ");
  }
   return;
}

void loop()
{
  wiegen(&i,wl);
Ungetestet.

Gruß Tommy

"Wer den schnellen Erfolg sucht, sollte nicht programmieren, sondern Holz hacken." (Quelle unbekannt)
Alle Beiträge dieses Benutzers finden
Diese Nachricht in einer Antwort zitieren
26.02.2019, 22:21 (Dieser Beitrag wurde zuletzt bearbeitet: 26.02.2019 22:23 von MicroBahner.)
Beitrag #3
RE: Lokale Variable an loop zurück - Fehler
(26.02.2019 21:04)Haukini schrieb:  Aktuell habe ich das Problem, dass ich die Variable i global definiere, mit in die Funktion nehme, aber ich sie mit return nicht zurück in den main Teil bekomme.
Ich denke, Du hast noch ein Verständnisproblem, was die Variablen bzw. Parameter in einer Funktion sind und wie globale Variable funktionieren.

Deine globale Variable i ist eigentlich innerhalb der Funktion einfach vorhanden, und Du könntest sie dort setzen - fertig. Ohne Funktionsparameter und Returnwert.

Du definierst jetzt aber eine Variable i als Parameter bei der Funktion:
Code:
int wiegen(int i,int wl) {
Damit definierst Du innerhalb der Funktion eine neue Variable i, die mit deiner globalen Variable nichts gemein hat. Das sind 2 verschiedene Variablen - sie haben nur den gleichen Namen, was das Ganze sehr unübersichtlich macht. Da die Namen identisch sind, überdeckt deine funktionsinterne Variable jetzt die globale Variable. D.h. auf die globale Variable kannst Du innerhalb der Funktion nicht mehr zugreifen.
Beim Aufruf der Funktion übergibst Du nun den Wert der globalen i an die funktionsinterne i. benutzt den Wert dort aber nicht, sondern setzt ihn neu - aber eben nur in der funktionsinternen Variable i.
Mit dem
Code:
return i;
würdest Du zwar den Wert der Funktionsinternen Variable als Funktionswert zurückgeben, den Funktionswert benutzt Du aber gar nicht. Die funktionsinterne Variable i verschwindet mit dem Ende des Funktionsaufrufes wieder - sie existiert nur temporär.

Alternativen hat dir Tommy gezeigt, aber es ist eigentlich eine ganz schlechte Idee, eine globale Variable genau so zu benennen wie eine funktionsinterne Variable. Das führt nur zu Verwechselungen.

Gruß, Franz-Peter
Alle Beiträge dieses Benutzers finden
Diese Nachricht in einer Antwort zitieren
26.02.2019, 22:33
Beitrag #4
RE: Lokale Variable an loop zurück - Fehler
Ihr habt mir beide sehr geholfen! Sowohl die Info mit dem Pointer als auch die Info mit der Variablen war hilfreich und das Programm funktioniert!

Vielen herzlichen Dank euch beiden! =)
Alle Beiträge dieses Benutzers finden
Diese Nachricht in einer Antwort zitieren
Antwort schreiben 


Möglicherweise verwandte Themen...
Thema: Verfasser Antworten: Ansichten: Letzter Beitrag
  Kennt jemand einen Stepper Closed Loop Sketch? Holzwurm56 16 892 17.06.2019 22:37
Letzter Beitrag: georg01
  DCF77 Fehler beim Kompilieren Xwill 5 670 11.06.2019 21:47
Letzter Beitrag: Tommy56
  For-Loop verschluckt Ausgabe am seriellen Monitor TimeMen 5 372 14.04.2019 17:59
Letzter Beitrag: Tommy56
  Einfache IF-Abfrage....(mir) unerklärlicher Fehler Lite 10 569 24.03.2019 12:36
Letzter Beitrag: Lite
  Wasserverbrauchszähler, statische Variablen, komisches Verhalten in der loop() pzYsTorM 14 801 19.03.2019 20:33
Letzter Beitrag: Hilgi
  Char in Int variable wandeln Rockman 5 451 06.03.2019 23:22
Letzter Beitrag: Tommy56
  Variable auf zwei Bytes aufteilen ? huber5093 4 527 05.03.2019 20:17
Letzter Beitrag: Tommy56
  Fehler in Beispielen MCP23S17 Blende8 0 315 03.03.2019 10:22
Letzter Beitrag: Blende8
  Zahl aus txt-Datei als globale Variable einlesen Lance101 17 971 16.02.2019 14:38
Letzter Beitrag: Tommy56
  Arduino IDE Fehler beim öffnen des Seriallen Monitors mgm099 6 744 28.12.2018 12:42
Letzter Beitrag: mgm099

Gehe zu:


Benutzer, die gerade dieses Thema anschauen: 1 Gast/Gäste