Go Down

Topic: Matrix Display und mal wieder Umlaute  (Read 809 times) previous topic - next topic

1hotte

Apr 09, 2018, 03:02 pm Last Edit: Apr 09, 2018, 05:08 pm by 1hotte
Hallo , mein Name ist Uwe bin 47 Jahre und Neu hier im Forum.

Ich Programmiere eigentlich nur SPS von Siemens. Arduino´s habe ich schon lange aber Nutze sie nur für kleinere dinge ( von Programmieren kann man da nicht sprechen).  


Mein Problem sind Umlaute im Matrix display , die umlaute werden angezeigt ABER irgenwie schummelt sich da ein byte dazu siehe Bild. Das Problem sind die Trennstriche die dort erscheinen.


Ich würde mich freuen wenn es jemanden gibt der Mein Sketch optimieren könnte . Da Ich den Sketch nicht zu 100 % verstehe, da ich ihn nur geändert habe und nicht selber geschrieben habe .



gelesen wird von einer lokalen Adresse die UTF-8 codiert ist.



Code: [Select]
#include <MD_Parola.h>
#include <MD_MAX72xx.h>
#include <TimeLib.h>
#include <WiFiUdp.h>
#include <ESP8266WiFi.h>
#include <ESP8266HTTPClient.h>
#include <ArduinoJson.h>
#include <FS.h>
#include <WiFiManager.h>
#include <ArduinoOTA.h>

char refreshSeconds[10] = "60";
char scrollPause[10] = "5";
char url[255] = "192.168.1.68:8087/getPlainValue/system.adapter.simple-api.0.Matrix_Display";
char scrollSpeed[10] = "25";

textEffect_t scrollEffectIn  = PA_SCROLL_LEFT;
textEffect_t scrollEffectOut = PA_SCROLL_UP;
textPosition_t scrollAlign   = PA_CENTER;

String configFilename     = "sysconf.json";

//fixe Display
#define MAX_DEVICES 12
#define CLK_PIN   D7
#define DATA_PIN  D6
#define CS_PIN    D8
MD_Parola P = MD_Parola(DATA_PIN, CLK_PIN, CS_PIN, MAX_DEVICES);
//MD_Parola P = MD_Parola(CS_PIN, MAX_DEVICES);
uint8_t degC[] = {5, 6 , 15 , 9 , 15 , 6 };
uint8_t line[] = {4,  0, 8, 8, 8 };
uint8_t plus[] = {5, 8, 8, 62, 8, 8};
uint8_t block[] =  {3, 255, 255, 255};
uint8_t heart[] = {5, 28, 62, 124, 62, 28};
uint8_t oe[] = {5, 56, 69, 68, 69, 56};
uint8_t OE[] = {5, 61, 66, 66, 66, 61};
uint8_t ue[] = {5, 60, 65, 64, 33,124};
uint8_t UE[] = {5, 60, 65, 64, 65, 60};
uint8_t ae[] = {5, 32, 85, 84,121, 64};
uint8_t AE[] = {5, 121, 20, 18, 20, 121};

   
char curMessage[512];

int loopCount = 0;
int cnt = 0;
long lastMillis = 0;
String valueArray[20];
int valueCount = 0;
int intensity = 0;
int modeCnt = 0;
byte timeSetTryCount = 0;

//WifiManager - don't touch
#define IPSIZE              16
bool shouldSaveConfig        = false;
bool wifiManagerDebugOutput  = false;
char ip[15]      = "0.0.0.0";
char netmask[15] = "0.0.0.0";
char gw[15]      = "0.0.0.0";
bool startWifiManager = false;

const int NTP_PACKET_SIZE = 48;
byte packetBuffer[ NTP_PACKET_SIZE];
unsigned int localNTPport = 2390;
const char* ntpServerName = "ptbtime2.ptb.de";
WiFiUDP NTPudp;

int localCNTRLport = 6610;
char incomingPacket[255];
WiFiUDP CNTRLudp;

#define key1 D1
#define key2 D2
bool key1last = false;
bool key2last = false;

