Go Down

Topic: "8-Bit" Eingang, Texte definieren und speichern (Read 13106 times) previous topic - next topic

postmaster-ino

Hi

Den IST-Zustand kennen wir jetzt - wie ist der SOLL-Zustand?
Du könntest Du z.B. merken, wann eine Meldung zuletzt kam und die Ausgabe auf die SD-Karte für z.B. 15 Minuten unterdrücken, wobei mir dann der Sinn eines LOG-Files entgeht, wenn ich nicht alle Meldungen logge.

Alternativ könntest Du das Anliegen und das Wegfallen der Meldung loggen, wenn Meldung 3 'neu' kommt, wird geloggt, daß Meldung 3 AB JETZT anliegt.
Wenn in der nächsten Runde der Anzeige diese Meldung nicht mehr enthalten ist, wird geloggt, daß die Meldung 3 JETZT weggefallen ist.

Ob Das übersichtlicher wird?
Du kannst ja einen 2.ten Arduino parallel an den Jetzigen hängen und eben zwei SD_Karten beschreiben - so geht Dir zumindest das aktuell funktionierende Log nicht verloren, während Du am Experimentieren bist.

MfG
Dein Problem, Dein Sketch, Deine Bilder.
Ob ich ohne Diese an Deinem Problem arbeiten will, entscheide aber immer noch ich.
Große Buchstaben? Immer wieder, neben Punkt und Komma, gerne gesehen.

Jannomag

Der Logger befindet sich seit einem Jahr in Entwicklung - es ist ein inoffizieller Freundschaftsdienst für eine andere Abteilung meiner Firma. Da der Logger einen alten Drucker ersetzt, der seit 2 Jahren nicht läuft, spielt es keine Rolle, ob der Logger nun läuft oder nicht, so lange es in Arbeit ist. Bedeutet, ich kann jeder Zeit rumbasteln - sofern ich auf Arbeit bin (in der Privatzeit mache ich da nix dran).

Mir fällt es schwer, Ideen in C umzusetzen - ich verstehe, was im Sketch steht, könnte ihn aber ohne Hilfen und Beispielen nicht erneut aus dem Kopf schreiben.

Meine Idee wäre:
Überprüfe alle Meldungen, ob diese in den letzten 40 Sekunden angefallen sind. Wenn ja, nicht auf SD schreiben.
Ansonsten, scheiben.

40 Sekunden entspricht dann 10 Meldungen, was eigentlich nicht vorkommen kann.

Die Frage ist nur, wie viel schafft der Uno zu speichern und zu verarbeiten.

Tommy56

Wieviele verschiedene Meldungen gibt es denn?

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

agmue

Wieviele verschiedene Meldungen gibt es denn?
Acht Leitungen, also theoretisch 256 Meldungen, von denen aber wohl nicht alle vorkommen, aber berücksichtigt werden müssen. So meine Erinnerung.
Die Vorstellungskraft ist wichtiger als Wissen, denn Wissen ist begrenzt. (Albert Einstein)

Tommy56

Also entweder ein Array mit 256 uint32_t = 1024 Byte (256 mögliche Meldungen + letzteMillis) oder wenn nur die letzten 10 Meldungen beachtet werden sollen, ein Array mit 10 * (1+4) Byte = 50 Byte. (Meldungsnummer+letzteMillis)

Die erste Variante hat den schnelleren Zugriff, weil man bei der 2. iterieren muss und bei einer neuen Meldung die älteste rauswerfen muss.

Ich frage mich aber: Wenn das Ding schon seit 2 Jahren tot ist, ob das wirklich noch jemanden interessiert.

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

agmue

Ich frage mich aber: Wenn das Ding schon seit 2 Jahren tot ist, ob das wirklich noch jemanden interessiert.
Nur der Drucker ist tot, nicht die Anlage.
Die Vorstellungskraft ist wichtiger als Wissen, denn Wissen ist begrenzt. (Albert Einstein)

Jannomag

Ich frage mich aber: Wenn das Ding schon seit 2 Jahren tot ist, ob das wirklich noch jemanden interessiert.

Gruß Tommy
Nur der Drucker ist tot, nicht die Anlage.

Genau, die eigentliche Anlage, eine Schiebersteuerung und Messeinheit für Abwasser, mit mehreren Betriebsmodi und direkter Ansteuerung der Motoren inkl. Direktüberwachung, läuft seit 20 Jahren unverändert.
Das ist auch das Problem - vor 20 Jahren hatte meine Firma eine andere Struktur, die Erbauer leben teilweise nicht mehr und die Herstellerfirma existiert auch nicht mehr. Im Laufe der Jahre sind die Unterlagen und die Software verschwunden, letztere mit Sicherheit durch das Sterben der damals schon rückständigen Siemens-Hardware.

