INFO: Dieses Forum nutzt Cookies...
Cookies sind für den Betrieb des Forums unverzichtbar. Mit der Nutzung des Forums erklärst Du dich damit einverstanden, dass wir Cookies verwenden.

Es wird in jedem Fall ein Cookie gesetzt um diesen Hinweis nicht mehr zu erhalten. Desweiteren setzen wir Google Adsense und Google Analytics ein.

Antwort schreiben 
 
Themabewertung:
  • 0 Bewertungen - 0 im Durchschnitt
  • 1
  • 2
  • 3
  • 4
  • 5
Problem mit millis() bei Programmablauf
23.03.2015, 21:31 (Dieser Beitrag wurde zuletzt bearbeitet: 23.03.2015 21:32 von pahe87.)
Beitrag #1
Problem mit millis() bei Programmablauf
Guten Abend werte Community,

ich komme einfach nicht dahinter, wie ich dem Programmablauf beibringen kann,
dass er nach zwei Sekunden (interval2) wieder den Ausgang auf LOW setzt
und erst dann wieder von vorne mit interval1 beginnt.

Code:
void AutomatischeFeuchtigkeit()
{
  
  h = dht.readHumidity();
  t = dht.readTemperature();
  
  unsigned long previousMillis = 0;
  unsigned long interval1 = 60000;
  unsigned long interval2 = 2000;
  
  if ((h == 0) || (t == 0) || (isnan(h)) || (isnan(t)))
    {
     digitalWrite(12, LOW);
    }
  else if ((h < 60) && (digitalRead(3) == LOW))
    {
     if ((unsigned long)(millis() - previousMillis) >= interval1)
       {
        previousMillis = millis();
        digitalWrite(12, HIGH);
        if ((unsigned long)(millis() - previousMillis) >= interval2)
          {
           previousMillis = millis();
           digitalWrite(12, LOW);    
          }
       }
    }
  else
      {
       digitalWrite(12, LOW);
      }
}

Soweit läuft der Code an sich, aber eben nur mit interval1 und interval2 wird komplett ignoriert.

Wäre um einen Tipp froh, was ich falsch mache - vorab vielen Dank!

MFG pahe87

Hoffe um Nachsicht mit meiner Unwissenheit & bin Neuling und brav am lernen.
Alle Beiträge dieses Benutzers finden
Diese Nachricht in einer Antwort zitieren
23.03.2015, 22:52
Beitrag #2
RE: Problem mit millis() bei Programmablauf
Hallo,
dein Code ist ja heftig verschachtelt. Ich vermute da das Problem. Nebenbei: ein paar Kommentare wären nicht schlecht, dann verstehst Du selbst in ein paar Wochen noch was Du da programmiert hast und wir würden's vielleicht auch besser verstehen :-)

Also in den "else if" kommst Du überhaupt erst mal rein, wenn nicht schon der darüber liegende "if" durch eine der 4 oder-Bedingungen erfüllt ist.
Dann passt bei " if ((unsigned long)(millis() - previousMillis) >= interval1)" was nicht: das (unsigned long) gehört da nicht hin - weiter unten ebenso.

Mach' mal die serielle Schnittstelle an
- im Setup: Serial.begin(9600); // Serielle Schnittstelle initialisieren
- im Programm nach jedem if eine Zeile a la: Serial.println("Position 1"); // Position im Serial Monitor anzeigen
- in der Arduino-IDE den Serial Monitor einschalten

Dann kannst Du sehen bis zu welcher Stelle dein Programm in der Abarbeitung kommt und kannst somit die "Fehlerstelle" eingrenzen.

Gruss Ralf
Alle Beiträge dieses Benutzers finden
Diese Nachricht in einer Antwort zitieren
24.03.2015, 06:14 (Dieser Beitrag wurde zuletzt bearbeitet: 24.03.2015 06:31 von Corvus.)
Beitrag #3
RE: Problem mit millis() bei Programmablauf
unsigned long previousMillis = 0; deklariert eine lokale Variable. D. h. bei jedem Aufruf von AutomatischeFeuchtigkeit() wird eine neue Variable erzeugt und mit 0 initialisiert. Was du brauchst ist eine statische Variable. Diese bleibt bei jedem Aufruf der Funktion erhalten und nur beim ersten Aufruf wird ihre Initialisierung ausgeführt.
Mit static unsigned long previousMillis = 0; sollte dein Problem gelöst sein. Kann ich aber nicht mit Sicherheit sagen, weil ich nicht weiß, wie dein restlicher Code aussieht.

