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
mal wieder ein kleines Problem mit blinken ohne delay :)
15.03.2015, 20:28
Beitrag #1
mal wieder ein kleines Problem mit blinken ohne delay :)
Hallo zusammen

Ich bin wieder mal aktiv Smile

Und zwar ist mir im Berufsleben folgedens aufgefallen:

Ich bin Heizungsinstlateur und auf den Neubauten, wenn der Estrich gegossen wurde, bekommen wir von der Firma die den Estrich gegossen hat jeweils einen Zettel auf dem steht, wie geheitzt werden muss um den Boden auszutrocknen, etwa so:

1. Woche: nicht heizen.
2. Woche: 25°C
3. Woche: 30°C
usw.

Nun da zu dieser Zeit meist die richtige Heizung noch nicht einsatzbereit ist und der Elektriker noch nichts angeschlossen hat, müssen wir jeweils mit einer mobilen Elektroheizung heizen. Mit der kann man aber keine genaue Temperatur erreichen, da sie nur über mechanische Thermostaten geregelt wird.

Wir müssen dann immer von Hand am noch nicht angeschlossenen Mischventil drehen um die entsprechende Temperatur zu erreichen / halten. Deshalb hab ich mit dem Arduino UNO ein ist / soll Temperatur vergleich programmiert.

Die Funktion ist einfach:

Mit zwei Tastern kann ich die Temperatur einstellen die ich gerne hätte. Die ist Temperatur wird über einen NTC Termistor gemessen in °C umgerechnet und dann mit dem Sollwert verglichen. Wenn nun die gemessene Temperatur niedriger ist als die Eingestellte, wird ein Port für eine Sec auf High gestellt und umgekert auch. Aber genau da steckt der Wurm drinn. Die Ports werden zwar auf High gesetzt aber nicht mehr auf Low. Das ganze habe ich wegen den Tastern ohne delay programmiert. Soll also heissen ich habe das Blinken ohne Delay demo noch nicht ganz verstanden, den die erste Pause, die den ist / sollwert alle 5 Sec vergleicht funktioniert.

So, ende Roman Smile hier der Code:

Code:
#include <math.h>
#include <LiquidCrystal.h>

LiquidCrystal lcd(2,3,5,6,7,8,9); //rs=2, rw=3, enable=5, D4=6, D5=7, D6=8, D7=9


int ResValue= 10000;
float valTemp;

int SensorPin=0;

const int  button1Pin = A1;
const int  button2Pin = A2;

const int mimozu = 10;
const int mimoauf = 11;

int button1State = 0;
int button2State = 0;

int variable = 15;

unsigned long waittime;
const long interval0 = 5000;
const long interval1 = 1000;

void setup() {
  
lcd.begin(16,2);

pinMode(button1Pin, INPUT_PULLUP);
pinMode(button2Pin, INPUT_PULLUP);

pinMode(mimozu,OUTPUT);
pinMode(mimoauf,OUTPUT);

}

void loop(){

lcd.setCursor(0,0); //Sollwert auf lcd ausgeben
lcd.print("Soll:");  
lcd.print(variable);
lcd.print(" C");
    
  button1State = digitalRead(button1Pin); //Taster1 abfragen
  if (button1State == LOW) {
  delay(200);
  variable += 1;
  }
  
  button2State = digitalRead(button2Pin); //Taster2 abfragen
  if (button2State == LOW) {
  delay(200);
  variable -= 1;
  }
  
  if (variable > 55) { variable = 55; } //Solltemp nicht über 55 einstellbar
  if (variable < 15) { variable = 15; } //solltem nicht unter 15 einstellbar
    

  valTemp=ReadNTC(analogRead(SensorPin)); //istwert auf lcd anzeigen
  lcd.setCursor(0,1);
  lcd.print("Ist: ");
  lcd.print(valTemp);
  lcd.println(" C");
  

  if(millis() - waittime > interval0) { //alle 5 sec die werte vergleichen
    waittime = millis();
  
  if(valTemp < variable - 1){digitalWrite(mimoauf, HIGH); //istwert < sollwert? wenn nein, dann Mischventil öffnen
  if(mimoauf == HIGH && millis() - waittime > interval1) {//Mischventil nach 1 sec stoppen
  waittime = millis();
  digitalWrite(mimoauf, LOW);}}
  
  if(valTemp > variable + 1){digitalWrite(mimozu, HIGH); //istwert > sollwert? wenn nein, dann Mischventil schliessen
  if(mimoauf == HIGH && millis() - waittime > interval1) {//Mischventil nach 1 sec stoppen
  waittime = millis();
  digitalWrite(mimozu, LOW);}}
}
}

