

Das klassische Board fürs Hobby ist eigentlich das Arduino-Board. Mit zusätzlicher Hardware lässt sich ein Arduino auch ins heimische Netz einbinden. Es gibt inzwischen in der Preisklasse aber auch Boards die einen Mikrocontroller mit Funkanbindungsmöglichkeit haben. Der ESP8266 dürfte der gebräuchlichste davon sein. Mit 11 nutzbaren Digital-E/A-Ports und einem Analogen Eingang ist er zwar etwas dürftiger ausgestattet als der Arduino, die CPU wird aber in der Regel mit 80MHz getaktet, was dann wieder andere Vorteile gegenüber dem Arduino bringt. Das schönste, der lässt sich über die Arduino-IDE genau so programmieren wie der Arduino. Allerdings muss man dazu erst noch die entsprechenden Boards in der IDE installieren. Das funktioniert aber ziemlich problemlos. Eine Beschreibung dazu findet man hier. Eine kurze Übersicht zur Technologie findet man hier
Ich bin auf das Board gestoßen, als ich nach einer Möglichkeit gesucht habe, Daten möglichst einfach drahtlos auf meinen Rechner zu übertragen. Das Modul lässt sich ganz einfach ins heimische WLAN einbinden. Über eine kurzes Programm kann man dann vom PC aus drahtlos auf das Board zugreifen.
Zuerst der ESP als Server und der PC als Client.
Ich habe mir im ersten Anlauf einen ESP8266D1 MINI besorgt. Mit einem kleinen Programm, wahrscheinlich der simpelste Server der Welt.
Zum Programmieren wird das Board über ein Micro USB-Kabel mit dem Rechner verbunden. Aber Vorsicht, die meisten Kabel für Smartphones funktionieren nicht, weil die intern nur Verbindungen für die Stromversorgung haben.
Der ESP ESP8266 fungiert bei der Methode als Server. Mit dem Programm loggt sich das Board in den heimischen Router ein. Dazu muss der entsprechende Name des Netzwerks und das Passwort im Programm unter "ssid" und "password" eingetragen werden.
Code: Alles auswählen
#include <ESP8266WiFi.h>
const char* ssid = "Name des WLAN-Netzwerks";
const char* password = "1234567890";
int rt_ledPin=D2;
int gr_ledPin=D1;
int ge_ledPin=D5;
// Create an instance of the server
// specify the port to listen on as an argument
WiFiServer server(80);
void setup() {
Serial.begin(9600);
pinMode(gr_ledPin, OUTPUT);
pinMode(rt_ledPin, OUTPUT);
pinMode(ge_ledPin, OUTPUT);
digitalWrite(rt_ledPin, HIGH);
digitalWrite(gr_ledPin, LOW);
delay(10);
Serial.println();
Serial.println();
Serial.print("Connecting to ");
Serial.println(ssid);
WiFi.mode(WIFI_STA);
WiFi.begin(ssid, password);
while (WiFi.status() != WL_CONNECTED) {
delay(500);
Serial.print(".");
}
digitalWrite(gr_ledPin, HIGH);
digitalWrite(rt_ledPin, LOW);
digitalWrite(ge_ledPin, LOW);
Serial.println("");
Serial.println("WiFi connected");
server.begin();
Serial.println("Server started");
Serial.println(WiFi.localIP());
}
void loop()
{
WiFiClient client;
if (!(client = server.available())) // Client angemeldet?
return;
digitalWrite(ge_ledPin,HIGH);
unsigned long time0= millis();
while(!client.available())
{
if((millis()-time0) > 5000)// Verbindung abgebrochen;
{
digitalWrite(ge_ledPin, LOW);
return;
}
delay(1);
}
String a = client.readStringUntil('\r');
client.flush();
String s="Antwort vom Server auf"+a+"\r";
client.print(s);
client.flush();
delay(1);
digitalWrite(ge_ledPin, LOW);
}
Wenn das Einloggen funktioniert, braucht man nur noch einen Client der dem Server dann Anfragen stellen kann oder Anweisungen geben kann. kann. Da genügt ein kurzes c++ Programm das über die ausgegebene IP-Adresse mit dem Board kommuniziert.
Code: Alles auswählen
using namespace std;
/*
getestet mit mingw-w64\i686-8.1.0-posix-dwarf-rt_v6-rev0 in CodeBlocks
libws2_32.a muss mit eingebunden werden.
Infos: http://userpage.fu-berlin.de/~ram/pub/pub_jf47ht81Ht/c++_windows_sockets
*/
#include <iostream>
#include <ostream>
#include <stdio.h>
#include <stdlib.h>
#include <time.h>
#include <windows.h>
#include <winsock.h>
void SocketError()
{
::std::cerr << "Fatal Error" << '\n';
WSACleanup();
::std::system( "PAUSE" );
exit(0);
}
char* ip = "192.168.178.33";
int port = 80;
string Anfrage(struct sockaddr *address,string anfrage)
{
SOCKET sock;
const int BUF_LEN=10000;
char File_Buf[ BUF_LEN ];
int r;
if(( sock = socket( AF_INET, SOCK_STREAM, 0 ))== INVALID_SOCKET )
SocketError();
if( connect( sock,address, sizeof( struct sockaddr )))
SocketError();
send( sock,anfrage.c_str(), strlen(anfrage.c_str()),0 );
for(string antwort="";;antwort+=File_Buf)
{
memset (File_Buf,0,BUF_LEN);
r=recv( sock, File_Buf,BUF_LEN, 0 );
if(r < 0)
SocketError();
else if(r == 0)
{
closesocket(sock);
return antwort;
}
}
}
int main()
{
struct sockaddr_in address;
struct hostent * host;
WSADATA wsaData;
if(WSAStartup(MAKEWORD(2,2),&wsaData) !=0)
::std::cout << "WSAStartup failed\n";
address.sin_family = AF_INET;
address.sin_port = htons(port);
::std::cout << "Connecting to host\n";
if(!( host = gethostbyname( ip )))
SocketError();
address.sin_addr.s_addr=*(( unsigned long * )host->h_addr);
for(int n=0; ;++n)
{
for(int i1=0;i1 < 4;++i1)
{
string Antwort=Anfrage(( struct sockaddr * )&address,string(" Anfrage ")+to_string(i1)+string(" vom Client \r"));
::std::cout << Antwort << '\n';
}
::std::cout << "\n" << "2 Sekunden warten\n" << '\n';
Sleep(2000);
}
WSACleanup();
::std::system( "PAUSE" );
}
Das Programm sendet alle 2 Sekunden 4 Anfragen an das Board. Das Board schickt dann eine Antwort zurück. Die Ausgabe des Client-Programms sieht dann wie folgt aus:
Die IP-Adresse wird vom Router vergeben, wenn das Board sich einloggt. Die kann u.U. von Fall zu Fall verschieden sein. Im Router lässt sich aber in der Regel eine feste Adresse einstellen.
Ich habe mir inzwischen auch das NodeMCU V3.1 -Board besorgt. Das funktioniert allerdings nur mit zusätzlicher Stromversorgung richtig. Die Versorgung über USB reicht zumindest bei meinem Rechner nicht aus. Das Board zieht etwa 90 mA. Mein ESP8266D1 MINI Board zieht etwa 70mA. Eine Recherche im Netz hat dann ergeben, dass derartige Probleme beim ESP8266 öfters auftreten, weil der je nach Betriebsart auch schon einmal kurzzeitig 350mA zieht. Eine reguläre Stromversorgung schafft da aber immer Abhilfe. Beim Betrieb als Server oder Client im WLAN braucht man die in der Regel ja ohnehin.
So ein Server ist hauptsächlich für Steuerungszwecke recht gut geeignet. Der wartet einfach bis ein Client sich bei ihm meldet und führt dann aus, was der vorgibt. Für Fernsteuerungen ist die Methode sehr gut zu gebrauchen. Beim Übermitteln von Daten aber nicht unbedingt. Wenn man z.B. Daten für eine Wetterstation sammeln will, dann ist es sinnvoll nur alle paar Minuten eine Messung zu machen, die dann an einen Rechner übermittelt wird. In der Ruhephase kann man die Messmimik abschalten oder in eine stromsparende Ruhephase versetzen. Die Batterielaufzeit der Messmimik erhöht sich dadurch enorm. Für den Fall muss dann der PC zum Server und das ESP8266D1 Board zum Client werden. Der PC wartet dann, bis das Board sich bei ihm meldet. Das Board muss in dem Fall nicht dauerhaft mit dem WLAN verbunden sein. Die Methode werde ich auch noch ausprobieren.