Fehler: 80: error: a function-definition is not allowed here before '{' token

Hallo Gemeinde,
ein noch grüner hinter den Ohren User des Arduino hat ein Problem, bei dem er trotz einige Tage googlen und Forum lesen bzw vergleichen ncht mehr weiter kommt.
Mein Sketch bringt folgenden Fehler, bei dem ich nicht wiess, wie er zu beseitigen ist. Das ganze ist zur Überprung da, ob das LCD Shield mit dem ESP01 Modul zusammen läuft. Ziel ist es, das der Arduino Thermometer anzeigt, die Daten an einen Raspi schickt und diese dir visull sichtbar gemacht werden (InfluxDB und Grafana).
Vielen dank für eure Unterstützung.
LED Blitzer

#include <LiquidCrystal.h>
#include <SoftwareSerial.h>
#include <SPI.h>
#include <DHT.h>
//#include <DHT_U.h>

LiquidCrystal lcd(8, 9, 4, 5, 6, 7); // LCD Shield

#define DHTPIN A5 // PIN für DHT22
#define DHTTYPE DHT22 // DHT 22

DHT dht(DHTPIN, DHTTYPE);
//----------------------------------------------------------------
// Konfiguration ESP8266WiFi
//----------------------------------------------------------------
#include "WiFiEsp.h"

#ifndef HAVE_HWSERIAL1

SoftwareSerial Serial1(13, 12); // RX, TX

#endif

char ssid[] = "XXX12345";            // your network SSID ////  ZUHAUSE
char pass[] = "XXX09876";        // your network password////  ZUHAUSE

int status = WL_IDLE_STATUS;     // the Wifi radio's status
// Initialize the Ethernet client object
WiFiEspClient client;
//-------------------------------------------------------------------------------- 
void setup() {
// wifi init
Serial.println("Starting WiFi");
WiFi.begin(ssid, pass);
//-------------------------------------------------------------------------------
if (WiFi.status()==WL_CONNECTED) {               //Wenn Wlan verbunden
Serial.print("Connected");                        //Sagt "Connected"
}
else {                                            //Wenn nicht
loop();
Serial.print(".");                                 //Dann Sagt alle halbe sec ein Punkt
delay(500);

lcd.begin(16, 2);
lcd.print("starting");
lcd.clear();
dht.begin();
Serial.begin(9600);
Serial.print("Connection WIFI da");
}                                 
//----------------------------------------------------------------
void loop()
{ <-------------------- genau hier tritt der Fehler auf; warum? Lösung?
float h = dht.readHumidity();
float t = dht.readTemperature();

if(isnan(h) || isnan(t) ||){                     // check if returns are valid, if they are NaN (not a number) then something went wrong!
                           lcd.setCursor(0,0);
                           lcd.println("DHT22 nicht gefunden");
                           return;
                           } 
else {
      lcd.setCursor(0,0);
      lcd.print(" Temp: ");
      lcd.print(t);
      lcd.print(" \337C");
      lcd.setCursor(0,1);
      lcd.print("Luftf: ");
      lcd.print(h);
      lcd.print(" %  ");
}
      delay(1000);                            // DHT22 can't poll faster than 1x a second
}
    
Serial.print(" Temp: ");
Serial.print(t);
Serial.print("C");
Serial.print("\t");
Serial.print("Luftf: ");
Serial.print(h);
Serial.print("%");
Serial.print("\t");
delay(2000); // lese alle 2 Sekunden ein
}

anfrage_arduino.doc (28.5 KB)

Poste den kompletten Fehler und deinen Sketch hier in Code-Tags, dann sehen wir wo der fehler ist.

Was verstehst du an Code-Tags nicht ?
Ein Word-Dokument zu posten, ist die schlechteste Idee.

Hallo Danke noiasca,

genau das war mein Problem. Danke für deine unkomplizierte Hilfe.

noiasca:
OT @ Hot: das findet kein Anfänger.

schreiben muss man
[ code ] der sketch [ / code ]

ohne Leerschritte
und das Icon sind spitze Klammern < / >

kein Wunder dass das alle übersehen. In der Hilfe stehts irgendwo ...

Stimmt natürlich, da muss man eben lesen;)

Aber ok, der Fehler des TO ist vermutlich der unübliche "loop-Aufruf" im Setup.
Soweit ich das hier am Tablet sehen kann.

