Wert aus Datenreihe

Hi, wie kann ich am besten aus einer Datenreihe, welche ich auslese, (wird im Serial Monitor etwa in der Form angezeigt: SDFFF2005049850) z.B. jetzt immer die Stelle 8-11 auslesen? (Wäre in diesem Fall dann 0504) So, dass ich es entsprechend weiterverarbeiten kann?

Na wenn du das in ein array einliest, kannst du ja beliebige Stellen desselben direkt ansprechen ...

http://arduino.cc/en/Tutorial/StringSubstring

Hi, danke mal soweit, ich hab´s jetzt mal mit String versucht, aber irgendwie klappts nicht. Mein Code sieht so aus:

#include "Dcf77.h"

Dcf77 dcf77(1); 
String w1[26]= {dcf77.getDateTime()};
int Led = 13;

void setup() {
  Serial.begin(9600);
  pinMode(Led, OUTPUT);
}

void loop() {
  const char *x = dcf77.getDateTime();
  if (strcmp (x,"DCF77POLL") != 0) {
    Serial.println(dcf77.getDateTime());  
  }
  if (w1[13] == "2") {
    digitalWrite(Led,HIGH); }
    else {
      digitalWrite(Led,LOW); }
  }

aus dcf77.getDateTime() wird folgendes ausgelesen: DCF77DATA 2012021861722CET (und im Serial Monitor auch angezeit)

Also müsste doch die Pin13 Led leuchten oder?

Ähm? W1 ? wo kommt das her ?

Von
String w1[26]
Oder ist das falsch?

Hier http://arduino.cc/en/Reference/StringConstructor sind die allgemeinen Regularien.

Die eckige Klammer zeigt ein einzelnes Element eines Arrays an, wenn sie mit einem Integer belegt ist.

Hab ich inzwischen auch so angepasst, aber es klappt immer noch nicht. Ich sehe den Fehler einfach nicht:

int Led = 13;

void setup() {
  Serial.begin(9600);
  pinMode(Led, OUTPUT);
}

void loop() {
  const char *x = dcf77.getDateTime();
  if (strcmp (x,"DCF77POLL") != 0) {
    Serial.println(dcf77.getDateTime());  
  }
  String stringOne =  String(dcf77.getDateTime());
  if (stringOne.charAt(14) == 2) {
    digitalWrite(Led,HIGH); }
    else {
      digitalWrite(Led,LOW); }
  }

hast du ne Idee? Normal sollte die LED doch jetzt leuchten oder?

Warum die mehrfachen Aufrufe von dcf77.getDateTime ? Die Funktion gibt offensichtlich einen Pointer zurück, nur wenn kein "DCF77POLL" soll die LED leuchten, ungetesteter Ansatz:

void loop() {
  const char *x = dcf77.getDateTime();
  if (strcmp (x,"DCF77POLL") != 0) {
    Serial.println(x);  
    if (x[13] == '2') {
        digitalWrite(Led,HIGH);
       // hier evtl. testweise ein delay von z.B. 1 sec einfuegen, damit die LED auch sichtbar leuchten kann
    }
  } else {
     digitalWrite(Led,LOW); 
  }
}

Ich programmiere kein C++, kenne also die String-Klasse nicht, deshalb pures C. ;)

Gruß, mmi.

Hi Vielen Dank etwas abgewandelt funktioniert es jetzt:

void loop() {
  const char *x = dcf77.getDateTime();
  if (strcmp (x,"DCF77POLL") != 0) {
    Serial.println(x);  
  }
    if (x[13] == '2') {
    digitalWrite(Led,HIGH); }
}

Warum das aber mit dem String Befehl nicht klappt erschließt sich mir aber immer noch nicht.

Und direkt das nächste Problem:

Wenn nun x[22] 5 entspricht wird im Seriellen Port gar nichts ausgegeben, bis der Wert sich auf 6 erhöht.

void setup() {
  Serial.begin(9600);
  pinMode(Led, OUTPUT);
  pinMode(Led2, OUTPUT);  
  pinMode(Led3, OUTPUT);
  pinMode(Led4, OUTPUT);  
}

void loop() {
  const char *x = dcf77.getDateTime();
  if (strcmp (x,"DCF77POLL") != 0) {
    Serial.println(x);  
  }
    if (x[22] == '4' || x[22] == '9') {
    digitalWrite(Led,HIGH); }
    else {
    digitalWrite(Led,LOW); }
  
    if (x[22] == '1' || x[22] == '6') {
    digitalWrite(Led2,HIGH); }
    else {
    digitalWrite(Led2,LOW); }
  
    if (x[22] == '2' || x[22] == '7') {
    digitalWrite(Led3,HIGH); }
    else {
    digitalWrite(Led3,LOW); } 

    if (x[22] == '5' && x[21] != '1'){
    digitalWrite(Led4,HIGH); }
    else {
    digitalWrite(Led4,LOW); }     
}

Müsste aber doch eigentlich so passen oder?

Auch wenn x[22] == '5', muß über serial eine Ausgabe erfolgen. Die Ausgabe wird ja nur unterdrückt, wenn als terminierter String "DCF77POLL" zurückgegeben wird.

Laß Dir doch erstmal alles über die serielle Schnittstelle ausgeben, dann lässt sich der Fehler sicher schnell eingrenzen. Ich weiß nicht, was "DCF77GetDateTime" alles zurückgeben kann - kann Dir deshalb auch nicht weiterhelfen.

Ich glaube eher, dass es an

    if (x[22] == '5' && x[21] != '1'){

Liegt. Verwende ich evtl != falsch? Habe mal testweise

    if (x[22] == '5' && x[21] == '1'){

Versucht. So würde es funktionieren. Lässt sich != gar nicht mit && kombinieren?

Beides sind korrekte Ausdrücke (&& und != kombiniert). Oben schreibst Du "keine Ausgabe über serial" - gemeint ist dann wohl eher "digitalWrite"!! Mach doch an dieser Stelle auch eine serielle Ausgabe, dann siehst Du doch den Fehler.

Es funktioniert weder die Ausgabe in dieser Minute (der Wert wird jede Minute ausgegeben) Noch geht die LED an. Ich denke, dass er solange die Bedingung erfüllt ist, dass x22 5 entspricht und x21 nicht 1 ist, sich irgendwie aufhängt oder so. Allerdings kann ich das nicht so recht nachvollziehen, da wenn ich es anders herum Teste (mit 2 mal ==) es ja funktioniert.

Aufhängen wird er sich deswegen wohl nicht.

Allerdings frägst Du x[..] auch ab, wenn Du "DCF77POLL" als abgeschlossenen, also mit 0 terminierten String, empfangen hast. Deshalb hatte ich in meinem Code oben diese If-Abfragen geschachtelt positioniert, sodaß diese Abfragen nur erfolgen, wenn kein "DCF77POLL"-String zurückgegeben wird - so muß es nach meiner Auffassung auch sein!