Aktuell werden 2 Mal am Tag schriftliche Protokolle angefertigt und zur Umweltbehörde geschickt. Da es schon länger als 2 Jahre so läuft, stört es keinen - wir sind schliesslich auf der Arbeit und nicht auf der Flucht.

Der Logger ist erst im Geiste während einer kleinen Unterhaltung zwischen mir und dem Kollegen, der die Anlage betreut, entstanden, da ich da an dieser Anlage auch meine Abschlussprüfung gemacht habe.

Denke, das sollte Aufschluss geben, über den Grund des ganzen.

Es gibt aktuell 49 definierte Meldungen.
Um neue Meldungen einprogrammieren zu können, würde man Simatic benötigen - aber bei den Wucherpreisen wird das mit Sicherheit keiner bei uns wollen.

Früher konnte man sich auch noch bei uns aus anderen Abteilungen Siemens-Laptops ausleihen. Aber dank Datenschutz und Siemens-Lizenzen geht's nicht mehr (...bei uns).


agmue

Leider fehlt mir eine zündende Idee, wie man das intellektuell leicht zu lösende Problem in den Griff bekommen kann. Daher habe ich mal was zusammengefriemelt, was so la la funktioniert. Um keine Informationen zu verlieren, unterdrücke ich keine Ausgaben, sondern markiere Stellen, an denen sich die Meldungen ändern.

Ich gehe von maximal zehn (HISTANZ) gleichzeitigen Meldungen aus, die in einem Feld (hist) gespeichert werden. Durch Vergleiche wird entschieden, ob eine Ausgabe markiert werden sollte oder nicht.

Die Meldungen habe ich die Datei Meldungstexte.h ausgelagert, um das Programm übersichtlicher zu machen.

Die Ausgabe habe ich in eine gleichnamige Funktion verlagert. Alle Änderungen der Ausgaben habe ich nur für den seriellen Monitor vorgenommen, eine SD-Karte habe ich nicht angeschlossen.

Die textlich gekürzte Datei:

Code: [Select]
//Meldungen festlegen, 256 Möglichkeiten, sofern der Speicher des Arduino es zulässt.
// t_0-256 legt Meldungsnummer fest, die später aufgerufen werden kann
// kmt dient als Platzhalter, um Fehler zu vermeiden
const char t_0[] PROGMEM = "T.0\r\n";
const char t_1[] PROGMEM = "T.1\r\n";
const char t_2[] PROGMEM = "T.2\r\n";
const char t_3[] PROGMEM = "T.3\r\n";
const char t_4[] PROGMEM = "T.4\r\n";
const char t_5[] PROGMEM = "T.5\r\n";
const char t_6[] PROGMEM = "T.6\r\n";
const char t_7[] PROGMEM = "T.7\r\n";
const char t_8[] PROGMEM = "T.8\r\n";
const char t_9[] PROGMEM = "T.9\r\n";
const char t_10[] PROGMEM = "T.10\r\n";
const char t_11[] PROGMEM = "T.11\r\n";
const char t_12[] PROGMEM = "T.12\r\n";
const char t_13[] PROGMEM = "T.13\r\n";
const char t_14[] PROGMEM = "T.14\r\n";
const char t_15[] PROGMEM = "T.15\r\n";
const char t_16[] PROGMEM = "T.16\r\n";
const char t_17[] PROGMEM = "T.17\r\n";
const char t_18[] PROGMEM = "T.18\r\n";
const char t_19[] PROGMEM = "T.19\r\n";
const char t_20[] PROGMEM = "T.20\r\n";
const char t_21[] PROGMEM = "T.21\r\n";
const char t_22[] PROGMEM = "T.22\r\n";
const char t_23[] PROGMEM = "T.23\r\n";
const char t_24[] PROGMEM = "T.24\r\n";
const char t_25[] PROGMEM = "T.25\r\n";
const char t_26[] PROGMEM = "T.26\r\n";
const char t_27[] PROGMEM = "T.27\r\n";
const char t_28[] PROGMEM = "T.28\r\n";
const char t_29[] PROGMEM = "T.29\r\n";
const char t_30[] PROGMEM = "T.30\r\n";
const char t_31[] PROGMEM = "T.31\r\n";
const char t_32[] PROGMEM = "T.32\r\n";
const char t_33[] PROGMEM = "T.33\r\n";
const char t_34[] PROGMEM = "T.34\r\n";
const char t_35[] PROGMEM = "T.35\r\n";
const char t_36[] PROGMEM = "T.36\r\n";
const char t_37[] PROGMEM = "T.37\r\n";
const char t_38[] PROGMEM = "T.38\r\n";
const char t_39[] PROGMEM = "T.39\r\n";
const char t_40[] PROGMEM = "T.40\r\n";
const char t_41[] PROGMEM = "T.41\r\n";
const char t_42[] PROGMEM = "T.42\r\n";
const char t_43[] PROGMEM = "T.43\r\n";
const char t_44[] PROGMEM = "T.44\r\n";
const char t_45[] PROGMEM = "T.45\r\n";
const char t_46[] PROGMEM = "T.46\r\n";
const char t_47[] PROGMEM = "T.47\r\n";
const char t_48[] PROGMEM = "T.48\r\n";
const char t_49[] PROGMEM = "T.49\r\n";
const char kmt[] PROGMEM = "kein Meldungstext";

