Fórum témák

» Több friss téma
Fórum » K típusú hőelem alkalmazása
Lapozás: OK   3 / 3
(#) Inhouse válasza Istyu97 hozzászólására (») Okt 19, 2023 / 1
 
Gondolom zárt szelvényt sem készítesz pl. otthon.
(#) 24bitponthu válasza Istyu97 hozzászólására (») Okt 21, 2023 /
 
Otthon hazilagosan is pofon egyszerű osszeforrasztani , saját anyagból.
Ha érdekel leírom bár már többször is leírtam itt .
(#) HA5AWS hozzászólása Máj 4, 2024 /
 
Sziasztok!
Egy hőelemet szeretnék páka hőmérsékletmérésre használni. Eddigi méréseim szerint "K" típusú a szonda. A táblázat amit letöltöttem a nulla fokos befogóra adja a hőmérsékletekhez az értékeket. Ahhoz, hogy valós értéket kapjak a mérésnél jó megoldás-e ha a táblázatban megadott pl. 22 fokra megadott értéket a mért értékhez hozzáadom? Későbbiekben egy PIC-es áramkör kerül rá megfelelő erősítővel, és az kompenzálja egy hőmérővel a kijelzett értéket. Nem labor alkalmazásnak szeretném használni, csak amatőr felhasználású a készülék. Jó-e az elgondolásom vagy valami más megoldást javasoltok?
Köszönöm a segítséget!
Üdv: Gábor
A hozzászólás módosítva: Máj 4, 2024
(#) proli007 válasza HA5AWS hozzászólására (») Máj 4, 2024 /
 
Hello! Jól gondolod, de kapható MAX6675 amiben benne van a hidegpont kompenzáció is.
(#) HA5AWS válasza proli007 hozzászólására (») Máj 4, 2024 /
 
Szia!
Köszönöm. A MAX jó lenne ha tudnék programozni.
Üdv: Gábor
A hozzászólás módosítva: Máj 4, 2024
(#) kaqkk válasza HA5AWS hozzászólására (») Máj 5, 2024 /
 
Ha nem tudsz programozni hogyan lesz pices áramkör rajta ?
Idézet:
„Későbbiekben egy PIC-es áramkör kerül rá”
(#) Gafly válasza kaqkk hozzászólására (») Máj 5, 2024 / 1
 
Szuicid hajlamaid vannak.
A hozzászólás módosítva: Máj 5, 2024
(#) HA5AWS válasza kaqkk hozzászólására (») Máj 5, 2024 /
 
Szia!
Mondjuk ebben a formában nem teljesen igaz, PARSIC segítségével konyhanyelven elvagyunk egymással. Kb. ezen a szinten megy a PIC programozás.
Üdv: Gábor
(#) robis01 válasza HA5AWS hozzászólására (») Máj 6, 2024 / 1
 
Ha esetleg más is számításba jöhet nem csak PIC, akkor vannak komplett projektek ARDUINO-ra.
wokwi
Arduino
video1
video2
(#) HA5AWS válasza robis01 hozzászólására (») Máj 6, 2024 /
 
Köszönöm!
Úgy tűnik tovább kell képezzem magam, tetszenek a megoldások.
Üdv: Gábor
(#) pittyu2 válasza dcsabi hozzászólására (») Feb 25, 2026 /
 
Szia. A hestore ben vett MAX6675 modulokat használom, de a hőfok szabályzóban zavar az érték ugrálás. Az összeállításom :Arduino nano, 2*16 LCD, piros- zöld led és Relé. Mikor a beállított hőfok környékén a lassú hőfok változás miatt ki-be kapcsolgat a relé az zavar.(meg a működtetett eszközt)
Te találtál megoldást érték átlagolással, erre lennék kíváncsi. Hol találok rá megoldást, mitkell a programban módosítani.
Köszi : pittyu
(#) klausz18 válasza pittyu2 hozzászólására (») Feb 25, 2026 /
 
Számolj standard eloszlást a több mérés adatából és dobd el belőle a standard eloszlási sávon kívülieket. Minden analógban végződő szenzornál ha fontos a biztos mérés, legalább ezt kell használni. Sima 10K-s NTC-nél is van ilyen környezet okozta zaj probléma, nem csak a K-ra jellemző.
Sok helyen használom az AVT algoritmust, mert sokkal egyszerűbb mint FIR vagy FFT-t csinálni. Az AVT egyszerű mint a faék. De ha nem is standard eloszlást számolsz, simán eldobhatsz minden olyan értéket ami az eddigi átlag 2x-ese mondjuk, de akkor figyelni kell hogy amíg nincs meg a kellő minta szám a tömbödbe addig nem szabad, mert sosem fog feltöltődni.

AVT algoritmus
(#) HeZ válasza pittyu2 hozzászólására (») Feb 25, 2026 /
 
Gyakorlati, egyszerű megoldások a kétféle problémára:
- ugrálás: átlagolás 1 = 10 elemű tömbbe sorban írom a mért értékeket, ha az eltérés nagyobb, mint az átlag X%-ánál, 0-át írok, majd átlagolom a nem 0 értékeket;
átlagolás 2 = 10 elemű tömbbe sorban írom a mért értékeket, ha az eltérés nagyobb az előző X%-ánál, eldobom az értéket, majd átlagolom a 10 értéket;
- ki-be kapcsolgató relé: hiszterézis alkalmazása: relét akkor kapcsolsz, ha az új átlag X%-nál kisebb/nagyobb az előző átlagnál.
Minden mérésnél megteszem ezen számításokat, nem várok 10 új mérésre - van ahol elég 10 mérésenként számolni, ez függ a mérés sebességénél.
klaus18 által javasolt Antonyan Vardan Transform (AVT) módszer is ilyesmi.
A hozzászólás módosítva: Feb 25, 2026
(#) pittyu2 válasza klausz18 hozzászólására (») Feb 25, 2026 /
 
Köszi , de ez nekem magas. Nem tudok programozni- csak lemásolni és feltölteni mások által megírt programokat.
(#) HeZ válasza pittyu2 hozzászólására (») Feb 25, 2026 /
 
Egyfajta megoldás chatgpt által:

* 10 darab analóg mérést átlagol (pl. hőmérséklet szenzor)
* Hiszterézist alkalmaz egy kapcsolási küszöb körül
* Relét (vagy LED-et) vezérel

A példa feltételezi, hogy:
* Az analóg hőmérséklet szenzor az **A0** lábon van (pl. LM35)
* A kimenet egy relé vagy LED a **8-as digitális lábon**

## Működési elv:
* 10 mintát veszünk gyors egymásutánban
* Kiszámoljuk az átlagot
* Ha az átlag **küszöb fölé megy + hiszterézis/2**, bekapcsol
* Ha az átlag **küszöb alá megy - hiszterézis/2**, kikapcsol
* A köztes tartományban nem változtat állapotot, ami megakadályozza a ki-be kapcsolgatást határértéken.

## Arduino példa kód:

const int sensorPin = A0;
const int outputPin = 8;

const int sampleCount = 10;

float threshold = 25.0; // Kapcsolási hőmérséklet (°C)
float hysteresis = 1.0; // Hiszterézis sáv (°C)

bool outputState = false;

float readAverageTemperature() {
long sum = 0;

for (int i = 0; i < sampleCount; i++) {
sum += analogRead(sensorPin);
delay(10); // kis stabilizációs késleltetés
}

float averageADC = sum / (float)sampleCount;

// LM35 esetén: 10mV / °C
// Arduino 5V referencia → 1023 = 5V
float voltage = averageADC * (5.0 / 1023.0);
float temperature = voltage * 100.0;

return temperature;
}

void setup() {
pinMode(outputPin, OUTPUT);
Serial.begin(9600);
}

void loop() {

float temp = readAverageTemperature();

Serial.print("Atlagolt homerseklet: ");
Serial.println(temp);

// Hiszterézis logika
if (!outputState && temp > (threshold + hysteresis / 2.0)) {
outputState = true;
digitalWrite(outputPin, HIGH);
}
else if (outputState && temp < (threshold - hysteresis / 2.0)) {
outputState = false;
digitalWrite(outputPin, LOW);
}

delay(1000);
}

## Példa beállítás

* threshold = 25°C
* hysteresis = 1°C

Kapcsolás:
* Bekapcsol: 25.5°C felett
* Kikapcsol: 24.5°C alatt

## Miért jobb ez így?

* ✔ Zajcsökkentés (10 minta átlagolás)
* ✔ Nem vibrál a relé
* ✔ Egyszerű, gyors, kis RAM igény
* ✔ AVR-en stabilan fut

Más megoldások:

* ✔ ESP32-re optimalizálva
* ✔ AVT jellegű statisztikai szűréssel
* ✔ Mozgóátlagos (rolling average) változatra
* ✔ Fixpontos (float nélküli) verzióra AVR-hez

Csak szólj
A hozzászólás módosítva: Feb 25, 2026
(#) HeZ válasza pittyu2 hozzászólására (») Feb 25, 2026 /
 
Zajos értékek szűrése AVT módszerrel:

const int sensorPin = A0;
const int outputPin = 8;

const int sampleCount = 10;

float threshold = 25.0; // Kapcsolási hőmérséklet
float hysteresis = 1.0; // Hiszterézis sáv (°C)

bool outputState = false;

float readTemperatureAVT() {

float samples[sampleCount];
float sum = 0;

// 1. Mintavétel
for (int i = 0; i < sampleCount; i++) {
int raw = analogRead(sensorPin);
float voltage = raw * (5.0 / 1023.0);
float temp = voltage * 100.0; // LM35

samples[i] = temp;
sum += temp;
delay(10);
}

// 2. Első átlag
float mean = sum / sampleCount;

// 3. Szórás számítás
float variance = 0;
for (int i = 0; i < sampleCount; i++) {
variance += pow(samples[i] - mean, 2);
}
variance /= sampleCount;
float stddev = sqrt(variance);

// 4. Outlier eldobás (±1 szórás)
float filteredSum = 0;
int validCount = 0;

for (int i = 0; i < sampleCount; i++) {
if (abs(samples[i] - mean) <= stddev) {
filteredSum += samples[i];
validCount++;
}
}

// Ha minden kiesne (ritka eset), visszatérünk az első átlaggal
if (validCount == 0) return mean;

// 5. Új átlag (AVT eredmény)
return filteredSum / validCount;
}

void setup() {
pinMode(outputPin, OUTPUT);
Serial.begin(9600);
}

void loop() {

float temp = readTemperatureAVT();

Serial.print("AVT homerseklet: ");
Serial.println(temp);

// Hiszterézis logika
if (!outputState && temp > (threshold + hysteresis / 2.0)) {
outputState = true;
digitalWrite(outputPin, HIGH);
}
else if (outputState && temp < (threshold - hysteresis / 2.0)) {
outputState = false;
digitalWrite(outputPin, LOW);
}

delay(1000);
}
(#) HeZ válasza pittyu2 hozzászólására (») Feb 25, 2026 /
 
Gyorsabb, integer (egész számokkal operáló, ezért kb. 4–6× gyorsabb) alapú, robusztus AVT módszer (hadd ne javasoljak további programmegoldásokat ):

const int sensorPin = A0;
const int outputPin = 8;

const byte sampleCount = 10;

int threshold = 250; // 25.0 °C (tized fokban)
int hysteresis = 10; // 1.0 °C (tized fokban)

bool outputState = false;

int readTemperatureAVT() {

int samples[sampleCount];
long sum = 0;

// 1. Mintavétel (ADC → tized °C)
for (byte i = 0; i < sampleCount; i++) {
int raw = analogRead(sensorPin);

// LM35 integer átszámítás:
// raw * 5000mV / 1023 → mV
// LM35: 10mV / °C
// → °C = mV / 10
// → tized °C = mV
long milliVolt = (long)raw * 5000L / 1023L;
int temp10 = milliVolt; // 1mV = 0.1°C

samples[i] = temp10;
sum += temp10;

delay(5);
}

// 2. Első átlag
int mean = sum / sampleCount;

// 3. Átlagos abszolút eltérés (MAD jelleg)
long devSum = 0;
for (byte i = 0; i < sampleCount; i++) {
devSum += abs(samples[i] - mean);
}

int avgDev = devSum / sampleCount;

// Robusztus szűrési faktor (állítható)
// 1.5x szórás jellegű küszöb (integerben)
int limit = avgDev * 3 / 2;

// 4. Outlier szűrés
long filteredSum = 0;
byte validCount = 0;

for (byte i = 0; i < sampleCount; i++) {
if (abs(samples[i] - mean) <= limit) {
filteredSum += samples[i];
validCount++;
}
}

if (validCount == 0)
return mean;

return filteredSum / validCount;
}

void setup() {
pinMode(outputPin, OUTPUT);
Serial.begin(9600);
}

void loop() {

int temp = readTemperatureAVT();

Serial.print("Robusztus AVT homerseklet (0.1C): ");
Serial.println(temp);

// Hiszterézis logika
if (!outputState && temp > (threshold + hysteresis / 2)) {
outputState = true;
digitalWrite(outputPin, HIGH);
}
else if (outputState && temp < (threshold - hysteresis / 2)) {
outputState = false;
digitalWrite(outputPin, LOW);
}

delay(1000);
}

Ha még stabilabbat akarsz:

limit = avgDev * 2; → lazább szűrés;
limit = avgDev; → agresszívebb szűrés;
kombinálható medián előszűréssel;
sliding window megoldással is átalakítható.
(#) HeZ válasza pittyu2 hozzászólására (») Feb 25, 2026 / 1
 
Vedd tekintetbe, a MAX6675-nek 12 bites (0,25 Celsius fok) felbontásnál ~220 msec a konverziós ideje, tehát másodpercenként kb 4-szer mérhetsz.
Az újabb, gyorsabb, 14 bites verzió = MAX31855.
Nomeg minek méred a hőmérsékletét, mire használod a mért értéket?
Kemencénél lassú mozgókorrekciós zajszűrés célravezető, gyorsabb vezérléshez PID (proporcionális + integráló + deriváló) szükséges, adaptív-zajszint alapú hiszterézis stb...
A hozzászólás módosítva: Feb 25, 2026
(#) pittyu2 válasza HeZ hozzászólására (») Feb 25, 2026 /
 
Nagyon hálás vagyok neked , valóban részletes leírás hogy mit kell csinálnom.
Azt hiszem lesz min gondolkodnom pár napig.Mit hova kell illeszteni a programban. Amúgy "hackster.IO program."
Idézet:
„Measure temperature using thermocouple and MAX6675”

Nincsenek nagy igények, a kijelzőt sem igazán nézi senki-csak a kazán szivattyú ki-be kapcsolását kell elintézni.Azt is kézzel mechanikusan végezzük. DEE !! ha véletlenül tűzrakásnál nincs bekapcsolva, vagy az utolsó tűzrakás után még parázsnál nincs kikapcsolva- akkor avatkozzon be.
Ha kialszik a tűz ,de a szivattyú még jár(mondjuk egész éjszaka ) akkor a pufferből jelentős hő veszlik el kéményen keresztül.Kissé értelmetlennek tűnik amit írok .Mégegyszer köszönöm a hozzászólásodat : pittyu
UI: A kémény kilépő hőfokát mérem.
A hozzászólás módosítva: Feb 25, 2026
(#) HeZ válasza pittyu2 hozzászólására (») Feb 26, 2026 / 1
 
Itt biztos segítünk a programban, ha ez a rész okoz gondot neked, így tudsz koncentrálni a projekted többi részére, amik szintén nagyon fontosak!
Igaz, ritkán fogjátok nézni a kijelzőt (pl 2x20 karakteres LCD vagy minimum 1"-os OLED), de javaslom, hiszen információt nyújt, könnyű a beállításokat megtenni-megváltoztatni, nem drága (1-2ezer forint), minimális a fogyasztása és nem egy szürke (fekete) dobozt kell nézned, amiben ki tudja mi történik-történt...
Sőt, ESP modulos megoldással mobiltelefonon is nézheted mi történik, mik a beállítások, stb.
A hozzászólás módosítva: Feb 26, 2026
(#) pittyu2 válasza HeZ hozzászólására (») Feb 26, 2026 /
 
Szia. Hálás vagyok azért mert foglalkozol a gondommal . Olyan sok lehetőséget kínáltál fel, hogy teljesen bele zavarodtam. Kiemelnéd azt a részt ami rám legjobban illik ??
Tehát az összeállításom : Ardu Nano,Max6675, 2*16 LCD, relé. Ez így már megvan- működik.
Max6675 : A0--S0: ,A1--CS.: A2--SCK.
Kimenet : D13--Relé--D8: ,LED-D9--LED
LCD: D2--D7
  1. #include <LiquidCrystal.h> //Libraries
  2. LiquidCrystal lcd(2, 3, 4, 5, 6, 7); //Arduino pins to lcd
  3.  
  4. #define SO  A0
  5. #define CS  A1
  6. #define SCK A2
  7.  
  8. #define G_led 8
  9. #define R_led 9
  10. #define buzzer 13
  11.  
  12. float temp_c, temp_f;
  13.  
  14. void setup(){
  15.  
  16. pinMode(R_led,OUTPUT); // declare Red LED as output
  17. pinMode(G_led,OUTPUT); // declare Green LED as output
  18. pinMode(buzzer,OUTPUT); // declare Buzzer as output
  19.  
  20. lcd.begin(16, 2); // Configura lcd numero columnas y filas
  21. lcd.clear();
  22. lcd.setCursor (0,0);
  23. lcd.print("   Welcome To   ");
  24. lcd.setCursor (0,1);
  25. lcd.print("  Thermocouple  ");
  26. delay(2000);
  27. lcd.clear();
  28. }
  29.  
  30. void loop(){
  31. lcd.setCursor(0,0);
  32. lcd.print("  Temperature   ");
  33. temp_c = Thermocouple_read();
  34. if(isnan(temp_c)){
  35. lcd.clear();
  36. lcd.setCursor(0,0);
  37. lcd.print("Connect");
  38. lcd.setCursor(0,1);
  39. lcd.print("Thermocouple");
  40. delay(1000);
  41. lcd.clear();
  42. loop();
  43. }
  44. temp_f = (temp_c * 9.0)/ 5.0 + 32.0; //convert Celcius to Fahrenheit
  45.  
  46. lcd.setCursor(0,1);
  47. lcd.print(temp_c,1);
  48. lcd.write(0xdf); // to display °
  49. lcd.print("C  ");
  50.  
  51. lcd.setCursor(9,1);
  52. lcd.print(temp_f,1);
  53. lcd.write(0xdf); // to display °
  54. lcd.print("F  ");
  55.  
  56.    
  57. if(temp_c>150){
  58. digitalWrite(buzzer, HIGH);
  59. digitalWrite(G_led, LOW); // Turn LED off.  
  60. digitalWrite(R_led, HIGH);  // Turn LED on.
  61. delay(300);
  62. }else{  
  63. digitalWrite(G_led, HIGH); // Turn LED on.  
  64. digitalWrite(R_led, LOW);  // Turn LED off.
  65. }
  66.  
  67. digitalWrite(buzzer, LOW);
  68. delay(500);
  69. }
  70.  
  71. double Thermocouple_read() {
  72. uint16_t v_out;
  73.  
  74. pinMode(CS, OUTPUT);
  75. pinMode(SO, INPUT);
  76. pinMode(SCK, OUTPUT);
  77.  
  78. digitalWrite(CS, LOW);
  79. delay(1);
  80. v_out = shiftIn(SO, SCK, MSBFIRST);
  81. v_out <<= 8;
  82. v_out |= shiftIn(SO, SCK, MSBFIRST);
  83.  
  84. digitalWrite(CS, HIGH);
  85. if (v_out & 0x4) {
  86. //Thermocouple is disconnected
  87. return NAN;
  88. }
  89.  
  90. // The lower three bits (0,1,2) are discarded status bits
  91. v_out >>= 3;
  92. // The remaining bits are the number of 0.25 degree (C) counts
  93. return v_out*0.2529;
  94. }
A hozzászólás módosítva: Feb 26, 2026
(#) user1914 válasza pittyu2 hozzászólására (») Feb 27, 2026 /
 
Szevasz!
Szemtelen voltam és behúztam a códodat az AI-ba.
Ami feltünt benne, hogy lehetséges hibát is feltárt.
Ami nem biztos hogy az, de esetleg lehet le kellene ellenőrizned.
Üdv. M.
(#) HeZ válasza pittyu2 hozzászólására (») Feb 27, 2026 /
 
Hirtelen 2 hiba + 1 hiányosság:
pinMode-okat a program elejére tedd;
MAX6675 kiolvasása nem 16 bites;
nincs benne zajszűrés.

Példa (LCD kezelés nélkül -> azt megoldottad és delay()-t használ, amit célszerű elkerülni, de itt nem kritikus):
const int SO = 4;
const int CS = 5;
const int SCK = 6;

const int outputPin = 8;

const byte sampleCount = 10;

int threshold = 100 * 4; // 100°C (0.25°C egységben)
int hysteresis = 4 * 2; // 2°C hiszterézis (0.25°C egységben)

bool outputState = false;

uint16_t readMAX6675raw() {
digitalWrite(CS, LOW);
delayMicroseconds(10);

uint16_t value = 0;

for (byte i = 0; i < 16; i++) {
digitalWrite(SCK, LOW);
delayMicroseconds(1);

value <<= 1;
if (digitalRead(SO))
value |= 1;

digitalWrite(SCK, HIGH);
delayMicroseconds(1);
}

digitalWrite(CS, HIGH);

// Bit 2 = thermocouple disconnected
if (value & 0x4) return 0xFFFF;

value >>= 3; // 12 bites adat
return value; // 0.25°C egység
}

int readTemperatureAVT() {

int samples[sampleCount];
long sum = 0;

for (byte i = 0; i < sampleCount; i++) {

uint16_t raw = readMAX6675raw();
if (raw == 0xFFFF) return 0; // hiba eset

samples[i] = raw;
sum += raw;

delay(220); // MAX6675 konverziós idő!
}

int mean = sum / sampleCount;

long devSum = 0;
for (byte i = 0; i < sampleCount; i++) {
devSum += abs(samples[i] - mean);
}

int avgDev = devSum / sampleCount;

int limit = avgDev * 3 / 2;

long filteredSum = 0;
byte validCount = 0;

for (byte i = 0; i < sampleCount; i++) {
if (abs(samples[i] - mean) <= limit) {
filteredSum += samples[i];
validCount++;
}
}

if (validCount == 0)
return mean;

return filteredSum / validCount;
}

void setup() {
pinMode(SO, INPUT);
pinMode(CS, OUTPUT);
pinMode(SCK, OUTPUT);
pinMode(outputPin, OUTPUT);

digitalWrite(CS, HIGH);
Serial.begin(9600);
}

void loop() {

int temp = readTemperatureAVT();

Serial.print("Homerseklet: ");
Serial.print(temp / 4.0);
Serial.println(" C");

if (!outputState && temp > (threshold + hysteresis / 2)) {
outputState = true;
digitalWrite(outputPin, HIGH);
}
else if (outputState && temp < (threshold - hysteresis / 2)) {
outputState = false;
digitalWrite(outputPin, LOW);
}
}
(#) pittyu2 válasza HeZ hozzászólására (») Feb 27, 2026 /
 
Szia.Ha kijavítom a leírt hibákat -PIN mode és felbontás, nem lehet csak pár sorral beilleszteni szűrést és differenciát ?
Mert már működik és csináltam LCD-t .
Most mennem kell unokázni , eltünök pár napra.
A hozzászólás módosítva: Feb 27, 2026
Következő: »»   3 / 3
Bejelentkezés

Belépés

Hirdetés
XDT.hu
Az oldalon sütiket használunk a helyes működéshez. Bővebb információt az adatvédelmi szabályzatban olvashatsz. Megértettem