Heizungssteuerung für einen Behälter

nix_mehr_frei: Ich tobe mich lieber in Hardware aus :D

man kann auch mit OPs tolle Regler bauen!

guntherb:

nix_mehr_frei: Ich tobe mich lieber in Hardware aus :D

man kann auch mit OPs tolle Regler bauen!

man kann vieles auch nur mit einem Triac einem NTC und einer Handvoll passiven Bauelementen. Eine Lösung mit einem Microcontroller wie zB Arduino hat den Vorteil der programmierbarkeit. Grüße Uwe

Habe ein kleines Problem. Möchte nun SoftwareSerial in meinen Code einbauen. Bekomme beim Kompilieren Fehlermeldungen bezüglich der Library.

C:\Program Files (x86)\Arduino\libraries\SoftwareSerial\SoftwareSerial.cpp:81: warning: only initialized variables can be placed into program memory area
C:\Program Files (x86)\Arduino\libraries\SoftwareSerial\SoftwareSerial.cpp: In member function 'void SoftwareSerial::begin(long int)':
C:\Program Files (x86)\Arduino\libraries\SoftwareSerial\SoftwareSerial.cpp:399: error: 'PCICR' was not declared in this scope
C:\Program Files (x86)\Arduino\libraries\SoftwareSerial\SoftwareSerial.cpp:402: error: 'PCMSK2' was not declared in this scope
C:\Program Files (x86)\Arduino\libraries\SoftwareSerial\SoftwareSerial.cpp:402: error: 'PCMSK0' was not declared in this scope
C:\Program Files (x86)\Arduino\libraries\SoftwareSerial\SoftwareSerial.cpp:402: error: 'PCMSK1' was not declared in this scope
C:\Program Files (x86)\Arduino\libraries\SoftwareSerial\SoftwareSerial.cpp: In member function 'void SoftwareSerial::end()':
C:\Program Files (x86)\Arduino\libraries\SoftwareSerial\SoftwareSerial.cpp:417: error: 'PCMSK2' was not declared in this scope
C:\Program Files (x86)\Arduino\libraries\SoftwareSerial\SoftwareSerial.cpp:417: error: 'PCMSK0' was not declared in this scope
C:\Program Files (x86)\Arduino\libraries\SoftwareSerial\SoftwareSerial.cpp:417: error: 'PCMSK1' was not declared in this scope

Wenn ich Beispielprogramme öffne, ist das ebenso. Hat jemand AHnung, was die Ursache sein kann?

Habe bei dem ATMega8-16PU Einschränkungen bezüglich der RX/TX Pins oder kann ich den frei wählen?

Hat niemand eine Idee warum die ganzen Serial-Libs bei mir nicht gehen?

