Go Down

Topic: Wert aus Datenreihe (Read 1 time) previous topic - next topic

ALEX7786

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?

df6ih

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


ALEX7786

Hi,
danke mal soweit,
ich hab´s jetzt mal mit String versucht,
aber irgendwie klappts nicht.
Mein Code sieht so aus:
Code: [Select]
#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?

df6ih

Ähm? W1 ? wo kommt das her ?

ALEX7786

Von
String w1[26]
Oder ist das falsch?

df6ih

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.

ALEX7786

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

Code: [Select]
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?

mmi

#8
Feb 19, 2012, 07:14 am Last Edit: Feb 19, 2012, 07:23 am by mmi Reason: 1
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:
Code: [Select]

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.

ALEX7786

Hi
Vielen Dank
etwas abgewandelt funktioniert es jetzt:

Code: [Select]
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.

ALEX7786

#10
Feb 19, 2012, 05:10 pm Last Edit: Feb 19, 2012, 07:47 pm by ALEX7786 Reason: 1
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.

Code: [Select]
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?

mmi

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.

ALEX7786

Ich glaube eher, dass es an

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

Liegt.
Verwende ich evtl != falsch?
Habe mal testweise
Code: [Select]
    if (x[22] == '5' && x[21] == '1'){

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

mmi

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.

ALEX7786


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.

Go Up