Go Down

Topic: (gelöst) Sketch stoppt mit Poti auf A4 ? (Read 805 times) previous topic - next topic

4711

Aug 22, 2020, 11:08 am Last Edit: Aug 25, 2020, 08:59 am by 4711
Hallo Gemeinde,

bräuchte wieder eure Hilfe, ich komm nicht dahinter was da los ist.
Ich lese 5 Poti ein, soweit alles gut, einfaches Script funktioniert einwandfrei.

Code: [Select]
int iTOffset = 0;
  int iTCorrect = 0;
  int iT1 = 0;
  int iT2 = 0;
  int iT3 = 0;
  int iT4 = 0;  
  int iT5 = 30;  

  // ThermoCouple
  #include <max6675.h>
  const unsigned int thermo_gnd_pin = 6;
  const unsigned int thermo_vcc_pin = 5;
  const unsigned int thermo_so_pin  = 2;
  const unsigned int thermo_cs_pin  = 3;
  const unsigned int thermo_sck_pin = 4;
  MAX6675 thermocouple(thermo_sck_pin, thermo_cs_pin, thermo_so_pin);

  // Timer
  const unsigned int cuiShowTime = 1000; //Serial Print Temp
  unsigned long uliShowTime = 0; // Timer

void setup() {
  // put your setup code here, to run once:
    // THERMO
  pinMode(thermo_vcc_pin, OUTPUT);
  pinMode(thermo_gnd_pin, OUTPUT);
  digitalWrite(thermo_vcc_pin, HIGH);
  digitalWrite(thermo_gnd_pin, LOW);

  // Define Serial Output to display machine status ---
  Serial.begin (9600); // Datenrate 9600 bps
  while (!Serial) {;}// wait for serial port to connect. Needed for native USB port only

}

void loop() {
  // put your main code here, to run repeatedly:
  iTOffset = map(analogRead(A0),0,1024,-50,50);
  if (analogRead(A0)==0) {iTCorrect = thermocouple.readCelsius();}
  else {iTCorrect = thermocouple.readCelsius() + iTOffset;};
  if (analogRead(A1)==0) {iT1 = 170;}
  else {iT1 = 170 + map(analogRead(A1),0,1024,-30,30);};
  if (analogRead(A2)==0) {iT2 = 180;}
  else {iT2 = 180 + map(analogRead(A2),0,1024,-30,30);};
  if (analogRead(A3)==0) {iT3 = 160;}
  else {iT3 = 160 + map(analogRead(A3),0,1024,-30,30);};
  if (analogRead(A4)==0) {iT4 = 150;}
  else {iT4 = 150 + map(analogRead(A4),0,1024,-30,30);};
//  iT4 = 150 + map(analogRead(A4),0,1024,-30,30);

  // --------------------------------------------------
  // INFO ---------------------------------------------
  // --------------------------------------------------
    if ((millis() - uliShowTime) > cuiShowTime)
    { Serial.print("Sek:");
      Serial.print(millis()/1000);
      Serial.print(" - Temp: ");
      Serial.print(iTCorrect);
      Serial.print(" Offset: ");
      Serial.print(iTOffset);
      Serial.print(", T1: ");
      Serial.print(iT1);
      Serial.print(", T2: ");
      Serial.print(iT2);
      Serial.print(", T3: ");
      Serial.print(iT3);
      Serial.print(", T4: ");
      Serial.print(iT4);
      Serial.print(", T5: ");
      Serial.println(iT5);
      uliShowTime = millis();
    }
  // --------------------------------------------------

}


Wenn ich mein großes Script aufspiele passiert etwas komisches.
sobald das Poti am A4 auf 0 geht, stoppt der Sketch.
Ich sehe keine serielle Verbindung mehr (ein Testrelais das im Sekundentakt schaltet stoppt).

Tja, woran liegt das ?





Ext. Spannungsversorgung 12V, per Board auf 12V UNO und 5V Aufsteckplatine (nicht verbunden mit dem UNO).
Alles vom UNO hat nicht geklappt, mit den Poti angesteckt ging gar nichts mehr.
5kOhm Potis.

Danke für eure Hilfe!
Kann das ein Performanceproblem sein, der Sketch verwendet nicht viel, aber Serial, Thermo u Display?

4711

das große Programm (gekürzt, geht hier nicht komplett rein)
Code: [Select]
[code]// ----------------------------------------------------
// ----------------------------------------------------
// Bibliotheken ---------------------------------------
// ----------------------------------------------------
  #include <max6675.h>
  #include <Wire.h> // Wire Bibliothek einbinden
  #include <LiquidCrystal_I2C.h> // Vorher hinzugefügte LiquidCrystal_I2C Bibliothek einbinden
// ----------------------------------------------------
// GLOBALE KONSTANTEN ---------------------------------
// ----------------------------------------------------
  const unsigned int cuiShowTime = 1000; //Serial Print Temp