LED_Blitzer:
genau das war mein Problem. Danke für deine unkomplizierte Hilfe.

Verstehe ich nicht.
Warum fragst du nicht ?

Nehme die Klammer die unter dem delay(1000); steht weg, dann ist der Fehler weg.

else {
       lcd.setCursor(0,0);
       lcd.print(" Temp: ");
       lcd.print(t);
       lcd.print(" \337C");
       lcd.setCursor(0,1);
       lcd.print("Luftf: ");
       lcd.print(h);
       lcd.print(" %  ");
 }
       delay(1000);                            // DHT22 can't poll faster than 1x a second
}       <----------------die muss weg.

Auf eine { folgt immer nur eine }
Eine } alleine kann nicht sein.

Hi Franz,
Danke für die Antwort. Habe ich gemacht, jedoch ohne Erfolg, gleiches Fehlerbild.
lcd_Temp_Funk_V01:80: error: a function-definition is not allowed here before '{' token

{

^

lcd_Temp_Funk_V01:113: error: expected '}' at end of input

}

^

Mehrere Bibliotheken wurden für "Adafruit_Sensor.h" gefunden
Benutzt: C:\Users\XXXX\Documents\Arduino\libraries\Adafruit_Sensor
Nicht benutzt: C:\Users\aehrle\Documents\Arduino\libraries\Adafruit_Unified_Sensor
exit status 1
a function-definition is not allowed here before '{' token

Alles ab