float ReadNTC(int valADC)// istwert Umrechnung
{
float Temp;
Temp = log(((10240000/valADC) - ResValue));
Temp = 1 / (0.001129148 + (0.000234125 * Temp) + (0.0000000876741 * Temp * Temp * Temp));
Temp = Temp - 273.15;            // Convert Kelvin to Celcius
//Temp = (Temp * 9.0)/ 5.0 + 32.0; // Convert Celcius to Fahrenheit
return Temp;
}

Besten Dank schon mal im Voraus Smile

Das Wissen über Programmieren, eröffnet neue Welten in der Elektronik. Cool
Alle Beiträge dieses Benutzers finden
Diese Nachricht in einer Antwort zitieren
15.03.2015, 23:27
Beitrag #2
RE: mal wieder ein kleines Problem mit blinken ohne delay :)
Hallo,

ich würde jetzt mal ganz spontan sagen, dass da ein paar Klammern bei der Berechnung fehlen und daher "waittime > interval1" betrachtet wird bevor "millis() - waittime" berechnet wird.

Ich finde es besser zu lesen, wenn ich eine temporäre (oder auch globale) Variable deklariere in der ich millis() + Differenzzeit berechne und dann nachfolgend "nur" noch überwachen muss ob millis() > Variable ist.
Ausserdem solltest Du aus der Zuweisung unsigned long waittime; ein unsigned long waittime = 0; machen, dann ist diese Variable schon mal initial mit 0 belegt - es kann auch passieren dass da "irgendwas" drinsteht wenn das nicht gemacht ist.

