Du meinst wie es auf dem OLED aussieht?
Der Unterschied ist marginal. Momentan etwas ästhetischer mit dem etwas grösseren Abstand in der Mitte.
Du meinst wie es auf dem OLED aussieht?
Der Unterschied ist marginal. Momentan etwas ästhetischer mit dem etwas grösseren Abstand in der Mitte.
bin ich der falsche Addressat, mit OLED mach ich seltenst was.
Mir ist nur die Ausgabe der IP aufgefallen. Die IP Struktur könnte printable sein, vieleicht spart das das sprintf
@stoni99 ... Zahlenkolonnen rechtsbündig auszurichten schaut in der Regel schöner aus.
Also ich würde das mit einfachem 10er Schritt machen und den rechten Teil nach oben ziehen.
Alternativ oben einen pixel tiefer anfangen, dann ist der entstehende Rand nicht ganz so auffällig.
Also ich bin noch immer der Meinung, das das auch mit 10er Schritten geht ![]()
Ich hab mal den Code umgeschrieben und hoffe nichts vergessen zu haben. Wenn sich Zeit findet, las den mal laufen - ich wüsste gern ob der geht...
#include <ESP8266WiFi.h>
#include <SSD1306Wire.h> // für OLED` 128x64
#include <WiFiUdp.h>
//#define LED D7
WiFiUDP Udp;
unsigned int localUdpPort = 4210; // local port to listen on
char befehl[8]; // buffer for incoming packets in binär
const uint8_t relaisNum = 6;
bool relais[relaisNum] = {false};
uint16_t leistung[relaisNum] = {50, 100, 200, 200, 200, 200};
uint16_t heizLeistung = 0;
String myString;
char myIpString[24]; //um IP Adresse in String umzuwandeln und anzuzeigen
char *ssid = "++++++++++++";
char *password = "##########";
// Initialize the OLED display using Wire library
SSD1306Wire display(0x3c, D1, D2); //D2=SDK D1=SCK As per labeling on NodeMCU
//unsigned int localUdpPort = 4210;
char incomingPacket[256];
char replyPacket[] = "Hi there! Got the message :-)";
bool newMessage = false;
void WiFiStart() // Unterprogramm um WiFi am Router anzumelden
{
// Connect to WiFi network
display.clear();
display.setFont(ArialMT_Plain_10);
display.drawString(0, 0, "Call to " + String(ssid));
display.display();
WiFi.begin(ssid, password);
int i = 0;
while (WiFi.status() != WL_CONNECTED)
{
display.drawString(i, 9, ".");
display.display();
delay(500);
i += 3;
}
// Print the IP address
IPAddress myIp = WiFi.localIP();
sprintf(myIpString, "%d.%d.%d.%d", myIp[0], myIp[1], myIp[2], myIp[3]); //IP muss in String umgewandelt werden
display.clear();
display.setFont(ArialMT_Plain_16);
display.drawString(0, 0, myIpString);
display.display();
delay(2000); // Unterprogramm aufrufen um Sprengerzeiten neu einzustellen
}
void displayStart()
{
display.init();
display.flipScreenVertically();
display.setTextAlignment(TEXT_ALIGN_LEFT);
display.setFont(ArialMT_Plain_16);
//display.setFont(ArialMT_Plain_10);
display.clear();
display.drawString(0, 0, "Start...");
display.display();
delay(1000);
}
void setup()
{
Serial.begin(9600);
myString.reserve(25);
displayStart();
WiFiStart(); //Unterprogramm verbindet ESP mit Router
Udp.begin(localUdpPort);
delay(3000);
}
void loop()
{
readUDPData();
printNewData(); //Unterprogramm vfür OLED Datenanzeige
}
void readUDPData()
{
int packetSize = Udp.parsePacket();
if (packetSize)
{
//Serial.printf("Received %d bytes from %s, port %d\n", packetSize, Udp.remoteIP().toString().c_str(), Udp.remotePort());
int len = Udp.read(incomingPacket, 255);
if (len > 0)
{
incomingPacket[len] = '\0';
newMessage = true;
}
//Serial.printf("UDP packet Inhalt: %s\n", incomingPacket);
heizLeistung = 0;
for (byte b = 0; b < relaisNum; b++)
{
relais[b] = bitRead(atoi(incomingPacket), b);
if (relais[b]) heizLeistung += leistung[b];
}
}
}
void anzeige() // Unterprogramm um Daten auf OLED anzuzeigen
{
//int16_t x, int16_t y, int16_t radius
const uint16_t xCircle = 3, xString = 9, y = 6, r = 3, line = 10;
for (byte b = 0; b < relaisNum; b++)
{
relais[b] ? display.fillCircle(xCircle, y + b * line, r) : display.drawCircle(xCircle, y + b * line, r);
myString = String(leistung[b]) + "W";
display.drawString(xString, b * line, myString);
}
display.drawString(50, 33, "empf: " + String(incomingPacket));
myString = "binaer: ";
for (byte b = relaisNum; b > 0; b--)
{myString = myString + String(relais[b - 1]);}
display.drawString(50, 43, myString);
display.drawString(50, 53, "HzLeist.: " + String(heizLeistung) + "W");
display.display();
delay(300);
}
void printNewData() // Display Ausgabe
{
const uint8_t maxSymbol = 7;
static uint8_t symbol = 0;
static uint8_t lastSymbol = maxSymbol;
static uint32_t lastMillis = 0;
const uint16_t xCircle = 122, yCircle = 4, pause = 100;
if (newMessage) // Neue Daten gesetzt? ...
{
if (symbol == maxSymbol) // ... start nicht gesetzt? ...
{lastMillis = millis(); symbol = 0;} // ... Merken und aulösen
else
{if (millis() - lastMillis >= pause * symbol) symbol++;} // ... oder nächsten Schritt
}
else return; // wenn keine neue Message hier Ende
//
switch (symbol != lastSymbol ? symbol : 255)
{
case 0: display.setColor(WHITE); display.clear(); symbol ++; /* FALLTHRU */ // HIER KOMMT KEIN BREAK!
case 1: display.drawCircle(xCircle, yCircle, 1); break;
case 2: display.drawCircle(xCircle, yCircle, 2); break;
case 3: display.setColor(BLACK); display.drawCircle(xCircle, yCircle, 1); break;
case 4: display.setColor(WHITE); display.drawCircle(xCircle, yCircle, 4); break;
case 5: display.setColor(BLACK); display.drawCircle(xCircle, yCircle, 2); break;
case 6: display.drawCircle(xCircle, yCircle, 4); break;
case 7:
display.setFont(ArialMT_Plain_10);
display.setColor(WHITE);
anzeige();
newMessage = false;
break;
}
display.display();
lastSymbol = symbol;
}
Ja, funktioniert!
Nur ein kleiner Schönheitsfehler: Die IP Adresse wird beim Neustart noch angezeigt obwohl die Datenanzeige da ist (überlagert). Nach Neudaten wieder ok.
Ich gebe zu: Dein Code ist eleganter! ![]()
Das war Sinn der Übung. ![]()
Ich wollte vor allem erstmal Dein Vorhaben verstehen.
Was die erste Anzaige angeht, habe ich mal noch was umgebaut.
Dein CharArray habe ich mal gestrichen... und das mal dem reserviertem String zugeordnet.
Im setup() kommt zuerst displayStart, was auf 0,0 die erste Ausgabe mit 16p macht.
Dann kommt das Wifi, was ebenfalls mit 16p daherkommt. Ich habe da am Ende nach dem display.display() festgelegt, das als nächstes der Display gelöscht und dann mit 10p geschrieben wird.
Sobald das nächste mal der display beschrieben wird, hat er von dort die Vorgaben.
Und ich hab in dem switch/case noch den default mit rein genommen. Die Bedingung zum switch muss ja auch einen Sinn haben ![]()
Dann sollte das jetzt durch sein.
#include <ESP8266WiFi.h>
#include <SSD1306Wire.h> // für OLED` 128x64
#include <WiFiUdp.h>
//#define LED D7
WiFiUDP Udp;
unsigned int localUdpPort = 4210; // local port to listen on
char befehl[8]; // buffer for incoming packets in binär
const uint8_t relaisNum = 6;
bool relais[relaisNum] = {false};
uint16_t leistung[relaisNum] = {50, 100, 200, 200, 200, 200};
uint16_t heizLeistung = 0;
String myString;
char *ssid = "++++++++++++";
char *password = "##########";
// Initialize the OLED display using Wire library
SSD1306Wire display(0x3c, D1, D2); //D2=SDK D1=SCK As per labeling on NodeMCU
//unsigned int localUdpPort = 4210;
char incomingPacket[256];
char replyPacket[] = "Hi there! Got the message :-)";
bool newMessage = false;
void WiFiStart() // Unterprogramm um WiFi am Router anzumelden
{
// Connect to WiFi network
display.clear();
display.setFont(ArialMT_Plain_10);
display.drawString(0, 0, "Call to " + String(ssid));
display.display();
WiFi.begin(ssid, password);
int i = 0;
while (WiFi.status() != WL_CONNECTED)
{
display.drawString(i, 9, ".");
display.display();
delay(500);
i += 3;
}
// Print the IP address
IPAddress myIp = WiFi.localIP();
myString = String(myIp[0]) + '.' + String(myIp[1]) + '.' + String(myIp[2]) + '.' + String(myIp[3]);
display.clear();
display.setFont(ArialMT_Plain_16);
display.drawString(0, 0, myString);
display.display();
delay(2000); // Unterprogramm aufrufen um Sprengerzeiten neu einzustellen
}
void displayStart()
{
display.init();
display.flipScreenVertically();
display.setTextAlignment(TEXT_ALIGN_LEFT);
display.setFont(ArialMT_Plain_16);
display.clear();
display.drawString(0, 0, "Start...");
display.display();
delay(1000);
}
void setup()
{
Serial.begin(9600);
myString.reserve(25);
displayStart();
WiFiStart(); //Unterprogramm verbindet ESP mit Router
display.clear();
display.setFont(ArialMT_Plain_10);
Udp.begin(localUdpPort);
delay(3000);
}
void loop()
{
readUDPData();
printNewData(); //Unterprogramm vfür OLED Datenanzeige
}
void readUDPData()
{
int packetSize = Udp.parsePacket();
if (packetSize)
{
//Serial.printf("Received %d bytes from %s, port %d\n", packetSize, Udp.remoteIP().toString().c_str(), Udp.remotePort());
int len = Udp.read(incomingPacket, 255);
if (len > 0)
{
incomingPacket[len] = '\0';
newMessage = true;
}
//Serial.printf("UDP packet Inhalt: %s\n", incomingPacket);
heizLeistung = 0;
for (byte b = 0; b < relaisNum; b++)
{
relais[b] = bitRead(atoi(incomingPacket), b);
if (relais[b]) heizLeistung += leistung[b];
}
}
}
void anzeige() // Unterprogramm um Daten auf OLED anzuzeigen
{
//int16_t x, int16_t y, int16_t radius
const uint16_t xCircle = 3, xString = 9, y = 6, r = 3, line = 10;
for (byte b = 0; b < relaisNum; b++)
{
relais[b] ? display.fillCircle(xCircle, y + b * line, r) : display.drawCircle(xCircle, y + b * line, r);
myString = String(leistung[b]) + "W";
display.drawString(xString, b * line, myString);
}
display.drawString(50, 33, "empf: " + String(incomingPacket));
myString = "binaer: ";
for (byte b = relaisNum; b > 0; b--)
{myString = myString + String(relais[b - 1]);}
display.drawString(50, 43, myString);
display.drawString(50, 53, "HzLeist.: " + String(heizLeistung) + "W");
display.display();
delay(300);
}
void printNewData() // Display Ausgabe
{
const uint8_t maxSymbol = 7;
static uint8_t symbol = 0;
static uint8_t lastSymbol = maxSymbol;
static uint32_t lastMillis = 0;
const uint16_t xCircle = 122, yCircle = 4, pause = 100;
if (newMessage) // Neue Daten gesetzt? ...
{
if (symbol == maxSymbol) // ... start nicht gesetzt? ...
{lastMillis = millis(); symbol = 0;} // ... Merken und aulösen
else
{if (millis() - lastMillis >= pause * symbol) symbol++;} // ... oder nächsten Schritt
}
else return; // wenn keine neue Message hier Ende
//
switch (symbol != lastSymbol ? symbol : 255)
{
case 0: display.setColor(WHITE); display.clear(); symbol ++; /* FALLTHRU */ // HIER KOMMT KEIN BREAK!
case 1: display.drawCircle(xCircle, yCircle, 1); break;
case 2: display.drawCircle(xCircle, yCircle, 2); break;
case 3: display.setColor(BLACK); display.drawCircle(xCircle, yCircle, 1); break;
case 4: display.setColor(WHITE); display.drawCircle(xCircle, yCircle, 4); break;
case 5: display.setColor(BLACK); display.drawCircle(xCircle, yCircle, 2); break;
case 6: display.drawCircle(xCircle, yCircle, 4); break;
case 7:
display.setFont(ArialMT_Plain_10);
display.setColor(WHITE);
anzeige();
newMessage = false;
break;
default:
return;
break;
}
display.display();
lastSymbol = symbol;
}
This topic was automatically closed 180 days after the last reply. New replies are no longer allowed.