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
  Serieller string zwischenspeichern und wieder ausgeben. Matt 11 295 12.02.2018 10:51
Letzter Beitrag: Tommy56
  Schon wieder eine Zeitschaltung Eckardt 7 280 28.01.2018 10:26
Letzter Beitrag: Tommy56
  Buzzer ohne Delay Harry 9 516 23.01.2018 12:30
Letzter Beitrag: Tommy56
  Problem mit Wire.available() abfrage avoid 1 247 11.01.2018 13:40
Letzter Beitrag: Tommy56
  Arduino Software ohne Bibliotheken-Manager bertl68 3 296 02.01.2018 18:36
Letzter Beitrag: Tommy56
  Arduino Software Serial - Delay notwendig? Zipfel1 18 842 02.01.2018 11:59
Letzter Beitrag: Tommy56
  SerialComInstruments 4 Problem Darstellung Nextero 35 1.195 15.12.2017 18:51
Letzter Beitrag: ElEspanol
  Problem mit Nema17 und A4988 Philthy 6 363 08.12.2017 12:35
Letzter Beitrag: Tommy56
  Arduino -> Controllino [Problem gelöst] Cyrilsneer 17 1.112 27.11.2017 18:49
Letzter Beitrag: Franz54
Question Problem beim seriellen Einlesen von RFID-Reader Bezel 5 498 05.11.2017 22:37
Letzter Beitrag: Tommy56

Gehe zu:


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