Die unveränderlichen Variablen interval1 und interval2 würde ich auch als Konstante deklarieren. Das machst du mit const. Ein besserer Datentyp, der Größe wegen, wäre für diese unsigned int.

Alles zusammen müsste dann so aussehen:

static unsigned long previousMillis = 0;
const unsigned int interval1 = 60000;
const unsigned int interval2 = 2000;


Die Cast-Notation (unsigned long) zur Typumwandlung ist an der Stelle tatsächlich überflüssig, da sowohl der Rückgabewert von millis(), als auch previousMillis vom Typ unsigned long sind und damit das Ergebnis ihrer Subtraktion ebenfalls. Es führt aber zu keinem Fehler wie von Ralf suggeriert.

gruß lorenz
Alle Beiträge dieses Benutzers finden
Diese Nachricht in einer Antwort zitieren
24.03.2015, 10:41
Beitrag #4
RE: Problem mit millis() bei Programmablauf
Stimmt, das mit der internen Variablendeklaration hatte ich übersehen.

Wenn Du die von Lorenz geschilderte Variablendeklaration im Programmteil "void setup" machst, dann sind die Variablen global deklarert und du kannst Dir auch sicher sein, dass dieser Programmteil nur einmal (beim Start) durchlaufen wird. Auch dies trägt zur Übersichtlichkeit des Codes bei.

Gruss Ralf
Alle Beiträge dieses Benutzers finden
Diese Nachricht in einer Antwort zitieren
24.03.2015, 10:53 (Dieser Beitrag wurde zuletzt bearbeitet: 24.03.2015 11:02 von HaWe.)
Beitrag #5
RE: Problem mit millis() bei Programmablauf
das mit den globalen Variablen ist vielleicht etwas Geschmacksache...
ein paar Konventionen sind aber sicherlich auch oft sehr hilfreich und nützlich:

wenn Variablen wirklich "global", von verschiedenen Funktionen/Prozeduren für Zugriffe benötigt und verändert werden, ist es tatsächlich richtig, sie global zu deklarieren, denn sonst müsste man sie immer als Argumente by reference übergeben.

Wenn aber nur 1 einzige Funktion diese Variable(n) benötigt, ist es sauberer, sie lokal zu deklarieren, und wenn ihr letzter Wert nach erneutem Aufruf nicht vergessen werden darf, macht man sie "static".

Zur Bezeichnung kann es hilfreich sein, lokale Variablen mit einem oder 2 Unterstrich(en) zu versehen
unsigned long savetime_ ;
globale Variablen dagegen nicht.
Das erhöht die Lesbarkeit und schützt vor versehentlichen Verwechslungen gleichlautender Variablen-Namen.

Und noch ein Tipp für C-Programmier-Anfänger:
wenn du "später" auch mal auf anderen Plattformen arbeitest (z.B. Due), ist es besser und sicherer, von vornherein die "neuen" C11 Datentypen zu verwenden:
int16_t statt int
int32_t statt long
uint16_t statt unsigned int
uint32_t statt unsigned long
int8_t statt char
uint8_t statt byte
oder wenigstens explizit "signed char" bzw. "unsigned char", denn diese alten Typen werden von Arduino Sketch unterschiedlich behandelt!

Einzige Ausnahme: char arrays[] für serielle Ausgabe-Strings dürfen immer nur den char * Typ haben.


Das erspart dir möglicherweise Tage-langes Haareraufen beim Debuggen.
Alle Beiträge dieses Benutzers finden
Diese Nachricht in einer Antwort zitieren
24.03.2015, 11:08
Beitrag #6
RE: Problem mit millis() bei Programmablauf
Hallo,
hier hast Du zwei IntervallSchalter, vielleicht helfen Sie Dir auf die Sprünge...
Code:
static unsigned long zStempel, zStempel2;
static unsigned long led_state;
static unsigned long last_led_state;
unsigned long intervall;
unsigned long val;
const int LED = 13;
const int potPin = 0;



void setup()
{
  pinMode(LED, OUTPUT);
  pinMode(potPin, INPUT);
}

void loop()
{

val = analogRead(potPin);
intervall = map(val,0,1023,60,43200);

if (millis() - zStempel > intervall)
{
    zStempel = millis();
    zStempel2 = zStempel;
    
    led_state = 1;
}

if(led_state == 1 && millis() - zStempel2 >= 50) led_state = 0;

if(last_led_state != led_state)
{
    last_led_state = led_state;
    digitalWrite(LED, led_state);
}
}