else {                                            //Wenn nicht
loop();
Serial.print(".");                                 //Dann Sagt alle halbe sec ein Punkt
delay(500);

lcd.begin(16, 2);
...

...ist irgendwie vermurkst (in der Version "12:10:41 by LED_Blitzer".

Formal fehlt die schliessende Klammer von setup() vor der Definition von

 void loop () {...

, wenn ich das richtig sehe.

Dass man loop() einmal innerhalb von setup aufruft, ist ungewöhnlich.
Der Kommentar danach ".. alle halbe sec ... " deutet an, dass das ganz anders gedacht ist.

Hi Michael,
der Aufruf mit aller halben Secunde sollte mir eigentlich auf dem seriellen Interface zeigen, ob das WLAN verbunden ist, oder eben nicht - in dem Fall, alle halbe Secunde einen Punkt schreiben. Gibt es dafür eine elegantere Lösung?

Elegantere Lösung gibt es, aber der Aufruf
  loop();
innterhalb von setup() war vermutlich ein Irrtum. ( Das baut die Arduino-IDE für dich aussen rum )

Mal nur ein bisschen umgestellt:

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

   // wifi init
   Serial.println("Starting WiFi");
   WiFi.begin(ssid, pass);
   while (WiFi.status()!=WL_CONNECTED) {   
   //Solange nicht verbunden
      Serial.print(".");                                 //Dann Sagt alle halbe sec ein Punkt
      delay(500);
   }

   //Wenn Wlan verbunden
       Serial.print("Connected");                        //Sagt "Connected"

   lcd.begin(16, 2);
   lcd.print("starting");
   lcd.clear();   // Damit man das "starting" nicht sehen kann ;)

   dht.begin();

   Serial.print("Connection WIFI da");
}      // Ende von setup 

void loop () {
...
}

Einrücken hilft beim Verständnis

Kannst jetzt selber weiter verschönern, hoffe ich

Ja das waren mehrere Klammern. Da zu wenig, da zu viel. So ist jetzt das Klammernspiel in Ordnung.

#include <LiquidCrystal.h>
#include <SoftwareSerial.h>
#include <SPI.h>
#include <DHT.h>
//#include <DHT_U.h>

LiquidCrystal lcd(8, 9, 4, 5, 6, 7); // LCD Shield

#define DHTPIN A5 // PIN für DHT22
#define DHTTYPE DHT22 // DHT 22

DHT dht(DHTPIN, DHTTYPE);
//----------------------------------------------------------------
// Konfiguration ESP8266WiFi
//----------------------------------------------------------------
#include "WiFiEsp.h"

#ifndef HAVE_HWSERIAL1

SoftwareSerial Serial1(13, 12); // RX, TX

#endif

char ssid[] = "XXX12345";            // your network SSID ////  ZUHAUSE
char pass[] = "XXX09876";        // your network password////  ZUHAUSE

int status = WL_IDLE_STATUS;     // the Wifi radio's status
// Initialize the Ethernet client object
WiFiEspClient client;
//--------------------------------------------------------------------------------
void setup() {
  // wifi init
  Serial.println("Starting WiFi");
  WiFi.begin(ssid, pass);
  //-------------------------------------------------------------------------------
  if (WiFi.status() == WL_CONNECTED) {             //Wenn Wlan verbunden
    Serial.print("Connected");                        //Sagt "Connected"
  }
  else {                                            //Wenn nicht
    loop();
    Serial.print(".");                                 //Dann Sagt alle halbe sec ein Punkt
    delay(500);

    lcd.begin(16, 2);
    lcd.print("starting");
    lcd.clear();
    dht.begin();
    Serial.begin(9600);
    Serial.print("Connection WIFI da");
  }
}
//----------------------------------------------------------------
void loop()
{ < -------------------- genau hier tritt der Fehler auf; warum ? Lösung ?
  float h = dht.readHumidity();
  float t = dht.readTemperature();

  if (isnan(h) || isnan(t) || ) {                  // check if returns are valid, if they are NaN (not a number) then something went wrong!
    lcd.setCursor(0, 0);
    lcd.println("DHT22 nicht gefunden");
    return;
  }
  else {
    lcd.setCursor(0, 0);
    lcd.print(" Temp: ");
    lcd.print(t);
    lcd.print(" \337C");
    lcd.setCursor(0, 1);
    lcd.print("Luftf: ");
    lcd.print(h);
    lcd.print(" %  ");
  }
  delay(1000);                            // DHT22 can't poll faster than 1x a second


Serial.print(" Temp: ");
Serial.print(t);
Serial.print("C");
Serial.print("\t");
Serial.print("Luftf: ");
Serial.print(h);
Serial.print("%");
Serial.print("\t");
delay(2000); // lese alle 2 Sekunden ein
}

Die geschwungene Klammer die setup() schließen sollte ist in die loop() gerutscht.
Welche geschwungene schließende Klammer versetzt werden muß, mußt Du entscheiden.

Grüße Uwe

Danke schön. Ohne Fehler ist der Sketch jetzt kompiliert.
Doch oh graus!!!
Keinerlei Anzeigen in der seriellen Konsole, noch am LCD.
Ich glaube ich habe hier noch einen größeren Hund eingebaut.

LED_Blitzer:
Danke schön. Ohne Fehler ist der Sketch jetzt kompiliert.
Doch oh graus!!!
Keinerlei Anzeigen in der seriellen Konsole, noch am LCD.
Ich glaube ich habe hier noch einen größeren Hund eingebaut.

Dann solltest du deinen aktuellen Sketch posten.

Mir kommt dieser Teil syspekt vor:

#ifndef HAVE_HWSERIAL1

SoftwareSerial Serial1(13, 12); // RX, TX

#endif

Du verwendest doch überhaupt kein Serial1 im letzten sichtbaren Sketch.

Außerdem Wie hast Du das LCD angeschlossen? Über Pegelwandler oder ist es ein 3,3 V LCD?

Gruß Tommy

Doch o Graus!
Keinerlei Anzeigen in der seriellen Konsole, noch am LCD.
Ich glaube ich habe hier noch einen größeren Hund eingebaut.

Nein, mindestens sind es zwei Hunde, aber vermutlich kleinere :wink:

Dass die Leute auch mit irgendeinem gefundenen Mist, und gleich einem großen Sketch anfangen wollen...

"Keinerlei Anzeige in der Seriellen Konsole" sollte mit

void setup() {
  Serial.begin(9600); // muss natürlich vor einem print kommen 
  // wifi init
  Serial.println("Starting WiFi");
}
void loop() {}

6 Zeilen sind schon reichlich

... in den Griff zu kriegen sein. Wenn das tut, kannst du dich um dein LCD-Display kümmern.
( Da hast du ein .clear(), was die Ausgabe von vorher natürlich unsichtbar macht )
Dann hast du eine TestUmgebung, mit der du dein WiFi connect testen kannst.

michael_x:
Dass die Leute auch mit irgendeinem gefundenen Mist, und gleich einem großen Sketch anfangen wollen...

Das hättest du mal lieber Rot und Fett geschrieben, dann wird es auch gelesen.
Ob`s verstanden wird, ist eine andere Sache.