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
Benzinuhr mit stufigem Geber
21.03.2016, 19:01
Beitrag #9
RE: Benzinuhr mit stufigem Geber
Danke ich versuche es.

Bei den Millis komme ich nicht am Blink vorbei.
Wenn nur eine Pause statt "delay" sein soll, bezogen auf einen geschalteten Ausgang, reicht mir das geblinke nicht.

Code:
if (Celsius > threshold) //Über 24°
    digitalWrite(ledPin, HIGH); //Schalte Pin D13 Auf High

  if (Celsius < threshold) //Unter24°
    digitalWrite(ledPin, LOW);

val = digitalRead(ledPin);//Zustand vom ledPin
  if (val == HIGH) // Wenn er High ist
  {
    digitalWrite(ledPin, HIGH);
    delay(oneMinute);// Eine Minute Pause

Mit val=digitalRead lese ich den Zustand des Ausgangs. Wenn ich lese das er HIGH ist, schreibe ich das der "Pausenfunktion". Die sagt dann:"Ok eine Minute bleibt das so"
Wenn ich jetzt das Skript mit den millis statt delay einbaue, weiß ich nicht wie ich mich auf die LED-HIGH beziehe und nur die Minute diesen Pin High lasse?
Da fehlt mir, wie so oft im Karniggelbuch der Bezugsbegriff. Eben:
if (ledPin x y,High); wait 1000millis;

Eigentlich eine einfache Frage, aber danach habe ich schon halb youtube und ixquick durchsucht.
Haach und die Zeit läuft pausenlos,

Achim

Ich kann kaum etwas lernen, vergesse das auch wieder. Aber wenn ich etwas immer wieder klar vor Augen habe, kann ich verdammt viel damit anfangen
Alle Beiträge dieses Benutzers finden
Diese Nachricht in einer Antwort zitieren
22.03.2016, 00:02
Beitrag #10
RE: Benzinuhr mit stufigem Geber
Ich habe mal etwas gebastelt (nicht getestet)
Code:
unsigned long pause_01_start  = 0;
bool          pause_01_status = false;

void setup() {
  // put your setup code here, to run once:

}

void loop() {
  // put your main code here, to run repeatedly:


  if (Celsius > threshold) {    //Über 24°
    digitalWrite(ledPin, HIGH); //Schalte Pin D13 Auf High
    pause_01 (60000);           //Wartezeit 60s starten (60000ms)
  }

  if (Celsius < threshold && !pause_01(0)) //Unter24° und Wartezeit abgelaufen
    digitalWrite(ledPin, LOW);
}


// pause_01(1000); mit Parameter > 0 aufgerufen startet die Zeit neu
// pause_01(0);    mit Parameter = 0 aufgerufen liefert den Status zurück
// Zeit läuft, Status = true
// Zeit abgelaufen, Status = false
bool pause_01 ( unsigned long zeit)
{
  static unsigned long wartezeit;

  if (zeit != 0 && !pause_01_status) {  // gewünschte Wartezeit != 0 && Zeit läuft nicht
    wartezeit = zeit;                   // übergebene Wartezeit merken
    pause_01_start = millis();          // Startzeit merken
    pause_01_status = true;             // wartezeit ist aktiv merken
  }
  if (pause_01_status && millis() < pause_01_start + wartezeit ) { // Wartezeit läuft && Wartezeit nicht abgelaufen
    return false;
  }
  else { // Wartezeit läuft && Wartezeit ist abgelaufen
    pause_01_status = false;
    return true;
  }
}

Wenn Celsius > threshold geht die LED an und die Wartezeit startet
Wenn Celsius < threshold und die Wartezeit abgelaufen ist, geht die LED aus
Du kannst pause_01(); nur ein mal verwenden, wenn du mehrere Pausen gleichzeitig brauchst, musst du dir eine pause_02() u.s.w. bauen.
Gleichzeitig bedeutet dabei dass mehrere Wartezeiten zeitgleich parallel laufen.
Nacheinander genutzt kannst du pause_01(); natürlich mehrfach im Programm an verschiedenen stellen nutzten.
pause_01(); ist nicht retriggerbar. D.h. wenn die Zeit mal läuft, läuft sie bis sie abgelaufen ist. Eine erneuter Aufruf mit einer neuen Wartezeit startet also erst dann wenn die alte Wartezeit abgelaufen ist.

Gruß
Arne

ExclamationMit zunehmender Anzahl qualifizierter Informationen bei einer Problemstellung, erhöht sich zwangsläufig die Gefahr auf eine zielführende Antwort.Exclamation
Alle Beiträge dieses Benutzers finden
Diese Nachricht in einer Antwort zitieren
22.03.2016, 14:18
Beitrag #11
RE: Benzinuhr mit stufigem Geber
Hallo Arne,
herzlichen Dank, dass du Dir selbst um Mitternacht noch Zeit für mich nimmst! Andererseits ist mir das schon peinlich, da ich mich nicht erkenntlich zeigen kann.
Leider komme ich so langsam auf den Trichter, dass ich passen sollte. Ich beisse mich zu fest, anderes bleibt liegen.
Der Code ist für mich ziemlich verständlich. Das nützt nur nicht viel, da ich ständig den Überblick verliere. Alles Gelesene haftet nur temporär. Altes Wissen ist abrufbar. {Stromunfall}. Macht nix, ist 5 Jahre her, komme ich mit klar.

Alternativen:
A= Externe Pause mit 555iger sehr simpel. Aber keine Taster für threshold Änderung.

B=Die Benzinuhr geht ja. Und dazu ein Temperaturmodul mit 555 Verzögerung.

C=Den Sketch gegen Bezahlung erstellen lassen.(Andere Gegenleistung geht ja nicht).
???
Denn ich habe selbst beim Rüberkopieren einen Fehler gemacht, den ich nicht finde.
D13 reagiert auf den threshold, macht aber keine Pause.
Code:
#include <LiquidCrystal.h>


LiquidCrystal lcd(12, 11, 5, 4, 3, 2);
const int numRows = 2;
const int numCols = 16;
const int tempPin = A5;

const int threshold = 22; // Schwellwert

int ledPin = 13;//Ausgang bei Temp erreichen auf High


unsigned long pause_01_start  = 0;
bool          pause_01_status = false;


void setup() {
  pinMode(ledPin, OUTPUT); //Start Ausgang
  lcd.begin(numCols, numRows);//Start LCD

   lcd.setCursor(6, 1); //2. Reihe 7.Zeichen
  lcd.print("Temperatur");  //Schreibt das Wort


}

void loop()
{
       int val;  // Einen Wert vom Sensor einlesen
  int Celsius;  // Er heißt Celsius

  val = analogRead(tempPin); //Von Analog 5 einlesen

  Celsius = map(val, 491, 572, 20, 30); //Getestet entpricht der Temperatur
  lcd.setCursor(1, 1); //2. Reihe 2. Feld
  lcd.print( Celsius); //Schreibe den Wert für Celsius
    


  if (Celsius > threshold) {    //Über 24°
    digitalWrite(ledPin, HIGH); //Schalte Pin D13 Auf High
    pause_01 (10000);           //Wartezeit 60s starten (60000ms)
  }

  if (Celsius < threshold && !pause_01(0)) //Unter24° und Wartezeit abgelaufen
    digitalWrite(ledPin, LOW);
}


// pause_01(1000); mit Parameter > 0 aufgerufen startet die Zeit neu
// pause_01(0);    mit Parameter = 0 aufgerufen liefert den Status zurück
// Zeit läuft, Status = true
// Zeit abgelaufen, Status = false
bool pause_01 ( unsigned long zeit)
{
  static unsigned long wartezeit;

  if (zeit != 0 && !pause_01_status) {  // gewünschte Wartezeit != 0 && Zeit läuft nicht
    wartezeit = zeit;                   // übergebene Wartezeit merken
    pause_01_start = millis();          // Startzeit merken
    pause_01_status = true;             // wartezeit ist aktiv merken
  }
  if (pause_01_status && millis() < pause_01_start + wartezeit ) { // Wartezeit läuft && Wartezeit nicht abgelaufen
    return false;
  }
  else { // Wartezeit läuft && Wartezeit ist abgelaufen
    pause_01_status = false;
    return true;
  }
}

Schade

Achim

Ich kann kaum etwas lernen, vergesse das auch wieder. Aber wenn ich etwas immer wieder klar vor Augen habe, kann ich verdammt viel damit anfangen
Alle Beiträge dieses Benutzers finden
Diese Nachricht in einer Antwort zitieren
22.03.2016, 18:22
Beitrag #12
RE: Benzinuhr mit stufigem Geber
Hallo Achim,

wir helfen hier doch gern. Manchmal auch zu späterer Stunde, je nachdem wie sich die Zeit ergibt.

Am liebsten helfe ich wenn die Aufgabenstellung klar ist.
Ungern gehe ich Beiträge an in denen man alles zusammen suchen muss und zig mal nachfragen muss bis man alle nötigen Infos hat.
Aber bei dir passt das bisher.

Ich denke auf die Alternativen kannst du verzichten. Der Arduino kann das Gewünschte auch ohne externe Hardwareunterstützung. Man muss es ihm nur richtig beibringen aber das ist oft das Problem.

Ich bekomme die Programme meist auch nicht auf Anhieb lauffähig hin. (Siehe mein Programm von heute Nacht).
Deshalb habe ich es nochmal überarbeitet und jetzt sollte es funktionieren.
Code:
#include <LiquidCrystal.h>

LiquidCrystal lcd(12, 11, 5, 4, 3, 2);
const int numRows = 2;
const int numCols = 16;
const int tempPin = A5;

const int threshold = 22; // Schwellwert

int ledPin = 13;//Ausgang bei Temp erreichen auf High


unsigned long pause_01_start  = 0;
bool          pause_01_status = false;


void setup() {
  pinMode(ledPin, OUTPUT); //Start Ausgang
  lcd.begin(numCols, numRows);//Start LCD

  lcd.setCursor(6, 1); //2. Reihe 7.Zeichen
  lcd.print("Temperatur");  //Schreibt das Wort
}

void loop()
{
  int val;  // Einen Wert vom Sensor einlesen
  int Celsius;  // Er heißt Celsius

  val = analogRead(tempPin); //Von Analog 5 einlesen

  Celsius = map(val, 491, 572, 20, 30); //Getestet entpricht der Temperatur
  lcd.setCursor(1, 1); //2. Reihe 2. Feld
  lcd.print( Celsius); //Schreibe den Wert für Celsius

  if (Celsius > threshold && pause_01(0) ) {    //Über 22°
    digitalWrite(ledPin, HIGH); //Schalte Pin D13 Auf High
    pause_01 (10000);           //Wartezeit 60s starten (60000ms)
  }

  if (Celsius < threshold && pause_01(0)) { //Unter22° und Wartezeit abgelaufen
    digitalWrite(ledPin, LOW);
    pause_01_status = false;
  }
}


// pause_01(1000); mit Parameter > 0 aufgerufen startet die Zeit neu
// pause_01(0);    mit Parameter = 0 aufgerufen liefert den Status zurück
// Zeit läuft, Status = true
// Zeit abgelaufen, Status = false
bool pause_01 ( unsigned long zeit)
{
  static unsigned long wartezeit;
  if (zeit != 0 && !pause_01_status) {  // gewünschte Wartezeit != 0 && Zeit läuft nicht
    wartezeit = zeit;                   // übergebene Wartezeit merken
    pause_01_start = millis();          // Startzeit merken
    pause_01_status = true;             // wartezeit ist aktiv merken
  }
  if (zeit == 0) {
    if (pause_01_status && millis() < pause_01_start + wartezeit ) { // Wartezeit läuft && Wartezeit nicht abgelaufen
      return false;
    }
    else { // Wartezeit läuft && Wartezeit ist abgelaufen
      return true;
    }
  }
}

Wenn die Temperatur auf >22°C (also 23°C und mehr) steigt, geht die LED an und die Zeit startet.
Wenn die Temperatur auf <22°C (also 21°C und weniger) fällt, geht die LED sofort aus wenn die Zeit schon abgelaufen ist. Wenn die Zeit noch nicht abgelaufen war, wird gewartet bis die Zeit abgelaufen ist.
Die LED bleibt also immer mindestens die eingestellte Zeit an.

Aber was hat diese Temperaturgeschichte mit der Benzinuhr zu tun? Gehört das zusammen?

Gruß
Arne

ExclamationMit zunehmender Anzahl qualifizierter Informationen bei einer Problemstellung, erhöht sich zwangsläufig die Gefahr auf eine zielführende Antwort.Exclamation
Alle Beiträge dieses Benutzers finden
Diese Nachricht in einer Antwort zitieren
23.03.2016, 18:30
Beitrag #13
RE: Benzinuhr mit stufigem Geber
Hallo Arne,
Danke für dein Aufmuntern!
Danke auch für deine Arbeit den Sketch, welcher super funktioniert, zu erstellen.
Die "Benzinuhr" funktioniert, und belegt die obere Zeile. Die Zeigt ja nur an und schaltet nichts.
Ich habe das nur getrennt, da die Tread Überschrift schon garnichts mehr mit dem Thema zu tun hatte. (Verwarnungslevel)

Jetzt versuche ich noch den threshold über Taster zu ändern.
Hier habe ich schon Tipps bekommen.

Das Frühjahr kommt!

Achim

Ich kann kaum etwas lernen, vergesse das auch wieder. Aber wenn ich etwas immer wieder klar vor Augen habe, kann ich verdammt viel damit anfangen
Alle Beiträge dieses Benutzers finden
Diese Nachricht in einer Antwort zitieren
Antwort schreiben 


Gehe zu:


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