PDA

Archiv verlassen und diese Seite im Standarddesign anzeigen : Anfängerproblem: WiFi-Beispiel in Gang bringen



pupo
27.12.2017, 14:55
Hallo zusammen,

ich habe gestern zum ersten Mal probiert, etwas mit einem NodeMCU zu machen und bin auch sonst ein ziemlicher Anfänger mit Elektronik. Mein erstes Projekt ist eine Lebendmausefalle, die mich per Mail oder so benachrichtigen soll, damit die Maus nicht zu lange warten muss.
Also wollte ich den NodeMCU dazu bringen, das Beispiel auszuführen, ich glaube es hieß "httpServer Hello". Also einfach nur anmelden, und eine Webseite zeigen. Das Hochladen klappt nach vielen Versuchen, wenn es auch sehr lange dauert. Problem:

- Es gibt keine Wlan-Verbindung. Meine Fritzbox zeigt keine neue Verbindung an, obwohl ich die richtige SSID ("Fritz!Box 7490") eingetragen habe und auch das richtige Passwort.
- Meine Fritzbox zeigt keine fehlgeschlagenen Verbindungsversuche an, also versucht er es noch nicht einmal.
- Das Skript scheint grundsätzlich zu laufen. Über den Serial Monitor zeigt er mir an, dass er sich gerade versucht zu verbinden (indem er immer neue Punkte schreibt).
- Der NodeMCU baut beim Start plötzlich selbst ein WLAN auf (zu dem ich das Passwort natürlich nicht kenne). Ich sehe also in der WLAN-Übersicht nicht mehr nur mein Fritzbox-Wlan, sondern einen weiteres WLAN-Netz von dem NodeMCU. Ich will aber, dass es sich an meiner Fritzbox anmeldet.


Es ist ein ESP12E-Board (das mit den beiden Knöpfen neben dem USB-Eingang für flash und reset). Mein Computersystem ist Raspbian mit Arduino IDE.

Was mache ich falsch?

Rabenauge
27.12.2017, 21:02
Ich schätze, das Teil läuft im falschen Modus (eben Hotspot, statt sich in ein bestehendes Wlan einzuklinken).
Ich les mich zu den Dingern gerade ein, und bin nen paarmal darüber gestolpert, dass das die Standard-Einstellung ist. Ansonsten muss man die wohl erst umprogrammieren.

Was du falsch machst ist wohl, das Handbuch _nicht_ zu lesen...;)

pupo
27.12.2017, 22:59
Ich habe gar kein Handbuch. Habe mir aber schon eines bestellt. Danke schon mal für den Hinweis. Wenn du noch mehr rausfindest, würde ich mich über eine Antwort natürlich sehr freuen!

Sehr sinnvoll finde ich diese Standardeinstellung jedenfalls nicht. Um einen Hotspot sinnvoll betreiben zu können, müsste der NodeMCU ja irgendwoanders sein Internet herbekommen. Ich habe aber dort nirgends eine LAN-Buchse gesehen...

pupo
28.12.2017, 02:52
Ich habe es eben erfolglos versucht, indem ich die folgende Zeile hinzugefügt habe, im Setup-Bereich des Sketches:
WiFi.mode(WIFI_STA);

Es ist frustrierend, wenn direkt am Anfang alles nicht klappt.

RoboTrader
28.12.2017, 04:36
Es ist frustrierend, wenn direkt am Anfang alles nicht klappt.

Nicht verzweifeln. Ging mir auch so, dass trotz sehr guter Programmierkenntnisse und guter Elektronik-Kenntnisse meine ersten Mikro-Kontroller-Schritte nicht so funktionieren, wie ich mir das dachte. Dabei habe ich drei Dinge gelernt:
1. Ich muss mich erst richtig in die Thematik einlesen und reindenken, da es ein komplexes Feld ist. Mit vielen tollen Möglichkeiten, aber durch Flexibilität auch nicht ganz trivial.
2. Wirklich erst alle Basis-Schaltungen ausprobieren und nicht sofort an die eierlegende Wollmilchsau gehen. So erhält man schnell Erfolgserlebnisse und kann dann schneller alles zusammensetzen als man denkt.
3. Roboter und Mikrokontroller sind großartig und machen riesigen Spaß!

