Funktionen mit void ?

Hallo,

ich habe/hatte es mittlerweile geschafft (it Eurer Hilfe) Daten des Arduino an die DB zu senden (über ein php-script)
damit alles ein wenig geordneter aussieht wollte ich bestimmte Teile des Programms in Funktionen auslagern.
Dabei verstehe die Möglichkeiten nicht ganz.
einmal kann ich eine Funktion mit

int meinefunktion()
{
machwas;
}
oder mit
void meinefunktion1()
{
machwas;
}
aufrufen

bei mir gibt es jedoch hier und da Probleme und ich weiss nicht wieso.

hier mal der Code

#include <Ethernet.h>
#include <SPI.h>
// Tiny RTC (DS1307)
#include <Wire.h>    // I2C-Bibliothek einbinden
#include "RTClib.h"  // RTC-Bibliothek einbinden

RTC_DS1307 RTC;      // RTC Modul
//Room_Sesnor DHT22
#include "DHT.h" 
#define DHTPIN 9     
#define DHTTYPE DHT22 //DHT11, DHT21, DHT22

DHT dht(DHTPIN, DHTTYPE);

//Ethernet_Shield
byte mac[] = { 0xDE, 0xAD, 0xBE, 0xEF, 0xFE, 0xED };
byte ip[] = { 192, 168, 2, 105 };
byte server[] = { 192, 168, 2, 104 }; // Google
//Connect mysql 
char url[]  = "/test_db/db_conect.php";
char key[]  = "meinpasswort";
char host[] = "192.168.2.104";	// DOMAIN eingeben!

EthernetClient client;

#define echoPin 4 // Echo Pin
#define trigPin 3 // Trigger Pin
#define LEDPin 13 // Onboard LED
      
int maximumRange = 200; // Maximum range needed
int minimumRange = 0; // Minimum range needed
long duration, distance; // Duration used to calculate distance

void setup()
{
  
  // Initialisiere I2C  
  Wire.begin();
  
  //Clock
  // Initialisiere RTC
  RTC.begin();
         if (! RTC.isrunning()) {
                // Aktuelles Datum und Zeit setzen, falls die Uhr noch nicht läuft
                RTC.adjust(DateTime(__DATE__, __TIME__));
                Serial.println("Echtzeituhr wurde gestartet und auf Systemzeit gesetzt.");
          }
            else {
              
              Serial.println("Echtzeituhr laeuft bereits.");

          }
  
  Ethernet.begin(mac, ip);
  Serial.begin(9600);
  client.connect(server, 80);
  Serial.println("DHT22 - Test!");
  dht.begin();
  delay(1000);
  // Serial.begin (9600);
   pinMode(trigPin, OUTPUT);
   pinMode(echoPin, INPUT);
   // pinMode(LEDPin, OUTPUT); // Use LED indicator (if required)
}

void loop()
{
  //clock
  DateTime now=RTC.now(); // aktuelle Zeit abrufen
  show_time_and_date(now);  // Datum und Uhrzeit ausgeben
  delay(10000); // 30 Sekunden warten bis zur nächsten Ausgabe
  
  // Room_temp_and_hum
  float hum = dht.readHumidity();     //Luftfeuchte auslesen
  float temp = dht.readTemperature();  //Temperatur auslesen
  Serial.println("connecting...");
  float Water_1_sum;
  //float Water_1;
   Water_1_sum=Water_1();
  Serial.println("jetzt der wasserstand"); 
  Serial.println(Water_1_sum);
  Serial.println("jetzt die temp ==>:");
  Serial.println(temp);
  Serial.println("jetzt die Luftfeuchte ==>:"); 
  Serial.println(hum);
  daten_senden(url,temp,hum,key,host);
}

void show_time_and_date(DateTime datetime){
  
  // Wochentag, Tag.Monat.Jahr
  //Serial.print(get_day_of_week(datetime.dayOfWeek()));
  //Serial.print(", ");
  if(datetime.day()<10)Serial.print(0);
  Serial.print(datetime.day(),DEC);
  Serial.print(".");
  if(datetime.month()<10)Serial.print(0);
  Serial.print(datetime.month(),DEC);
  Serial.print(".");
  Serial.println(datetime.year(),DEC);
  
  // Stunde:Minute:Sekunde
  if(datetime.hour()<10)Serial.print(0);
  Serial.print(datetime.hour(),DEC);
  Serial.print(":");
  if(datetime.minute()<10)Serial.print(0);
  Serial.print(datetime.minute(),DEC);
  Serial.print(":");
  if(datetime.second()<10)Serial.print(0);
  Serial.println(datetime.second(),DEC);
}