//256 Meldungen im Speicher
const char* const meldung[] PROGMEM = {t_0, t_1, t_2, t_3, t_4, t_5, t_6, t_7, t_8, t_9, t_10, t_11, t_12, t_13, t_14, t_15, t_16, t_17, t_18, t_19, t_20, t_21, t_22, t_23, t_24, t_25, t_26, t_27, t_28, t_29, t_30, t_31, t_32, t_33, t_34, t_35, t_36, t_37, t_38, t_39, t_40, t_41, t_42, t_43, t_44, t_45, t_46, t_47, t_48, t_49, kmt, kmt, kmt, kmt, kmt, kmt, kmt, kmt, kmt, kmt, kmt, kmt, kmt, kmt, kmt, kmt, kmt, kmt, kmt, kmt, kmt, kmt, kmt, kmt, kmt, kmt, kmt, kmt, kmt, kmt, kmt, kmt, kmt, kmt, kmt, kmt, kmt, kmt, kmt, kmt, kmt, kmt, kmt, kmt, kmt, kmt, kmt, kmt, kmt, kmt, kmt, kmt, kmt, kmt, kmt, kmt, kmt, kmt, kmt, kmt, kmt, kmt, kmt, kmt, kmt, kmt, kmt, kmt, kmt, kmt, kmt, kmt, kmt, kmt, kmt, kmt, kmt, kmt, kmt, kmt, kmt, kmt, kmt, kmt, kmt, kmt, kmt, kmt, kmt, kmt, kmt, kmt, kmt, kmt, kmt, kmt, kmt, kmt, kmt, kmt, kmt, kmt, kmt, kmt, kmt, kmt, kmt, kmt, kmt, kmt, kmt, kmt, kmt, kmt, kmt, kmt, kmt, kmt, kmt, kmt, kmt, kmt, kmt, kmt, kmt, kmt, kmt, kmt, kmt, kmt, kmt, kmt, kmt, kmt, kmt, kmt, kmt, kmt, kmt, kmt, kmt, kmt, kmt, kmt, kmt, kmt, kmt, kmt, kmt, kmt, kmt, kmt, kmt, kmt, kmt, kmt, kmt, kmt, kmt, kmt, kmt, kmt, kmt, kmt, kmt, kmt, kmt, kmt, kmt, kmt, kmt, kmt, kmt, kmt, kmt, kmt, kmt, kmt, kmt, kmt, kmt, kmt, kmt, kmt, kmt, kmt, kmt, kmt, kmt, kmt, kmt, kmt, kmt, kmt, kmt, kmt, kmt, kmt, kmt, kmt, kmt, kmt, kmt, kmt, kmt, kmt};
Die Vorstellungskraft ist wichtiger als Wissen, denn Wissen ist begrenzt. (Albert Einstein)

agmue

Das Programm zum mal darüber nachdenken:

Code: [Select]
/* TOC Daten-Logger programmiert von Jan Schröder, RMH KM-TE */

//Bibliotheken einbinden
#include <Wire.h>
#include "RTClib.h"
//#include <SD.h>
#include <SdFat.h> //SdFat.h wird verwendet, da längere Dateinamen und Zeitstempel möglich sind, bei SD.h nicht
SdFat SD; //Umwandeln von alten SD.h Befehle für SdFat.h
#include <SPI.h>
#include <string.h>
#include <avr/pgmspace.h>

