TAG-Tag-Bericht 04.04.2017

Die Aufgabenstellung ist klar: Kontaktlos Messen, Steuern, Regeln. Keine Gefahr durch feuchtigkeitsbedingte Kurzschlüsse, Überwachung über das Intranet. Eine Lösung kann über die modernen ESP-01-Chips von ESPRESSIF laufen. Nachdem ein kleiner „heißer Punkt“ (HotSpot) als lokaler Router etc. eingerichtet war konnten die Versuche beginnen. Das Web-Ergebnis zeigt die Abbildung. Tischlampe ist ein String, den ein Arduino-Nano via ESP-Chip und Hotspot sendet, was ein internetfähiges Endgerät entsprechend darstellen kann.Der getestete Aufbau durchdringt mühelos die dicke Mauer des Makerspaces im Palais.

Zitat des Makers: „Der ESP war direkt an den USB-Treiber angeschlossen und (WICHTIG!) beim programmieren wurde einfach der Pin GPIO0 auf Masse gelegt. Manchmal klappt der Upload auch nicht, dann muss der ESP kurz von Strom getrennt werden um in ganz neu zu starten. In der Arduino IDE musste im Board Manager noch per Link aus dem Internet das ESP Paket installiert werden. Bei der Auswahl des Generic ESP8266 erscheinen einige neue Optionen bei den Werkzeugen, die zum Teil sehr wichtig sind. Bei mir hat der ESP am Anfang nicht funktioniert, weil meine Uploadfunktion standardmäßig auf DIO gestellt war, aber auf DOUT gestellt werden musste. Nachdem der Upload dann funktioniert hat, gings an den Code. Der Code sagt zuerst „ich verbinde mich mit dem Netzwerk mit dieser SSID und diesem WPA2 Passwort und dann schreibt er seine DHCP IP in den Serial Port.“ Danach hat unser Code sogar eine funktionierende Website erstellt, die mit dem Browser aufgerufen werden konnte und 3 Buttons enthielt, die jeweils ihre eigene Nachricht hatten, die sie an den ESP übermittelt haben wenn sie gedrückt wurden.“

Hier folgt der Code. Die kritischen Login-Schüssel sind durch „XXXX“ und „YYYY“ ersetzt.

#include <ESP8266WiFi.h>

#define LED_PIN 0

char website[] = "<!DOCTYPE HTML>"
"<html style=\"width:100%;height:100%\">"
"<head><title>ESP-01</title></head>"
"<body style=\"width:100%;height:100%\">"
"<table style=\"width:100%;height:100%\">"
"<tr><th><button style=\"width:100%;height:100%;font-size:10vw\" onclick=\"onClick('0')\"> Tischlampe </button></th></tr>"
"<tr><th><button style=\"width:100%;height:100%;font-size:10vw\" onclick=\"onClick('2')\"> Schrankleds </button></th></tr>"
"<tr><th><button style=\"width:100%;height:100%;font-size:10vw\" onclick=\"onClick('1')\"> Dunkel </button></th></tr>"

"</table>"
"<script> function onClick(id) { var request = new XMLHttpRequest(); request.open(\"POST\",id); request.send(); } </script>"
"</body></html>";

char key[] = "XXXXXXX";
char ssid[] = "YYYYY";

WiFiServer server(80);

void setup() {
  pinMode(LED_PIN, OUTPUT);
  
  Serial.begin(9600);
  WiFi.mode(WIFI_STA);
  //WiFi.config(ip, gateway, subnet);
  WiFi.begin(ssid, key);
  
  Serial.print("Connecting");
  while (WiFi.status() != WL_CONNECTED)
  {
    delay(500);
    Serial.print(".");
  }
  Serial.println();
  
  Serial.print("Connected, IP address: ");
  Serial.println(WiFi.localIP());

  server.begin();
}

boolean pin;
void loop() {
  WiFiClient client = server.available();
  if (client) {
    String httpRequest = "";
    // an http request ends with a blank line
    boolean currentLineIsBlank = true;
    int line = 0;
    while (client.connected()) {
      if (client.available()) {
        char c = client.read();
        if (line == 0) httpRequest += c;
        //Serial.write(c);
        // if you've gotten to the end of the line (received a newline
        // character) and the line is blank, the http request has ended,
        // so you can send a reply
        if (c == '\n' && currentLineIsBlank && httpRequest.startsWith("GET / ")) {
          // send a standard http response header
          client.println("HTTP/1.1 200 OK");
          client.println("Content-Type: text/html");
          client.println("Connection: close");  // the connection will be closed after completion of the response
          //client.println("Refresh: 5");  // refresh the page automatically every 5 sec
          client.println();
          client.println(website);
          break;
        }
        else if (c == '\n' && currentLineIsBlank && httpRequest.startsWith("POST")) {
          client.println("HTTP/1.1 200 OK");
          client.println("Connection: close");  // the connection will be closed after completion of the response
          client.println();
          
          pin = !pin;
          digitalWrite(LED_PIN, pin);

          Serial.println(httpRequest.substring(6,7));
          
          break;
        }
        if (c == '\n') {
          // you're starting a new line
          currentLineIsBlank = true;
          line++;
        }
        else if (c != '\r') {
          // you've gotten a character on the current line
          currentLineIsBlank = false;
        }
      }
    }
    // give the web browser time to receive the data
    delay(1);
    //Serial.print(httpRequest);
    // close the connection:
    client.stop();
  }
}

Der LED-Globus stellt weitere Herausforderungen. Auf dem Bild erscheint auf Grund der Belichtungszeit nur ein Abschnitt des Bildes, das der Globus darstellen kann. Noch aber funktionieren nicht alle Micro-LEDs vorschriftsmäßig und die Programmierung ist noch nicht gegeben. Also gilt es, den Fehler zu finden. Ein Digitalvoltmeter leistet schon einmal gute Hilfe. Damit allein ist es aber noch nicht getan. Die LED-Zeile verleiht dem Globus noch eine kräftige Unwucht …. . Mehr beim nächsten TAG-Tag.

 

Schreibe einen Kommentar

Diese Website verwendet Akismet, um Spam zu reduzieren. Erfahre mehr darüber, wie deine Kommentardaten verarbeitet werden.