IOT

Internet of Things mit dem NanoESP Board:

Grundlagen

  1. Nano Board und WLAN Board kommunizieren über eine Software-Serielle-Schnittstelle (Pin 11 und 12)
    • Um mit dem ESP-Board über die Serielle Schnittstelle zu kommunizieren: 19200 Baut einstellen!!!!
    • Man kann vom Arduino Board aus Daten an das ESP Board schicken: z.B. esp8266.println(„AT“);
    • Daten, die das ESP-Board an das Arduino Board schickt: esp8266.read()
    • Man kann Daten, die das ESP Board an das Arduino Board zurücksendet auch auf dem seriellen Monitor darstellen: Serial.write(esp8266.read());  – d.h. vorher abfragen, ob das ESP-Board da ist (if (esp8266.available())) und dann einlesen, was geschickt wurde vom ESP-Board (read geht auf das ESP-Board – write schreibt es auf den seriellen Monitor – da das Esp-Board die Daten in Ascii-Zeichen schickt, muss man Serial.write(…) verwenden und nicht Serial.print(…) – das würde die Ascii Codes der Buchstaben, die verschickt wurden ausgeben.
  2. Das ESP-Board kann in 3 Modi gefahren werden:
    • Als Access-Point: AT+CWMODE=2
      • (PW setzen: AT+CWSAP=“NW Name“, „Passwort“, 5, 3
        • (5: Channel ID, 3: Verschlüsselungsmodes zw. 0-4)
    • Im Stationsmodus: AT+CWMODE=1
      • man kann in diesem Modus eine Verbindung des ESP Boards mit meinem WLAN Router herstellen => Board kann mit dem Internet verbunden werden
    • Dualer Modus: AT+CWMODE=3
      • Modus 1 und 2 ist möglich
  3. Um den Modus oder andere Befehle im Programm zu setzen kann man eine Bibliothek importieren: NanoEsp.h, die viele grundlegende Methoden bereits vorgibt (Auflistung https://iot.fkainka.de/library)
    • hier z.B. #include <NanoESP.h>
    • NanoESP nanoesp = NanoESP();
    • nanoesp.configWifiMode(DUAL);
  4. Um das Board als Webserver oder Client zu verwenden, gibt es die Bibliothek NanoESP_HTTP.h. Auflistung der Methoden https://iot.fkainka.de/library
    1. hier z.B. #include <NanoESP.h>
    2. #include <NanoESP_HTTP.h>
    3. NanoESP nanoesp = NanoESP();
    4. NanoESP_HTTP http = NanoESP_HTTP(nanoesp);

_______________________________________________________________

Mit dem Packetsender Daten mit dem Board über UDP austauschen

UDP: einfaches Protokoll, Daten werden vom Sender zum Empfänger geschickt, ohne zu prüfen, ob sie angekommen sind.

Um schnell eine Kommunikation mit dem Board herzustellen und ein wenig damit auszuprobieren, kann man auf den PC ein kleines Programm runterladen (https://packetsender.com/download#show).

Von dem Programm aus kann man über UDP Daten an das ESP Board senden und dort darauf reagieren, z.B. eine LED an und ausschalten.

Einstellungen im Packetsender

Unter File->settings: UDP Server erlauben und Port 90 einstellen

settings.PNG

In der allgemeinen Oberfläche:

ASCII: text, den man übermitteln möchte

Address: IP Adresse des NanoEsp Boards

Port: 91

Protokoll: UDP

packetsender

Programm auf dem Board:

//Libaries importieren
#include <NanoESP.h>
#include <NanoESP_HTTP.h> //special library for http-connection
#include <SoftwareSerial.h>

 

#define LED 9

//Objekte für die Kommunikation zum NanoEsp und über den Webserver
NanoESP nanoesp = NanoESP();
NanoESP_HTTP http = NanoESP_HTTP(nanoesp); //init http library with an instance of nanoesp

 

void setup() {
//um auf dem Seriellen Monitor Text sichtbar zu machen – 19200 Baut!!!
Serial.begin(19200);

//Initialisierung des WLAn Boards (NanoEsp)
nanoesp.init();

//ACCESPOINT Konfiguration
nanoesp.configWifiMode(ACCESSPOINT);
//das ESP Board ist selbst der AP, der Rechner verbindet sich mit dem Board direkt
nanoesp.configWifiAP(„NanoESP“, „“);
//Kommunikation mit Packetsender über UDP vorbereiten
//der Rechner, auf dem der packetsender läuft, bekommt 192.168.4.2 als Adresse zugewiesen
if (nanoesp.startUdpServer(0,“192.168.4.2″, 90,90, 0))
Serial.println(„UDP verbunden!“);
else
Serial.println(„UDP Fehler bei Verbindungsaufbau!“);

Serial.println(nanoesp.getIp());
pinMode(LED, OUTPUT);

}

void loop() {
int id, len;
String daten;
if (nanoesp.recvData(id, len))
{
//empfangene Daten anzeigen – alternativ zu find…
// daten=nanoesp.readStringUntil(‚\r‘);
//Serial.println(daten);

//im packetsender led0 oder led1 eingaben, um die led zu schalten
if (nanoesp.find(„led“)) {
Serial.println(„LED schalten“);
int setLed = nanoesp.parseInt();
digitalWrite(LED, setLed);
}
else {
Serial.println(„Wrong UDP Command“);
if (nanoesp.sendCom(„AT+CIPSEND=19“, „>“))
{
nanoesp.sendCom(„Wrong UDP Command“, „OK“);
}
}
}
}

_________________________________________________________________
Board als Server (TCP Kommunikation)

TCP. komplexer als UDP, da sichergestellt wird, dass die Daten beim Epfänger angekommen sind, wird kein OK zurück geschickt an den Sender, so schickt dieser keine weiteren Daten

über Website steuern

/*
Einfacher Webserver:Hört auf Port 80
Passwort und SSID anpassen

Eine Website mit 2 Buttons wird erzeugt. Die Buttons schalten die LED auf Pin 9
*/

//Libaries importieren
#include <NanoESP.h>
#include <NanoESP_HTTP.h> //special library for http-connection
#include <SoftwareSerial.h>

//Router config
#define SSID „TestSSID“
#define PASSWORD „passwort“

//Led Pin
#define led 9

//Antwort, wenn angekommen

#define OK „HTTP/1.1 200 OK \n“

//Website

const char site[] PROGMEM = {
„<HTML><HEAD>\n<meta name=\“viewport\“ content=\“width=device-width, initial-scale=2.0, user-scalable=yes\“>\n<title>\nSwitch LED\n</title>\n</HEAD>\n\n<BODY bgcolor=\“#FFFF99\“ text=\“#000000\“>\n<FONT size=\“6\“ FACE=\“Verdana\“>\nSwitch LED\n</FONT>\n\n<HR>\n<BR>\n<FONT size=\“3\“ FACE=\“Verdana\“>\nSwitch the LED <BR>\non D9 ON and OFF\n<BR>\n<BR>\n<form method=\“GET\“>\n\t<button type=\“submit\“ name=\“led\“ value=\“1\“>LED ON</button>\n\t<button type=\“submit\“ name=\“led\“ value=\“0\“>LED OFF</button>\n</form>\n<BR>\n<HR>\n\n</font>\n</HTML>\n\0″
};

//Objekte für die Kommunikation zum NanoEsp und über den Webserver
NanoESP nanoesp = NanoESP();
NanoESP_HTTP http = NanoESP_HTTP(nanoesp); //init http library with an instance of nanoesp

//Initialisierungen
void setup()
{
//um auf dem Seriellen Monitor Text sichtbar zu machen – 19200 Baut!!!
Serial.begin(19200);

//Initialisierung des WLAn Boards (NanoEsp)
nanoesp.init();

//ACCESPOINT Konfiguration
nanoesp.configWifiMode(DUAL);

// warten, bis zum WiFi verbunden
if (nanoesp.wifiConnected())
Serial.println(F(„Verbunden!“));
else
Serial.println(F(„Error WLAN Verbindung“));

//Start TCP Server – auf Port 80
//wichtig bei Kommunikation über das Internet, dort immer TCP und Port 80
if (nanoesp.startTcpServer(80))
Serial.println(F(„TCP Server Activ“));
else
Serial.println(F(„TCP Server Error“));

//IP Adresse im Seriellen Monitor ausgeben, damit man z.B. den Browser oder die App //mit eben dieser Adresse verbinden kann
Serial.println(nanoesp.getIp());
}

 

//eigentliches Programm
void loop() // run over and over
{
//Erhält das ESP Board eine neue Anfrage über TCP, so kommt folgendes an:
// id – eine fortlaufende Nummer
// method – ob der Anfrager (bzw. die anfragende Website über GET oder POST Daten übermittelt
// ressource – der Pfad, woher geladen werden soll, z.B. / die Indexsite, falls eine Website vom Webserver angefordert wird
// parameter – z.B. ?led=0 wenn über GET angefragt wurde
String method, ressource, parameter;
int id;
//falls eine neue Anfrage angekommen ist an den Webserver, die Variablen neu belegen
if (http.recvRequest(id, method, ressource, parameter)) {
//Testausgabe auf dem Seriellen Monitor
Serial.println(„New Request from id :“ + String(id) + „, method: “ + method + „, ressource: “ + ressource + “ parameter: “ + parameter);

//wenn vom Browser über die Angabe der IP Adresse des ESP Boards die Anfrage kommt, die Website zu liefern
if (ressource == „/“) //Index Seite
nanoesp.sendData(id, createWebsite());

//wenn auf einen Button auf der Website gedrückt wurde, wird ein parameter gesetzt
if (parameter == „?led=0“)
digitalWrite(led,0);
if (parameter == „?led=1“)
digitalWrite(led,1);

//Bestätigung, das alles angekommen ist, damit eine neue TCP Anfrage gestellt //werden kann
nanoesp.sendData(id,OK);
nanoesp.closeConnection(id);
}
}

//Website vor dem Verschicken in dem xBuffer zusammenstellen (wird aus dem //char[] rausgelesen
String createWebsite()
{
String xBuffer;

for (int i = 0; i <= sizeof(site); i++)
{
char myChar = pgm_read_byte_near(site + i);
xBuffer += myChar;
}

return xBuffer;
}

________________________________________________________________

mit App Inventor steuern

/*
Einfacher Webserver:Hört auf Port 80
Passwort und SSID anpassen
*/

//Libaries importieren
#include <NanoESP.h>
#include <NanoESP_HTTP.h> //special library for http-connection
#include <SoftwareSerial.h>

//Router config
#define SSID „Name“
#define PASSWORD „test“

//Led Pin
#define led 9

//Antwort, über TCP an Sender, wenn Daten empfangen

#define OK „HTTP/1.1 200 OK \n“

//Objekte für die Kommunikation zum NanoEsp und über den Webserver
NanoESP nanoesp = NanoESP();
NanoESP_HTTP http = NanoESP_HTTP(nanoesp); //init http library with an instance of nanoesp

//Initialisierungen
void setup()
{
//um auf dem Seriellen Monitor Text sichtbar zu machen – 19200 Baut!!!
Serial.begin(19200);

//Initialisierung des WLAn Boards (NanoEsp)
nanoesp.init();

//ACCESPOINT Konfiguration
nanoesp.configWifiMode(DUAL);

// warten, bis zum WiFi verbunden
if (nanoesp.wifiConnected())
Serial.println(F(„Verbunden!“));
else
Serial.println(F(„Error WLAN Verbindung“));

//Start TCP Server – auf Port 80
//wichtig bei Kommunikation über das Internet, dort immer TCP und Port 80
if (nanoesp.startTcpServer(80))
Serial.println(F(„TCP Server Activ“));
else
Serial.println(F(„TCP Server Error“));

//IP Adresse im Seriellen Monitor ausgeben, damit man z.B. den Browser oder die App mit eben dieser Adresse verbinden kann
Serial.println(nanoesp.getIp());
}

//eigentliches Programm
void loop() // run over and over
{
//Erhält das ESP Board eine neue Anfrage über TCP, so kommt folgendes an:
// id – eine fortlaufende Nummer
// method – ob der Anfrager (bzw. die anfragende Website über GET oder POST Daten übermittelt
// ressource – der Pfad, woher geladen werden soll, z.B. / die Indexsite, falls eine Website vom Webserver angefordert wird
// parameter – z.B. ?led=0 wenn über GET angefragt wurde
String method, ressource, parameter;
int id;

//falls eine neue Anfrage angekommen ist an den Webserver, die Variablen neu belegen
if (http.recvRequest(id, method, ressource, parameter)) { //Incoming request, parameters by reference
//Testausgabe auf dem Seriellen Monitor
Serial.println(„New Request from id :“ + String(id) + „, method: “ + method + „, ressource: “ + ressource + “ parameter: “ + parameter);
//da über TCP kommuniziert wird, muss der Server dem Browser bzw. der APP bestätigen, dass alles angekommen ist, sonst geht es nicht weiter

//LED an und ausschalten
if (parameter == „?led0“)
digitalWrite(led,0);
else
digitalWrite(led,1);

//Bestätigung, das alles angekommen ist, damit eine neue TCP Anfrage gestellt werden kann
nanoesp.sendData(id,OK);
nanoesp.closeConnection(id); //Verbindung beenden –> Browser erkennt vollständige Übertragung
}
}

Im App Inventor ein „An“ und „Aus“ Knopf anlegen und ein „Web“:

led

 

_______________________________________________-

Bibliotheken:

https://iot.fkainka.de/library

 

Gib Deine E-Mail-Adresse an, um dem Blog zu folgen, dann bekommst Du automatisch alle Änderungen in den Artikeln per E-Mail zugeschickt

Kategorien
%d Bloggern gefällt das: