Serielle Datenstring vom Computer im Adruino Mega einlesen und aufteilen

Hab zunächst tausend Dank das Du Dich meinem Problem annimmst und Dir die Arbeit gemacht hast meinen Sketch zu verstehen bzw. herauszufinden was mein Gedankengang war.... :slightly_smiling_face:

Okay, das mit der RTC auf allen Empfänger verzichten hat natürlich auch positive Aspekte.
Sprich kann ich drauf verzichten, wurde von mir nur so gemacht weil ich es nicht besser wusste das es auch anders, und dazu auch noch besser geht.

Das ist leicht gesagt, war bis dato froh das ich selbst auch mal was hinbekommen habe.
Bin echt gespannt was Du daraus machst oder schon gemacht hast.
Wahrscheinlich verstehe ich dann nur die hälfte, wenn´s überhaupt soviel wird.

Nichts grossartiges, aber mal was zum zeigen.

Im Anhang findest Du ein zip mit zwei umgeschriebenen libs.
Das zip einfach in den libOrdner entpacken.

Dann den Code auf den Mega spielen.

Das ist dann übrig geblieben von Deiner Uhr.


#include <Wire.h>
#include <SPI.h>

// Uhr
#include <DS1307RTCB.h>
#include <TimeLibB.h>  // auf deutsch umgeschriebene TimeLib von Paul Stoffregen

// Sender
#include <nRF24L01.h>
#include <RF24.h>
RF24 radio(8, 9);                          // CE, CSN - MISO 50, MOSI 51, SCK 52
const uint8_t address[6] = "00001";            // Sender-Adresse

// Display
#include <LiquidCrystal_I2C.h>
LiquidCrystal_I2C lcd(0x27, 16, 2);

// Tasterelemente
const uint8_t tasterLinks = 45;
const uint8_t tasterRechts = 44;
const uint8_t tasterLinksLED = 47;
const uint8_t tasterRechtsLED = 46;


void setup()
{
  Serial.begin(115200);
  Serial.println(F("Start..."));
  
  setSyncProvider(RTC.get); // Festlegen der Zeitübergabe an time
  
  lcd.begin();
  lcd.backlight();
}

void loop()
{
  displayKalender();
}


void displayKalender()
{
  static time_t prevDisplay = 0; // Merker für Aktuallisierung
  if (now() != prevDisplay)
  {
    prevDisplay = now();
    char zeileAnzeige[16] = {0};
    sprintf(zeileAnzeige, "Zeit  %0u:%0u:%0u", hour(), minute(), second());
    lcd.setCursor(0, 0);
    lcd.print(zeileAnzeige);
    zeileAnzeige[16] = {0};
    sprintf(zeileAnzeige, "%s. %0u.%0u.%u", dayShortStr(weekday()), day(), month(), year());
    lcd.setCursor(0, 1);
    lcd.print(zeileAnzeige);
  }
}

Die libs muessen ja auch noch mit ran...
Benziner_timelibs.zip (37,6 KB)

Hallo XY-Projekt, sorry das ich mich gerstern nicht mehr gemeldet habe.Dieses We geht einfach alles schief.... :woozy_face:
Da haste mal wieder ganz schön gezaubert....unglaublich wie man(n) einen Code kürzen kann.
Kannst Du mir verraten welche lib Du für das LCD genommen hast, bei mir kennt er " lcd.begin();"
nicht. Mit "lcd.init();" funktioniert es.Ich verwende LiquidCrystal_I2C in Version 1.1.2

Und mit der vorgestellten Null bei den Sekunden, nach 59 sek kommt 09,19,29,39 bis 99, dann 10,11... und geht bis 59sek wieder richtig.Mal sehen wann ich wieder die Zeit dazu finde das rauszubekommen....

Ersetze überall %0u durch %02u
:frowning:

Ist die von adafruit - aber bis auf das init/begin gibt es keine Unterschiede.

Du bist mein der Held des Tages, was würde ich nur ohne Dich machen....
Hast mir ein Lichtblick und ein strahlen übers Gesicht gezaubert am Ende des sch... Wochende.

Danke :+1: :+1: :+1:

Hoffentlich mit Mama im Garten sitzen.

Kannst Du mal einen aktuellen Empfängersketch - oder eine Quelle hier im Thread oder drüben raussuchen?

Danke!

Dazu bin ich leider nicht gekommen...

Rotary_Matrix_NRF24_Wlan_V13.4.ino (20.6 KB)
Mein aktueller Empfängersketch für die Matrix, nicht ganz so übersichtlich. :see_no_evil:
Aber war stolz wie Bolle......hat gemacht was er sollte.

Hmpf... Da muss ich erstmal durch.
Es wird.

Sag jetzt nichts :slightly_smiling_face:, ich habe Dich vorgewarnt.....
Das kommt dabei raus, wenn der Schlosser Brötchen backen will !!!
Man kann´s essen, aber ob´s schmeckt sagen Dir andere :wink:

Ich hoffe das ich bei diesem Projekt nee menge lernen kann, behalte, und in neuen Projekten einsetzen kann.

Ich glaube das mit den Array´s muss ich vertiefen, kann man nee menge mit anstellen und nicht zuletzt vereinfachen.Und mach bitte keinen Stress, dass Projekt läuft schon solange da kommt es nicht drauf an.

Bin ja schon überglücklich das Du mich dabei unterstützt.....obwohl das ist schon mehr ! ! !
Danke und immer wieder Danke an Alle.

Das kann ich nicht beurteilen, aber wenn Dir die Uhr gefallen hat, dann darfst Du jetzt auch mit zwei Tasten da dran was machen.

// Uhr
// -> HINWEIS: Die 1307 ist in den reinen Uhrfeldern gleich der 3231 - wer die 3231 Zusatzfunktionen braucht muss selbst basteln
// -> Die Libs gab es als .zip
#include <DS1307RTCB.h>                // auf die TimeLibB angepasste 1307 von Paul Stoffregen
#include <TimeLibB.h>                  // auf deutsch umgeschriebene TimeLib von Paul Stoffregen

// Sender
#include <nRF24L01.h>
#include <RF24.h>
RF24 radio(8, 9);                      // CE, CSN - MISO 50, MOSI 51, SCK 52
const uint8_t address[6] = "00001";    // Sender-Adresse

// Display
#include <LiquidCrystal_I2C.h>
LiquidCrystal_I2C lcd(0x27, 16, 2);

// Tasterelemente
const uint8_t tasterLinks = 45;
const uint8_t tasterRechts = 44;
const uint8_t tasterLinksLED = 47;
const uint8_t tasterRechtsLED = 46;
const uint32_t bounceTime = 100;        // hoeher gewaehlt auch wegen LCD-Geschwindigkeit
const uint32_t timeout = 30000;         // Zeit die ohne Tastendruck vergehen muss um einen Abbruch zu erzwingen

void setup()
{
  Serial.begin(115200);
  Serial.println(F("Start..."));
  // Tasten
  pinMode(tasterLinks, INPUT_PULLUP);
  pinMode(tasterRechts, INPUT_PULLUP);
  // Uhr
  setSyncProvider(RTC.get);             // Festlegen der Zeituebergabe an timeLib
  // setSyncInterval(3000);             // default festgelegt: 5000 ms
  if (timeStatus() != timeSet)
    Serial.print("Keine ");
  Serial.println("RTC gefunden");
  // Display
  lcd.begin();
  lcd.backlight();
  lcd.clear();
  // Sender
  /*
    radio.begin();                        // Start der 2,4 GHz Wireless Kommunikation
    radio.openWritingPipe(address);       // Setzen der Sendeadresse
    radio.setDataRate(RF24_250KBPS);      //(RF24_1MBPS); //(RF24_250KBPS);     // Setzen der Übertragungsgeschwindigkeit
    radio.setPALevel(RF24_PA_MAX);        // Leistung des NRF(MAX,HIGH,LOW,MIN)
    radio.setChannel(127);                // Sendekanal
    radio.setAutoAck(0);                  // Nicht auf Bestätigungsantwort warten
    radio.stopListening();                // Das angeschlossene Modul als Sender konfiguriert
  */
  startBild();
  delay(2000);
  Serial.println(F("Let's go running..."));
}

bool x = false;

void loop()
{
  x =  uhrStellen(x);
}