Habe mittlerweile 3 ausprobiert und bei allen sind Probleme in der .cpp =( =(

Ich komme nicht weiter...

Hallo R1der, du hattest mir ja bereits per PN auch schon geschrieben. Ich gehe mal davon aus, dass an deinem selbst gelöteten Teil liegt. Dort wird die Pinbelegung nicht für hinterlegt sein. Gab bei einigen Libs auch schon das Problem, dass der Leonardo ohne inoffiziele Ändernung nicht benutzbar war.

Frei wählen kannst du die Pins bei NewSoftSerial, bei der AltSoftSerial geht es soweit ich weiß nicht. Dort sind die festgelegt.

// AltSoftSerial always uses these pins:
//
// Board          Transmit  Receive   PWM Unusable
// -----          --------  -------   ------------
// Teensy 2.0         9        10       (none)
// Teensy++ 2.0      25         4       26, 27
// Arduino Uno        9         8         10
// Arduino Mega      46        48       44, 45
// Wiring-S           5         6          4
// Sanguino          13        14         12

Eine Frage, da du ja schriebst, dass du das auf eine Platine aufbaust, besteht evtl. die Möglichkeit, dass du mit Swiss Machine Pins einen Arduino darauf steckbar machst? Dürfte deutlich einfacher sein, vorallem wenn mal das Teil defekt geht. Ein Pro Mini kostet ja nichts. (10$ Sparkfun).

versuche nun auch die Alt zu nutzen.

Aber ich kann noch nicht mal die Beispiele kompilieren...

In file included from C:\Program Files (x86)\Arduino\libraries\AltSoftSerial\AltSoftSerial.cpp:25:
C:\Program Files (x86)\Arduino\libraries\AltSoftSerial\/config/known_boards.h:101:2: error: #error "Please define your board timer and pins"
C:\Program Files (x86)\Arduino\libraries\AltSoftSerial\AltSoftSerial.cpp: In static member function 'static void AltSoftSerial::init(uint32_t)':
C:\Program Files (x86)\Arduino\libraries\AltSoftSerial\AltSoftSerial.cpp:64: error: 'CONFIG_TIMER_NOPRESCALE' was not declared in this scope
C:\Program Files (x86)\Arduino\libraries\AltSoftSerial\AltSoftSerial.cpp:68: error: 'CONFIG_TIMER_PRESCALE_8' was not declared in this scope
C:\Program Files (x86)\Arduino\libraries\AltSoftSerial\AltSoftSerial.cpp:75: error: 'INPUT_CAPTURE_PIN' was not declared in this scope
C:\Program Files (x86)\Arduino\libraries\AltSoftSerial\AltSoftSerial.cpp:76: error: 'OUTPUT_COMPARE_A_PIN' was not declared in this scope
C:\Program Files (x86)\Arduino\libraries\AltSoftSerial\AltSoftSerial.cpp:85: error: 'ENABLE_INT_INPUT_CAPTURE' was not declared in this scope
C:\Program Files (x86)\Arduino\libraries\AltSoftSerial\AltSoftSerial.cpp: In static member function 'static void AltSoftSerial::end()':
C:\Program Files (x86)\Arduino\libraries\AltSoftSerial\AltSoftSerial.cpp:90: error: 'DISABLE_INT_COMPARE_B' was not declared in this scope
C:\Program Files (x86)\Arduino\libraries\AltSoftSerial\AltSoftSerial.cpp:91: error: 'DISABLE_INT_INPUT_CAPTURE' was not declared in this scope
C:\Program Files (x86)\Arduino\libraries\AltSoftSerial\AltSoftSerial.cpp:94: error: 'DISABLE_INT_COMPARE_A' was not declared in this scope
C:\Program Files (x86)\Arduino\libraries\AltSoftSerial\AltSoftSerial.cpp: In static member function 'static void AltSoftSerial::writeByte(uint8_t)':
C:\Program Files (x86)\Arduino\libraries\AltSoftSerial\AltSoftSerial.cpp:119: error: 'ENABLE_INT_COMPARE_A' was not declared in this scope
C:\Program Files (x86)\Arduino\libraries\AltSoftSerial\AltSoftSerial.cpp:120: error: 'CONFIG_MATCH_CLEAR' was not declared in this scope
C:\Program Files (x86)\Arduino\libraries\AltSoftSerial\AltSoftSerial.cpp:121: error: 'GET_TIMER_COUNT' was not declared in this scope
C:\Program Files (x86)\Arduino\libraries\AltSoftSerial\AltSoftSerial.cpp:121: error: 'SET_COMPARE_A' was not declared in this scope
C:\Program Files (x86)\Arduino\libraries\AltSoftSerial\AltSoftSerial.cpp: At global scope:
C:\Program Files (x86)\Arduino\libraries\AltSoftSerial\AltSoftSerial.cpp:127: warning: 'COMPARE_A_INTERRUPT' appears to be a misspelled signal handler
C:\Program Files (x86)\Arduino\libraries\AltSoftSerial\AltSoftSerial.cpp: In function 'void COMPARE_A_INTERRUPT()':
C:\Program Files (x86)\Arduino\libraries\AltSoftSerial\AltSoftSerial.cpp:134: error: 'GET_COMPARE_A' was not declared in this scope
C:\Program Files (x86)\Arduino\libraries\AltSoftSerial\AltSoftSerial.cpp:142: error: 'CONFIG_MATCH_SET' was not declared in this scope
C:\Program Files (x86)\Arduino\libraries\AltSoftSerial\AltSoftSerial.cpp:144: error: 'CONFIG_MATCH_CLEAR' was not declared in this scope
C:\Program Files (x86)\Arduino\libraries\AltSoftSerial\AltSoftSerial.cpp:146: error: 'SET_COMPARE_A' was not declared in this scope
C:\Program Files (x86)\Arduino\libraries\AltSoftSerial\AltSoftSerial.cpp:156: error: 'CONFIG_MATCH_SET' was not declared in this scope
C:\Program Files (x86)\Arduino\libraries\AltSoftSerial\AltSoftSerial.cpp:157: error: 'SET_COMPARE_A' was not declared in this scope
C:\Program Files (x86)\Arduino\libraries\AltSoftSerial\AltSoftSerial.cpp:164: error: 'CONFIG_MATCH_NORMAL' was not declared in this scope
C:\Program Files (x86)\Arduino\libraries\AltSoftSerial\AltSoftSerial.cpp:165: error: 'DISABLE_INT_COMPARE_A' was not declared in this scope
C:\Program Files (x86)\Arduino\libraries\AltSoftSerial\AltSoftSerial.cpp:172: error: 'CONFIG_MATCH_CLEAR' was not declared in this scope
C:\Program Files (x86)\Arduino\libraries\AltSoftSerial\AltSoftSerial.cpp:173: error: 'SET_COMPARE_A' was not declared in this scope
C:\Program Files (x86)\Arduino\libraries\AltSoftSerial\AltSoftSerial.cpp: At global scope:
C:\Program Files (x86)\Arduino\libraries\AltSoftSerial\AltSoftSerial.cpp:190: warning: 'CAPTURE_INTERRUPT' appears to be a misspelled signal handler
C:\Program Files (x86)\Arduino\libraries\AltSoftSerial\AltSoftSerial.cpp: In function 'void CAPTURE_INTERRUPT()':
C:\Program Files (x86)\Arduino\libraries\AltSoftSerial\AltSoftSerial.cpp:197: error: 'GET_INPUT_CAPTURE' was not declared in this scope
C:\Program Files (x86)\Arduino\libraries\AltSoftSerial\AltSoftSerial.cpp:200: error: 'CONFIG_CAPTURE_FALLING_EDGE' was not declared in this scope
C:\Program Files (x86)\Arduino\libraries\AltSoftSerial\AltSoftSerial.cpp:203: error: 'CONFIG_CAPTURE_RISING_EDGE' was not declared in this scope
C:\Program Files (x86)\Arduino\libraries\AltSoftSerial\AltSoftSerial.cpp:209: error: 'SET_COMPARE_B' was not declared in this scope
C:\Program Files (x86)\Arduino\libraries\AltSoftSerial\AltSoftSerial.cpp:210: error: 'ENABLE_INT_COMPARE_B' was not declared in this scope
C:\Program Files (x86)\Arduino\libraries\AltSoftSerial\AltSoftSerial.cpp:225: error: 'DISABLE_INT_COMPARE_B' was not declared in this scope
C:\Program Files (x86)\Arduino\libraries\AltSoftSerial\AltSoftSerial.cpp:232: error: 'CONFIG_CAPTURE_FALLING_EDGE' was not declared in this scope
C:\Program Files (x86)\Arduino\libraries\AltSoftSerial\AltSoftSerial.cpp: At global scope:
C:\Program Files (x86)\Arduino\libraries\AltSoftSerial\AltSoftSerial.cpp:245: warning: 'COMPARE_B_INTERRUPT' appears to be a misspelled signal handler
C:\Program Files (x86)\Arduino\libraries\AltSoftSerial\AltSoftSerial.cpp: In function 'void COMPARE_B_INTERRUPT()':
C:\Program Files (x86)\Arduino\libraries\AltSoftSerial\AltSoftSerial.cpp:250: error: 'DISABLE_INT_COMPARE_B' was not declared in this scope
C:\Program Files (x86)\Arduino\libraries\AltSoftSerial\AltSoftSerial.cpp:251: error: 'CONFIG_CAPTURE_FALLING_EDGE' was not declared in this scope

Es liegt nicht an der Hardware. Irgendwas passt mit meiner IDE nicht, oder?

Autsch... Liegt an meiner Board.txt...

Die Board.txt ist glaube ich, was beim Leo auch teils Probleme gemacht hat. Das dürfte es sein ;) Bleib aber bei der AltSoft wenns geht.

Würd ich ja auch nutzen, nur mag die Lib scheinbar keine 8MHz Taktfrequenz =(

Und das war es dann auch mit dem PID-Regler :zipper_mouth_face:

Binäre Sketchgröße: 7.706 Bytes (von einem Maximum von 7.168 Bytes)

Toll... Naja, das Ergebniss vom Zweipunktregler ist nicht sehr schön, aber erfüllt seinen Zweck:

Sketchgröße: 7.706 Bytes (von einem Maximum von 7.168 Bytes)

Tja, 8kB Flash ist knapp, mit Arduino Software. Nicht umsonst ist Arduino gleich auf den 168 umgestiegen und selbst der UNO ist heute ein 328. Aber hat der ATMEGA8 nicht auch eine Hardware-Serial Schnittstelle? Wofür brauchst du AltSoftSerial?

sonst: A) Benutzt du/deine PID library float - Arithmetik. Das macht zwar vieles einfacher, kostet aber... Eine sportliche Herausforderung : PID in 16 bit Integer-Arithmetik ... ( Besser als 2Punkt ?) B) ATMEGA328 statt ATMEGA8 - hat die gleichen 28 Pins, kostet im Guloshop das Doppelte (2,50 statt 1,25 EUR) C) Bootloader raus (ist da überhaupt einer din, in den letzten 1000 Bytes ?)