Code:
unsigned long Timestamp = 0;
long intervall = 2000;
int Zaehler = 1;

void setup()    
{
  Serial.begin(19200);
}
void loop()
{  
if (millis() - Timestamp > intervall)  
{  
  Timestamp = millis();
(Zaehler++);
  Serial.print("Zaehler ");
  Serial.println(Zaehler);
    if (Zaehler == 12)
  {
  (Zaehler = 0);
}

}}
Gruß und Spaß
Andreas
Alle Beiträge dieses Benutzers finden
Diese Nachricht in einer Antwort zitieren
24.03.2015, 11:49 (Dieser Beitrag wurde zuletzt bearbeitet: 24.03.2015 11:51 von HaWe.)
Beitrag #7
RE: Problem mit millis() bei Programmablauf
ps,
globale Variablen muss man nie static machen, das sind sie automatisch -
andererseits ist es oft gut, wenn man sie vorab (z.B. bei der Deklaration) initialisiert Wink
Alle Beiträge dieses Benutzers finden
Diese Nachricht in einer Antwort zitieren
24.03.2015, 12:24
Beitrag #8
RE: Problem mit millis() bei Programmablauf
(24.03.2015 10:41)Foto-Ralf schrieb:  Wenn Du die von Lorenz geschilderte Variablendeklaration im Programmteil "void setup" machst, dann sind die Variablen global deklarert
Hi,
jetzt verwirrt den Armen doch nicht noch mehr. Wenn man in der Funktion setup eine Variable deklariert, dann ist sie genauso wenig global wie wenn man das in loop oder irgend einer anderen Funktion deklariert. Eine Variable wird global, wenn man sie außerhalb der Funktionen deklariert, also z.B. vor der Zeile "void setup() {".
Glücklicherweise ist eine normale Variablendeklaration auch gleichzeizitig eine Variablendefinition (außer bei Attributen von Klassen und deren Instanzen). Dadurch wird es erlaubt, gleich einen Initialwert mit zu geben. Also z.B. "int bla = 42;".
Damit hat man auch garantiert, dass die Variable nur einmal am Anfang auf 42 gesetzt wird. Das ist sogar noch "garantierter" als wenn man das in setup() macht, da schon in die Sprache eingebaut und nicht per Konvention in der Arduino-IDE.

Ok, vielleicht habe ich jetzt auch ein bisschen zur Verwirrung beigetragen.
Gruß,
Thorsten

Falls ich mit einer Antwort helfen konnte, wuerde ich mich freuen, ein paar Fotos oder auch ein kleines Filmchen des zugehoerigen Projekts zu sehen.
Alle Beiträge dieses Benutzers finden
Diese Nachricht in einer Antwort zitieren
Antwort schreiben 


Möglicherweise verwandte Themen...
Thema: Verfasser Antworten: Ansichten: Letzter Beitrag
  Fehler im Programmablauf binderj1 14 354 10.10.2016 10:29
Letzter Beitrag: StephanBuerger
  Problem mit SD Card Library BennIY 4 193 06.10.2016 18:38
Letzter Beitrag: Bitklopfer
  Problem mit SD.remove Eichner 6 212 22.08.2016 19:42
Letzter Beitrag: Eichner
  4x16 Tastermatrix Problem Michel 16 852 14.07.2016 10:02
Letzter Beitrag: StephanBuerger
  Problem mit Delay und Millis funnyzocker 1 459 26.06.2016 09:54
Letzter Beitrag: hotsystems
  Problem mit ESP8266 und EMail senden torsten_156 1 604 13.06.2016 21:14
Letzter Beitrag: torsten_156
  ESP8266_01 flashen - Problem torsten_156 12 1.056 30.05.2016 20:12
Letzter Beitrag: torsten_156
  Hardwareserial/Softserial: Problem mit Superklasse tuxedo0801 10 483 19.05.2016 12:25
Letzter Beitrag: amithlon
  ESP8266 HTML Problem arduino_weatherstation 1 497 25.04.2016 21:52
Letzter Beitrag: rkuehle
  Mehrere Abläufe gleichteitig mit "Millis" MarkusSpielt 3 665 11.04.2016 18:23
Letzter Beitrag: MarkusSpielt

Gehe zu:


Benutzer, die gerade dieses Thema anschauen: 1 Gast/Gäste