Falsche Serielle Ausgabe und berechnung zwischen zwei I/Os

Guten Nachmittag
warum ih zwei Probleme in en Thread packe? Ich denke, dass diese beiden miteinadner zu tun haben.

Also ich die Zeit von einem Blinkryhtumus rausbekommen. Ich denke mal das ich einen grawierenden Denkfehler habe:

long firstMillis = 0;
long secondMillis = 0;
long ergebnis = 0;

long firstMillis1 = 0;
long secondMillis1 = 0;

int status = 5; //0= kein Wasser, 1 = Wasser wird erhitzt, =2 Fertig

int i = 0;
int z = 0;
int y = 0;

void setup()
{
  Serial.begin(9600);
  pinMode(7, INPUT);
  pinMode(4, OUTPUT);
  pinMode(3, OUTPUT);
  digitalWrite(4, HIGH);
  delay(500);
  digitalWrite(4, LOW);
}

void loop()
{
  //Serial.println(digitalRead(7));
  //delay(500); 
  if(digitalRead(7) == 1)
  {
    firstMillis = millis();
    ergebnis =firstMillis - secondMillis;
    //Serial.println(firstMillis-secondMillis);
    //Serial.println(ergebnis);
    if((ergebnis <= 917 && ergebnis >= 130) && status != 1)
    {
      i++;
      Serial.println("I: "+i);
      if(i == 20)
      {
        status = 1;
        i = 0;
        Serial.println("Wasser wrd herihtzt!");
      } 
    }

    else if(ergebnis <= 78 && status != 0)
    {

      z++;
      Serial.println("Z"+z);
      if(z == 20)
      {
        status = 0;
        z = 0;
        Serial.println("Kein Wasser!");
      }

    }

    else if(ergebnis > 1000 && status != 2)
    { 

      y++;
     Serial.println(y);
      if(y == 1500)
      {
        Serial.println("Wasser ist fertig");
        status = 2;
        y = 0;
      }
    }
  }
  else
  {
    secondMillis = millis(); 
  }
}

An sich funktioniert es auch aber mit einigen Einschränkungen. UND hier kommt die fließende Überleitung zum zweiten Problem:
Der Arduino scheint die Nachrichten random auszugeben(siehe Anhang). Z.B. das “Wasser ist fertig”, aber vorhher wird y nicht ausgegeben.

audacity363:
Der Arduino scheint die Nachrichten random auszugeben(siehe Anhang).

Der Arduino macht immer das, was Du programmierst.

Ich weiß zwar nicht genau, was Du machen möchtest.
Aber ich rate mal:

long firstMillis = 0;
long secondMillis = 0;
long ergebnis = 0;

long firstMillis1 = 0;
long secondMillis1 = 0;

int status = 5; //0= kein Wasser, 1 = Wasser wird erhitzt, =2 Fertig

int i = 0;
int z = 0;
int y = 0;

void setup()
{
  Serial.begin(9600);
  pinMode(7, INPUT);
  pinMode(4, OUTPUT);
  pinMode(3, OUTPUT);
  digitalWrite(4, HIGH);
  delay(500);
  digitalWrite(4, LOW);
}

void loop()
{
  //Serial.println(digitalRead(7));
  //delay(500); 
  if(digitalRead(7) == 1)
  {
    firstMillis = millis();
    ergebnis =firstMillis - secondMillis;
    //Serial.println(firstMillis-secondMillis);
    //Serial.println(ergebnis);
    if((ergebnis <= 917 && ergebnis >= 130) && status != 1)
    {
      i++;
      Serial.print("I: ");
      Serial.println(i);
      if(i == 20)
      {
        status = 1;
        i = 0;
        Serial.println("Wasser wrd herihtzt!");
      } 
    }

    else if(ergebnis <= 78 && status != 0)
    {

      z++;
      Serial.print("Z");
      Serial.println(z);
      if(z == 20)
      {
        status = 0;
        z = 0;
        Serial.println("Kein Wasser!");
      }

    }

    else if(ergebnis > 1000 && status != 2)
    { 

      y++;
     Serial.println(y);
      if(y == 1500)
      {
        Serial.println("Wasser ist fertig");
        status = 2;
        y = 0;
      }
    }
  }
  else
  {
    secondMillis = millis(); 
  }
}

N'Abend Es geht sich hier um die Statusmeldung von einer Senseo Kaffeeemaschiene. Die LED blinkt ja schnell wenn kein Wasser da ist, langsammer wenn das Wasser erhtzt wird und bleibt an wenn er fertig ist. Jetzt war meine Idee das ich I/O mit jeweils eigenen millis() Variablen zu versehen und dann mit der Differenz arbeite.

Ja kla gibt der Arduino immer das aus was ich angebe, nur wie? Ich meine vor den langen Textausgaben müsste eigendlich eine Zahl ausgegeben werden und warum ist die Ausgbe so verschoben?!

audacity363: warum ist die Ausgbe so verschoben?!

Weil Du das so programmiert hast!

Mit dem Codeabschnitt:

  char text[]="Erstens zweitens drittens";
  Serial.println(text);
  Serial.println(text+8);

wird mit dem ersten println der Text ausgegeben, und mit dem zweiten println wird der Text ab "Stringanfang+8" ausgegeben, also nicht der String von Anfang an.

Wenn Du stattdessen den Text ausgeben möchtest und dann noch die Zahl 8, dann sind das zwei print/println-Anweisungen. Oder Du formatierst zuerst mal beides zu einem String zusammen.

Würden Anführungszeiche um die 8 nicht auch helfen? Serial.println(text+"8"); Grüße Uwe

Nein! Konkatenieren mit + geht nur mit String Klassen. Die machen nichts anderes als den + Operator zu überladen um dann eine bestimmte Operation durchzuführen.

Bei C Strings hat man Zeiger auf Speicher. Daher addiert man da einen Offset auf die Start-Adresse des Arrays. Wobei ich finde, dass der der Compiler meckern sollte wenn man das mit Literalen statt Variablen probiert.

“test1” + “test2” wäre die Addition von zwei Zeigern. Das compiliert nicht.

Ich empfehle da dringend Streaming.h:
http://arduiniana.org/libraries/streaming/
Das überlädt den << Operator mit inline Funktionen für die Ausgabe. Der Code der rauskommt ist also nicht anders als normal, aber man erspart sich diese unsägliche Aneinanderreihung von print() Anweisungen.

Eine Alternative ist die sdFat Lib. Die enthält echte Streaming Operatoren, sowohl für Ausgabe als auch Eingabe!
http://code.google.com/p/sdfatlib/
Siehe dazu das cin_cout Beispiel

Oder die Arduino Standard Template Library: