/* Single_Temp.pde - Example using the MAX6675 Library. Created by Ryan McLaughlin <ryanjmclaughlin@gmail.com>
This work is licensed under a Creative Commons Attribution-ShareAlike 3.0 Unported License. http://creativecommons.org/licenses/by-sa/3.0/ */ #define HIDEGEBB 6 // relay1 #define MELEGEBB 7 // relay2 #define MOTORFUTASIDO 1000 #define CIKLUSIDOMP 30 #include <MAX6675.h> int x = 0; int row = 0; int LED1 = 13; // Status LED Pin int CS = 4; // CS pin on MAX6675 int SO = 3; // SO pin of MAX6675 int SCLK = 5; // SCLK pin of MAX6675 int units = 1; // Units to readout temp (0 = raw, 1 = ˚C, 2 = ˚F) float temperature = 0.0; // Temperature output variable float hofok10 = 0.0;
// Initialize the MAX6675 Library for our chip MAX6675 temp(CS,SO,SCLK,units);
// Setup Serial output and LED Pin // MAX6675 Library already sets pin modes for MAX6675 chip! void setup() { Serial.begin(9600); Serial.println("CLEARDATA"); Serial.println("LABEL, TIME, temperature"); pinMode(LED1, OUTPUT); pinMode(HIDEGEBB, OUTPUT); pinMode(MELEGEBB, OUTPUT); }
void loop() { // Read the temp from the MAX6675 temperature = temp.read_temp();
if(temperature < 0) { // If there is an error with the TC, temperature will be < 0 Serial.print("Thermocouple Error on CS"); Serial.println( temperature ); digitalWrite(LED1, HIGH); } else { //Serial.print("Current Temperature: "); Serial.println(temperature ); digitalWrite(LED1, LOW); Serial.print("DATA, TIME,"); row++; x++; } // Wait one second before reading again delay(500);
/* Initiate a temperature conversion. According to MAX's tech notes FAQ's for the chip, Line going high initiates a conversion, which means, we need to clock the chip low to high to initiate the conversion, then wait for the conversion to be complete before trying to read the data from the chip. */ digitalWrite(_CS_pin,LOW); delay(2); digitalWrite(_CS_pin,HIGH); delay(220);
/* Read the chip and return the raw temperature value */
/* Bring CS pin low to allow us to read the data from the conversion process */ digitalWrite(_CS_pin,LOW);
/* Cycle the clock for dummy bit 15 */ digitalWrite(_SCLK_pin,HIGH); delay(1); digitalWrite(_SCLK_pin,LOW);
/* Read bits 14-3 from MAX6675 for the Temp. Loop for each bit reading the value and storing the final value in 'temp' */ for (int i=11; i>=0; i--) { digitalWrite(_SCLK_pin,HIGH); value += digitalRead(_SO_pin) << i; digitalWrite(_SCLK_pin,LOW); }
/* Read the TC Input inp to check for TC Errors */ digitalWrite(_SCLK_pin,HIGH); error_tc = digitalRead(_SO_pin); digitalWrite(_SCLK_pin,LOW);
/* Read the last two bits from the chip, faliure to do so will result in erratic readings from the chip. */ for (int i=1; i>=0; i--) { digitalWrite(_SCLK_pin,HIGH); delay(1); digitalWrite(_SCLK_pin,LOW); }
// Disable Device digitalWrite(_CS_pin, HIGH);
/* Keep in mind that the temp that was just read is on the digital scale from 0˚C to 1023.75˚C at a resolution of 2^12. We now need to convert to an actual readable temperature (this drove me nuts until I figured this out!). Now multiply by 0.25. I tried to avoid float math but it is tough to do a good conversion to ˚F. THe final value is converted to an int and returned at x10 power.
2 = temp in deg F 1 = temp in deg C 0 = raw chip value 0-4095 */ if(_units == 2) { temp = (value*0.25) * 9.0/5.0 + 32.0; } else if(_units == 1) { temp = (value*0.25); } else { temp = value; }
/* Output negative of CS_pin if there is a TC error, otherwise return 'temp' */ if(error_tc != 0) { return -_CS_pin; } else { return temp; } }
/* Single_Temp.pde - Example using the MAX6675 Library. Created by Ryan McLaughlin <ryanjmclaughlin@gmail.com>
This work is licensed under a Creative Commons Attribution-ShareAlike 3.0 Unported License. http://creativecommons.org/licenses/by-sa/3.0/ */ #define HIDEGEBB 6 // relay1 #define MELEGEBB 7 // relay2 #define MOTORFUTASIDO 1000 #define CIKLUSIDOMP 30 #include <MAX6675.h>
int LED1 = 13; // Status LED Pin int CS = 4; // CS pin on MAX6675 int SO = 3; // SO pin of MAX6675 int SCLK = 5; // SCLK pin of MAX6675 int units = 1; // Units to readout temp (0 = raw, 1 = ˚C, 2 = ˚F) float temperature = 0.0; // Temperature output variable float hofok10 = 0.0;
// Initialize the MAX6675 Library for our chip MAX6675 temp(CS,SO,SCLK,units);
// Setup Serial output and LED Pin // MAX6675 Library already sets pin modes for MAX6675 chip! void setup() { Serial.begin(9600); pinMode(LED1, OUTPUT); pinMode(HIDEGEBB, OUTPUT); pinMode(MELEGEBB, OUTPUT); }
void loop() { // Read the temp from the MAX6675 temperature = temp.read_temp();
if(temperature < 0) { // If there is an error with the TC, temperature will be < 0 Serial.print("Thermocouple Error on CS"); Serial.println( temperature ); digitalWrite(LED1, HIGH); } else { Serial.print("Current Temperature: "); Serial.println( temperature ); digitalWrite(LED1, LOW); } // Wait one second before reading again delay(1000);
Arduino: 1.5.8 (Windows 7), Board: "Arduino Due (Programming Port)"
read_temp.pde:14:5: error: conflicting declaration 'int SCK' In file included from D:arduinohardwarearduinosamcoresarduino/Arduino.h:189:0, from C:Userswindows71DocumentsArduinolibrariesMAX6675-Library-master/MAX6675.h:12, from read_temp.pde:9: D:arduinohardwarearduinosamvariantsarduino_due_x/variant.h:135:22: error: 'SCK' has a previous declaration as 'const uint8_t SCK' static const uint8_t SCK = PIN_SPI_SCK; ^ Hiba a fordítás során.
This report would have more information with "Show verbose output during compilation" enabled in File > Preferences.
Azt is illik figyelembe venni, hogy az 1.5.8 BETA verzió máshogy kezeli a könyvtárakat mint a korábbi verziók. Akinek van ideje érdemes összehasonlítani egy régebbit az újjal, kicsit belemászva. Speciális meghatározott felépítése van, hogyan kell felépülnie a könyvtáraknak és van mindegyikben egy fájl is, ami leírja a könyvtár tartalmát.
Első gyanúm a hibaüzenet alapján, hogy neked ez a könyvtár nincs is telepítve, így bele se tudja fordítani a kódba. Így azt le kell töltened, és hozzá kell adni a könyvtárakhoz.
Ha régi felépítésű könyvtárt találsz, akkor egy korábbi Arduino verziószámmal kell feltöltened, vagy át kell alakítani a könyvtár szerkezetét.
Tipp: rosszul van telepítve a könyvtár. Szedd le, nézz bele editorral, hogy nincs-e benne hibás belső hivatkozás, aztán tedd fel újra rendes, hivatalos úton.
Mert hiába rakod tele ha az este úgyis be kell gyújtani. A 85/70 fokos pufi vesztesége 25%-al több mint egy 70/70-re fűtött pufié.
Igaz 25%-al több energiát raktál bele, de annak a 20%-át buktad veszteség formájában."
Ez így nagyon általános megfogalmazás.A fenti érték saccra 5-10 cm szigeteléssel lehet igaz, de ha emeled a szigetelés vastagságát ezek a számok már nagyon nem igazak.
Nem cél a fojtott működés, a teljesítmény csökkentés szülte kényszer.
Viszont a rendszerhatásfokát inkább növeli, ez mért adat.
A napi hőmérséklet időszakfüggő, de egy hőigényen felül az alacsonyabb periódusban inkább gazdaságos a fojtott üzem, mint a nagyintenzitású ezért alacsonyabb hatásfokú felfűtés.
Az emberi bioszenzor érzékenységétől függ, mekkora hőingadozást visel el rövidtávon, hogyan működik a hőkomfortja.
Mert ez kényelmes lehet, de én nem hiszek abban, hogy ez kevesebb fűtőanyagot igényelne.
A hőfok érdekes kérdés. Mert nem feltétlen jó az egyenletes hőfok. Ha már közel van az elvárt értékhez a helyiség hőmérséklete a lecsökkentett hőmérsékletű radiátor szerintem jobb komfortot (és megtakarítást is) eredményez.
E mellett számomra jobb ha éjszaka hidegebb van. Egy szolid 3-5 fokos hőfoklépcső ha beilleszthető a napi rutinba jelentős, 20-30% megtakarítást is eredményezhet. (ezt viszont saját tapasztalatból tudom, mert mértem még anno gázból).
"A kazán-puffer viszonylatában a maximális kazánhatásfok, maximális pufferhőfok, a puffer-radiátor oldalon a maximális hőkomfort, az időjáráskövető egyenletes, a helyiséghasználatot követő hőleadás a cél."
A maximális pufferhőfok nagyon csalóka. Több topicban is zajlik a licitálás a ki tud többet berakni a pufferbe verseny.
HA a puffer nem fűtött térben van, hanem kazánház, pince, garázs ez full totális veszteség.
Inkább a puffer kapacitásának illesztése a hőigényhez lenne érdekes.
Mert hiába rakod tele ha az este úgyis be kell gyújtani. A 85/70 fokos pufi vesztesége 25%-al több mint egy 70/70-re fűtött pufié.
Igaz 25%-al több energiát raktál bele, de annak a 20%-át buktad veszteség formájában.
Ha így közelíted meg, akkkor egy arduinó képes lehet (???) megmondani, hogy mennyi fa kell ahhoz, hogy a tárolási veszteséged csökkenjen. (Tudom, így leírva utópia, de valahol ez lehet a megtakarítás egyik alapja).
Pont olyan dologról írtok amit majd valamikor szeretnék megvalósítani.
Nem az ésszerűség hanem a hobbi miatt.
Ami nekem folyamatirányításból átjött anno és szerintem a neheze az a differenciál egyenlet felírása.
Tegyük fel, hogy a házunk fűtéséhez készülő pid vezérléshez akarom felírni az egyenletet.
Mi az alapja az egyenletnek?
Amiket látok PID-nek mondott vezérléseket mind hőfokra, füstgázra vezérel.
Én egy picit másképp gondoltam: az energia mennyiségre szeretném felírni az egyenletet.
Az épület hőveszteségét kell pótolni. De beleszámít a hőtároló kapacitás, a rendszer saját tároló képessége, puffer (mint tárolós tag a "P", "I", "D" tagon felül).....
Ezek szerencsére létező s jól megfogható összefüggések. Szerintem egy arduino simán elboldogulna vele, merthogy az egyenletek egy jelentős része előre meghatározható, nem változó, hanem konstans értékekkel számolható. (pl a falak hűlése egy felmérés után alig tartalmaz változót: a rétegrendből származó hőátbocsájtás innentől egyszerű).
Arduino + PLC: ezt ismered? Még nem próbáltam, de PLC-szerű library arduino-ra. Mondjuk én inkább leprogramoztam eddig kézzel, de a PLC ladder logicnak lehet előnye, talán jobban áttekinthető és könnyebb.
Vannak hasonló tervek, ileltve egy része megvalósult, csak máshogy.... Nálam jelenlege egy PLC műveli a felvázolt dolgot, és van egy két plusz még:
- a padlófűtésem is van, és be van rakva a betonba is egy hőérzékelő, ami méri konkrétan a beton hőmérsékletét (persze jó kérdés, melyik részre és hová tegyünk egy ilyen érzékelőt, mert nem evidens.... eleve többkörös, északi és déli oldal, stb)
- elgondolkodtató lenne az osztógyűjtő kimenetére elektronikus elzárószelepeket rakni áganként (csak ne kerülne olyan sokba....), így körönként szabályozhatóvá válhatna a hőmérséklet (persze jó lett volna gyárilag kihúzni szobánként, de az rengeteg cső és pénz)
Viszont mivel elég bugyuta PLC, ezért olyan sokmindenre nem alkalmas, csak alapdolgokra. Így tervezem lecserélni magam is mikrovezérlős rendszerre az egészet, mert egy korrekt PLC nagyon drága masinéria.
Egy vegyes-puffer körbe lehet nem nyúlnék bele elektronikával, hordoz magában veszélyeket. Persze meg lehet oldani biztonsági pluszokkal, de ott nem érzem szükségét belenyúlni. Nem gondolom, hogy sokkal jobb hatásfokot kapunk. Max ugyebár a már sokak által megvalósított elektronikus huzatszabályzóval lehet kicsit jobbá tenni, de másban én nem látok nagyon nagy lehetőséget.
Puffer-ház körnél viszont annál inkább van értelme......
Az eddigi fűtési és mérési tapasztalatok alapján kezd fogalmazódni a követelményrendszer, ami a gazdaságosan megvalósítható komfortos fűtéshez vezethet.
Vegyestüzelés és radiátoros fűtés esetén nem beszélhetünk kiegyensúlyozott hőáramokról, meglehetősen változóak a körülmények.
Ezért fontos a viszonylag kevésszámú beavatkozási elem kezelése.
A szabályzó elektronika ne legyen nagyon bonyolult, masszív legyen, megbízható, az összes bekerülési költség arányos részét képviselje.
Az is látszik a mérések alapján, a puffer lesz az a beiktatott gépészeti elem a rendszerben, ami a legkönnyebben összekapcsolja a két eltérő működésű egységét.
Vagyis kell egy időjáráskövető szabályozás egy vegyestüzelésű-puffer-radiátor elemekből álló fűtéshez. Esetemben.
A kazán-puffer viszonylatában a maximális kazánhatásfok, maximális pufferhőfok, a puffer-radiátor oldalon a maximális hőkomfort, az időjáráskövető egyenletes, a helyiséghasználatot követő hőleadás a cél.
"ahol én a klasszikus értelemben vett pid szabályozásnak nem sok értelmét látom, mert ahogy te is írtad, annyi külső változó van, hogy annak komplexitása"
Ez így nem igaz. persze el lehet menni a végtelenbe bonyolultságot és algoritmust tekintve, de van egy egészséges határ, amit betartva igenis hasznos és jól alkalmazható dolog. Ez kb az a kategória, hogy méred a külső, belső hőmérsékletet, és a keverőszelepen tudsz változtatni az előremenőn. Ez három mérési pont, nem több, és elég tud lenni.- Gyárilag is hasonlóak a szabályzók, van amelyik még az előremenőt sem méri, vagy magával a kazánnal kommunikálva intézi ezt el. és mérhető adott esetben az energiatakarékosság is, a kevesebb energiafelhasználás.
Ipari szintű méretekben is hasonló az elv, csak ott PLC-ket használnak a vezérlés megvalósítására, és sokzónás rendszer van, több mindent mérnek. Illetve ebből kifolyólag sokkal komplexebb.
"de adott esetben egy több magos nagy processzor számítási kapacitását is erősen feszegetné."
Ez nagyon nagy baj lenen ha így lenne. Egy pár Mhz-en ketyegő mikrokontrollerrel ez simán úgy megvalósítható, hogy az idő 99%-ban pihen a kontroller :-). Nem igényel ez komoly erőforrást, csak jól megkonstruált matematikai alapokat amik komoly elméleti háttérrel rendelkeznek. 20-30 ezer ft környékén már lehet kapni az egyszerűbb verziókat készen, abban sem P4 procik vannak - már csak a telepes alacsony energiafelhasználású táplálás miatt se. És PID alapúak. Az egyik ok amiért nem kell nagy erőforrás a sebesség igénye. NAgy időállandók vannak, bőven van idő mindenre. Pl egy motorvezérlésnél, ahol usec idők alatt kell beavatkozni és reagálni, ott már más a helyzet, az keményebb dió.
Köszi, nagyon jó összefoglaló. Java itt megvan/volt teljesen. :-)
Alapvetően rendkívül egyszerű rendszer építése a cél később, 1 bites kimenettel és kvázi-analóg, viszonylag szűk tartományú, de annál nagyobb felbontású bemenettel. Később jön majd kifelé analóg rendszer is, aminek a bemenete már nem egy, hanem várhatóan több paramétert fog elemezni (szintén analógot, csak más jellegűt).
Egyébként pont a ház fűtésvezérlés az, ahol én a klasszikus értelemben vett pid szabályozásnak nem sok értelmét látom, mert ahogy te is írtad, annyi külső változó van, hogy annak komplexitása nem hogy egy Arduino, de adott esetben egy több magos nagy processzor számítási kapacitását is erősen feszegetné. (Megjegyzem, az egyik barátom korábbi házában a fűtésszabályozás konkrétan a külső hőmérséklettől függött, vagyis akkor fűtött, amikor kint hideg volt, nem akkor, amikor bent, volt is gázszámla vastagon.)
Egy egyszerű rendszerben (egy bit ki, analóg be) egy Mega szintű 16 MHz-es mikrokontroller bőségesen elég a cél megvalósításához, ipari berendezésekben (konkrétan kávégépekben) is hasonló bonyolultságú eszközök dolgoznak teljesen megbízhatóan, paraméterezhetően (P, I, D paraméter). Ezt a szintet valamelyik O'Reilly-könyvben elég felszínesen ugyan, de funkcionálisan megfelelően kivesézik, annyira legalábbis, hogy egy működő egyszerű rendszer összeállítható legyen. Majd megkeresem, illetve majd ha odaérek, mutatom a projektet is.