Go Down

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

4711

Sry, ja richtig, Danke! habs bestellt!

4711

#31
Aug 23, 2020, 11:06 am Last Edit: Aug 23, 2020, 11:10 am by 4711
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:
Code: [Select]

    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

Code: [Select]

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


auch für die Seriellen Ausgaben!

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

ich habe meine Code angepasst, wäre hier noch etwas möglich um den Update-Zyklus am Display zu beschleunigen, wenn ich das zu oft mache (Zyklus) dann geht der UNO/Mega in die Knie, aktuell bin ich bei 500ms. Kann ich die aktuelle Auslastung des Uno/Mega wo sehen?

Code: [Select]
  #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 = 500; //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;
  // Analog 4/5 werden von der I2C Schnittstelle verwendet
  const unsigned int poti_stage_4 = A7;
  // 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 = 170;
  int iT2 = 180;
  int iT3 = 160;
  int iT4 = 150; 
  int iT5 = 30; 
  // FU per Step
  int iFU1 = 50;
  int iFU2 = 40;
  int iFU3 = 35;
  int iFU4 = 40;
  int iFU5 = 50;
  // 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(poti_calibrate),0,1024,-50,50);
  if (analogRead(poti_calibrate)==0) {iTCorrect = thermocouple.readCelsius();}
  else {iTCorrect = thermocouple.readCelsius() + iTOffset;};
  if (analogRead(poti_stage_1)==0) {iT1 = 170;}
  else {iT1 = 170 + map(analogRead(poti_stage_1),0,1024,-30,30);};
  if (analogRead(poti_stage_2)==0) {iT2 = 180;}
  else {iT2 = 180 + map(analogRead(poti_stage_2),0,1024,-30,30);};
/*  if (analogRead(poti_stage_3)==0) {iT3 = 160;}
  else {iT3 = 160 + map(analogRead(poti_stage_3),0,1024,-30,30);};
  if (analogRead(poti_stage_4)==0) {iT4 = 150;}
  else {iT4 = 150 + map(analogRead(poti_stage_4),0,1024,-30,30);};
*/
  if (analogRead(poti_stage_3)==0) {iFU2 = 40;}
  else {iFU2 = 40 + map(analogRead(poti_stage_3),0,1024,-5,5);};
  if (analogRead(poti_stage_4)==0) {iFU3 = 35;}
  else {iFU3 = 35 + map(analogRead(poti_stage_4),0,1024,-5,5);};