Was mir jetzt noch komisch vorkommt ist:
Code:
if(millis() - waittime > interval0) { //alle 5 sec die werte vergleichen
    waittime = millis();
  
  if(valTemp < variable - 1){digitalWrite(mimoauf, HIGH); //istwert < sollwert? wenn nein, dann Mischventil öffnen
  if(mimoauf == HIGH && millis() - waittime > interval1) {//Mischventil nach 1 sec stoppen
  waittime = millis();
  digitalWrite(mimoauf, LOW);}}

Ich würde mal sagen, dass da zu viele if's ineinander verschachtelt sind.
Ich denke das müsste
Code:
if((millis() - waittime) > interval0) { //alle 5 sec die werte vergleichen
    waittime = millis();
  
  if(valTemp < variable - 1){digitalWrite(mimoauf, HIGH)}; //istwert < sollwert? wenn nein, dann Mischventil öffnen
  if(mimoauf == HIGH && (millis() - waittime) > interval1) {//Mischventil nach 1 sec stoppen
  waittime = millis();
  digitalWrite(mimoauf, LOW);}
heissen, dann muss nicht "valTemp < variable - 1" erfüllt sein um zu "mimoauf == HIGH && (millis() - waittime) > interval1" zu kommen.

Ich hoffe, dass dich das weiterbringt.

Gruss Ralf
Alle Beiträge dieses Benutzers finden
Diese Nachricht in einer Antwort zitieren
16.03.2015, 12:03
Beitrag #3
RE: mal wieder ein kleines Problem mit blinken ohne delay :)
Hi,
meiner Meinung nach gibt es da ein paar andere Probleme.
Code:
if(valTemp < variable - 1){digitalWrite(mimoauf, HIGH); //istwert < sollwert? wenn nein, dann Mischventil öffnen
  if(mimoauf == HIGH
"mimoauf" ist 11. HIGH ist wahrscheinlich 255. 11 ist nie gleich 255, also wird das nie funktionieren. Was Du meinst ist wahrscheinlich
Code:
if(digitalRead(mimoauf) == HIGH)
Das ist aber in dem Zusammenhang auch ueberfluessig, da Du es vorher ja per digitalRead auf HIGH gesetzt hast.

Jetzt schauen wir uns das ganze mal mit etwas mehr Kontext an:
Code:
if(millis() - waittime > interval0) { //alle 5 sec die werte vergleichen
    waittime = millis();
  
  if(valTemp < variable - 1){digitalWrite(mimoauf, HIGH); //istwert < sollwert? wenn nein, dann Mischventil öffnen
  if(mimoauf == HIGH && millis() - waittime > interval1) {//Mischventil nach 1 sec stoppen
  waittime = millis();
  digitalWrite(mimoauf, LOW);}}
Das ganze findet also sowieso nur alle 5 Sekunden statt. Die 1-Sekunden-Abfrage ist damit unerheblich. Was Du eigentlich willst ist folgendes: Waehrend das Ventil sich bewegt, warte 1 Sekunde. Ansonsten warte 5 Sekunden und pruefe dann die Temperatur. Also etwa so:
Code:
if(digitalRead(mimoauf) == HIGH) {  // Ventil bewegt sich
      if(millis() - waittime > interval1) {  // Zeit abgelaufen
          waittime = millis();
          digitalWrite(mimoauf, LOW);
      };
}else{    // Ventil bewegt sich nicht
      if(millis() - waittime > interval0) { //alle 5 sec die werte vergleichen
          waittime = millis();
          if(valTemp < variable - 1)  {
              digitalWrite(mimoauf, HIGH); //istwert < sollwert? wenn nein, dann Mischventil öffnen
          };
}
Gruss,
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
16.03.2015, 20:18
Beitrag #4
RE: mal wieder ein kleines Problem mit blinken ohne delay :)
Hallo zusammen.

Danke für eure Antworten. Leider haben diese nicht zum gewüntschten erfolg verholfen. Bei Thorstens letzem Code läuft der ganze Vergleich nicht mehr.


Ich habe das Problem nun selber gelöst Smile mir ist eben wärend des schreibens dieser Antwort etwas eingefallen.

Ich darf die if die die Ports ausschalten nicht in den 5sec interval if haben. Wenn sie ausserhalb sind gehts.

Code:
#include <math.h>
#include <LiquidCrystal.h>

LiquidCrystal lcd(2,3,5,6,7,8,9); //rs=2, rw=3, enable=5, D4=6, D5=7, D6=8, D7=9


int ResValue= 10000;
float valTemp;

int SensorPin=0;

const int  button1Pin = A1;
const int  button2Pin = A2;

const int mimozu = 10;
const int mimoauf = 11;

int button1State = 0;
int button2State = 0;

int variable = 15;

unsigned long waittime = 0;
const long interval0 = 5000;
const long interval1 = 1000;

void setup() {
  
lcd.begin(16,2);

pinMode(button1Pin, INPUT_PULLUP);
pinMode(button2Pin, INPUT_PULLUP);

pinMode(mimozu,OUTPUT);
pinMode(mimoauf,OUTPUT);

}

void loop(){

lcd.setCursor(0,0); //Sollwert auf lcd ausgeben
lcd.print("Soll:");  
lcd.print(variable);
lcd.print(" C");
    
  button1State = digitalRead(button1Pin); //Taster1 abfragen
  if (button1State == LOW) {
  delay(200);
  variable += 1;
  }
  
  button2State = digitalRead(button2Pin); //Taster2 abfragen
  if (button2State == LOW) {
  delay(200);
  variable -= 1;
  }
  
  if (variable > 55) { variable = 55; } //Solltemp nicht über 55 einstellbar
  if (variable < 15) { variable = 15; } //solltem nicht unter 15 einstellbar
    

  valTemp=ReadNTC(analogRead(SensorPin)); //istwert auf lcd anzeigen
  lcd.setCursor(0,1);
  lcd.print("Ist: ");
  lcd.print(valTemp);
  lcd.println(" C");
  

  if(millis() - waittime > interval0) { //alle 5 sec die werte vergleichen
    waittime = millis();
  
  if(valTemp > variable + 1){digitalWrite(mimozu, HIGH);} //istwert > sollwert? wenn ja, dann Mischventil schliessen
  
  if(valTemp < variable - 1){digitalWrite(mimoauf, HIGH);} //istwert < sollwert? wenn ja, dann Mischventil öffnen
}
  if(digitalRead(mimozu) == HIGH && (millis() - waittime) > interval1){ //Mischventil nach 1 sec stoppen
  waittime = millis();
  digitalWrite(mimozu, LOW);}
  
  if(digitalRead(mimoauf) == HIGH && (millis() - waittime) > interval1) {//Mischventil nach 1 sec stoppen
  waittime = millis();
  digitalWrite(mimoauf, LOW);}
}

float ReadNTC(int valADC)// istwert Umrechnung
{
float Temp;
Temp = log(((10240000/valADC) - ResValue));
Temp = 1 / (0.001129148 + (0.000234125 * Temp) + (0.0000000876741 * Temp * Temp * Temp));
Temp = Temp - 273.15;            // Convert Kelvin to Celcius
//Temp = (Temp * 9.0)/ 5.0 + 32.0; // Convert Celcius to Fahrenheit
return Temp;
}


Warscheindlich hat der 5sec Timer den 1 sec Timer abgewürgt

Das Wissen über Programmieren, eröffnet neue Welten in der Elektronik. Cool
Alle Beiträge dieses Benutzers finden
Diese Nachricht in einer Antwort zitieren
16.03.2015, 23:29
Beitrag #5
RE: mal wieder ein kleines Problem mit blinken ohne delay :)
Jetzt sind auch die if's nicht mehr so ineinander verschachtelt ;-)

Schön, dass Du eine Lösung gefunden hast die funktioniert.


Gruss Ralf
Alle Beiträge dieses Benutzers finden
Diese Nachricht in einer Antwort zitieren
18.03.2015, 20:26
Beitrag #6
RE: mal wieder ein kleines Problem mit blinken ohne delay :)
So, nun habe ich noch eine SD Karte hinzugefügt. Jetzt zählt der Arduino in einer Variable jede Sekunde 1 hoch. Wenn er bei 60 angelangt ist, wird die Variable auf 0 zurückgesetzt und die Variable min wird um 1 erhöt. Zugleich wird der Ist und der Soll auf die SD Karte geschrieben. Da ich noch eine Variable für die Stunden und Tage erstellt habe, kann ich so die Laufzeit gleich mit auf die SD Karte schrieben.

Das hat mich auf die Idee gebracht, eine Uhr mit Wecker Funktion (im prinzip eine Alarmclock) zu Programieren, Just for Fun. Mal sehen wie gut die dann läuft.

Update folgt sobald der Heizungsregler auf eine Lochrasterplatine gelötet und das ganze in einem Gehäuse verstaut ist.

Das Wissen über Programmieren, eröffnet neue Welten in der Elektronik. Cool
Alle Beiträge dieses Benutzers finden
Diese Nachricht in einer Antwort zitieren
06.07.2015, 15:59
Beitrag #7
RE: mal wieder ein kleines Problem mit blinken ohne delay :)
Nachtrag:

Mein Cheff findet, dass man sowas nicht braucht. Wird also wohl nicht realisiert. Schade, aber gelernt hab ich trozdem was Smile

Das Wissen über Programmieren, eröffnet neue Welten in der Elektronik. Cool
Alle Beiträge dieses Benutzers finden
Diese Nachricht in einer Antwort zitieren
Antwort schreiben 


Möglicherweise verwandte Themen...
Thema: Verfasser Antworten: Ansichten: Letzter Beitrag
  LED blinken zeitversetzt starten Sky-Shadow 6 191 17.06.2017 15:12
Letzter Beitrag: Sky-Shadow
  delay(...) im Code ok? donut 4 190 08.06.2017 20:16
Letzter Beitrag: donut
Question Problem beim Hochladen auf AtTiny45. Hilfe -.- Jonas Lindenblatt 17 931 16.04.2017 12:58
Letzter Beitrag: Jonas Lindenblatt
  Brauche Zeitverzögerung delay/millis/timer? Spiecky 17 731 15.04.2017 09:41
Letzter Beitrag: hotsystems
  Funksteckdose mit NFC an und wieder ausschalten blackzero23 12 494 20.02.2017 23:27
Letzter Beitrag: hotsystems
  Smart Home Webserver Basic Authentication Problem Osotastic 21 858 20.02.2017 18:00
Letzter Beitrag: Tommy56
  Problem mit Sketch senden an Uno feuerwehr 5 667 31.01.2017 20:41
Letzter Beitrag: Tommy56
  TimeAlarm Bibliothek delay() anweisung renid55 0 226 03.01.2017 21:13
Letzter Beitrag: renid55
  Beim Hochladen USB Problem Nils 10 1.000 29.12.2016 21:05
Letzter Beitrag: renid55
  Ausgang "blinken" lassen NormanIGB 11 837 28.12.2016 17:20
Letzter Beitrag: Tommy56

Gehe zu:


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