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
  2 LEDs unabhängig blinken lassen cappy0815 1 192 26.09.2017 07:42
Letzter Beitrag: hotsystems
  Fortschritte beim 3-flammigen Gasgrill - nun wieder Pause MOE. 17 685 14.09.2017 11:24
Letzter Beitrag: Bitklopfer
  blinken mit millis Gonmaus 13 667 08.09.2017 21:12
Letzter Beitrag: Bitklopfer
  NeoPixels: Sketch will nicht - Problem mit delay? Zabsi 5 327 22.08.2017 15:17
Letzter Beitrag: Tommy56
  Problem mit LSM 303 Snörb 1 240 22.08.2017 14:16
Letzter Beitrag: Snörb
  Problem mit externem Interrupt manfred474 13 936 13.08.2017 08:54
Letzter Beitrag: MicroBahner
  Problem mit Klassen GuaAck 4 365 09.08.2017 09:28
Letzter Beitrag: MicroBahner
  2 Servos ohne delay steuern Ratlos 27 2.090 26.07.2017 20:43
Letzter Beitrag: MicroBahner
  LEDs ansteuern ohne Delay mir MIDI abfrage OnkelPelle 11 868 20.07.2017 22:35
Letzter Beitrag: hotsystems
Question Problem mit TFT Sam217 8 687 20.07.2017 21:51
Letzter Beitrag: hotsystems

Gehe zu:


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