void daten_senden(char url, float temp, float hum, char key, char host){
   if (client.connected()) {
    Serial.println("connected");

   //client.println();
    
    //float W_Dist;
   // float W_1_Dist;
   // int a;
    //Serial.println(W_Dist());
 
    Serial.print("Verbunden...sende Daten...");
    client.print("GET ");
    client.print(url);
    client.print("?TEMP=");
    client.print(temp);
    client.print("&");
    client.print("&HUM=");
    client.print(hum);
    client.print("&func=1");
    client.print("&TEST=1");
    client.print("&key=");
    client.print(key);
    client.println(" HTTP/1.1");
    client.print("Host: ");
    client.println(host);
    client.println();
    Serial.println("fertig!");
  } else {
    Serial.println("connection failed");
  }
  if (client.available()) {
    char c = client.read();
    Serial.print(c);
  }

  if (!client.connected()) {
    Serial.println();
    Serial.println("disconnecting.");
    client.stop();
    for(;;)
      ;
  }


void Water_1()
{
  int duration;
  float  distance;
  digitalWrite(trigPin, HIGH);
  delayMicroseconds(500);
  digitalWrite(trigPin, LOW);
  duration = pulseIn(echoPin, HIGH);
  distance = (duration/2.0) / 29.1;
 
    //Serial.print(distance);
    //Serial.println(" cm");
    return distance;
}

bei void Water_1
bringt er stets Fehler
wieso?
er bring: variable or field Water_1 declared void

Grüße Jürgen

Du hast bei "void Water_1" den Rückgabewert mit void angegeben was bedeutet, dass es keinen Rückgabewert gibt.
Trotzdem hast du am Ende der Funktion ein "return ...." drin stehen, um einen Wert zurückzugeben.

"return" wird nur verwendet, wenn die Funktion auch einen Rückgabewert hat.

Ändere void in float.

Hallo,

du meinst diese Zeile:
Water_1_sum=Water_1();

Water_1() ist ja als void declariert - liefert also nichts zurück.

Grüße,
Jürgen

Hallo,

aha ist es also so...
wenn ich eine Funktion als void deklariere bekomme ich keinen Wert zurück ?
return habe ich nun aus der void funktion entfernt

jetzt erhalte ich
void value not ignored as it ought to be

ich benötige aber einen wert aus der Funktion und zwar die Entfernung also "distance"

Gruß Jürgen

ps... wenn ich also Teile in Unterprogramme auslagern will dann muss ich unterscheiden ob ich einen oder mehrere Werte zurück haben möchte (hier darf ich dann kein void benutzen sondern z.B. int meinefunktion(){machwas;}) ?
und wenn ich einfach was erledigen möchte wie z.B. daten_senden (an eine mysqldb) dann kann ich void benutzen?

JuergenR:
Water_1() ist ja als void declariert - liefert also nichts zurück.

ok, danke für die Info, es geht jetzt.

habe den Unterschied zw. einer void-funktion und einer definierten also mit int meinefunktion() noch nicht begriffen.

wie ist es eigentlich wenn eine Funktion versch. Datentypen zurückgeben soll

eine Funktion die Werte zurück gibt muss ja zuvor mit einem Datentypen deklariert werden oder?
also z.B.
float meinefunktion( );

wenn ich darin aber datentypen mit dem Typ char und float zurückgeben will wie muss man das dann machen? geht das überhaupt?

eine Funktion kann nur einen Datentyp zurückgeben, keine verschiedenen.

Über den Rückgabewert geht nur eine Variable. Wenn man mehrere Werte zurückgeben muss, kann man Referenzen oder Zeiger als Parameter verwenden.

z.B.:

void func(int* ret1, int* ret2)
{
     *ret1 = 5;
     *ret2 = 3;
}

void loop()
{
      int ret1 = 0;
      int ret2 = 0;
 
      func(&ret1, &ret2);
}

Normalerweise werden Parameter call-by-value übergeben und eine Kopie erstellt. Die Funktionen können als die Parameter nicht verändern. Hier werden die Parameter call-by-reference übergeben und man kann sie ändern.

Alternativ mit Referenzen statt Zeigern:

void func(int &ret1, int &ret2)
{
     ret1 = 5;
     ret2 = 3;
}

void loop()
{
      int ret1 = 0;
      int ret2 = 0;
 
      func(ret1, ret2);
}

Referenzen sind abgespeckte Versionen von Zeigern, aber hier reicht das und man muss nicht viel ändern.

Ein anderer etwas "unsauberer" Weg ist mit globalen Variablen zu arbeiten.
Globale Variablen sind Variablen die außerhalb von Funktionen deklariert wurden.
Im Gegensatz dazu sind Variablen in der Funktion deklariert lokale Variablen und existieren nur in der Funktion. Mehrere Funktionen können lokale Variablen mit gleichen Namen deklariert haben und diese sind alle verschiedene Variablen.

Beispiel:

INT GlobaleVariable;
void setup()
void loop()
void meineFunktion()
  {
  INT LokaleVariable;
  }

int meineFunktion2(int EINGABEWERT)
{
return (EINGABEWERT *2);
}

Grüße Uwe

Vielen Dank,

ich hoffe ich begreife das mal :frowning:
bin ja noch absolut neu auf dem Gebiet.
Danke für Eure Hilfe!