#define SYNC_INTERVAL 1000 //Synchronisierungsintervall für SD-Karte auf 1000ms

//Pins festlegen
//const int led[8] = {10, 11, 12, 13, A0, A1, A2, A3}; //Led-Pins aus Ausgang, falls benötigt
const int bits[8] = {2, 3, 4, 5, 6, 7, 8, 9}; //Lege Pins für die Bit-Eingänge fest

#include "Meldungstexte.h"  // ausgelagert,damit die Programmdatei übersichtlich bleibt

const byte HISTANZ = 10;
byte hist[HISTANZ];
//Buffergröße auf 80 setzen
char buffer[80];

//Uhr-Typ festlegen
RTC_PCF8523 RTC;
//uint32_t syncTime = 0;

//SD-Karten CS Pin festlegen
const int chipSelect = 10;
//Länge des Dateinamen festlegen
char filename[30];
//Datei-Variable festlegen
File logfile;

void setup() {
  Serial.begin(9600);
  Wire.begin();
  RTC.begin();
  // Überprüfe, ob RTC die Zeit beibehält
  if (! RTC.initialized()) {
    Serial.println("RTC läuft nicht!");
  }
  RTC.adjust(DateTime(F(__DATE__), F(__TIME__))); //Stelle Uhrzeit nach Systemzeit, als der Sketch kompilliert wurde

  for (byte i = 0; i < 8; i++) { //Interpretiere die Eingänge 'bits' als Array
    pinMode(bits[i], INPUT_PULLUP); //Lege 'bits' Pins als Eingang (gegen Masse) fest
    //    pinMode(led[i], OUTPUT); //Lege 'led' Pins als Ausgang fest
  }
  for (byte i = 0; i < HISTANZ; i++) {
    hist[i] = 255;
  }
  Serial.println(F("TOC-Anlage Datenlogger"));
  Serial.println(F("Ersteller: J. Schröder - RMH KM-TE - 25.09.2018"));
  Serial.println(F("Initialisiere SD-Karte..."));
  Serial.println();
  pinMode(10, OUTPUT); //SD-Karte überprüfen auf Anwesenheit
  if (!SD.begin(chipSelect)) { //Wenn nicht, dann...
    Serial.print(F("SD-Karte fehlt!"));
  }
  Serial.println(F("SD-Karte initialisiert!"));
  Serial.println();
  //Serielle Ausgabe ab hier, kann auskommentiert werden
  Serial.println(F("Aktuelles Datum ist: "));
  DateTime now = 0; //RTC.now(); //Setze now Variable und gebe Seriell Datum und Uhrzeit aus
  Serial.print(now.day(), DEC);
  Serial.print('.');
  Serial.print(now.month(), DEC);
  Serial.print('.');
  Serial.print(now.year(), DEC);
  Serial.println(' ');
  Serial.println(F("Aktuelle Uhrzeit ist: "));
  Serial.print(now.hour(), DEC);
  Serial.print(':');
  Serial.print(now.minute(), DEC);
  Serial.print(':');
  Serial.print(now.second(), DEC);
  Serial.print(' ');
  Serial.println("(UTC)\nInitialisierung Ende\n\n");
}

