Hirdetés

2024. április 26., péntek

Gyorskeresés

Hozzászólások

(#1) hcl


hcl
félisten
LOGOUT blog

"fénydiódás leválasztás "
Optocsatoló :)

A gombokhoz miért kell IC? Az Arduinora rá lehet drótozni simán a gombokat.
Amúgy zsír cikk, én is mostanában kezdtem Arduino alapú izéket építeni :) Azok is megjelennek majd itt :)

Mutogatni való hater díszpinty

(#2) schawo válasza hcl (#1) üzenetére


schawo
titán

Rá lehet, de nagyon nem elegáns, mert a nyomásérzékelés nem lesz jó. Az áthúzás miatt egy csomó fals lenyomást érzékel. A kondi simítja a jelet, az IC meg megszünteti a kondi miatti lassú felfutásból származó fals jeleket. Bővebben itt és itt

[ Szerkesztve ]

evDirect villanyautós töltőhálózat

(#3) lapa válasza schawo (#2) üzenetére


lapa
veterán

50 fokon hogyan hőkezelődik a hús? vagy úgy kérdem mivel biztosítod, hogy mindenhol meglegyen biztosan a 70 fok?

nem teljesen világos mi a különbség eme módszer és a lobogó vízbe zacskót rakás között. úgy tudtam ez csak a főzési időre van hatással, lásd kukta.

ha nagyon belegondolok nekem ez a vákuumzacsi se világos, lévén attól, hogy kiszivattyúzod a levegőt a nyomás odabent nem fog változni.

linkelhetnél esetleg valami szemléltető ábrát a gépről + nájlonról.

amúgy nagyon alapos cikk ezzel a sok bolondbiztos bekötési rajzzal. jó lenne ha lennének ilyen minőségű útmutatóim a saját projektjeim kapcsán.

(#4) hcl válasza lapa (#3) üzenetére


hcl
félisten
LOGOUT blog

Minden Arduino-s projekthez ilyenek vannak :) Fritzing-gel lehet ilyet.

@Schawo : Érteni. Én nem bonyoltanám ennyire, de igazából persze, szép megoldás. Én tettem az első gombos megoldásomra egy 300-as delayt, és annyi, ráadásul gy folyamatosan is érzékeli a lenyomást. (Óra beállításánál jó dolog :) )
Mondjuk persze, ez időérzékeny dolgoknál nem jó, de ahogy elnézem, ez a főzős sem az :)

[ Szerkesztve ]

Mutogatni való hater díszpinty

(#5) sonar


sonar
addikt

Pálinkát lehet vele főzni?

A tudást mástól kapjuk, a siker a mi tehetségünk - Remember: Your life – Your choices!

(#6) schawo válasza hcl (#4) üzenetére


schawo
titán

Az alapmenüt megszakításokkal fogom vezérelni, egy megszakításrutinban a delay pedig maga a halál :)

(#3) lapa
1. Minden húsfajtának megvan a maga receptje (hőmérséklet, idő). Ha az összes mérési ponton eléri a kívánt hőmérsékletet a víz, akkor indul a főzési idő.

2. Igen, a főzési időre van hatással. De az állaga is más egy kuktás ételnek, mint egy nem kuktásnak. Ugyanígy különbözik állagában a 100 fokon és az 50-70 fokon készített étel. Ezen kívül az étel nem érintkezik sem vízzel, sem oxigénnel.

3. Valóban nincs effektív vákuum. Azért kell vákuumfóliázni, mert így a zacskóban nincs jelen hőszigetelő levegőbuborék, ami miatt nem lenne garantálható a maghőmérséklet, továbbá se a főzés során, sem pedig a későbbi tárolás során nincs jelen levegő, így az étel nem oxidálódik, jobb az íz, és tovább eltartható.

Ez első rész, a cikk következő részében lesznek képek, Arduino kód, videó.

(#4) hcl
Az ábrák painttel készültek :D

(#5) sonar
Olyan nincs, hogy valami nem sörnyitó :))

[ Szerkesztve ]

evDirect villanyautós töltőhálózat

(#7) hcl válasza schawo (#6) üzenetére


hcl
félisten
LOGOUT blog

Ért :) Akkor igaz, hogy nem lehet szórakozni :)

Az ábrák meg nagyon hasonlítottak a Fritzing-esekre, ez akkor azt jelenti, hogy jók lettek :)

[ Szerkesztve ]

Mutogatni való hater díszpinty

