Go Down

Topic: Programmierprobleme... (Read 462 times) previous topic - next topic

FELIX_93

Hallo zusammen  8)

Ich bin neu hier, habe noch fast keine Ahnung von Arduinos - geschweige denn Programmieren  :smiley-roll-blue:

Habe nun ein Problem..  Ich habe einen 3D Drucker (Dual Extruder), der fast keine speziellen Einstellungen zulässt..  allerdings muss ich die Temperatur etwas erhöhen..

Nun habe ich mir gedacht, ich lese mit einem Arduino die Temperatur am Sensor aus, Schalte dann ein Mini-Relais und schalte so die Heizung am Extruder 2 extern ein. Das funktioniert soweit ganz gut..  Nun möchte ich, dass der Extruder 2 erst beginnt zu heizen, wenn der Extruder 1 eine gewisse Temperatur hat.
Also habe ich den Sensor am Extruder 1 auch noch angeschlossen...  aber ich kriege es einfach nicht hin..  Extruder 2 regelt nachwievor immer auf die richtige Temperatur, ob nun Extruder 1 heizt oder nicht :/ kann mir jemand helfen?

Pin 4 - Relaiseingang
A0 - Sensor v. Extruder 2
A1 - Sensor v. Extruder 1

Code: [Select]

void setup() {
  pinMode(4, OUTPUT);
  digitalWrite(4, HIGH);
  Serial.begin(9600);

}

void loop() {
 
  int sensorValue1 = analogRead(A1); //read the A1 pin value
  float voltage1 = sensorValue1 * (5.00 / 1023.00); //convert the value to a true voltage 
  Serial.println(voltage1);

  if (voltage1 <= 3.15); {
  delay(1000);
  int sensorValue = analogRead(A0); //read the A0 pin value
  float voltage = sensorValue * (5.00 / 1023.00); //convert the value to a true voltage 
  Serial.println(voltage);
  if (voltage < 0.75); {
    digitalWrite(4, LOW);
  }
  if (voltage > 0.75) {
    digitalWrite(4, HIGH); }
  }   
}


vielen Dank

Thorsten4171

Schau dir mal deine if Anweisungen an das ; ist fehl am Platz

gregorss

Schau dir mal deine if Anweisungen an das ; ist fehl am Platz
Hundsgemein. Als ich mich noch zu den Anfängern gezählt habe, hat mir sowas mal eine Hornhaut auf der Brille beschert.

Gruß

Gregor
Wenn man keine Probleme hat, kann man sich welche machen („Großes Lötauge", Medizinmann der M3-Hopi)
Nicht lange fackeln, lass' Backen wackeln! (Seeed)

FELIX_93

#3
Apr 10, 2018, 09:45 pm Last Edit: Apr 10, 2018, 09:46 pm by FELIX_93
also ich hab das mal abgeändert...
funktioniert allerdings noch immer nicht..  ich bin kurz vorm verzweifeln :/

Code: [Select]
void setup() {
  pinMode(4, OUTPUT);
  digitalWrite(4, HIGH);
  Serial.begin(9600);

}

void loop() {
 
  int sensorValue1 = analogRead(A1); //read the A1 pin value
  float voltage1 = sensorValue1 * (5.00 / 1023.00); //convert the value to a true voltage 
  Serial.println(voltage1);
  Serial.println(voltage2);

  if (voltage1 <= 3.15) {
  delay(1000);
  int sensorValue = analogRead(A0); //read the A0 pin value
  float voltage = sensorValue * (5.00 / 1023.00); //convert the value to a true voltage 
  Serial.println(voltage);
  if (voltage < 0.75) {
    digitalWrite(4, LOW);
  }
  if (voltage > 0.75) {
    digitalWrite(4, HIGH); }
  }   
}

HotSystems

also ich hab das mal abgeändert...
funktioniert allerdings noch immer nicht..  ich bin kurz vorm verzweifeln :/
.....
Das ist schön....oder auch nicht.
Vielleicht solltest du uns mal in Kenntnis setzen, was funktioniert und was nicht funktioniert.
Das wäre für die Helfenden unheimlich wichtig.
Gruß Dieter

I2C = weniger ist mehr: weniger Kabel, mehr Probleme. 8)

postmaster-ino

Hi

Ungetestet, möchte aber fast drauf wetten, daß dieser Code-Haufen nicht kompiliert.
Dann sind jede Menge 'magic numbers' enthalten, also Zahlen, Die einfach so und ohne Erklärung in dem Code vorkommen.
Auch werden Variablen ausgegeben, Die es gar nicht gibt (deshalb meine fast-Wette).