// ----------------------------------------------------
// GLOBALE I/O ----------------------------------------
// ----------------------------------------------------
  const unsigned int cuiHeating = 8;
  const unsigned int cuiRelais = 12;
  // ThermoCouple
  const unsigned int thermo_gnd_pin = 6;
  const unsigned int thermo_vcc_pin = 5;
  const unsigned int thermo_so_pin  = 2;
  const unsigned int thermo_cs_pin  = 3;
  const unsigned int thermo_sck_pin = 4;
  // FU
  const unsigned int FU_Analog = 9;
  const unsigned int FU_Start = 10;
  // Poti
  const unsigned int poti_calibrate = A0;
  const unsigned int poti_stage_1 = A1;
  const unsigned int poti_stage_2 = A2;
  const unsigned int poti_stage_3 = A3;
  const unsigned int poti_stage_4 = A4;
  // Time
  const unsigned int cuiTime = 3000; // Delay
// ----------------------------------------------------
// GLOBALE MERKER -------------------------------------
// ----------------------------------------------------
  unsigned int uiStep = 0;  // Step Indicator
  bool bRelais = LOW;
  bool bFAN = LOW; // Fan on/off
  unsigned int uiFAN = 0; // Speed of Fan Analog
  unsigned int uiFAN_Hz = 0; // Speed of Fan Herz
  // Timer
  unsigned long uliTime = 0; // Timer
  unsigned long uliShowTime = 0; // Timer
  // TMP per Step
  int iTOffset = 0;
  int iTCorrect = 0;
  int iT1 = 0;
  int iT2 = 0;
  int iT3 = 0;
  int iT4 = 0;  
  int iT5 = 30;  
  // ERROR
  bool bError = LOW; // Merker für Fehlerausgabe
  unsigned int uiError = 0; // Error
// ----------------------------------------------------
// FUNCTION -------------------------------------------
// ----------------------------------------------------
  MAX6675 thermocouple(thermo_sck_pin, thermo_cs_pin, thermo_so_pin);
  LiquidCrystal_I2C lcd(0x27, 16, 2);  
// ----------------------------------------------------
// INIT -----------------------------------------------
// ----------------------------------------------------
void setup() {
  pinMode(cuiHeating, INPUT_PULLUP);
  pinMode(cuiRelais, OUTPUT);
  // THERMO
  pinMode(thermo_vcc_pin, OUTPUT);
  pinMode(thermo_gnd_pin, OUTPUT);
  digitalWrite(thermo_vcc_pin, HIGH);
  digitalWrite(thermo_gnd_pin, LOW);
  // LCD
  lcd.init(); //Im Setup wird der LCD gestartet
  lcd.backlight(); //Hintergrundbeleuchtung einschalten (lcd.noBacklight(); schaltet die Beleuchtung aus).
  // Define Serial Output to display machine status ---
  Serial.begin (9600); // Datenrate 9600 bps
  while (!Serial) {;}// wait for serial port to connect. Needed for native USB port only
}
// ----------------------------------------------------
// MAIN - CODE ----------------------------------------
// ----------------------------------------------------
void loop() {
  // --------------------------------------------------
  // INPUT / OUTPUT -----------------------------------
  // --------------------------------------------------
  iTOffset = map(analogRead(A0),0,1024,-50,50);
  if (analogRead(A0)==0) {iTCorrect = thermocouple.readCelsius();}
  else {iTCorrect = thermocouple.readCelsius() + iTOffset;};
  if (analogRead(A1)==0) {iT1 = 170;}
  else {iT1 = 170 + map(analogRead(A1),0,1024,-30,30);};
  if (analogRead(A2)==0) {iT2 = 180;}
  else {iT2 = 180 + map(analogRead(A2),0,1024,-30,30);};
  if (analogRead(A3)==0) {iT3 = 160;}
  else {iT3 = 160 + map(analogRead(A3),0,1024,-30,30);};
  if (analogRead(A4)==0) {iT4 = 150;}
  else {iT4 = 150 + map(analogRead(A4),0,1024,-30,30);};
  // --------------------------------------------------
  // ERROR --------------------------------------------
  // --------------------------------------------------
    if (uiError != 0)
     { if (!bError)
       { Serial.print("!!! ERROR : "); Serial.print(uiError);
         Serial.println(" !!! Call your Distributor for HELP ;) ");
         bError = HIGH;
       }
     }
  // --------------------------------------------------
  // MACHINE ------------------------------------------
  // --------------------------------------------------
    if (!bError)
    { PROCESS();
      analogWrite(FU_Analog,uiFAN);
    }
    else // STOP ALL ----------------------------------
    { bFAN = LOW;
      uiFAN_Hz = 0;
      uiFAN = 0;
      analogWrite(FU_Analog,0);
      bRelais = LOW;
    }
  // --------------------------------------------------
  // INFO ---------------------------------------------
  // --------------------------------------------------
    if ((millis() - uliShowTime) > cuiShowTime)
    { Serial.print("Sek:");
      Serial.print(millis()/1000);
      Serial.print(" - Step: ");
      Serial.print(uiStep);
      Serial.print(" - Temp: ");
      Serial.print(iTCorrect);
      Serial.print(" Offset: ");
      Serial.print(iTOffset);
      Serial.print(", Hz: ");
      Serial.print(uiFAN_Hz);
      Serial.print(", Analog: ");
      Serial.print(uiFAN);
      Serial.print(", T1: ");
      Serial.print(iT1);
      Serial.print(", T2: ");
      Serial.print(iT2);
      Serial.print(", T3: ");
      Serial.print(iT3);
      Serial.print(", T4: ");
      Serial.print(iT4);
      Serial.print(", T5: ");
      Serial.println(iT5);
      uliShowTime = millis();
      // Test
      digitalWrite(cuiRelais,bRelais);
      bRelais=!bRelais;
    }
  // --------------------------------------------------
}
// ----------------------------------------------------
// PROCESS - CODE -------------------------------------
// ----------------------------------------------------
void PROCESS() {
  uiFAN = 255/5*uiFAN_Hz/10/2;
  // --------------------------------------------------
  if (!digitalRead(cuiHeating))
  { uiStep = 0;
    bFAN = LOW;
    uiFAN_Hz = 0;
    uiFAN = 0;
    analogWrite(FU_Analog,0);
    bRelais = LOW;
  }
  // --------------------------------------------------
  switch (uiStep) {
  // --------------------------------------------------
  // START --------------------------------------------
  // --------------------------------------------------
  case 0: // Heating starts ?
    // lcd
    if ((millis() - uliTime) > cuiTime) {
      lcd.setCursor(0,0); lcd.print("                ");
      lcd.setCursor(0,1); lcd.print("                ");
      lcd.setCursor(0, 0);
      lcd.print("Bereit");
      lcd.setCursor(9, 0);
      lcd.print(iTCorrect);
      lcd.setCursor(15, 0);
      lcd.print("C");
      lcd.setCursor(0, 1);
      lcd.print("warte auf Start");
      uliTime = millis();
    }
.....


[/code]

combie

Quote
UNO
Beim UNO läuft I2C über A4 und A5.
Wenn du da ein Poti zusätzlich dran hängst und es runter drehst, wird die I2C Verbindung gestört.

Das wundert dich?

Säge kein Sägemehl.


4711

Ja, dachte ich mir schon, hab grad das empirisch ermittelt, dass es so ist, gewusst (gespeichert) hatte ich es nicht.

Also Danke für eure Hilfe!!

Wäre noch für Code-Optimierungsvorschläge dankbar!

BG

4711

A6 und A7 funktionieren nicht, ich bekomme den Wert von A3 durchgeschleust.. ??

HotSystems

#6
Aug 22, 2020, 11:57 am Last Edit: Aug 22, 2020, 12:00 pm by HotSystems
A6 und A7 gibt es auf einem Uno nicht.
Es sei denn, es ist eine Sonder-Spezial-Ausführung.

Du könntest für I2C "SoftI2C" verwenden, dann geht es auch über digitale Pins.
Habe da aber selbst noch nichts mit gemacht.
Gruß Dieter

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

4711

Oh, OK. Ist das die Softwire Bibliothek?

Verstehe ich das richtig, dass mit solch einer Bibliothek ich die Pins def. kann welche ich verwende, damit A4/5 wieder verwendbar wird?


4711

ich will/muss da jetzt mit UNO auskommen.

d.h. nur über solch eine Bibliothek (wovon ich noch kA habe) wäre es möglich wieder Analoge Pins zu benutzen.
(warum ist das alles immer so ....)

OK, dann muss ich vorerst mit nur 4 Poti auskommen.


HotSystems

#11
Aug 22, 2020, 12:54 pm Last Edit: Aug 22, 2020, 12:58 pm by HotSystems
oder auf einen Nano "umziehen"
Es geht doch hier lt. TO um einen Uno, also wäre es immer besser die richtigen Tipps zu geben.

Und wenn du dir das Bild vom TO ansehen würdest, da ist ein Shield drauf, welches schlecht auf den Nano passt.
Gruß Dieter

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

HotSystems

Oh, OK. Ist das die Softwire Bibliothek?

Verstehe ich das richtig, dass mit solch einer Bibliothek ich die Pins def. kann welche ich verwende, damit A4/5 wieder verwendbar wird?
Ja, die kannst du so definieren.
Sieh dir einfach mal die Beispiele dazu an.
Wie schon geschrieben, ich habe sie bisher nicht gebraucht..
Gruß Dieter

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

4711

Ich bin da absolut noch Neuling, d.h. ich installiere die Softwire Bibliothek.

muss ich dann die Displaycristal löschen, ersetzt mir die Softwire diese und muss dann konfiguriert werden?

HotSystems

#14
Aug 22, 2020, 01:04 pm Last Edit: Aug 22, 2020, 01:07 pm by HotSystems
Ich bin da absolut noch Neuling, d.h. ich installiere die Softwire Bibliothek.

muss ich dann die Displaycristal löschen, ersetzt mir die Softwire diese und muss dann konfiguriert werden?
Was meinst du mit "Displaycristal" ?

Sieh dir einfach das Beispiel der Library an, da siehst du wie es funktionieren kann.

Hier kannst du schon mal einiges nachlesen.
Gruß Dieter

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

Go Up