void setup() {
  Serial.begin(115200);
  pinMode(key1, INPUT_PULLUP);
  pinMode(key2, INPUT_PULLUP);
  P.begin();
  P.setIntensity(intensity);
  P.displayClear();
  P.displaySuspend(false);
  P.addChar('$', degC);
  P.addChar('-', line);
  P.addChar('_', block);
  P.addChar('?', heart);
  P.addChar('ö', oe);
  P.addChar('Ö', OE);
  P.addChar('ü', ue);
  P.addChar('Ü', UE);
  P.addChar('ä', ae);
  P.addChar('Ä', AE);
 
  P.displayText("Starte...", PA_LEFT, 25, 10, PA_PRINT, PA_PRINT);
  P.displayAnimate();

  if (digitalRead(key1) == LOW || digitalRead(key2) == LOW) {
    startWifiManager = true;
  }

  if (!SPIFFS.begin()) {
    Serial.println("Failed to mount file system");
  } else {
    if (!loadSysConfig()) {
      Serial.println("Failed to load config");
    } else {
      Serial.println("Config loaded");
    }
  }

  //Nachdem die Config geladen wurde...
  P.setIntensity(intensity);

  if (doWifiConnect() == true) {
    NTPudp.begin(localNTPport);
    CNTRLudp.begin(localCNTRLport);
    setSyncProvider(getNtpTime);
    setSyncInterval(3600);
    while (timeStatus() == timeNotSet) {
      Serial.println("Waiting for Time set");
      delay(1500);
      timeSetTryCount++;
      if (timeSetTryCount > 4) {
        P.displayText("NTP FAILURE", PA_LEFT, 25, 10, PA_PRINT, PA_PRINT);
        P.displayAnimate();
        delay(2000);
        ESP.restart();
      }
    }
    P.displayText(curMessage, scrollAlign, String(scrollSpeed).toInt(), String(scrollPause).toInt() * 1000, scrollEffectIn, scrollEffectOut);
    startOTAhandling();
  }
  else ESP.restart();
}

void loop() {
  ArduinoOTA.handle();
  if (digitalRead(key1) == LOW ) {
    if (!key1last) {
      key1last = true;
      intensity = intensity + 2;
      if (intensity > 14) intensity = 0;
      P.setIntensity(intensity);
      Serial.println("Set intensity to " + String(intensity));
      if (!saveSysConfig()) {
        Serial.println("Failed to save config");
      } else {
        Serial.println("Config saved");
      }
      delay(50);
    }
  } else {
    key1last = false;
  }

  if (digitalRead(key2) == LOW ) {
    if (!key2last) {
      key2last = true;
      modeCnt++;
      if (modeCnt > valueCount + 1) modeCnt = 0;
      Serial.println("Mode: " + String(modeCnt));
      delay(50);
    }
  } else {
    key2last = false;
  }

  String udpMessage = handleUDP();

  if (((millis() - lastMillis > String(refreshSeconds).toInt() * 1000) || lastMillis == 0 || udpMessage == "update") && String(url) != "") {
    Serial.println("Fetching data from URL...");
    String valueString = loadDataFromURL();
    char buf[valueString.length() + 1];
    valueString.toCharArray(buf, sizeof(buf));
    char *p = buf;
    char *str;
    valueCount = 0;
    while ((str = strtok_r(p, ";", &p)) != NULL) {
      valueArray[valueCount] = str;
      valueCount++;
    }
    lastMillis = millis();
  }

  if (modeCnt == 0) {
    if (P.displayAnimate())
    {
      loopCount++;
      if (loopCount > valueCount || valueCount == 0) {
        String Zeit = calcTime(now());
        Zeit.toCharArray(curMessage, 10);
        loopCount = -1;
      } else {
        String currentValue = valueArray[loopCount];
        currentValue.toCharArray(curMessage, currentValue.length() + 1);
      }
      P.displayReset();
      P.displayText(curMessage, scrollAlign, String(scrollSpeed).toInt(), String(scrollPause).toInt() * 1000, scrollEffectIn, scrollEffectOut);
    }
  } else {
    if (valueCount > 0) {
      String currentValue = valueArray[modeCnt - 1];
      currentValue.toCharArray(curMessage, currentValue.length() + 1);
    }
    if (modeCnt > valueCount) {
      String Zeit = calcTime(now());
      Zeit.toCharArray(curMessage, 10);
    }

    P.displayText(curMessage, PA_CENTER, String(scrollSpeed).toInt(), 10, PA_PRINT, PA_PRINT);
    P.displayAnimate();
  }
}

String loadDataFromURL() {
  if (WiFi.status() == WL_CONNECTED) {
    HTTPClient http;
    http.setTimeout(3000);
    Serial.println("getState url: " + String(url));
    http.begin(url);
    int httpCode = http.GET();
    String payload = "error";
    if (httpCode > 0) {
      payload = http.getString();
    }
    if (httpCode != 200) {
      Serial.println("HTTP " + String(url) + " fail");
      payload = " HTTP ERROR ";
    }
    http.end();

    if (payload.indexOf("</ret>") > 0) {
      payload = payload.substring(payload.indexOf("<ret>"));
      payload = payload.substring(5, payload.indexOf("</ret>"));
    } else {
      payload = payload.substring(1, payload.length() - 1);
    }
    Serial.println("getState payload = " + payload);
    return payload;
  } else ESP.restart();
}

Tommy56

Dein Display/die Lib dazu kann kein UTF-8.
Setze Deinen Sketch bitte direkt ins Forum. Nutze dazu Codetags (</>-Button oben links im Forumseditor)