michael_x:

Sketchgröße: 7.706 Bytes (von einem Maximum von 7.168 Bytes)

Tja, 8kB Flash ist knapp, mit Arduino Software. Nicht umsonst ist Arduino gleich auf den 168 umgestiegen und selbst der UNO ist heute ein 328. Aber hat der ATMEGA8 nicht auch eine Hardware-Serial Schnittstelle? Wofür brauchst du AltSoftSerial?

sonst: A) Benutzt du/deine PID library float - Arithmetik. Das macht zwar vieles einfacher, kostet aber... Eine sportliche Herausforderung : PID in 16 bit Integer-Arithmetik ... ( Besser als 2Punkt ?) B) ATMEGA328 statt ATMEGA8 - hat die gleichen 28 Pins, kostet im Guloshop das Doppelte (2,50 statt 1,25 EUR) C) Bootloader raus (ist da überhaupt einer din, in den letzten 1000 Bytes ?)

Hardware Serial Pins hatte ich belegt. Da die ganzen fertigen LIBs jedoch kein 8MHz (nutze den internen Takt) unterstützen, habe ich die Belegung geändert und nutze nun Hardware-Serial, da soft eh nicht geht und ich nicht so tief drinnen stecke, um mal gerade eine Lib zu ändern.

A) Nein, Nur ganzzahlige Werte werden verarbeitet B) Habe den ATMEGA8 genommen, weil ich den nicht wegschmeissen will und den hier liegen hatte C) Bootloader ist raus. Mit Extremburner geprüft. Flash in dem Bereich sauber.