Wie, bitte, soll Dir geholfen werden, wenn der Code nicht Mal ansatzweise funktionsFÄHIG ist?

Auch wäre eine Beschreibung, was denn nicht so abläuft, wie Du Dir Das vorstellst, hilfreicher als 'geht nicht'.

Bitte etwas mehr Mühe beim Posten, dann gebe ich mir ggf. etwas mehr Mühe beim Lesen Deines Codes (sofern das Gelump kompiliert, mindestens theoretisch)

MfG

FELIX_93

Ohjee..  tut mir leid..  dieser Code kostet mich gerade sooo viel Nerfen..

Also
Sobald ich 'voltage1' in den Code miteinbeziehe, beginnt das Relais gar nicht mehr zu schalten - also Ausgang 4 ist wohl nicht mehr HIGH.. :/

habe den Code nun ca. 1000x umgeschrieben und alle mir nur erdenklichen Varianten ausprobiert..
Mein Code sieht nun folgendermassen aus:

Code: [Select]
void setup() {
  pinMode(4, OUTPUT);
  digitalWrite(4, HIGH);
  Serial.begin(9600);

}

void loop() {
  int sensorValue = analogRead(A0); //read the A0 pin value
  float voltage = sensorValue * (5.00 / 1023.00); //convert the value to a true voltage
  Serial.println(voltage);
  int sensorValue1 = analogRead(A1);
  float voltage1 = sensorValue1 * (5.00 / 1023.00);
  if (voltage1 > 3.0)
  {
   if (voltage > 0.9) {
    digitalWrite(4, HIGH);
   }
  delay(1000);
  if (voltage < 0.9) {
    digitalWrite(4, LOW);
  }
  delay(500);

  }
 
}


nun Regelt das ganze eigentlich ganz schön um die 0.9V. Aber aus irgendeinem Grund wird 'voltage1' gar nicht beachtet.  Die Spannung liegt bei ca 3.2V  Wenn ich nun den Wert 
Code: [Select]
if (voltage1 > 3.0) auf 3.0 setze, Regelt es, wie es soll. Wenn ich den Wert auf 3.5V setze, müsste das teil ja aufhören zu heizen, tut es aber nicht..  nun heizt es endlos.

habe es auch schon mit else probiert..  also
Code: [Select]
..... delay(500);
}
else
{digitalWrite(4, LOW)
}
.....


auch so regelt es nicht mehr, sondern heizt einfach endlos drauflos

ich hoffe ihr könnt mir folgen  :smiley-roll-blue:

postmaster-ino

Hi

Klingt vll. etwas blöd, aber heizt die Heizung ggf. bei LOW?

Spätestens mit dem ELSE-Zweig (aka voltage1<=3.0) ist der Ausgang bei jeder Konstellation definitiv gesetzt.

Ohne den ELSE-Zweig macht die Heizung Das, was Sie machte, als noch geregelt wurde, Sie bleibt also AN oder AUS - Das dann aber zu 100%.

Wenn Deine Fühler NTCs sind, verringert sich der Widerstand bei steigender Temperatur (Negativ->unterschiedliche Richtungen von Temperatur und Widerstand | Positiv->gleiche Richtung von Temperatur und Widerstand), wenn der NTC am Spannungsteiler der GND-Widerstand ist, sinkt der Messwert bei steigender Temperatur..

MfG

FELIX_93

also ich habe ja ein Relais, das mir den Strom für die Heizspirale schaltet.
Bei LOW sollte das Relais trennen..  und dann kann auch nichts mehr heizen.

Das Problem liegt darin, dass ich die Sensoren an der originalen Elektronik angeschlossen lassen muss, damit der Drucker überhaupt beginnt zu drucken.  Ich habe lediglich ein 2. Kabel gezogen, mit dem ich über das Arduino die Spannung messe.  bei ca 20°C beträgt die Spannung 3.2V, bei 220°C ist die Spannung noch bei ca 0.9V

naja..  die 'else'-variante hilft eben auch nix..  kann das Arduino denn diese 2 Werte unterscheiden?

postmaster-ino

Hi

Lasse Dir die Werte ausgeben, Die der Arduino 'sieht' - von der Logik sollte Dein Ansatz passen - da der Drucker aber nicht macht, was erwartet wird, passt irgend etwas nicht - und Da bist Du näher an der Hardware ;)

MfG

Doc_Arduino

#10
Apr 16, 2018, 09:54 pm Last Edit: Apr 17, 2018, 07:36 am by Doc_Arduino
Hallo,

vielleicht verwechselst du deine eigenen Variablen?

Habe es mal leserlicher gestaltet, für mich zumindestens.