Gruß Tommy
"Wer den schnellen Erfolg sucht, sollte nicht programmieren, sondern Holz hacken." (Quelle unbekannt)

noiasca

Da Ich den Sketch nicht zu 100 % verstehe, da ich ihn nur geändert habe und nicht selber geschrieben habe .
woher kopiert? URL?
how to react on postings:
- post helped: provide your final sketch, say thank you & give karma.
- post not understood: Ask as long as you understand the post
- post is off topic (or you think it is): Stay to your topic. Ask again.
- else: Ask again.

1hotte

Dein Display/die Lib dazu kann kein UTF-8.
Setze Deinen Sketch bitte direkt ins Forum. Nutze dazu Codetags (</>-Button oben links im Forumseditor)

Gruß Tommy
ok

woher kopiert? URL?
Link eingefügt


postmaster-ino

Hi

Woher kommt diese Anzeige?
Sehe in dem Sketch Nichts, wo auch nur ansatzsweise diese Zeichen ausgegeben werden sollen.
Hast Du die Daten, Die an die MAtrix geschickt werden, auch Mal parallel ins Terminal senden lassen? (denke, als HEX wird sinnvoller sein, da hier Steuerzeichen erkannt werden können)
Denke, Du bekommst schon Mist überliefert, Welchen der µC dann auf's Display bringt.

MfG
anscheinend ist Es nicht erwünscht, einen Foren-internen Link als 'Homepage' einzubinden, damit JEDER nur einen Klick von combie's Liste zum Thema State-Maschine entfernt ist.
... dann eben nicht ...

michael_x

Denke, Du bekommst schon Mist überliefert, Welchen der µC dann auf's Display bringt.
utf-8 sind bei Umlauten eben 2 Byte je Zeichen. Ob das Mist ist, sei mal dahingestellt. Aus utf-8 ansi machen ist bei einfachen Sachen zwar möglich, aber machen muss man es schon. Falls die Matrix überhaupt damit oder mit sonst einer Erweiterung der 7-bit ascii Zeichen zurecht kommt.  (?)

Whandall

Ein einfacher Weg wäre eine Funktion die von UTF nach Matrix-ASCII convertiert.

Code: [Select]
String matrixFromUTF8(String utfIn);
Ah, this is obviously some strange usage of the word 'safe' that I wasn't previously aware of. (D.Adams)

1hotte

Ein einfacher Weg wäre eine Funktion die von UTF nach Matrix-ASCII convertiert.

Code: [Select]
String matrixFromUTF8(String utfIn);
Wie könnte ich das einbinden ?

Whandall

Du hast die Funktion schon geschrieben? Cool.

Einbinden würde ich sie auf dem Weg zwischen UTF-Eingang und Matrix-Ausgang.

Ah, this is obviously some strange usage of the word 'safe' that I wasn't previously aware of. (D.Adams)

1hotte

Nein sorry Missverständnis :(  würde es nicht ausreichen den "strich" rauszunehmen ? Ich brauche ja nur die umlaute .

 

Whandall

#10
Apr 09, 2018, 11:39 pm Last Edit: Apr 09, 2018, 11:48 pm by Whandall
Du hast den Kode, die empfangenen Daten und das Display.

Und reicht es den Strich herauszunehmen?

Du könntest Glück haben, die Konversion von Umlauten könnte zufällig
dem zweiten Byte einer 2-Byte UTF-8 Kodierung entsprechen und
das erste Byte könnte zufällig für alle Umlaute gleich sein.
Ah, this is obviously some strange usage of the word 'safe' that I wasn't previously aware of. (D.Adams)

1hotte

Ja die Sachen habe ich , und dazu noch ganz viel von "keinen plan ". :(

Wenn Es eine Siemens Steuerung währe würde ich das die 2-Byte in den umlaufen rauspicken und das Das Byte dann dann einfach nach links oder rechts schieben und wieder zurück so das es mit nullen aufgefüllt währe .

Sorry aber ich bin echt ein voll NUB in der Arduino Programierung .

Whandall

Und wenn es ein Sandkuchen wäre, würdest wohl ein Förmchen nehmen.

google liefert bei der Anfrage "string utf-8 c++ umwandeln" 602000 Hits.
Ah, this is obviously some strange usage of the word 'safe' that I wasn't previously aware of. (D.Adams)

postmaster-ino

Wie wäre es, erst Mal herauszufinden, WAS als 2.tes (oder erstes) Byte gesendet wird?
Ausgabe (in HEX, ich wiederhole mich) im Serial-Terminal?

... nur so als Idee, daß hier Mal fertig wird ...

MfG
anscheinend ist Es nicht erwünscht, einen Foren-internen Link als 'Homepage' einzubinden, damit JEDER nur einen Klick von combie's Liste zum Thema State-Maschine entfernt ist.
... dann eben nicht ...

Go Up