void dateTime(uint16_t* date, uint16_t* time) { //Zeitstempel für Dateien definieren
  DateTime now = 0; //RTC.now();
  *date = FAT_DATE(now.year(), now.month(), now.day());
  *time = FAT_TIME(now.hour(), now.minute(), now.day());

}
void loop() {
  //Interpretiere Eingänge 'bits' als Array mit Werten wie 'wert'
  byte index = 0;
  static byte alt_index = 0, alt_index2 = 0, naechsterindex = 0, schritt = 0;
  static int8_t letztepos = -1;
  for (byte i = 0; i < 8; i++) {
    //@Forum: DELAY HABE ICH HIER EINGEFÜGT - delay(100);
    /*digitalWrite(led[i], */digitalRead(bits[i]);  //'digitalWrite(led[i],' bei Bedarf aktivieren, wenn LEDs benötigt werden, siehe Pinbelegung oben
    if (!digitalRead(bits[i])) {
      index += 1 << i;  // Das Verschieben des Bits ersetzt das Feld wert[]
    }
  }
  if ((alt_index != alt_index2) && (index == alt_index)) {

    bool vorhanden = false, markierung = false;
    switch (schritt) {
      case 0:  // Aufbau
        for (byte i = 0; i < HISTANZ; i++) {
          if (hist[i] == index) {
            if (i == 0) {
              naechsterindex = index;
            } else {
              naechsterindex = hist[i - 1];
            }
            vorhanden = true;
          }
        }
        if (vorhanden) {
          schritt = 1;
        } else {
          for (byte i = (HISTANZ - 1); i > 0; i--) {
            hist[i] = hist[i - 1];
          }
          hist[0] = index;
          letztepos++;
          markierung = true;
        }
        break;
      case 1:  // Wiederholung
        for (byte i = 0; i < HISTANZ; i++) {
          if (naechsterindex == index && hist[i] == index) {
            if (i == 0) {
              naechsterindex = hist[letztepos];
            } else {
              naechsterindex = hist[i - 1];
            }
            vorhanden = true;
          }
        }
        if (!vorhanden) {
          for (byte i = 1; i < HISTANZ; i++) {
            hist[i] = 255;
          }
          hist[0] = index;
          letztepos = 0;
          markierung = true;
          schritt = 0;
        }
        break;
      default:
        schritt = 0;
        break;
    }
    Serial.print(F("pos "));
    Serial.print(letztepos);
    Serial.print(F(":\t"));
    ausgabe(index, markierung);
  }
  delay(5);
  alt_index2 = alt_index;
  alt_index = index;
}

void ausgabe(byte nummer, bool neu) {
  for (byte i = 0; i < HISTANZ; i++) {
    Serial.print(hist[i]);
    Serial.print('\t');
  }
  Serial.println();
  DateTime now = 0; //RTC.now(); //Setze now Variable
  SdFile::dateTimeCallback(dateTime); //Zeitstempel für Dateien setzen
  sprintf(filename, "TOC-Log %02d-%02d-%02d.txt", now.year(), now.month(), now.day()); //Setze 'filename' Variable - TOC-Log JJJJ-MM-TT.txt
  logfile = SD.open(filename, FILE_WRITE); //Öffne Datei mit variable 'filenname' als Name
  strcpy_P(buffer, (char*)pgm_read_word(&(meldung[nummer]))); //Lege Variable 'buffer' fest, Ausgabe für 'buffer' besteht aus Variable 'meldung' + 'wert'-index
  //Serielle Ausgabe ab hier - kann auskommentiert werden
  if (neu) {
    Serial.print(F("###\t"));
  } else {
    Serial.print(F("   \t"));
  }
  Serial.print(F("Es wird in Datei geschrieben: "));
  Serial.println(filename);
  /*    if(now.day()<10) //Wenn Tag kleiner als 10 ist, schreibe eine 0 vorweg
        Serial.print('0'); */
  Serial.print(now.day(), DEC);
  Serial.print('.');
  /*    if(now.month()<10) //Wenn Monat kleiner als 10 ist, schreibe eine 0 vorweg
        Serial.print('0'); */
  Serial.print(now.month(), DEC);
  Serial.print('.');
  Serial.print(now.year(), DEC);
  Serial.print(' ');
  Serial.print('-');
  Serial.print(' ');
  /*    if(now.hour()<10) //Wenn Stunde kleiner als 10 ist, schreibe eine 0 vorweg
        Serial.print('0'); */
  Serial.print(now.hour(), DEC);
  Serial.print(':');
  /*    if(now.minute()<10) //Wenn Minute kleiner als 10 ist, schreibe eine 0 vorweg
        Serial.print('0'); */
  Serial.print(now.minute(), DEC);
  Serial.print(':');
  /*    if(now.second()<10) //Wenn Sekunde kleiner als 10 ist, schreibe eine 0 vorweg
        Serial.print('0'); */
  Serial.print(now.second(), DEC);
  Serial.print(' ');
  Serial.print("(UTC)");
  Serial.print("\r\n ");
  Serial.print(buffer); //Meldung Nr. [nummer] ausgeben
  Serial.print("\r\n\r\n");
  //Serielle Ausgabe Ende

  //Schreiben in Logdatei
  /*    if(now.day()<10) //Wenn Tag kleiner als 10 ist, schreibe eine 0 vorweg
        Serial.print('0'); */
  logfile.print(now.day(), DEC);
  logfile.print('.');
  /*    if(now.month()<10) //Wenn Monat kleiner als 10 ist, schreibe eine 0 vorweg
        logfile.print('0'); */
  logfile.print(now.month(), DEC);
  logfile.print('.');
  logfile.print(now.year(), DEC);
  logfile.print(' ');
  logfile.print('-');
  logfile.print(' ');
  /*    if(now.hour()<10) //Wenn Stunde kleiner als 10 ist, schreibe eine 0 vorweg
        logfile.print('0');*/
  logfile.print(now.hour(), DEC);
  logfile.print(':');
  /*    if(now.minute()<10) //Wenn Minute kleiner als 10 ist, schreibe eine 0 vorweg
        logfile.print('0');*/
  logfile.print(now.minute(), DEC);
  logfile.print(':');
  /*    if(now.second()<10) //Wenn Sekunde kleiner als 10 ist, schreibe eine 0 vorweg
        logfile.print('0');*/
  logfile.print(now.second(), DEC);
  logfile.print(' ');
  logfile.print("(UTC)");
  logfile.print("\r\n ");
  logfile.print(buffer);
  logfile.print("-------------------------------------------");
  logfile.print("\r\n\r\n"); //Absätze
  logfile.close(); //Schließe die Datei
  //Schreiben Ende
}
Die Vorstellungskraft ist wichtiger als Wissen, denn Wissen ist begrenzt. (Albert Einstein)