(#8) szipak


szipak
tag

figyelemmel fogom követni a folyamatokat, fejleményeket, lehet én is belefogok egy ilyesmibe :)

(#9) Jim Tonic


Jim Tonic
nagyúr

Csaltál! :D
Kerestem a múltkori hozzászólásaimat, aztán láttam, hogy újra kiraktad a cikket. :) Látom, meg is csináltad a változtatásokat, amikről beszélgettünk.
Figyelem majd a projekted. Feleségemnek már meg is említettem, mert neki meg az a gyengéje, hogy elveszítik az ételek a tápanyag- és vitamin-tartalmukat. Eddig azt hitte, a párolás a megoldás, de most kiderült, hogy az sem. Szóval hajrá! :)

Alcohol & calculus don't mix. Never drink & derive.

(#10) schawo válasza Jim Tonic (#9) üzenetére


schawo
titán

Figyeld a kezem, mert csalok :D

Igen, megcsináltam a változásokat, mert ésszerű volt :K

evDirect villanyautós töltőhálózat

(#11) sing1ep1ayer


sing1ep1ayer
őstag

Ez biztos nagyon jó és egészséges dolog, a leírás is rendkívül részletes, de el nem tudom képzelni hogy milyen lehet amikor otthon már előző nap éjjel fel kell rakni a másnapi ebédet. :U Nem is beszélve arról, mibe kerülhet 8-12 órán át folyamatosan működtetni egy fűtőszálas eszközt egyetlen fogás miatt. :Y De nálam hab a tortán az, hogy ha adott napon az ebéden kívül még egy másik étkezés menüjét is Sous Vide módon szeretnénk elkészíteni, akkor kapásból két edényre lesz szükség, mert senki nem tart akkora szüneteket két evésidő között, mint amíg itt bármi is megfő. :DDD

UI: Ez nem feltétlen egy Neked, inkább a módszernek szánt kritika és a véleményt kizárólag a cikkedben olvasottak alapján alakítottam ki, máshol nem néztem utána.

(#12) schawo válasza sing1ep1ayer (#11) üzenetére


schawo
titán

A kész étel fagyasztás nélkül hetekig eláll a hűtőben, tehát bármikor előre elkészítheted. Tálalás előtt csak át kell sütni egy pillanatra, hogy sültes kérge keletkezzen. Tehát az ebéd elkészítése a fogyasztás előtt csak pár percet vesz igénybe, ennél gyorsabban nem lehet ételt készíteni. A bonyolultabb ételek így készülnek a jobb éttermekben, ellenkező esetben szegény vendégnek órákat kellene várnia.

A fűtőszállal nem lesz gond, nem megy az folyamatosan, a PWM vezérléssel kábé 5-10%-on fűt, hogy tartsa a hőmérsékletet.

[ Szerkesztve ]

evDirect villanyautós töltőhálózat

(#13) sing1ep1ayer válasza schawo (#12) üzenetére


sing1ep1ayer
őstag

Ezeket azért jó tudni. De így is előre kell főznöd ha rendszeresen használod, ráadásul nem 12 órával, hanem napokkal. Egy étteremben ez nem gond, ott természetesen előre dolgoznak, de a háztartásokban ez azért annyira nem jellemző. Otthon inkább csak az dívik, hogy adott ételből sokat készítenek és a maradékot későbbre elrakják.

Még azt nem értem, hogy ezek szerint általában csak húst készítenek vele? Mert gondolom a babot,a sárgarépát, vagy a krumplit nem sütik át tálalás előtt, hogy sültes kérge legyen. Azt meg elképzelhetetlennek tartom, hogy az 1 hétre előre megfőzött, majd hűtött, végül kérgesre sütött hús finomabb legyen, mint a hagyományos módon teljesen frissen elkészített verzió - de persze hozzáteszem: sosem kóstoltam a Sous Vide változatot.

Egyébként mondanál egy példát "bonyolultabb" ételre, aminél ez a módszer egyértelműen győztes egy étterem esetén? Esetleg Wellinton?

(#14) _Szasza_ válasza sonar (#5) üzenetére


_Szasza_
tag

:DDD Ezen nagyot röhögtem :)

(#15) schawo válasza sing1ep1ayer (#13) üzenetére


schawo
titán

[link] [link] [link]

evDirect villanyautós töltőhálózat

(#16) lapa válasza schawo (#15) üzenetére


lapa
veterán

ez hasznos, betehetnéd az írásba is. mindazonáltal nem az én világom, mondhatni rétegigényesség. meg azért paráznék az alapanyag miatt.

amúgy heston hasonlóan csinálta a tökéletes steaket, alacsony hőfokon huszonórát. asszem nem zacsiban, de előtte megkérgezte tán hogy ne száradjon.

mondjuk egy jó bőrös császárnak neki kéne futnom, rég volt már.

[ Szerkesztve ]

(#17) schawo válasza lapa (#16) üzenetére


schawo
titán

A cikk maga nem is annyira a főzésről akar szólni, hanem a készülék házi elkészítéséről. De azért beteszem a cikkbe is. :)

evDirect villanyautós töltőhálózat

(#18) lapa válasza schawo (#17) üzenetére


lapa
veterán

igen, ezt azért deklarálhatnád az elején, hogy mi a cél. most dobtam ki az összes lábosom, mondom uccsekell már...

amúgy az még mindig nem világos, hogy mi köze a hús feljavításának a gőzpároláshoz. ahogy én tudom az inkább zöldségekre van amúgy is, az meg nem szuvidolós hanem nyersenevős-gyümicentrifugázós.

(#19) schawo válasza lapa (#18) üzenetére


schawo
titán

Várj várj várj! Remélem a kukából azért még elő tudod halászni őket. Ha már jött a kukásautó, akkor bizony így jártál. :P

evDirect villanyautós töltőhálózat

(#20) Infomaker


Infomaker
tag

A módszer tényleg jó, aki nem hisz benne, menjen el egy étterembe, ahol ilyet készítenek, kóstoljon, utána jöjjön ide vissza. Olyan omlós lesz tőle a hús, hogy csak na, ja és zamatos is.

(#21) lapa válasza Infomaker (#20) üzenetére


lapa
veterán

ezt senki nem vitatta, szóval nyitott kapukra találtál.

(#22) Auratech


Auratech
őstag

Az eljárást én a magam barkács módján honosítottam a saját konyhámban, már elég régóta.
Legutóbb malaccsászárt készítettem...

Tehát adott egy hőlégkeveréses sütő, amin a belső hőmérsékletet fokra, na jó kb +-5 fokra be tudom állítani.
Beletettem egy fazék meleg vizet kuktában és 70 fokra állítva egy óra múlva megnéztem, hány fokos víz.
64 és nem ment feljebb még egy óra múlva sem. 75 fokra állítva kaptam 70 fokot. 85-re 81-t , tehát 3-5 fokot csal felfelé a sütő. Az eljárásnál lényeges a hús külső és maghőmérsékletének azonossága.
Népi hagyományainkban ezt a francia modern módot az abálás közelíti leginkább.

A Húst befűszereztem, némi olajos-mustáros-fokhagymás-fűszeres pácot készítettem, amivel bepacsmagoltam a húst. Egy sütőzacskóba tettem és szépen kiszippantottam belőle a levegőt úgy, hogy a zacskó megtekert nyakán jött fel a páclé. Szépen csomót kötöttem rá és voilá.
(A vákuumzár amúgy csak légmentesítést jelent, vákuumot nem, hiszen akkor felforrna a zacskóban és a húsban lévő víztartalmú folyadék szobahőmérsékleten.)
A zacsi bele az előkészített 70 fokos vízfördőbe és vissza a sütőbe. Szombat este.
Tíz óra izzadás után kivettem. A zsíros részek áttetszőkké váltak és a vajpuha lett, de nem mint a túlfőtt hús, szálasan, hanem rugalmasan omlós.
A bőrével felfelé, azt letörölgetve meggrilleztem, míg hólyagosra pirult. Forrón szeleteltem és a zacskóból nyert, kiforralt, homogenizált pecsenyelével tálaltam. Igény estén teflon serpenyőben kicsit megpirítottam az egyik felét.
Legkiválóbb így libamájat készíteni és a legeslegvégén libazsírban hirtelen megkapatni. A legvégén sózni!
A legfontosabb előnye az ízeken és az eltarthatóságon kívül, hogy az így készített drága húsételek esetén nincs a 20-40%-os súlyveszteség, mint a tepsiben sütéskor.

[ Szerkesztve ]

Auratech Field Recording

(#23) schawo válasza Auratech (#22) üzenetére


schawo
titán

:C

Szép, és ötletes megoldás ez is :)

evDirect villanyautós töltőhálózat

(#24) Auratech válasza schawo (#23) üzenetére


Auratech
őstag

Viszont a te megoldásod azért egy nagyságrenddel energiatakarékosabb és jóval elegánsabb. :)

Auratech Field Recording

(#25) lapa válasza Auratech (#24) üzenetére


lapa
veterán

miért lenne energiatakarékosabb? csak ha a sütő hővesztesége nagyobb, mint a műanyag edényé. azért a sütők általában egész jól szigeteltek. persze megy a villany meg a venti, de az utóbbi nem feltétlen fontos, ha már úgyis kalibráltad.

nem beszélve arról, hogy a villany meg a venti is fűt, szóval nem vész kárba.

[ Szerkesztve ]

(#26) schawo válasza lapa (#25) üzenetére


schawo
titán

Így van, inkább csak elegánsabb.

Meg ez egy sokkal geekebb megoldás :DD

[ Szerkesztve ]

evDirect villanyautós töltőhálózat

(#27) lapa válasza schawo (#26) üzenetére


lapa
veterán

kipróbálni egy fritőz is jó lehet, most jöttem rá. persze a termosztát érzékenysége nyilván nem egy kategória.

nagyobb családoknak esetleg a hajdú bojler is. reggelre melegvíz + melegétel iccakai tarifával, szigetelve. csak kiszedni nehézkes.

egyre jobban rábeszélem magam a császárra, valamikor ebből még nagy gányolás lesz.

[ Szerkesztve ]

(#28) mexel


mexel
veterán

Él még ez a topik? Ha igen akkor az érdekelne, hogy egy ilyen komplett PID kontroller nem használható a sous vide-hoz?

(#29) schawo válasza mexel (#28) üzenetére


schawo
titán

Jónak néz ki, tud mindent amit tudni kell, önkalibrálós változat. Tetszik.

evDirect villanyautós töltőhálózat

(#30) mexel válasza schawo (#29) üzenetére


mexel
veterán

Akkor ez a verzió megvehető? Egy barátom nagyon rá van izgulva a dologra, imád főzni (tud is :DDD ) és most ez a vágya hogy kipróbálhassa ezt is. Először arra akart rábeszélni hogy építsük meg az általad írt kütyüt, de lehet hogy ez meghaladná a képességeinket. talán ez a majdnem kész megoldás jó lehetne.
Mire kell figyelni egy ilyen vásárlásánál? Mert vannak olcsóbban is ha kifogja az ember, kérds ugyanazt tudják-e.
Még egy hosszabb hőmőrő kell hozzá, mert amit adnak elég rövid. Pár dollárért az is van elvileg.

(#31) schawo válasza mexel (#30) üzenetére


schawo
titán

Legyen valamilyen öntanuló elektronikája, a relé kimenő teljesítménye elegendő legyen (ezzel nem lesz gond), és az elektronika tényleg tudja, amit ráírtak (ez valószínű)

Továbbá szüksége lesz egy vízmozgatóra is (keverő vagy szivattyú), különben nagyon egyenetlen lesz a vízhőmérséklet. Az én itteni példámból hiányzik a vízmozgató, de van 4 hőmérő és 2 forraló. Viszont ez így ebben a formában működésképtelen volt. Amikor viszont belekerült a vízmozgató, utána elég volt egy forraló és egy hőmérő (van az említett csomagban).

evDirect villanyautós töltőhálózat

(#32) mexel válasza schawo (#31) üzenetére


mexel
veterán

Köszi! Valami keringetőre gondoltunk természetesen. A leírásban K sensor van írva, ez mit jelent?

Valami ilyesmi hőmérőre gondoltam pluszban.

[ Szerkesztve ]

(#33) schawo válasza mexel (#32) üzenetére


schawo
titán

K az erősítési faktor. Minden PID K-vezérléssel működik. Nem szenzornak hívjuk, de ez részletkérdés.

evDirect villanyautós töltőhálózat

(#34) schawo válasza mexel (#32) üzenetére


schawo
titán

De arra figyelj, hogy a legutóbb linkeltben nincs relé.

Ami esetleg hiányozni fog az ilyen kütyükből, az az időzítés.

[ Szerkesztve ]

evDirect villanyautós töltőhálózat

(#35) mexel válasza schawo (#34) üzenetére


mexel
veterán

A relé az mire való ezeknél, és milyen időzítésre gondolsz? Arra hogy beállítsuk pl hogy 8 óra után kapcsoljon ki?

(#36) schawo válasza mexel (#35) üzenetére


schawo
titán

A relé arra való, hogy a nagy teljesítményű, hálózati áramforrásról üzemelő eszközöket (itt forraló) lehessen vezérelni az elektronikával.

Igen arra gondoltam. Persze tudom, hogy már rég feltalálták a vekkert, de akkor is :D

evDirect villanyautós töltőhálózat

(#37) mexel válasza schawo (#36) üzenetére


mexel
veterán

Én is nézegettem a készüléket és a képeket, hogy hol mutat időt, de akkor nem csoda hogy nem találtam :)Köszi az infókat, az időzítő hiányának ellenére szerintem kipróbálunk majd egyet.

(#38) tvamos


tvamos
nagyúr

Aranyos kis cikk. Koszi!
Erdekel majd a PID kodod, meg ahogy beallitod a szabalyozasi kort.
Annyi, hogy nem erdemes 2% ala vinni a teljesitmenyt. A szolgaltato nem szereti a fel ciklusokat. Az DC...

"Mindig a rossz győz, és a jó elnyeri méltó büntetését." Voga János

(#39) schawo válasza tvamos (#38) üzenetére


schawo
titán

Nyugodtan lehet 2% alá is vinni a teljesítményt, ha a PWM ciklus elég nagy :)

evDirect villanyautós töltőhálózat

(#40) schawo válasza tvamos (#38) üzenetére


schawo
titán

Itt egy kód. Nem a végleges, mert azt most valamiért nem találom (asszem notin fejeztem be, az meg most nincs velem), de a lényeg megvan itt is.

#include <OneWire.h>
#include <DallasTemperature.h>
#include <LiquidCrystal.h>
#include <Metro.h>
#include <PID_v1.h>
#include <PID_AutoTune_v0.h>


#define ONE_WIRE_BUS_PIN 0

#define TIME_INTERVAL 100
#define INITIAL_INTERVAL 800
#define REPEAT_INTERVAL 100

Metro keyboardTimer(100); // keyboard timer intervals
Metro cookingTimer(1000); // confirm timer
Metro powerTimer(100);

OneWire oneWire(ONE_WIRE_BUS_PIN);
DallasTemperature sensors(&oneWire);

DeviceAddress Probe01 = { 0x28, 0x2C, 0xBA, 0xE6, 0x03, 0x00, 0x00, 0x83 };
DeviceAddress Probe02 = { 0x28, 0xEA, 0xD8, 0xE6, 0x03, 0x00, 0x00, 0x3C };
DeviceAddress Probe03 = { 0x28, 0xE6, 0xD7, 0xE6, 0x03, 0x00, 0x00, 0x2E };
DeviceAddress Probe04 = { 0x28, 0xEB, 0xBD, 0xE6, 0x03, 0x00, 0x00, 0xC8 };

LiquidCrystal lcd(8, 9, 10, 11, 12, 13); // setup LCD

#define keyboardAnalogInput 0 // keyboard analog pin
// #define MAX_STRING_LEN = 32;
// #define MAX_WORDS = 10;
// lang definitions
const char* TEXT_WELCOME_L1 = "Sous Viduino";
const char* TEXT_WELCOME_L2 = "Udvozollek!";
const char* TEXT_TEMP_LONG = "Homerseklet";
const char* TEXT_TEMP = "H";
const char* TEXT_DEG = "C";
const char* TEXT_TIME_LONG = "Fozesi ido";
const char* TEXT_TIME = "I";
const char* TEXT_MINUTE = "perc";
const char* TEXT_CURRENT_TEMP_L1 = "Pillanatnyi";
const char* TEXT_CURRENT_TEMP_L2 = "homerseklet";
const char* TEXT_TIME_REMAINING = "Hatralevo ido";
const char* TEXT_ARE_YOU_SURE = "Egeszen biztos?";
const char* TEXT_YES = "IGEN";
const char* TEXT_NO = "NEM";
const char* TEXT_BACK = "Vissza";
const char* TEXT_START_COOKING = "Fozes inditasa";
const char* TEXT_PREHEATING = "Elomelegites";
const char* TEXT_COOKING = "Fozes";
const char* TEXT_TURN_OFF = "Kikapcsolas";
const char* TEXT_BYE_L1 = "Sous Viduino";
const char* TEXT_BYE_L2 = "Viszlat!";
const char* TEXT_ERROR = "Hijnye, baj van.";
const char* TEXT_SENSOR_FAIL = "Homero hiba.";


// keyboard button definitions
#define btnRIGHT 0
#define btnUP 1
#define btnDOWN 2
#define btnLEFT 3
#define btnENTER 4
#define confNONE 5

#define confNO 0
#define confYES 1

int keyIn = 0; // keyboard analog value
int buttonPressed; // keyboard digital value
int i = 0;
int prevButton = confNONE; // stores previous digital value
int counter = 0; // for keyoard repeats
int Temp = 50;
int Time = 240;
int menuItem = 1;
int menuSize = 3;
int confValue = confNO;
int Confirm = 0;
int Cooking = 0;
int Error = 0;
int tempError = 0;
const char* Status = TEXT_PREHEATING;
float temp1;
float temp2;
float temp3;
float temp4;
float tempAvg;
unsigned int timeRemaining = 0;
int tempSetting = 0;


//////////////////////

byte ATuneModeRemember = 2;
double input = 40, output = 1000, setpoint = 30;
double kp = 1000, ki = 0.0, kd = 0.0;

double kpmodel = 1.5, taup = 100, theta[50];
double outputStart = 5;
double aTuneStep = 50, aTuneNoise = 1, aTuneStartValue = 400;
unsigned int aTuneLookBack = 20;

boolean tuning = false;
unsigned long modelTime, serialTime;

PID myPID(&input, &output, &setpoint, kp, ki, kd, DIRECT);
PID_ATune aTune(&input, &output);

//set to false to connect to the real world
boolean useSimulation = false;

///////////////////////

void setup()
{
sensors.begin();
sensors.setResolution(Probe01, 12);
sensors.setResolution(Probe02, 12);
sensors.setResolution(Probe03, 12);
sensors.setResolution(Probe04, 12);

delay(500);

lcd.begin(16, 2); // init LCD
lcd.print(TEXT_WELCOME_L1);
lcd.setCursor(0, 1);
lcd.print(TEXT_WELCOME_L2);
delay(3000);
lcd.clear();
lcd.print(TEXT_TEMP_LONG);
lcd.setCursor(0, 1);
lcd.print("50 C");

////////////////////////
myPID.SetOutputLimits(0, 1000);
if(useSimulation) {
for(byte i = 0; i < 50; i++) {
theta[i] = outputStart;
}
modelTime = 0;
}
//Setup the pid
myPID.SetMode(AUTOMATIC);

if(tuning) {
tuning = false;
changeAutoTune();
tuning = true;
}
//////////////////////
}


void loop()
{
if (keyboardTimer.check() == 1 && !Error) {
lcd.setCursor(0, 1);
buttonPressed = readKeyboard(); // read digital value
if (buttonPressed == confNONE) counter = 0; // if button released, reset counter
if (prevButton == buttonPressed) { // if button kept pressed
++counter;
if (counter < (INITIAL_INTERVAL / TIME_INTERVAL) || counter % (REPEAT_INTERVAL / TIME_INTERVAL)) buttonPressed = confNONE; // if repeat timer not active, drop keyboard value
} else if (buttonPressed == confNONE) prevButton = buttonPressed;
if (buttonPressed != confNONE) // if new key or repeat active
{
switch(buttonPressed) {
int result;
case btnUP:
if(menuItem > 3) break; // draw only for main menu
menuItem = (menuItem == 1) ? menuSize : menuItem - 1; // move in the main menu
showMenu(menuItem);
break;
case btnDOWN:
if(menuItem > 3) break; // draw only for main menu
menuItem = (menuItem == menuSize) ? 1 : menuItem + 1; // move in main menu
showMenu(menuItem);
break;
case btnRIGHT:
switch(menuItem) {
case 1:
showValue(++Temp, TEXT_DEG); // increase temp
break;
case 2:
if(Time < 999) showValue(++Time, TEXT_MINUTE); // increase time
break;
case 4:
showConfirm(confValue = ((confValue == confYES) ? confNO : confYES)); // select reply
break;
}
break;
case btnLEFT:
if (menuItem == 1 && Temp > 0) showValue(--Temp, TEXT_DEG); // decrease temp, stay above zero
if (menuItem == 2 && Time > 0) showValue(--Time, TEXT_MINUTE); // decrease time, stay above zero
if (menuItem == 4) showConfirm(confValue = ((confValue == confYES) ? confNO : confYES)); // select reply

break;
case btnENTER:
switch(menuItem) {
case 3: // show confirm menu
Confirm = 1;
confValue = confNO;
showConfirm(confValue);
menuItem = 4;
break;
case 4:
Confirm = 0;
if(confValue == confYES) { // start cooking
Cooking = 1;
menuItem = 5;
timeRemaining = Time * 60;
tempSetting = Temp;
setpoint = tempSetting;
lcd.clear();
}
else {
menuItem = 1; // return to main menu
showMenu(menuItem);
}
}
break;
}
prevButton = buttonPressed; // store
}
}

if (cookingTimer.check() == 1 && Cooking && !Error) {
// showStatus(Status);
if (Status == TEXT_COOKING) timeRemaining--;
sensors.requestTemperatures();
temp1 = sensors.getTempC(Probe01);
temp2 = sensors.getTempC(Probe02);
temp3 = sensors.getTempC(Probe03);
temp4 = sensors.getTempC(Probe04);
if (temp1 > 0 && temp1 < 110 && temp2 > 0 && temp2 < 110 && temp3 > 0 && temp3 < 110 && temp4 > 0 && temp4 < 110) {
tempError = 0;
tempAvg = (temp1 + temp2 + temp3 + temp4) / 4;
/* lcd.setCursor(0, 1);
lcd.print(TEXT_TEMP);
lcd.print(":");
lcd.print(tempAvg);
lcd.print(" ");
lcd.setCursor(8, 1);
lcd.print(TEXT_TIME);
lcd.print(":");
lcd.print(timeRemaining / 60);
lcd.print(":");
if (timeRemaining % 60 < 10) lcd.print("0");
lcd.print(timeRemaining % 60); */

/////////////////////////
if(!useSimulation) input = tempAvg;
if(tuning) {
byte val = (aTune.Runtime());
if (val != 0) {
tuning = false;
}
if(!tuning) { //we're done, set the tuning parameters
kp = aTune.GetKp();
ki = aTune.GetKi();
kd = aTune.GetKd();
myPID.SetTunings(kp, ki, kd);
AutoTuneHelper(false);
}
}
else myPID.Compute();

if(useSimulation) {
theta[30] = output;
DoModel();
}
//// else analogWrite(0,output);
//send-receive with processing if it's time
SerialSend();

//////////////////
} else {
if (++tempError > 10) {
lcd.clear();
lcd.print(TEXT_ERROR);
lcd.setCursor(0, 1);
lcd.print(TEXT_SENSOR_FAIL);
Error = 1;
}
}
}
}

int showStatus(const char* currStatus) {
lcd.setCursor(0, 0);
lcd.print(currStatus);
}

int readKeyboard()
{
keyIn = analogRead(keyboardAnalogInput);
// read the value from the sensor
// buttons when read are centered at these values: 0, 144, 329, 504, 741
// add approx 70 to those values and check to see if we are close
if (keyIn > 1000) return confNONE;
if (keyIn < 70) return btnLEFT;
if (keyIn < 215) return btnUP;
if (keyIn < 400) return btnDOWN;
if (keyIn < 575) return btnRIGHT;
if (keyIn < 810) return btnENTER;
return confNONE; // when all others fail, return this...
}

void showValue(int Value, const char* Unit) {
lcd.setCursor(0, 1);
lcd.print(Value);
lcd.print(" ");
lcd.print(Unit);
lcd.print(" "); // to clear
}

void showMenu(int Menu) {
lcd.clear();
switch(Menu) {
case 1:
lcd.print(TEXT_TEMP_LONG); // temp
showValue(Temp, TEXT_DEG);
break;
case 2:
lcd.print(TEXT_TIME_LONG); // time
showValue(Time, TEXT_MINUTE);
break;
case 3:
lcd.print(TEXT_START_COOKING);
break;
// default:
// lcd.print(TEXT_ERROR);
}
}

void showConfirm(int Value)
{
if (Confirm == 1) {
lcd.clear(); // reset screen for first use only
lcd.print(TEXT_ARE_YOU_SURE);
Confirm++;
}
lcd.setCursor(0, 1); // draw selection
if (Value == confYES) lcd.print("#"); else lcd.print(" ");
lcd.print(TEXT_YES);
if (Value == confYES) lcd.print("#"); else lcd.print(" ");
if (Value == confNO) lcd.print("#"); else lcd.print(" ");;
lcd.print(TEXT_NO);
if (Value == confNO) lcd.print("#"); else lcd.print(" ");;
}

void printTemperature(DeviceAddress deviceAddress, byte pos)
{
float tempC = sensors.getTempC(deviceAddress);
switch(pos) {
case 1:
lcd.setCursor(0, 0);
break;
case 2:
lcd.setCursor(8, 0);
break;
case 3:
lcd.setCursor(0, 1);
break;
case 4:
lcd.setCursor(8, 1);
break;
}
if (tempC == -127.00) lcd.print("Error"); else lcd.print(tempC);
}


/////////////////////////////

void changeAutoTune()
{
if(!tuning)
{
//Set the output to the desired starting frequency.
output = aTuneStartValue;
aTune.SetNoiseBand(aTuneNoise);
aTune.SetOutputStep(aTuneStep);
aTune.SetLookbackSec((int)aTuneLookBack);
AutoTuneHelper(true);
tuning = true;
}
else
{ //cancel autotune
aTune.Cancel();
tuning = false;
AutoTuneHelper(false);
}
}

void AutoTuneHelper(boolean start)
{
if(start)
ATuneModeRemember = myPID.GetMode();
else
myPID.SetMode(ATuneModeRemember);
}


void SerialSend()
{
lcd.clear();
lcd.setCursor(0, 0);
lcd.print("i"); lcd.print(input); lcd.print(" ");
lcd.print("o"); lcd.print(output); // lcd.print(" ");
lcd.setCursor(0, 1);
// if(tuning){
// lcd.print("tuning mode");
// } else {
lcd.print("p"); lcd.print(myPID.GetKp()); // lcd.print(" ");
lcd.print("i"); lcd.print(myPID.GetKi()); // lcd.print(" ");
lcd.print("d"); lcd.print(myPID.GetKd());
// }
}

void DoModel()
{
//cycle the dead time
for(byte i=0;i<49;i++)
{
theta[i] = theta[i+1];
}
//compute the input
input = (kpmodel / taup) *(theta[0]-outputStart) + input*(1-1/taup) + ((float)random(-10,10))/100;

}

evDirect villanyautós töltőhálózat

(#41) tvamos válasza schawo (#40) üzenetére


tvamos
nagyúr

Koszi! Ez nagyon jol esett!
const char* TEXT_ERROR = "Hijnye, baj van.";
Amugy jo kis kod, lehet, ki is probalom, ha lesz par oram.
(Csak a szenzort kell atirni, dallas-om nincs.)

(#39) schawo válasza tvamos (#38) üzenetére
Valoban... nem tudom miert ertelmeztem ugy, hogy 1 sec az idoalap.
De akkor mar ne is nevezzuk PWM-nek, mert ugyebar nem az.

"Mindig a rossz győz, és a jó elnyeri méltó büntetését." Voga János

(#42) tvamos válasza schawo (#40) üzenetére


tvamos
nagyúr

Amugy mire hasznalod a metro.h-t?

"Mindig a rossz győz, és a jó elnyeri méltó büntetését." Voga János

(#43) schawo válasza tvamos (#41) üzenetére


schawo
titán

PWM jelentése impulzusszélesség moduláció, önmagában bármilyen kapcsolófrekvenciát jelenthet. Az én értelmezésemben legalábbis.

metro.h
Ha jól emlékszem a hőmérővel a soros kommunikációhoz van rá szükség.

[ Szerkesztve ]

evDirect villanyautós töltőhálózat

(#44) tvamos válasza schawo (#43) üzenetére


tvamos
nagyúr

Hat attol meg ezt nem hivjak PWM-nek. Ez egy allasos szabalyozo. A frekvenciat nem te hatarozod meg, hanem a halozat. (Talan csoport szabalyozas... de nem emlekszem mar mindenre pontosan.)

A lenyeg, amit mondani akartam, hogy akarhogy is hivod, ne csinalj fel szinuszt, mert azt nem szereti a betap oldali transzformator.

Sajnos nekem nem fordul le a programod. Rapihenek most.

"Mindig a rossz győz, és a jó elnyeri méltó büntetését." Voga János

(#45) schawo válasza tvamos (#44) üzenetére


schawo
titán

A szükséges könyvtárak megvannak?

evDirect villanyautós töltőhálózat

(#46) tvamos válasza schawo (#45) üzenetére


tvamos
nagyúr

Persze!

"Mindig a rossz győz, és a jó elnyeri méltó büntetését." Voga János

Copyright © 2000-2024 PROHARDVER Informatikai Kft.