Das Programm bläht sich auf, sobald ich den Regler einbinde. Mal schauen, vllt baue ich mir bei gelegenheit einen Regler mit Aufheizphase und darin begrenzter Leistung. Sowie eine Leistungsbegrenzung während der restlichen Laufzeit. Ohne komplexen PID. Mein Problem ist ja nur, dass der Heizkörper so heiß wird.

Habe den ATMEGA8 genommen, weil ich den nicht wegschmeissen will und den hier liegen hatte

Das leuchtet mir ein. Kaufen ist keine Lösung, sonst wäre man gar nicht hier.

Nein, Nur ganzzahlige Werte werden verarbeitet

Aber die Library rechnet wohl mit double. Wenn es die normale github / arduino playground PID Library ist.
Double sind zwar auch nur 32bit - floats, aber die float library im avrgcc wiegt schon was.
Nachtrag ausprobiert:
Zufügen der 3 Zeilen

// double x = 10;
// x = 1/x;
// Serial.println(x);

macht 2610 → 4222 bytes in einem kleinen Beispielsketch sonst ohne floats.

Wenn ich das Problem hätte, würde ich spasseshalber mal die PDI Lib umschreiben, indem ich alle double durch long ersetze und das ganze kompiliert kriege ohne dass die float library mitgelinkt wird.
Läuft dann natürlich nicht, aber zeigt ob es was bringen könnte