// ***** Uhr stellen Block
bool uhrStellen(bool setupModus)
{
  enum {se, mi, st, ta, mo, ja, ende};   // die einzelnen Schritte
  static uint8_t auswahl = se;           // Vorbelegung 1. Schritt
  static time_t lasttime = now();        // Vergleichvariable
  static uint8_t _st = 0;                // lokaler Speicher fuer UhrVariablen
  static uint8_t _mi = 0;
  static uint8_t _se = 0;
  static uint8_t _ta = 0;
  static uint8_t _mo = 0;
  static uint8_t _ja = 0;
  if (!setupModus)                       // Nicht im Setup-Modus? ...
  {
    lcd.noBlink();                       // ... ausmachen ...
    if (lasttime != now())               // ... wenn neue Zeit ...
    {
      displayKalender();                 // ... ausgeben ...
      lasttime = now();                  // ... merken
    }
    if (!tasteLinks())                   // Gedrueckt? Dann Start des SetupModus
    {
      lcd.blink();                       // Cursor soll blinken
      _st = hour();                      // uebernahme der aktuellen Daten in lokale Variablen
      _mi = minute();
      _se = second();
      _ta = day();
      _mo = month();
      _ja = shortYear();
      setupModus = true;                 // Merken, das SetupModus gestartet wurde
    }
  }
  else                                   // Im SetupModus ...
  {
    //                                   // ... blinkenenden Cursor positionieren
    if (auswahl == mi) lcd.setCursor(10, 0);
    else if (auswahl == st) lcd.setCursor(7, 0);
    else if (auswahl == ta) lcd.setCursor(7, 1);
    else if (auswahl == mo) lcd.setCursor(10, 1);
    else if (auswahl == ja) lcd.setCursor(13, 1);
    else lcd.setCursor(13, 0);

    // *** Ab hier Bearbeitung der Zeit
    // Auswahl der zu stellenden Zahl
    if (!tasteLinks())
    {
      Serial.println(F("taste links"));
      auswahl++; if (auswahl > ende) auswahl = ende;
      Serial.println(auswahl);
    }
    if (!tasteRechts() || auswahl == ende)                           // zaehlt den Wert aufwaerts ...
    {
      Serial.println(F("tasterechts"));
      switch (auswahl)                              // ... der vorher ausgewaehlt wurde
      {
        case se:
          Serial.println(F("sek+"));
          _se++; if (_se >= 60) {
            _se = 0;
          }
          break;
        case mi:
          Serial.println(F("min+"));
          _mi++; if (_mi >= 60) {
            _mi = 0;
          }
          break;
        case st:
          Serial.println(F("std+"));
          _st++; if (_st >= 24) {
            _st = 0;
          }
          break;
        case ta:
          /*
              Hier gibt es eine Besonderheit, da nicht alle Monate die gleiche Anzahl Tage haben
              Es wird nach dem hochzaehlen des Tages sofort via TimeLib nachgesehen, ob sich der
              Monat veraendert hat.
              Wenn ja, wird der Tag auf 1 gesetzt.
              Da alle anderen lokalen Variablen sich nicht veraendern, kann der gesamte
              Datensatz am Ende unveraendert geschrieben werden
          */
          Serial.println(F("tag+"));
          _ta++;
          setTime(_st, _mi, _se, _ta, _mo, _ja);
          if (month() != _mo)
          {
            _ta = 1;
          }
          break;
        case mo:
          Serial.println(F("mon+"));
          _mo++; if (_mo > 12) {
            _mo = 1;
          }
          break;
        case ja:
          Serial.println(F("jahr+"));
          _ja++; if (_ja > 31) {
            _ja = 21;
          }
          break;
        case ende:
          Serial.println(F("ende"));
          auswahl = se;
          lcd.noBlink();
          lcd.clear();
          setupModus = false;
          break;
        default:
          auswahl = ende;
          break;
      }
      Serial.print("timeset: "); Serial.println(now());
      setTime(_st, _mi, _se, _ta, _mo, _ja); // uebernimmt alle Werte - egal ob veraendert oder nicht
      RTC.set(now());                        // schreibt in die RTC
      displayKalender();                     // aktuallisiert den Display
    }
  }
  return setupModus;
}
// *** Ende Uhr stellen Block


void startBild()
{
  // ************ Anfang LCD Start-Anzeige ***********
  lcd.clear();
  lcd.setCursor(0, 0);
  lcd.print(F("Con V-12.0 mod1"));
  lcd.setCursor(0, 1);
  lcd.print(F("  4-Spur WLAN"));
  // *************Ende LCD Start-Anzeige *************
}

void displayKalender()
{
  char zeileAnzeige[16] = {0};
  sprintf(zeileAnzeige, "Zeit  %02u:%02u:%02u  ", hour(), minute(), second());
  lcd.setCursor(0, 0);
  lcd.print(zeileAnzeige);
  Serial.println(zeileAnzeige);
  memset(zeileAnzeige, 0, sizeof(zeileAnzeige));
  sprintf(zeileAnzeige, "  %s. %02u.%02u.%02u  ", dayShortStr(weekday()), day(), month(), shortYear());
  lcd.setCursor(0, 1);
  lcd.print(zeileAnzeige);
  Serial.println(zeileAnzeige);
}

uint8_t shortYear()
{
  return (year() - 2000);
}

