2018
HOME

Zusammenspiel verschiedener Komponenten
WiFi-LED Dot Matrix mit MAX7219
Ergänzung zum Buch
Messen Steuern Regeln mit Smartphone und Tablet
aWatch - model Sweden
Abbildung: Der Seewetterbericht als Laufschrift-Test live aus dem Äther.
An anderer Stelle auf dieser Seite wird gezeigt, wie Seewetterberichte als Laufschrift live über WLAN zur Anzeige gebracht werden.

An dieser Stelle sollen die Softwarekomponenten vorgestellt werden, die es erlauben sollen das eigene Projekt zu vereinfachen.

Die Blockdarstellung zeigt das Zusammenspiel der Anordnung: Ein Radio empfängt über HF Signale über die Stabantenne und leitet das NF-Signal einem Windows-Tablet oder PC zu.

Das Signal erreicht die Decoder-Software SeaTTY über die Soundkarte, die Töne in Texte wandelt. Dieses Programm legt die empfangenen Meldungen als Klartext-Dateien in ein Verzeichnis "Messages" ab. Ein VBScript überprüft ständig, ob eine neue Datei vorliegt und gibt diese dann auf der Windows-Konsole (DOS-Fenster) als Text-Kopie aus. Mit NetCat können diese Ausgaben über TCP/IP-WLAN über WiFi weiter gereicht werden (vgl. Kapitel 2.2 im Buch).

Das im Herbst 2017 erschienene Messen Steuern Regeln mit Smartphone und Tablet zeigt u.a. wie der ESP8266 ohne Arduino benutzt werden kann. Auch VBScript und NetCat sind dort mit Beispielen vertreten und werden im hinteren Teil "Zusammenspiel" für ähnlichen Beispiele benutzt. Das Windows-Tablet kommt dort ebenfalls häufiger zum Einsatz.

Ein Sketch in C/C++ versetzt den ESP8266 in die Lage einen eigenen HotSpot aufzuspannen und darüber die Verbindung zu NetCat des Win-PC herzustellen, die Texte zu empfangen und auf dem Dot-Matrix-Display durch entsprechende Ansteuerungen zur Anzeige zu bringen.
Abbildung: Blockdarstellung des Zusammenspiels

Im Einzelnen sind dies - wie auch aus der Blockdarstellung erkennbar:

SeaTTY und NetCat sind fertige Anwendungsprogramme, die hier nicht weiter erläutert werden sollen. Hier geht es zunächst um die Überwachung des "Messages"-Verzeichnisses der dekodierten Meldungen.


VBScript - mxseatty.vbs
Das Script ist abgeleitet vom Beispiel aus dem Menüpunkt Samples/Storage/Monitor File Creation im VBScript-Editor und überwacht hier das Verzeichnis "C:\ProgrammData\SeaTTY\Messages". Das Zeitintervall steht in Zeile 9 und ist auf 5 Sekunden eingestellt.

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
' From Monitor File Creation
strMessages = "C:\\\\ProgramData\\\\SeaTTY\\\\Messages""'
strComputer = "."
Set objWMIService = GetObject("winmgmts:" _
    & "{impersonationLevel=impersonate}!\\" & _
        strComputer & "\root\cimv2")

Set colMonitoredEvents = objWMIService.ExecNotificationQuery _
    ("SELECT * FROM __InstanceCreationEvent WITHIN 5 WHERE " _
        & "Targetinstance ISA 'CIM_DirectoryContainsFile' and " _
            & "TargetInstance.GroupComponent= " _
                & "'Win32_Directory.Name = strMessages")
