ESP8266 NodeMcu mit int.OLED
Ich habe eine kleine Animation für mein OLED wenn Daten per UDP empfangen wurden.
Statt delay möchte ich lieber millis einsetzen.
Problem: Die Animation (im Unterprogramm ganz unten) wird nur einmal bei Datenempfang (if (packetSize).....) durchlaufen. Einen aufgerechneten Milliwert werde ich also so nicht erreichen!?
Könnt ihr mir einen Tip geben wie ich das trotzdem umsetzen kann? Einen Marker setzen und im Haupt-Loop laufen lassen? Wird aber dann sehr unübersichtlich...
#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
boolean Relais1 = 0;
boolean Relais2 = 0;
boolean Relais3 = 0;
boolean Relais4 = 0;
boolean Relais5 = 0;
boolean Relais6 = 0;
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 :-)";
int Heizleistung = 0;
void setup() {
Serial.begin(9600);
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);
WiFiStart(); //Unterprogramm verbindet ESP mit Router
Udp.begin(localUdpPort);
delay(3000);
}
void loop() {
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';
}
//Serial.printf("UDP packet Inhalt: %s\n", incomingPacket);
//Symbol für neue Daten empfangen kurz anzeigen
DatenEmpfSymbol(); // Unterprogramm um Dateneingang als Animationspunkt auf OLED anzuzeigen
Relais1 = bitRead(atoi(incomingPacket),0);
Relais2 = bitRead(atoi(incomingPacket),1);
Relais3 = bitRead(atoi(incomingPacket),2);
Relais4 = bitRead(atoi(incomingPacket),3);
Relais5 = bitRead(atoi(incomingPacket),4);
Relais6 = bitRead(atoi(incomingPacket),5);
Heizleistung=0;
if (Relais1==1){Heizleistung=Heizleistung+50;}
if (Relais2==1){Heizleistung=Heizleistung+100;}
if (Relais3==1){Heizleistung=Heizleistung+200;}
if (Relais4==1){Heizleistung=Heizleistung+200;}
if (Relais5==1){Heizleistung=Heizleistung+200;}
if (Relais6==1){Heizleistung=Heizleistung+200;}
Anzeige(); //Unterprogramm vfür OLED Datenanzeige
}
}
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=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 Anzeige() // Unterprogramm um Daten auf OLED anzuzeigen
{
display.clear();
if (Relais1==1){display.fillCircle(3, 6, 3);} //int16_t x, int16_t y, int16_t radius
else {display.drawCircle(3, 6, 3);}
if (Relais2==1){display.fillCircle(3, 16, 3);}
else {display.drawCircle(3, 16, 3);}
if (Relais3==1){display.fillCircle(3, 26, 3);}
else {display.drawCircle(3, 26, 3);}
if (Relais4==1){display.fillCircle(3, 38, 3);}
else {display.drawCircle(3, 38, 3);}
if (Relais5==1){display.fillCircle(3, 48, 3);}
else {display.drawCircle(3, 48, 3);}
if (Relais6==1){display.fillCircle(3, 58, 3);}
else {display.drawCircle(3, 58, 3);}
display.drawString(9, 0, "50W");
display.drawString(9, 10, "100W");
display.drawString(9, 20, "200W");
display.drawString(9, 32, "200W");
display.drawString(9, 42, "200W");
display.drawString(9, 52, "200W");
display.drawString(50, 33, "empf= " + String(incomingPacket));
display.drawString(50, 43, "binaer= " + String(bitRead(atoi(incomingPacket),5)) + String(bitRead(atoi(incomingPacket),4)) + String(bitRead(atoi(incomingPacket),3)) + String(bitRead(atoi(incomingPacket),2)) + String(bitRead(atoi(incomingPacket),1)) + String(bitRead(atoi(incomingPacket),0)));
display.drawString(50, 53, "HzLeist.=" + String(Heizleistung) + "W");
display.display();
delay(300);
}
void DatenEmpfSymbol() // Unterprogramm um Dateneingang als Animationspunkt auf OLED anzuzeigen
{
display.drawCircle(122, 4, 1);
display.display();
delay(100);
display.drawCircle(122, 4, 2);
display.display();
delay(100);
display.setColor(BLACK);
display.drawCircle(122, 4, 1);
display.display();
delay(100);
display.setColor(WHITE);
display.drawCircle(122, 4, 4);
display.display();
delay(100);
display.setColor(BLACK);
display.drawCircle(122, 4, 2);
display.display();
delay(100);
display.drawCircle(122, 4, 4);
display.display();
display.setFont(ArialMT_Plain_10);
display.setColor(WHITE);
}