Jannomag

Danke agmue - das muss ich erstmal verarbeiten, werde es aber heute einmal so testen, wie du es geschrieben hast. Nächste Woche bin ich im Urlaub und werde daher erst übernächste Woche daran weiterarbeiten können.
Dafür lasse ich dann dein Script erstmal laufen, um eine Woche lang Daten zu sammeln und zu sehen, wie es funktioniert.

Parallel werde ich mir das Programm verinnerlichen - dauert immer etwas länger bei mir, bis kapiere, was da steht.

agmue

Dafür lasse ich dann dein Script erstmal laufen, um eine Woche lang Daten zu sammeln und zu sehen, wie es funktioniert.
Ich übernehme keine Verantwortung gegenüber der Behörde, es ist nur zusammengefriemelt ;D

Wäre natürlich gut, wenn Du die vollständigen Texte ergänzt. Die Ausgabe der SD-Karte habe ich nicht verändert, da sieht man also nix. Das kannst Du aber "leicht" erweitern: In der Funktion ausgabe gibt es den Merker neu. Wenn dieser gesetzt ist, wird "###" als Markierung im seriellen Monitor ausgegeben, sonst "   ". Das kannst Du für die SD-Karte übernehmen, damit Du nach einer Woche auch was siehst.

Gute Erholung!
Die Vorstellungskraft ist wichtiger als Wissen, denn Wissen ist begrenzt. (Albert Einstein)

Jannomag

Ich übernehme keine Verantwortung gegenüber der Behörde, es ist nur zusammengefriemelt ;D

Wäre natürlich gut, wenn Du die vollständigen Texte ergänzt. Die Ausgabe der SD-Karte habe ich nicht verändert, da sieht man also nix. Das kannst Du aber "leicht" erweitern: In der Funktion ausgabe gibt es den Merker neu. Wenn dieser gesetzt ist, wird "###" als Markierung im seriellen Monitor ausgegeben, sonst "   ". Das kannst Du für die SD-Karte übernehmen, damit Du nach einer Woche auch was siehst.

Gute Erholung!

Die Behörde bekommt erstmal nix zu sehen außer Handschriftliche Zustandsmeldungen - das ändert sich, wenn ich die Frage für das Teil erteile.

Um es besser zu verstehen, habe ich deine Ergänzungen in mein Sketch händisch eingehackt. Hat etwas geklappt, ich verstehe das Prinzip dahinter, jedoch vieles, was C an sich angeht nicht - das ist aber ein ganz anderes Problem, da ich ja kapiere, was das Skript tut.

Die Meldungen habe ich in eine eigene .h Datei gesetzt - ich wusste gar nicht, dass das so einfach geht, jetzt weiß ich es. Danke dafür.

Und den logfile Abschnitt habe ich bereits um die besagte Stelle für die Ausgabe erweitert.

agmue

Die Behörde bekommt erstmal nix zu sehen außer Handschriftliche Zustandsmeldungen - ...
Dann bin ich beruhigt :)
Die Vorstellungskraft ist wichtiger als Wissen, denn Wissen ist begrenzt. (Albert Einstein)

Serenifly

Es gibt übrigens auch sprintf_P() mit dem man den Format String im Flash lassen kann (mit PSTR()). Wenn du sonst schon fast überall das F()-Makro verwendest :)

Go Up