bool tasteLinks()                        // gibt 0 zurueck, wenn Taste gedrueckt - sonst 1
{
  static bool tasteMerker = false;
  static uint32_t lastTime = 0;
  if (digitalRead(tasterLinks) && tasteMerker) // debounce
  {
    tasteMerker = false;
  }
  if (!digitalRead(tasterLinks) && (millis() - lastTime >= bounceTime) && !tasteMerker) // Nur wenn Taste gedrueckt UND bouncezeit abgelaufen ...
  {
    lastTime = millis();                 // ... setze Merker ...
    tasteMerker = true;
    return false;                        // ... und gebe 0 zurueck
  }
  else                                   // Wenn nicht ...
  {
    return true;                         // ... dann nicht
  }
}

bool tasteRechts()
{
  static bool tasteMerker = false;
  static uint32_t lastTime = 0;
  if (digitalRead(tasterRechts) && tasteMerker)
  {
    tasteMerker = false;
  }
  if (!digitalRead(tasterRechts) && (millis() - lastTime >= bounceTime) && !tasteMerker)
  {
    lastTime = millis();
    tasteMerker = true;
    return false;
  }
  else
  {
    return true;
  }
}

Ich hab´s probiert..., das einstellen klappt prima und wird auch scheinbar übernommen.Warum scheinbar? Nach dem stellen der Uhr wird diese auch richtig angezeigt und läuft weiter. Nun kommt das aber... nach einem Neustart oder Reset, eine Uhrzeit und Datum was immer dieselbe falsche Zeit bzw. Datum anzeigt.

Hier mal ein auszug vom Monitor
20:58:58.462 -> taste links
20:58:58.462 -> 6
20:58:58.462 -> tasterechts
20:58:58.462 -> ende
20:58:58.462 -> timeset: 1075887336
20:58:58.509 -> Zeit 09:35:28
20:58:58.563 -> Mi. 04.02.04
20:59:04.528 -> Start...
20:59:04.528 -> RTC gefunden
20:59:07.690 -> Let's go running...
20:59:08.593 -> Zeit 09:33:43
20:59:08.646 -> Di. 03.02.04

Die Fett geschriebene Zeit/Datum Zahlen werden nach Reset ausgegeben, egal was ich zuvor eingestellt habe. Hab gedacht das liegt vielleicht an der Batt. ohne fängt er dann bei 0 an.
Ich finde keinen Ansatz woher die Zeit 09:33:43 und das Datum 03.02.04 kommt.

Ups.
den kenn ich - scheisse!
Ich hab hier nur meinen Stick mit - da war dann wohl die falsche drauf.
Und weil ich das kenne, habe ich das mal schnell....

void displayKalender()
{
  char zeileAnzeige[16] = {0};
  sprintf(zeileAnzeige, "Zeit  %02u:%02u:%02u ", hour(), minute(), second());
  lcd.setCursor(0, 0);
  lcd.print(zeileAnzeige);
  Serial.println(zeileAnzeige);
  memset(zeileAnzeige, 0, sizeof(zeileAnzeige-1));
  sprintf(zeileAnzeige, "  %s. %02u.%02u.%02u ", dayShortStr(weekday()), day(), month(), shortYear());
  lcd.setCursor(0, 1);
  lcd.print(zeileAnzeige);
  Serial.println(zeileAnzeige);
}

XY-Projekt Ich bewundere Dich, nu funzt es.Das machst Du bestimmt auch Beruflich oder?
:clap: :clap:

Nein.

Mir ging es hauptsächlich darum herauszufinden, ob es das ist, was DU mit Deinem conv-Sketch machst.

Insbesondere die Tastengeschichten sind - mit zwei Tasten und eine Uhr stellen - doch etwas tricky.

Wenn das passt, baue ich das zusammen.

Wie kann man nur so Fit sein, daher meine Vermutung das Du es auch Beruflich machst.

Ja, von der Bedienung her etwas anders, zwei Taster zunächst gleichzeitig drücken um ins Uhrzeit stellen zu gelangen.( Um nicht versehentlich ins Setup zu kommen) Rechter Taster einmal drücken um Uhrzeit für x Zeit anzeigen, dann zurück ins Startbild.

Du bist mir zuvorgekommen mit der Uhr stellen, da ich bei der Matrix den Drehimpulsgeber KY040 entdeckt habe ging meine Überlegung dahin ihn eventuell auch bei dem Conv einzusetzen.
Aber das kann ich vielleicht auch später machen, schöne Aufgabe für kalte November Tage. :thinking:

So, für mich ist heute leider wieder schluß :sleeping_bed: ruft, bedanke mich malwieder recht herzlich für Deine Hilfe und wünsche Dir einen ruhigen Wochenstart.

Da hab ich ein Menu...
:slight_smile:

Na dann: sleep()

Matrix-Holzgehäuse
Hier mal ein Nachhaltiges Gehäuse für ne Matrix...

3 Likes

Ich kann nur eines vergeben.
Aber das haste!

1 Like

Feines Teil.

Gruß Tommy