Code: [Select]

const byte pin_Relais = 4;
float voltage_0;
float voltage_1;

void setup() {

  Serial.begin(9600);
  pinMode(pin_Relais, OUTPUT);
  digitalWrite(pin_Relais, HIGH);

}

void loop() {
  
  int sensorValue_0 = analogRead(A0);
  voltage_0 = sensorValue_0 * 5.0 / 1024;    
    
  int sensorValue_1 = analogRead(A1);
  voltage_1 = sensorValue_1 * 5.0 / 1024;

  serieller_Monitor();
  
  if (voltage_1 > 3.0)
  {
    if (voltage_0 > 0.9) {
      digitalWrite(pin_Relais, HIGH);
    }
    else  {
      digitalWrite(pin_Relais, LOW);
    }

    delay(1000);
  }
 
}


void serieller_Monitor ()
{
  const unsigned int intervall = 300;
  static unsigned long last_ms = 0;

  if ( millis() - last_ms < intervall )  return;      // aller x [ms] frische Daten
  last_ms = millis();
    
  Ueberschriftszeile();
  Serial.print(voltage_0, 3); Serial.print('\t');
  Serial.print(voltage_1, 3);    
  Serial.println();
}


void Ueberschriftszeile ()
{
  static int counter = 33;    // für erste Ausführung Wert überhöht

  counter++;
  
  if (counter<25)  return;    // Anzahl Zeilen noch nicht erreicht, Funktion abbrechen
  
  counter = 0;
  Serial.print(F(" A0 ")); Serial.print('\t');
  Serial.print(F(" A1 "));
  Serial.println();
}


Der Code bzw. dein Code macht folgendes.
Wenn die Spannung von A1 größer 3V ist, erst dann wird die Spannung von A0 überhaupt erst ausgewertet.
Die Auswertung von A0 sollte dann so funktionieren wie gewollt. Schaltpunkt ist 0,9V ohne Hysterese.
Entweder darüber oder darunter.
Aber! Sobald A1 kleiner oder gleich 3V ist, passiert im gesamten Code gar nichts mehr.
Beobachte mal die beiden Spannungen die angezeigt werden.
Jetzt musst du wissen was du willst.
Was soll wann bei welcher Spannung passieren ... ?

Edit:
letzten beide Kommentare im Sketch geändert
Tschau
Doc Arduino '\0'

Messschieber auslesen: http://forum.arduino.cc/index.php?topic=273445
EA-DOGM Display - Demos: http://forum.arduino.cc/index.php?topic=378279

FELIX_93

Grandios  8)
es scheint nun endlich zu funktionieren :)

habe beim code allerdings noch ein 'else' eingefügt und voltage_1 soll < sein als 3.0...

Code: [Select]
const byte pin_Relais = 4;
float voltage_0;
float voltage_1;

void setup() {

  Serial.begin(9600);
  pinMode(pin_Relais, OUTPUT);
  digitalWrite(pin_Relais, HIGH);

}

void loop() {
 
  int sensorValue_0 = analogRead(A0);
  voltage_0 = sensorValue_0 * 5.0 / 1024;   
   
  int sensorValue_1 = analogRead(A1);
  voltage_1 = sensorValue_1 * 5.0 / 1024;

  serieller_Monitor();
 
  if (voltage_1 < 3.0)
  {
    if (voltage_0 > 0.9) {
      digitalWrite(pin_Relais, HIGH);
    }
    else  {
      digitalWrite(pin_Relais, LOW);
    }

    delay(1000);
  }
  else  {
    digitalWrite(pin_Relais, LOW);
  }
 
}


void serieller_Monitor ()
{
  const unsigned int intervall = 300;
  static unsigned long last_ms = 0;

  if ( millis() - last_ms < intervall )  return;      // aller x [ms] frische Daten
  last_ms = millis();
   
  Ueberschriftszeile();
  Serial.print(voltage_0, 3); Serial.print('\t');
  Serial.print(voltage_1, 3);     
  Serial.println();
}


void Ueberschriftszeile ()
{
  static int counter = 33;

  counter++;
 
  if (counter<25)  return;    // Zeit noch nicht erreicht, Funktion abbrechen
 
  counter = 0;
  Serial.print(F(" A0 ")); Serial.print('\t');
  Serial.print(F(" A1 "));
  Serial.println();
}


habe heute einen Trockendurchlauf gemacht..  werde dann diese Woche mal noch testen ob das ganze dann auch wirklich funktioniert :)

Ich werde dann den Code mal genau studieren..  da kommen dinge darin vor, die ich noch nie gesehen habe :/ 

Vielen Dank

Go Up