// --------------------------------------------------
  // 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(F("Sek:"));
      Serial.print(millis()/1000);
      Serial.print(F(" - Step: "));
      Serial.print(uiStep);
      Serial.print(F(" - Temp: "));
      Serial.print(iTCorrect);
      Serial.print(F(" Offset: "));
      Serial.print(iTOffset);
      Serial.print(F(", Hz: "));
      Serial.print(uiFAN_Hz);
      Serial.print(F(", Analog: "));
      Serial.print(uiFAN);
      Serial.print(F(", T1: "));
      Serial.print(iT1);
      Serial.print(F(", T2: "));
      Serial.print(iT2);
      Serial.print(F(", T3: "));
      Serial.print(iT3);
      Serial.print(F(", T4: "));
      Serial.print(iT4);
      Serial.print(F(", 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(F("Bereit          "));
      lcd.setCursor(9, 0);
      lcd.print(iTCorrect);
      lcd.setCursor(15, 0);
      lcd.print(F("C"));
      lcd.setCursor(0, 1);
      lcd.print(F("warte auf Start "));
      uliTime = millis();
    }

HotSystems

Warum willst du eine schnellere Darstellung ?
Woran erkennst du, dass die Controller in die Knie gehen ?

Gruß Dieter

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

4711

wenn bei jedem Zyklus update, stürzt der Sketch ab,.

HotSystems

wenn bei jedem Zyklus update, stürzt der Sketch ab,.
Bitte alle Fragen beantworten.

Und in die Knie gehen ist was anderes als Absturz.
An welcher Stelle im Sketch erfolgt der Absturz ?
Gruß Dieter

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

(deleted)

#35
Aug 23, 2020, 12:38 pm Last Edit: Aug 23, 2020, 12:38 pm by Peter-CAD-HST
(deleted)

michael_x

Quote
je mehr du von RAM in den PROGMEM verschieben kannst, desto mehr RAM wird frei, desto mehr Programmspeicher wird belegt.
Nicht ganz richtig: Statisch belegter RAM hat sowieso eine Kopie im Flash. Durch PROGMEM / F-Makro wird also der benötigte Flash-Speicher nicht erhöht, wohl aber RAM gespart.

Zwar gibt's für freigehaltenen RAM kein Geld zurück oder Bonuspunkte, aber RAM Belegung und speziell Überbelegung ist immer kritisch, mit undefiniertem Fehlerverhalten. Es lohnt sich generell bei der Arduino-Programmierung, immer den RAM-Bedarf im Auge zu behalten und zu wissen, dass der Compiler den tatsächlichen RAM-Bedarf nicht kennen kann.

Quote
wenn bei jedem Zyklus update, stürzt der Sketch ab
Das solltest du etwas erläutern. Was ist "updaten" ?

Quote
aktuell bin ich bei 500ms
Für einen loop-Durchlauf mit Serial und lcd-Ausgabe?
Und ohne?

Generell bremst Serial, wenn man mehr ausgeben möchte als möglich ist und der Puffer schon voll ist. (Bei 9600 1Zeichen/ms ab dem 64. Zeichen)

combie

Quote
ich habe meine Code angepasst, wäre hier noch etwas möglich um den Update-Zyklus am Display zu beschleunigen, wenn ich das zu oft mache (Zyklus) dann geht der UNO/Mega in die Knie, aktuell bin ich bei 500ms. Kann ich die aktuelle Auslastung des Uno/Mega wo sehen?
Nein, die Auslastung eines AVR ist immer 100%.

Deine Frage verstehe ich nicht.
Man soll nicht häufiger anzeigen, als man entspannt ablesen kann.

Um das anzeigen zu beschleunigen, sollte man nur die Änderungen auffrischen.


Deine Potis?
Müssen die so oft ausgelesen werden?
Das kann man auch (im 8 Bit Modus?) im Hintergrund laufen lassen.

Die map() Berechnungen müssen auch nur bei Änderungen gemacht werden.
Säge kein Sägemehl.

noiasca

Das ist nicht korrekt:
Quote
Durch PROGMEM / F-Makro wird also der benötigte Flash-Speicher nicht erhöht,
Bei Verwendung des F-Makros braucht man mehr Speicher.
Das erste F sowieso, jedes weitere auch wenns der Compiler nicht zusammenfassen kann.


Code: [Select]

void setup() {
  Serial.begin(115200);
  Serial.println(F("1234567890"));
 
  // IDE 1.8.13 1858/220
  Serial.println  ("ABCDEFGHIJ");
  Serial.print(millis());
  Serial.println  ("LMNOPQRSTU");
  Serial.print(millis()); 
  Serial.println  ("VWXZABCDEF"); 

/*
  //IDE 1.8.13 1870/188
  Serial.println(F("ABCDEFGHIJ"));
  Serial.print(millis()); 
  Serial.println(F("LMNOPQRSTU"));
  Serial.print(millis());
  Serial.println(F("VWXZABCDEF")); 
*/
 
}

void loop() {
  // put your main code here, to run repeatedly:
}
how to react on postings:
- post helped: provide your final sketch, say thank you & give karma.
- post not understood: Ask as long as you understand the post
- post is off topic (or you think it is): Stay to your topic. Ask again.
- else: Ask again.

4711

Ich bin kein Profi, ich habe kein Oszilloskop.

Wenn ich jeden Zyklus das Display update, läuft nichts mehr. Der UNO ist nicht mehr ansprechbar, keine Serielle Kommunikation, nichts. Das heißt für mich dass er KO gegangen ist.

HotSystems

Ich bin kein Profi, ich habe kein Oszilloskop.
Auch wenn du kein Profi bist, solltest du doch alle gestellten Fragen beantworten.
Sonst macht das hier keinen Sinn mehr.
Gruß Dieter

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

4711

Warum willst du eine schnellere Darstellung ?
Um eine Änderung am Poti schnell als Wert zu sehen (sonst Ratespiel) und echt zach.

Und in die Knie gehen ist was anderes als Absturz.
An welcher Stelle im Sketch erfolgt der Absturz ?
Die serielle stoppt, die LED 13 blinkt nicht mehr, mehr weiß ich nicht wie man rausfinden kann.

Nimm ein Oszilloskop oder Frequenzmesseisen und ermittle die Wiederholerate der LOOP();.

Im Setup:
Code: [Select]

#define OsziPin keineAhnungWasFreiIst
pinMode(OsziPin,OUTPUT);

In der LOOP:
Code: [Select]

digitalWrite(OsziPin,!digitalRead(OsziPin));

sry, ich hab kein entsprechendes Gerät.

Nicht ganz richtig: Statisch belegter RAM hat sowieso eine Kopie im Flash. Durch PROGMEM / F-Makro wird also der benötigte Flash-Speicher nicht erhöht, wohl aber RAM gespart.
Zwar gibt's für freigehaltenen RAM kein Geld zurück oder Bonuspunkte, aber RAM Belegung und speziell Überbelegung ist immer kritisch, mit undefiniertem Fehlerverhalten. Es lohnt sich generell bei der Arduino-Programmierung, immer den RAM-Bedarf im Auge zu behalten und zu wissen, dass der Compiler den tatsächlichen RAM-Bedarf nicht kennen kann.
Das solltest du etwas erläutern. Was ist "updaten" ?
Für einen loop-Durchlauf mit Serial und lcd-Ausgabe?
Und ohne?
Generell bremst Serial, wenn man mehr ausgeben möchte als möglich ist und der Puffer schon voll ist. (Bei 9600 1Zeichen/ms ab dem 64. Zeichen)
Updaten = Anzeige am Display auffrischen / ändern
Grundsätzlich möchte ich asap eine Änderung am Poti am Display sehen.

Deine Frage verstehe ich nicht.
Man soll nicht häufiger anzeigen, als man entspannt ablesen kann.
Um das anzeigen zu beschleunigen, sollte man nur die Änderungen auffrischen.
Deine Potis?
Müssen die so oft ausgelesen werden?
Das kann man auch (im 8 Bit Modus?) im Hintergrund laufen lassen.
Die map() Berechnungen müssen auch nur bei Änderungen gemacht werden.
Die Anzeige soll sich zügig ändern, wenn man am Poti dreht sonst ist ein Ratespiel.

Die Potis erzeugen einen Offset, dieser ist im Normalfall unverändert. D.h. bei Änderung auslesen wäre völlig OK, wenn ich wüsste wie das geht. Ich muss ja sowiso immer den Analogeingang abfragen, um eine Änderung zu sehen. Den Map() kann man dann natürlich nur bei Änderung ausführen.

Aktuell am Mega sind 5 Poti (zukünftig ev. mehr), ein 16x2 Display, ein Themperaturfühler und ein PWM-Analogwandler dran.
Die Aufgabe ist entsprechend Temperatur (Korrektur per Poti) und Stufen (erreichte Temperaturen - einstellbar per Poti) einen FU (Drehzahl per 0-5V) zu steuern. Fertig.

BG


4711

#43
Aug 24, 2020, 07:19 am Last Edit: Aug 24, 2020, 07:27 am by 4711
Morgen Peter,
im ersten Beitrag habe ich Bilder drin, reicht dir das oder soll ich noch andere Fotos machen?
BG
# ich mach noch ein Foto von der Anzeige







Go Up