Do
    Set objLatestEvent = colMonitoredEvents.NextEvent
    'Wscript.Echo objLatestEvent.TargetInstance.PartComponent
    
    s=objLatestEvent.TargetInstance.PartComponent
    i=InStr(s,"DataFile.Name=")
    If i>0 Then
     i=i+Len("DataFile.Name=")+1
     s=Mid(s,i)
     s=Left(s,Len(s)-1)
     s=Replace(s,"\\","\")
     l=filesize(s)
     WScript.Echo "~~~~~~  "
     WScript.Echo time
     WScript.Echo "  ~~~~~~" 
     If l < (5*1024) Then
       printfile s
     Else
       WScript.Echo s
       WScript.Echo "-----> 5k!"
     End if 
    End If
Loop

Sub printfile(filename)
' From Read a Text File from the Bottom Up
 Dim arrFileLines()
 Set objFSO = CreateObject("Scripting.FileSystemObject")
 Set objFile = objFSO.OpenTextFile(filename, 1)
 Do Until objFile.AtEndOfStream
     s = objFile.ReadLine
     wscript.echo s
 Loop
 objFile.Close
End sub

Function filesize(filename)
   Dim fso, f
   Set fso = CreateObject("Scripting.FileSystemObject")
   Set f = fso.GetFile(filename)
   filesize = f.size    
End Function

Eine neue Datei wird mit ihrem Pfad der Zeichenkette s übergeben und daraus der Pfad umgebaut, um zunächst die Länge (max. 5 kB) zu überprüfen mit der Routine filesize, damit nicht zu große Dateien dem ESP8266 zugeschickt werden. Falls alles stimmt gibt die Routine printfile - abgeleitet aus dem Beispiel Read a Text File from the Bottom Up - mit wscript.echo ausgegeben.


Batch Kommandozeilenscript

Um das Script zu testen, sollte eine mxseatty.bat-Datei (BAT-Datei 1) mit folgendem Inhalt angelegt werden:

cscript mxseatty.vbs

Mit einem Doppelklick auf diese BAT-Datei werden die Ausgaben des Scripts umgeleitet und erscheinen in einem "DOS-Fenster". Diese Ausgaben sollen auf das Dot-Matrix-Display umgelenkt werden.


NetCat Brücke zwischen den Komponenten
Mit der Zeile C:\Temp\nc\nc -L -p 23 -e cmd.exe in einer Textdatei, die nc cmd.bat (BAT-Datei 2) heißen könnte, wird dafür gesorgt, dass NetCat als nc.exe im Verzeichnis C:\Temp\nc mit den angegebenen Parametern gestartet wird. Diese Parameter sorgen dafür, dass NetCat auf Port 23 horcht und falls ein Ruf eingeht cmd.exe startet. Damit werden Ein- und Ausgaben nun über den Anrufer auf Port 23 abgewickelt. Diese Rolle übernimmt der ESP8266 mit seinem Sketch:

ESP8266 Sketch für den Arduino-Core

Vorausgesetzt die Arduino-IDE ist so eingerichtet, dass auch ein ESP8266 unterstützt wird, kann der folgende Sketch die Verbindung zwischen PC und Display übernehmen.

  1
  2
  3
  4
  5
  6
  7
  8
  9
 10
 11
 12
 13
 14
 15
 16
 17
 18
 19
 20
 21
 22
 23
 24
 25
 26
 27
 28
 29
 30
 31
 32
 33
 34
 35
 36
 37
 38
 39
 40
 41
 42
 43
 44
 45
 46
 47
 48
 49
 50
 51
 52
 53
 54
 55
 56
 57
 58
 59
 60
 61
 62
 63
 64
 65
 66
 67
 68
 69
 70
 71
 72
 73
 74
 75
 76
 77
 78
 79
 80
 81
 82
 83
 84
 85
 86
 87
 88
 89
 90
 91
 92
 93
 94
 95
 96
 97
 98
 99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
#include <MD_MAX72xx.h>
#include <SPI.h>

// WITTY
#define MAX_DEVICES    4
#define CS_PIN        15  // or SS
#define SCROLL_DELAY  40  // in milliseconds
#define CHAR_SPACING   1  // pixels between characters

MD_MAX72XX mx = MD_MAX72XX(CS_PIN, MAX_DEVICES);

// Global message buffers shared 
#define	BUF_SIZE (1024*8)  //ESP8266f mem
char curMessage[BUF_SIZE];
char newMessage[BUF_SIZE];
bool newMessageAvailable = false;
uint16_t scrollDelay;	// in milliseconds

/***************************************************
 * WiFi part
 ***************************************************/
#include <ESP8266WiFi.h>
WiFiClient client;
const uint16_t port = 23;
const char *host = "192.168.4.2"; // ip only local ap

// modified from serial example 

void readSerial(void)
{if (client.connected())
  if(client.available())
   {String s=client.readString() ;
    Serial.print(s);
    s.replace("\r","+");s.replace("\n","+");
    memset(newMessage,'\0',BUF_SIZE);
    s.toCharArray(newMessage, s.length()); 
    newMessageAvailable = true;
   }
 if(!client.connected())
  {if(!client.connect(host, port)) 
   {Serial.println("connection failed ");
    Serial.println("wait to connect port 23...");
   }else client.println("mxseatty.bat");
  }
}

uint8_t scrollDataSource(uint8_t dev, MD_MAX72XX::transformType_t t)
{static char *p = curMessage;
 static uint8_t	state = 0;
 static uint8_t	curLen, showLen;
 static uint8_t	cBuf[8];
 uint8_t colData;
 switch(state)
 {case 0: showLen = 
	   mx.getChar(*p++, sizeof(cBuf)/sizeof(cBuf[0]), cBuf);
          curLen = 0;
          state++;
          if (*p == '\0')
          {p = curMessage;
           if (newMessageAvailable)
           {strcpy(curMessage, newMessage);	
            newMessageAvailable = false;
           }
          }
  case 1: colData = cBuf[curLen++];
          if (curLen == showLen)
          {showLen = CHAR_SPACING;
           curLen = 0;
           state = 2;
          }
          break;
  case 2: colData = 0;
          curLen++;
          if (curLen == showLen)
          state = 0;
          break;
  default: state = 0;
 }
 return(colData);
}

void scrollText(void)
{static uint32_t	prevTime = 0;
 if (millis()-prevTime >= scrollDelay)
 {mx.transform(MD_MAX72XX::TSL);
  prevTime = millis();
 }
}

void setup()
{mx.begin();
 mx.setShiftDataInCallback(scrollDataSource);
 mx.control(MD_MAX72XX::INTENSITY, 0);
 scrollDelay = SCROLL_DELAY;
 strcpy(curMessage, "+");
 newMessage[0] = '\0';

 Serial.begin(57600);
 Serial.println("\n[MD_MAX72XX Message Display]");
 Serial.println("Be sure PC wifi  connected to ESPap.");
 Serial.println("On PC start: nc -L -p 23 -e cmd.exe");
 Serial.println("ESP will connect to port 23 at 192.168.4.2");
 Serial.println("All Windows Output will scroll on connect.");

 //WIFI AP
 WiFi.disconnect();
 WiFi.mode(WIFI_OFF);
 WiFi.softAP("ESPap",""); 
 WiFi.mode(WIFI_AP); 
 Serial.println(WiFi.softAPIP());  
 Serial.println(WiFi.localIP());
 Serial.print("\n");
 Serial.print("WiFi Station AP 'ESPap' "); 
 Serial.print("IP address: "); Serial.println(WiFi.softAPIP());
}

void loop()
{readSerial();
 scrollText();
}

Die Bibliothek MD_MA72XX wird zur Ansteuerung der Laufschrift benutzt. Das enthaltene Beispiel Message_Serial, dient als Grundgerüst. Es benutzt zwei Puffer curMessage und newMessage, die den darzustellenden Text beinhalten. Das Beispiel wurde auf ein Minimum gekürzt und mit WiFi-Routinen ergänzt, die überwiegend ESP8266WiFi-Beispielen entnommen wurden. Die Routine readSerial übernimmt nun das Einlesen neuer Texte für die Laufschrift, die auf maximal 8 kB begrenzt sein sollten. Die Hauptschleife besteht nur noch aus readSerial() und scrollText(). Falls es keine Verbindung gibt, so ruckelt das Laufband im TimeOut-Zyklus des Connect-Aufrufs. Bei stehender Verbindung über Port 23 mit dem Win-Tablet läuft der Text in voreingestellter Geschwindigkeit. Da auch auf ein readUntil verzichtet wurde, tritt ein solches TimeOut-Delay auch bei einer neuen Meldung einmalig auf. Auf diese Art und Weise erkennt man, während die alte Meldung noch 'durch tickert', dass neue Nachrichten folgen werden.

Dieser Sketch geht davon aus, dass kein Router oder Internet verfügbar ist. Das eigene WiFi-netz hat den Namen "ESPap" und ist "offen". Der PC muss also erst in diesem Netzwerk angemeldet sein. Ist nur ein PC in der Nähe, so ist dies dann möglicherweise 192.168.4.2, mit dem sich der Sketch im ESP8266 zu verbinden sucht.


Weitere Software
.
Startseite Bücher Software Digital RTV Musik Kontakt

Für Inhalt und weitere Verzweigung externer Links sind die Betreiber der dortigen Seiten verantwortlich - H.-J. Berndt