Dranbleiben und das genießen, was schon funktioniert!

... vielleicht helfen dir meine Gedanken etwas.

Rabenauge
28.12.2017, 11:00
Ohne Anspruch auf Richtigkeit (das Nodedings interessiert mich überhaupt nicht, ich will den ESP8266 als Modul benutzen), und es wird da geschrieben, dass die Teile in der Werkseinstellung eben _nur_ den Hotspot aufmachen- _ohne_ Internet (scheint das Ding nich zu können, beides gleichzeitig, ist ja meistens auch unnötig).
Also: entweder oder.
Infos dazu findest du z.B. hier (https://arduino-hannover.de/2014/12/11/wifi-kochbuch-mit-esp8266/)

Und an diversen anderen Stellen-da klingt es auch ähnlich.

HaWe
28.12.2017, 11:33
Ohne Anspruch auf Richtigkeit (das Nodedings interessiert mich überhaupt nicht, ich will den ESP8266 als Modul benutzen), und es wird da geschrieben, dass die Teile in der Werkseinstellung eben _nur_ den Hotspot aufmachen- _ohne_ Internet (scheint das Ding nich zu können, beides gleichzeitig, ist ja meistens auch unnötig).
Also: entweder oder.
Infos dazu findest du z.B. hier (https://arduino-hannover.de/2014/12/11/wifi-kochbuch-mit-esp8266/)

Und an diversen anderen Stellen-da klingt es auch ähnlich.



wieso "Werkseinstellung"? Der nodeMCU ist frei pogrammierbar, in welcher Weise er mit WiFi oder LAN arbeitet - ESP8266WiFi Server oder ESP8266WebServer , Client, Hotspot, Udp Client, oder was auch immer.

Rabenauge
28.12.2017, 12:47
Frei programmierbar heisst aber auch: man _muss_ es tun.
Und demnach, was der TO beschreibt, läuft das Ding eben nur als Wlan-Hotspot und nix anderes.
Irgendwas daran sagt mir schon, dass es dann wohl in genau dieser Einstellung ausgeliefert wurde.....

Wundert mich auch nicht, denn das _ist_ beim ESP8266 die "Werkseinstellung".
Das lies bitte an irgendeiner beliebigen Ecke nach....

HaWe
28.12.2017, 13:07
Frei programmierbar heisst aber auch: man _muss_ es tun.
Und demnach, was der TO beschreibt, läuft das Ding eben nur als Wlan-Hotspot und nix anderes.
Irgendwas daran sagt mir schon, dass es dann wohl in genau dieser Einstellung ausgeliefert wurde.....

Wundert mich auch nicht, denn das _ist_ beim ESP8266 die "Werkseinstellung".
Das lies bitte an irgendeiner beliebigen Ecke nach....

klar muss man es tun, dazu sind ja die nodeMCU Bibliotheken da - hier verstehe ich allerding nicht, wie man überhaupt was damit machen will, wenn man ihn nicht richtig programmiert.
Das wäre ja wie einen beliebigen anderen Sketch laufen lassen zu wollen, ohne einen solchen Sketch überhaupt zu programmieren.
Aber auch um auf Hotspot Routinen zugreifen zu können, muss man ja explizit die Libs #includen, initialisieren und aufrufen: wenn die also jetzt laufen, liegt es am Sketch, der hochgeladen wurde, nicht an "Werkseinstellungen" - nun müssen stattdessen eben die WiFi Client/Server oder die ESP8266WebServer Routinen #included, initialisiert und aufgerufen werden.

Haltstopp: Möglicherweise arbeitet der OP aber gar nicht mit der Arduino IDE? Dann kann ich ohne Kristallkugel allerdings auch nichts weiteres erkennen, und die habe ich grade verliehen... ;)

@pupo:
guck dir doch mal das hier an, samt aller weiterführenden Links:
http://www.mindstormsforum.de/viewtopic.php?f=78&t=9066

pupo
29.12.2017, 12:11
Danke für die Links und Hinweise, ich lese mir alles durch. Ich verstehe aber nicht, warum die Beispielsketche, die in der Arduino IDE mit der Bibliothek mitgeliefert werden, offenbar falsch programmiert sind. Wenn irgendwas out of the box funktionieren sollte, dann doch wohl die?

HaWe: Ja, ich arbeite mit der Arduino IDE

Außerdem gibt es eine explizite Einstellung, um den NodeMCU gleichzeitig als Server und Client laufen zu lassen. Dann muss der ESP8266 die doch auch beherrschen?!?

Verwunderte Grüße,
Pupo

HaWe
29.12.2017, 12:28
Danke für die Links und Hinweise, ich lese mir alles durch. Ich verstehe aber nicht, warum die Beispielsketche, die in der Arduino IDE mit der Bibliothek mitgeliefert werden, offenbar falsch programmiert sind. Wenn irgendwas out of the box funktionieren sollte, dann doch wohl die?

HaWe: Ja, ich arbeite mit der Arduino IDE

Außerdem gibt es eine explizite Einstellung, um den NodeMCU gleichzeitig als Server und Client laufen zu lassen. Dann muss der ESP8266 die doch auch beherrschen?!?

Verwunderte Grüße,
Pupo

ich selber nutze den nodeMCU nur mit den von mir verlinkten Beispielen, inzwischen auch noch etwas erweitert durch weitere nodeMCUs als remote-Clients.
Allerdings gibt es gefühlt hunderte verschiedener Libs und zigtausende Beispiel-Codes: um dir etwas Definitives sagen zu können, braucht man also zumindest deinen aktuellen Code - helfen müssen dir dann aber sicherlich andere User, da ich ja selber noch Anfänger bin.
Dennoch kannst du ja meine verlinkten Beispiele mal testweise hochladen, nur damit du checken kannst, wie sie sich generell ins Heimnetz integrieren lassen.

pupo
29.12.2017, 14:35
@Robotrader: Deine Gedanken helfen mir nur bedingt. Insofern schon gut zu wissen, dass auch bei anderen aller Anfang schwer ist. Aber andererseits - wenn schon das simpelste Beispiel nicht klappt, kommt es mir natürlich sinnlos vor, noch irgendwas anderes zu probieren. An meinem Chip ist keine Elektroschaltung ausser einer simplen Leuchtdiode, Ich habe noch keine Zeile Code programmiert sondern nur das Beispielskript mit den Logindaten fürs WLAN versehen und draufgeladen - Das verdammte Ding soll sich wirklich nur an meinem Netzwerk anmelden, dann wäre ich ja schon mal etwas zufriedener. Ich meine - Beispielsskripte sollen doch zeigen, wie es geht, oder? Und nicht zeigen, wie es nicht funktioniert...?

HaWe
29.12.2017, 15:09
poste doch bitte endlich mal deinen Code (in Code-Tags), samt Quelle (Link) zur Lib, z.B. github-repository etc.
Ohne Code als Referenz kann man hier doch überhaupt nichts genaues antworten!

RoboTrader
29.12.2017, 19:59
@Robotrader: Deine Gedanken helfen mir nur bedingt. Insofern schon gut zu wissen, dass auch bei anderen aller Anfang schwer ist. Aber andererseits - wenn schon das simpelste Beispiel nicht klappt, kommt es mir natürlich sinnlos vor, noch irgendwas anderes zu probieren. An meinem Chip ist keine Elektroschaltung ausser einer simplen Leuchtdiode, Ich habe noch keine Zeile Code programmiert sondern nur das Beispielskript mit den Logindaten fürs WLAN versehen und draufgeladen - Das verdammte Ding soll sich wirklich nur an meinem Netzwerk anmelden, dann wäre ich ja schon mal etwas zufriedener. Ich meine - Beispielsskripte sollen doch zeigen, wie es geht, oder? Und nicht zeigen, wie es nicht funktioniert...?

Ich hatte schon so einige Beispielskripte - auch von Python-Libraries direkt beigepackt - die nicht (mehr) funktionierten. Mich hat das auch geärgert, weil mir schwer fällt, überhaupt das Problem zu benennen. Aber beispielsweise wird hier im Forum wirklich mit viel Geduld versucht, sich an das Problem heranzutasten. Man lernt schnell, zu "knobeln". Das gehört wohl irgendwie dazu.

Viel Erfolg - da ich mich leider mit deinem Controller überhaupt nicht auskenne und eben selbst auf dem gesamten Gebiet noch neu bin. Wollte nur versuchen, dich etwas zu motivieren! Denn: Schlussendlich macht es einen riesigen Spaß!

pupo
30.12.2017, 00:55
Ich habe eben einen Code aus meinem neu gekauften Buch probiert, um zu sehen, ob der geht. Dabei habe ich versucht, ihn so weit wie möglich zu vereinfachen. Es reicht ja erst mal, dass das Modul sich nur an meinem Netzwerk anmeldet, sonst nix. Dann wäre ich ja schon mal einen Schritt weiter. Der Sketch schreibt auf meinen Serial Monitor ".-." bis in alle Ewigkeit.

// Sketch habe ich aus dem Buch "ESP8266 Projektbuch " von Martin Mohr und dann vereinfacht.

#include <ESP8266WiFi.h>
#include <ESP8266WebServer.h>

const char* ssid = "Fritz!Box 7490"; // das ist meine SSID, einfallslos, ich weiss............
const char* pass = "hier steht mein Passwort und es ist sicher korrekt, mehrmals geprüft";
const char* serverIp = "192.11168.1.20";
int serverPort = 80;

WiFiClient client;

void setup(){
Serial.begin (115200);
Serial.println("\r\n bla") ;
WiFi.begin(ssid, pass);
while (WiFi.status() != WL_CONNECTED) {

delay (500);
Serial.print(".-.");

}
Serial.println("");

Serial.print("Verbunden mit");
Serial.println(ssid);
Serial.print("IP address. ");
Serial.println(WiFi.localIP());
if (!client.connect(serverIp,serverPort) ) {
Serial.println("connect fail");
}
}
void loop(){

Serial.println("gemacht.");
delay (1500);

}


---------------------------------

Aber auch den anderen Code will ich euch nicht vorenthalten. Auch er bleibt bei der Anmeldung hängen und schreibt mir Pünktchen in den Serial Monitor, bis zum Sankt Nimmerleinstag. Es handelt sich um das Beispiel "BasicHttpClient" aus dem ESP8266-library für Arduino:

#include <ESP8266WiFi.h>
#include <WiFiClient.h>
#include <ESP8266WebServer.h>
#include <ESP8266mDNS.h>

const char* ssid = "Fritz!Box 7490";
const char* password = "mein Passwort...";

ESP8266WebServer server(80);

const int led = 5;

void handleRoot() {
digitalWrite(led, 1);
server.send(200, "text/plain", "hello from esp8266!");
digitalWrite(led, 0);
}

void handleNotFound(){
digitalWrite(led, 1);
String message = "File Not Found\n\n";
message += "URI: ";
message += server.uri();
message += "\nMethod: ";
message += (server.method() == HTTP_GET)?"GET":"POST";
message += "\nArguments: ";
message += server.args();
message += "\n";
for (uint8_t i=0; i<server.args(); i++){
message += " " + server.argName(i) + ": " + server.arg(i) + "\n";
}
server.send(404, "text/plain", message);
digitalWrite(led, 0);
}

void setup(void){
pinMode(led, OUTPUT);
digitalWrite(led, 0);
WiFi.mode(WIFI_STA); // <...................... Diese Zeile habe ich auf Euren Tip mit dem Wifi-Modus hin eingefügt, bringt aber nichts.
Serial.begin(115200);
WiFi.begin(ssid, password);
Serial.println("");

// Wait for connection
while (WiFi.status() != WL_CONNECTED) {
delay(500);
Serial.print(".");
}
Serial.println("");
Serial.print("Connected to ");
Serial.println(ssid);
Serial.print("IP address: ");
Serial.println(WiFi.localIP());

if (MDNS.begin("esp8266")) {
Serial.println("MDNS responder started");
}

server.on("/", handleRoot);

server.on("/inline", [](){
server.send(200, "text/plain", "this works as well");
});

server.onNotFound(handleNotFound);

server.begin();
Serial.println("HTTP server started");
}

void loop(void){
server.handleClient();
}

- - - Aktualisiert - - -

Vielleicht noch zur Anschlusssituation, ich habe meinen ESP8266 an einen Raspberry Pi am USB- Anschluss angesteckt, über die er mit Strom versorgt wird und über die ich auch den Code hochlade. Ansonsten habe ich im Moment gar nichts angeschlossen, also keine externe Schaltung mit Widerständen und Kondensatoren oder so. Ich habe irgendwo gelesen, dass sich mein Controller automatisch vom Flash- in den Run-Modus und zurück stellen würde, Da ich Den Sketch hochladen kann und auch die ".-." - Rückmeldung auf dem Serial Monitor kriege, sehe ich das bestätigt. Ich konnte auch schon eine LED blinken lassen.

Rabenauge
30.12.2017, 07:21
Hm- hast du mal das Ding direkt neben den Router gelegt?
Wenn ich mir angucke, was auf den Teilen für "Antennen" sind, würd ich nicht viel Reichweite erwarten...

HaWe
30.12.2017, 10:24
Hm- hast du mal das Ding direkt neben den Router gelegt?
Wenn ich mir angucke, was auf den Teilen für "Antennen" sind, würd ich nicht viel Reichweite erwarten...

10m Abstand zum Router, durch 2 tragende Wände hindurch, sind hier bei uns zuhause kein Problem.

@pupo:

Dein Code ist leider unleserlich ohne code-tag Formatierung (Raute oder hash tag).

Hast du meinen oben verlinkten Code getestet? - der funktioniert hier bei mir nachweislich.

Übrigens hilft auch oft zwischenzeitliches Ab- und Anstecken, wenn der ESP bereits kurz vorher im Netz registriert war und gerade eben ein neues Programm hochgeladen wurde.
Und du solltest freie (!), feste (!) WiFi-Adressen verwenden für den Webserver, wie ebenfalls in "meinem" Code geschehen (mangels Übersichtlichkeit finde ich keine entsprechenden Stellen bei dir im Code)



// WiFi settings

const char* ssid = "WiFi-ssd"; // WiFi-Name einsetzen! <<<<<<<<<<<<<<<<<
const char* password = "WiFi-pwd"; // WiFi-Passwort einsetzen! <<<<<<<<<<<<<
IPAddress ip(192,168,111,211); // IoT ESP8266 Server IP wählen! <<<<<<<<
IPAddress gateway(192,168,111,1); // Internet Gateway IP einsetzen! <<<<<<<
IPAddress subnet(255,255,255,0); // Subnet Mask <<<<<<<<<<<<<<<<<<<<<<<<<<

WiFiServer server(80);

//...
setup() {
WiFi.begin(ssid, password);
WiFi.config(ip, gateway, subnet); // feste IP
//...
}

- - - Aktualisiert - - -

PS,
die 3. Stellen bei den Wifi IPs müssen ntl identisch sein, meist ist es eine 1 oder eine 2, nicht der Patzhalter 111:

IPAddress ip(192,168,1,211); // iot ESP8266 Server IP wählen! <<<<<<<<
IPAddress gateway(192,168,1,1); // Internet Gateway IP einsetzen! <<<<<<<

pupo
30.12.2017, 10:46
Ja, ich hatte den Controller neben dem Router liegen. Hat nichts gebracht. Und andersrum kann ich im ersten Stock neben dem Router auch den WLAN-Zugangspunkt des Controllers erkennen, wenn der Controller unten im Bastelzimmer liegt. Bin eben extra noch mal hoch und habe es ausprobiert. Liegt bei 37% Empfangsstärke. Es gibt sogar ein drittes ominöses WLAN, von dem ich mir nicht erklären kann, woher es kommt. Vielleicht hat der Nachbar einen neuen Router oder so.

Kann mir bitte jemand erklären, wie ich Code richtig kennzeichne? Ich habe bei den Formatierungsoptionen nur eine Sprechblase für
Zitate

HaWe, ich werde deinen Code im Laufe des Tages ausprobieren.

HaWe
30.12.2017, 11:28
Kann mir bitte jemand erklären, wie ich Code richtig kennzeichne? Ich habe bei den Formatierungsoptionen nur eine Sprechblase für
Zitate .
Das "Raute" == Hash Tag Symbol
#
beim vollständigen Editor


du kannst auch manuell
[/code]
ans Ende und
[code]
an den Anfang des Blocks setzen.

- - - Aktualisiert - - -

PPS,
bei deiner IP ist oben z.B. ein Fehler bei deinem 1. Code:


const char* serverIp = "192.11168.1.20";

unabhängig davon, dass ich selber für IPs den Variablentyp IPaddress ip() verwende, nicht char*

pupo
30.12.2017, 14:32
Wow, da wäre ich nicht drauf gekommen. Gut beobachtet, danke. Ich versuche es erst noch mal mit korrigierter IP Adresse und wenn es trotzdem nicht geht, anschließend mit deinem Skript. Ist es okay, wenn ich nichts anschließe, oder werden das OLED Display und die LEDs zwingend benötigt?

Was mich übrigens noch wundert, ich habe schon so viele Geräte mit diesem WLAN verbunden - Handys, Laptops, Computer - und noch nie musste ich irgendwo die IP - Adresse selbst raussuchen. Die wurde eigentlich immer von der Fritzbox vergeben.

- - - Aktualisiert - - -

HaWe, dein Skript läuft bei mir nicht, weil ich einen anderen Controller habe. Ich bekomme die Fehlermeldung:


/home/pi/Arduino/HaWe/HaWe.ino:12:90: fatal error: ESP_SSD1306.h: No such file or directory
#include <ESP_SSD1306.h> // Modification of Adafruit_SSD1306 for ESP8266 compatibility

021aet04
30.12.2017, 14:47
Bei einem Server (bzw Gerät das angesprochen wird) vergibt man eine fixe Adresse. Wenn du ein Gerät ansprechen willst bei dem sich ständig die Adresse ändert wird es viel schwieriger (bzw musst jedes mal die Adresse herausfinden).

Bei einem PC o.Ä. hast du das Problem nicht, weil du von diesem Zugang auf das NW zugreifst. Willst du aber von einem anderen Gerät auf diesen PC zugreifen hast du die gleichen Probleme wie oben geschrieben.

MfG Hannes

pupo
30.12.2017, 14:47
AAAAAAAAAAAAAAAAAAAAAAHHHHHHHHHHHHHHHHHH ICH BIN SO BLÖÖÖD


Ich hatte als SSID eingegeben: "Fritz!Box 7490"

aber es ist in Wirklichkeit "FRITZ!Box 7490". Ich habe bestimmt hundert Mal nachgesehen und es nicht gemerkt. Das "FRITZ" muss gross geschrieben sein. Mein Controller hat sich eben gerade artig an der Fritzbox angemeldet. Ich kann ihn auch in der Fritzbox-Oberfläche bei den angemeldeten Geräten sehen. Vielen Dank. Ich liebe Euch alle.

HaWe
30.12.2017, 18:59
Wow, da wäre ich nicht drauf gekommen. Gut beobachtet, danke. Ich versuche es erst noch mal mit korrigierter IP Adresse und wenn es trotzdem nicht geht, anschließend mit deinem Skript. Ist es okay, wenn ich nichts anschließe, oder werden das OLED Display und die LEDs zwingend benötigt?

Was mich übrigens noch wundert, ich habe schon so viele Geräte mit diesem WLAN verbunden - Handys, Laptops, Computer - und noch nie musste ich irgendwo die IP - Adresse selbst raussuchen. Die wurde eigentlich immer von der Fritzbox vergeben.

- - - Aktualisiert - - -

HaWe, dein Skript läuft bei mir nicht, weil ich einen anderen Controller habe. Ich bekomme die Fehlermeldung:


/home/pi/Arduino/HaWe/HaWe.ino:12:90: fatal error: ESP_SSD1306.h: No such file or directory
#include <ESP_SSD1306.h> // Modification of Adafruit_SSD1306 for ESP8266 compatibility

das ist kein Controller, das ist ein OLED Display (SSD1306) - das kannst du auskommentieren - oder die Lib downloaden (Liib-Manager oder github, Links stehen dabei!) und mitcompilieren lassen, ohne OLED.
Ein OLED würde ich an deiner Stelle trotzdem spendieren, das ist Gold wert, und sei es nur zum stand-alone-Debuggen!

trotzdem schön, dass es jetzt klappt! :cool: