(gelöst) Sketch stoppt mit Poti auf A4 ?

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.

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?

das große Programm (gekürzt, geht hier nicht komplett rein)

[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]

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?

(deleted)

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

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

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.

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?

(deleted)

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.

(deleted)

Peter-CAD-HST:
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.

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?

Ja, die kannst du so definieren.
Sieh dir einfach mal die Beispiele dazu an.
Wie schon geschrieben, ich habe sie bisher nicht gebraucht..

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?

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?

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.

evtl. einen I2C ADC verbauen?
oder noch einfacher, einen Arduino Nano verwenden, der auch die beiden anderen Analog-Pins herausführt.

und weil ich es sehe:

    lcd.setCursor(0,0); lcd.print("                ");
      lcd.setCursor(0,1); lcd.print("                ");

da würde ich wirklich einfach ein lcd.clear() machen

und statt
lcd.print("Bereit");

Fixtexte in den Progmem verschieben, am einfachsten mit dem F-Makro

      lcd.print(F("Bereit"));

auch für die Seriellen Ausgaben!

https://www.arduino.cc/reference/de/language/variables/utilities/progmem/

(deleted)

Peter-CAD-HST:
Oder soll ich dich das nächste Mal vorher anschreiben und fragen ob mein Tipp für den TO hilfreich ist?

Was hab ich damit zu tun ?
Es ging um deinen Tipp A6 und A7 auf einem Uno zu verwenden, die es da nicht gibt.

OK, danke. ich versuchs, hab aber die Zusammenhänge nicht, daher male ich mir wenig Erfolgschanze aus.

ich verwende ein 2Zeilen Display, das ich mit LiquidCristal_I2C.h ansteuere.

  #include <Wire.h> // Wire Bibliothek einbinden
  #include <LiquidCrystal_I2C.h> // Vorher hinzugefügte LiquidCrystal_I2C Bibliothek einbinden
  LiquidCrystal_I2C lcd(0x27, 16, 2);  

  lcd.init(); //Im Setup wird der LCD gestartet 
  lcd.backlight(); //Hintergrundbeleuchtung einschalten (lcd.noBacklight(); schaltet die Beleuchtung aus). 

     lcd.setCursor(0,0); lcd.print("                ");

ändert sich mit der Softwire dran etwas?

noiasca:
evtl. einen I2C ADC verbauen?
oder noch einfacher, einen Arduino Nano verwenden, der auch die beiden anderen Analog-Pins herausführt.

und weil ich es sehe:

    lcd.setCursor(0,0); lcd.print("                ");

lcd.setCursor(0,1); lcd.print("                ");



da würde ich wirklich einfach ein lcd.clear() machen

und statt
lcd.print("Bereit"); 

Fixtexte in den Progmem verschieben, am einfachsten mit dem F-Makro



lcd.print(F("Bereit"));




auch für die Seriellen Ausgaben!

https://www.arduino.cc/reference/de/language/variables/utilities/progmem/

sehr interessant, hab aber kA was da nun der Unterschied ist und warum. OK Speicherbelegung ist ein Thema, wo sehe ich denn wenn einer kritisch wird, in der Übersetzungszeile dir mir die % der Auslastung angibt, hat dann wieder nur oder nicht mit dem RAM oder Flash zu tun?