Sketchgröße: 7.706 Bytes (von einem Maximum von 7.168 Bytes)

Ohne bootloader sollten doch 7800 Bytes in einen 8kB Speicher passen ?
Was passiert beim “Upload using Programmer” ?
Müssen da noch fuses anders gesetzt werden, damit kein bootloader Bereich geschützt bleibt?
Die 7.168 stammt aus der boards.txt und steht da, nach meinem Verständnis, wenn man nicht über bootloader lädt, nur zum Spass, oder ???

Ja, die Library rechnet mit double. Versuche die mal demnächst umzustricken.

In der Board.txt ist der maximale Speicher falsch angegeben. Hatte die Daten ohne zu überlegen kopiert und die Reserve für den Bootloader nicht beachtet.

atmega8a.name=ATmega8-16PU (standalone without OSZ)

atmega8a.upload.protocol=stk500
atmega8a.upload.maximum_size=7168
atmega8a.upload.speed=19200

atmega8a.bootloader.low_fuses=0xE4
atmega8a.bootloader.high_fuses=0xD9
atmega8a.bootloader.path=atmega8
atmega8a.bootloader.file=ATmegaBOOT-prod-firmware-2009-11-07.hex
atmega8a.bootloader.unlock_bits=0x3F
atmega8a.bootloader.lock_bits=0x0F

atmega8a.build.mcu=atmega8
atmega8a.build.f_cpu=8000000L
atmega8a.build.core=arduino
atmega8a.build.variant=standard

Könnte damit dann sogar klappen.

R1der:
Ja, die Library rechnet mit double.
Versuche die mal demnächst umzustricken.

Spar dir das mit dem PID in integer, das funktioniert nicht für thermische System, weil du so extrem kleine i-anteile brauchst.
Das ist integer darzustellen ist extrem aufwändig.

Wenn dein 2-punktregler läuft, dann paßt das doch!

alternativ kannst du auch einen PID selbst schreiben:

double PID_Kp = 2;
double PID_Ki = 0.001;
double PID_Kd = 0;

int PID(double Ist, double Soll){  
     const int Regeltakt = 1000;
     static unsigned long next_PID = 0;       
     static double last_Ist, ITerm;
     static int out;
     
     if (millis() > next_PID){
       next_PID += Regeltakt;
       double error =  Soll - Ist;
       double pTerm = PID_Kp *error; 
       ITerm += (PID_Ki * error /Regeltakt );	
       if(ITerm > 255) ITerm= 255; else if(ITerm < 0) ITerm= 0; 
       double dTerm = PID_Kd*(Ist - last_Ist)/Regeltakt;	
       last_Ist = Ist;
       out = pTerm + ITerm - dTerm;			
       if(out > 255) out= 255; else if(out < 0) out= 0; 
     }
     return out;
} // end funktion PID

das funktioniert nicht für thermische System, weil du so extrem kleine i-anteile brauchst

Das es nicht so einfach und universell geht, ist klar. Aber wenn ist und soll nur Zahlen zwischen 0 und 1023 sind, und das Ergebnis eine Zahl im Bereich 0 .. 255, muss man sich "nur" noch klarmachen dass man statt einem I Anteil von z.B. 0.01 / sec eher mit einem Anteil von 1 / 100 sec rechnet. ( man kann also nicht jede Sekunde einen Wert von 0.01 aufaddieren, sondern muss hochrechnen, wann der I-Anteil um +- 1 geändert wird. Schon deutlich komplizierter ;) Allerdings gebe ich dir auch recht: Eine TemperaturRegelung für einen 3l Wassertank sollte man auch mit einem einfachen Regler und ohne PWM hinkriegen.