Si të konfiguroni telefonat inteligjentë dhe PC. Portali informativ
  • në shtëpi
  • Windows 8
  • Automatizimi për fabrikën e birrës BeerDuino bazuar në arduino mega. Sisteme të automatizuara të bazuara në mikrokontrolluesin Arduino

Automatizimi për fabrikën e birrës BeerDuino bazuar në arduino mega. Sisteme të automatizuara të bazuara në mikrokontrolluesin Arduino

Automatizimi në shoqërinë moderne është një masë e nevojshme, sepse në epokën dixhitale është jashtëzakonisht e rëndësishme të eliminohet faktori njerëzor në industri të ndryshme për të standardizuar dhe përmirësuar cilësinë e produktit. Ka edhe zona ku thjesht nuk është e mundur që një person të bëjë atë që robotët janë të aftë, për shembull, prodhimin e nano-materialeve dhe mikropllakave.

Sidoqoftë, automatizimi ndihmon jo vetëm në prodhim, por mund të jetë i dobishëm edhe për laikin. Për shembull, automatizimi për një fabrikë birre arduino mund të lehtësojë shumë procesin e prodhimit të një produkti. Le të shohim se si mund të ndihmojë automatizimi për korrigjimin në arduino dhe gjëra të tjera, dhe të shohim shembuj.

Përparësitë kryesore të sistemeve të automatizuara të bazuara në mikrokontrolluesin Arduino

Askush nuk ju ndalon të bashkoni tabelën tuaj dhe ta programoni vetë duke përdorur gjuhë të nivelit të ulët. Sidoqoftë, automatizimi në arduino dhe mikrokontrolluesit e gatshëm do ta lehtësojë shumë të gjithë procesin dhe do të kursejë kohë. Në fund të fundit, është shumë më e lehtë të blini një produkt të gatshëm me një sërë bibliotekash dhe ta përshtatni atë me nevojat tuaja. Dhe automatizimi i përballueshëm në arduino mega 2560 mund të jetë i dobishëm në shumë fusha të jetës, nga çelësat e zërit për një shtëpi inteligjente deri tek dreqin elektrik me një detektor lëvizjeje. Përparësitë kryesore për të cilat është i famshëm automatizimi Arduino janë:

  1. Pragu i ulët i hyrjes. Nuk ka nevojë të merrni një arsim inxhinierik, thjesht shikoni disa video trajnimi dhe keni njohuri bazë të programimit.
  2. Një numër i madh bibliotekash tashmë të përgatitura. Arduino përdoret në CIS nga shumë entuziastë të robotikës, deri në atë pikë sa prodhimi i pajisjeve të ndryshme elektronike bëhet hobi i tyre. Prandaj, komuniteti i përdoruesve është jashtëzakonisht aktiv në rrjet, ai pret një numër të madh boshllëqesh dhe është i gatshëm t'ju ndihmojë në zgjidhjen e çdo problemi. Cilësia e bibliotekave, për shkak të pragut të ulët të hyrjes, vuan, por askush nuk e ndalon krijimin tuaj, mjafton të studioni semantikën e gjuhës C ++ ose të përdorni përkthyes të gatshëm.
  3. Shumë pajisje periferike. Nuk ka rëndësi nëse keni nevojë për një automatizim serë arduino apo një sensor drite, do të gjeni çdo modul, deri te sensorët e zërit dhe njohësit e zërit. Po, disa borde kushtojnë shumë para, por gjithmonë mund të gjeni analoge të lirë, për shembull, një modul wi-fi nga prodhuesit e palëve të treta esp8269, i cili është 10 herë më i lirë se ai zyrtar.
  4. Shumë informacion. Çdo problem me të cilin po përballeni tashmë është përjetuar nga dikush dhe ndoshta do të gjeni një zgjidhje në Google. Ekziston gjithashtu një literaturë gjithëpërfshirëse në dispozicion për rishikim.

Sidoqoftë, mos mendoni se Arduino nuk ka të meta. Bordi është i njohur për performancën e tij të dobët. Në detyra veçanërisht komplekse dhe me një sasi të madhe kodi, koha e përgjigjes mund të arrijë 1 sekondë, gjë që është e papranueshme për mikrokontrolluesit. Memoria flash për shumicën e moduleve nuk kalon 1 MB, e cila nuk mjafton për të krijuar rrjete nervore ose për të përdorur skedarë media. Sigurisht, mund të lidhni një kartë memorie ndihmëse, por kjo gjithashtu rrit kohën e përgjigjes, kërkon burime shtesë për ta fuqizuar atë dhe bëhet në një mënyrë gjysmë artizanale.

Sidoqoftë, sistemet e thjeshta të automatizuara, për shembull, për prodhimin e birrës ose serrave, nuk kërkojnë as një pjesë të vogël të burimeve që mund të sigurojë bordi. Prandaj, për shumicën e përdoruesve, këto mangësi do të duken të pakuptimta. Nëse vendosni të montoni printerin tuaj 3-D ose një dizajn më kompleks, duhet t'i hidhni një vështrim më të afërt analogëve. Por pragu i hyrjes për konkurrentët e Arduino do të jetë shumë më i lartë.

Një shembull i automatizimit të procesit bazuar në mikro Arduino

Shembulli më i thjeshtë i automatizimit të procesit mund të jetë një serë arduino. Për të krijuar çdo sistem, ia vlen të përcaktohen qartë detyrat që duhet të kryejë. Duke përdorur shembullin e një sere, kjo do të ishte:

  1. Krijimi i një klime të veçantë.
  2. Ndezja dhe fikja në kohë e ndriçimit.
  3. Lotim në kohë i bimëve dhe mbajtja e lagështisë në të njëjtin nivel.

Bazuar në këto detyra, mund të vini re menjëherë se çfarë duhet të blini për bordin kryesor:

  1. Sensor temperature. Do të sigurojë që ajri të mos nxehet ose ftohet, duke qenë brenda kufijve të përcaktuar nga programi. Në rast ndryshimi të temperaturës, bordi do të ndezë kondicionerin ose bateritë elektronike.
  2. Sensori i dritës. Sigurisht, ju mund të kufizoni veten në një zgjidhje softuerike dhe të blini llamba të shtrenjta me imitim të dritës së ditës. Por nëse doni të krijoni një serë të plotë, atëherë do të jetë shumë më i përshtatshëm të instaloni një tavan automatik, i cili do të kontrollohet nga Arduino.
  3. Sensori i lagështisë. Këtu gjithçka është e njëjtë si me temperaturën, sipas skenarit të përcaktuar, tarifa do të përfshijë spërkatës dhe lagështues ajri, nëse është e nevojshme.

Kur të keni blerë të gjitha modulet e nevojshme, mbetet vetëm t'i programoni ato. Në fund të fundit, pa një kod, këto janë vetëm copa hekuri, të afta për asgjë.

Programimi i mikro Arduino për automatizimin e procesit. Shembull

Ashtu si në paragrafin e mëparshëm, është e rëndësishme që programimi të ndajë detyrën në nën-paragrafë të veçantë dhe t'i kryejë ato në mënyrë sekuenciale. Programimi Arduino ndodh falë komandave në ndërfaqen AT dhe AT +, duke përdorur bibliotekat e përgatitura. Prandaj, të gjitha skriptet shkruhen në një mjedis të veçantë në C ++ dhe, para se të bëni ndonjë gjë, merrni kohë për të studiuar semantikën e tij. Përveç kryerjes së funksioneve të thjeshta, sistemi është gjithashtu i aftë të ruajë skriptet në memorie flash, gjë që na nevojitet në këtë shembull.

Mbani në mend se informacioni nga secili sensor vjen në kohë reale dhe si variabla, megjithatë, ju mund të kufizoni kohën e përgjigjes, pasi nuk ka nevojë të humbni burime dhe të matni vazhdimisht çdo parametër. Në përputhje me rrethanat, vendosni kohën e ndezjes dhe fikjes për secilin sensor, ose vendosni kohën e përgjigjes në një interval të caktuar.

Do të doja të paraqes një shembull tjetër të përdorimit të Arduino në detyra reale. Këtu do të paraqes projektin më të thjeshtë, por vërtet funksional për rregullimin e ngrohjes së një shtëpie duke përdorur një kazan elektrik me bazë Arduino. Unë me të vërtetë shpresoj se ky artikull do të ndihmojë dikë të heqë mënjanë frikën dhe të përpiqet të përdorë duart për qëllimin e synuar, ai stërvit duart, trurin shumë mirë dhe jep një ndjenjë të rrallë kënaqësie në krijimin e diçkaje interesante. Pasi kam filluar të punoj me këtë kontrollues, jam ende disi i hutuar nga mundësitë që hapen kur e përdor atë.

Historia

Pse, pikërisht, Arduino? Thjeshtësia, aksesueshmëria, shumë dokumentacion dhe biblioteka. Si, me siguri, shumë, unë e kam parë Arduino për një kohë të gjatë, që nga fëmijëria më pëlqejnë të gjitha llojet e baterive dhe motorëve, dhe këtu është një nivel i ri, një gjuhë programimi e plotë dhe një mori opsionesh I / O. Kur "partnerët tanë më të mundshëm ekonomikë" filluan ta prodhonin atë, çmimet për të ranë në një nivel të pranueshëm. Si rezultat, bleva një çantë fillestare dhe, pasi kisha ndezur mjaftueshëm LED dhe tregues, kisha dëshirë ta përdorja diku nëpër shtëpi.

Çfarë ngrohim

Gjyshja ime jeton në një shtëpi fshati afër Moskës, ku nuk ka as ujë normal, as gaz, as ngrohje dhe zgjidhja e të gjitha këtyre problemeve kërkon investime të mëdha ose aplikim duarsh. Këtu pashë një vend ku mund të përdorësh plotësisht arduino, ka ku të kthehesh. Plus më i madh i një shtëpie fshati është se ajo tradicionalisht nuk është e madhe dhe shumë e thjeshtë. Kështu është dhe e imja - një shtëpi tipike e një familjeje fshatare të mesit të shekullit të 20-të, është një kasolle me trungje me një dhomë të madhe dhe një kuzhinë. Nuk ka dhoma të tjera me ngrohje, që është një plus për ne, mjafton të ruajmë dhe kontrollojmë temperaturën në një dhomë të vetme.

Ngrohje

Pajisjet e ngrohjes. Tradicionalisht, shtëpia kishte ngrohje me sobë. Një furrë "gjermane" në dhomë (nxehet për shkak të një tubi të gjatë dredha-dredha), e dyta "ruse" në kuzhinë (nxehet për shkak të madhësisë së madhe të vetë furrës). Nëse dikush qëndron pezull në idetë kinematografike se një sobë është e lezetshme dhe, për më tepër, natyrale dhe romantike, atëherë marr guximin të sugjeroj se këta njerëz nuk kanë jetuar kurrë në një shtëpi me ngrohje sobë. Në fakt, nuk është shumë i rehatshëm, i papërshtatshëm dhe i rrezikshëm nga zjarri. Ndaj rreth 5 vite më parë u porosit dhe u zbatua një projekt për instalimin e instalimeve elektrike të ngrohjes më të thjeshtë me dy tuba me kazan me gaz. Kaldaja supozohej të ushqehej nga cilindrat e gazit.

Më pas, u vendos që të modernizohej sistemi, të shtohej një pompë për riciklimin e detyruar të ftohësit dhe një kazan elektrik të vogël 2 kilovat, në mënyrë që të mos vuani nga ndezja e gazit kur nuk është ende shumë ftohtë. I gjithë automatizimi u reduktua në praninë e një çelësi të madh me thikë në mur, kur ftohej, ndizej dhe kur ishte shumë nxehtë, fiket. Dy kilovat ishin të mjaftueshme diku deri në një temperaturë prej 0 ° C, atëherë ishte e nevojshme të ndizet një gaz ose një furrë, e cila ishte jashtëzakonisht e papërshtatshme.

Përshtatshmëria ekonomike

Para se të ndryshonte ndonjë gjë, natyrisht, u vendos të llogaritet nëse e gjithë kjo ide ka kuptim fare. Duke llogaritur nga përvoja konsumin e gazit nga cilindrat, duke vlerësuar konsumin e pritshëm të karburantit dizel, arrita në përfundimin se nuk ka kuptim në lloje të tilla të ngrohjes nëse ka një sasi të mjaftueshme të energjisë elektrike. Me një çmim, cilindrat dolën diku 6-7 mijë në muaj, naftë, nëse blen diçka të djegur apo verë në dimër, mund të kursesh deri në 5 mijë në muaj, ndërsa energjia elektrike e pastër doli 7 mijë. Shtoni këtu koston e bojlerit, cilindrat që zvarriten vazhdimisht dhe erën nga paga, dhe bëhet e qartë se energjia elektrike është shumë më e thjeshtë dhe aspak më e shtrenjtë. Natyrisht, ka edhe djegës peleti në modë së fundi, por nuk më përshtaten, pasi nuk dinë të ndizen vetë dhe për këtë arsye kanë një fuqi minimale, dhe aspak të vogël (rreth 5 kW), e cila 90% e kohës thjesht nuk ka ku të shkojë, dhe kërkojnë të paktën 2 herë në javë për të derdhur karburant, gjë që ndonjëherë nuk ka kush ta bëjë. Dhe kostoja e vetë kaldajave është një rend i madhësisë më shumë se opsionet e mëparshme, kështu që ato janë të përshtatshme për shtëpi të mëdha ku nevojitet më shumë energji dhe kosto të larta, dhe jo në rastin tim.

pajisje të rënda

U përpoqa të vlerësoja fuqinë e kërkuar bazuar në konsumin e gazit dhe vlerësime të tjera, doli që më duheshin 4-5 kW, me një diferencë prej 6. Një rishikim i tregut tregoi se ekziston një model kazani elektrik i ngjashëm me atë të instaluar tashmë, por me 3 elemente ngrohëse nga 2 kW secili. Për më tepër, ajo shitej pa kontroll, gjë që ishte edhe më e përshtatshme dhe më e lirë për mua. Në përgjithësi, vetë kaldaja është një dizajn jashtëzakonisht i thjeshtë, një cilindër metalik me tuba hyrje dhe dalje, një kapak i tërhequr nga bulona nga lart, në të cilin janë fiksuar elementët e ngrohjes. Për më tepër, 2 sensorë janë futur në kuti, një sensor rezistent i temperaturës dhe një sensor që mbyllet kur mbinxehet, të dyja nga sistemi i ftohjes së makinës. Tani është çështja e energjisë elektrike. Situata ime u thjeshtua nga fakti se ka një punëtori pranë shtëpisë, në të cilën janë të lidhura 3 faza (popullorisht - 380). Natyrisht, ekzistonte një tundim për të ushqyer çdo element ngrohjeje nga faza e vet, kështu që një kabllo e specializuar me 4 bërthama në një bishtalec metalik për shtrimin nëntokësor u ble dhe u vendos në dhomën e bojlerit. Kablloja futet në mburojë me RCD të lidhur në seri dhe një bllok prej 3 automatesh 10A secili. Më tej, kablloja shkoi direkt në mburojë me arduino dhe prej andej në bojlerin elektrik.

pajisje të lehta

Eshte e qarte qe elementet e ngrohjes do i kontrollojme me arduino, pyetja eshte si? Duke iu përmbajtur parimit - sa më e thjeshtë, aq më e besueshme, ne thjesht do t'i ndezim ose fikim duke përdorur një stafetë pa asnjë opsion kalimtar. Pasi u ngjita në aliexpress, gjeta një bllok stafetë për arduino, i cili mund të kontrollojë 5 linja energjie menjëherë. Një problem, rryma maksimale që mund të përballojnë këto rele është 10A, dhe unë marr 2kW / 220V ~ 9A. Kjo është, pothuajse një maksimum, dhe është e dëshirueshme që të ketë një diferencë prej të paktën 25%. Megjithatë, vendosa të shfrytëzoj një shans. Sinqerisht, stafetat zgjatën pothuajse një javë, pastaj sapo filluan të shkrihen. Ishte e nevojshme të vendosej diçka dhe shpejt, sepse ishte dimër dhe ishte e pamundur të ndalohej ngrohja. Prandaj, reletë 30A u blenë, megjithatë, me mbështjellje 12V. Prandaj, bashkova shpejt një transistor në çdo stafetë për t'i ndezur ato nga arduino 5V.

Qarku funksionoi mirë për gati një muaj, dhe më pas vura re se ishte disi shumë nxehtë në shtëpi. Testi tregoi se një stafetë "u dogj" në pozicionin e ndezur. I trokita - funksionoi përsëri, por zgjati për disa ditë. E ndryshova me shpresën se ishte një martesë, por një javë më vonë ndodhi e njëjta gjë me stafetën e 2-të. Pasi vendosi rezervën e fundit, ai shkoi përsëri te Aliu. U gjetën reletë të specializuara për arduino në 40A! Këto duhet të mjaftojnë me siguri, mendova. Nja dy javë pritje, dhe tani përsëri hedh transistorët dhe vendos reletë të reja me një parzmore dhe tregues të gatshëm. Gëzimi ishte jetëshkurtër, pas 2-3 javësh stafeta ngeci përsëri. Fillova të studioj çështjen, rezulton se për të zvogëluar ngarkesën në stafetë dhe për të hequr ndezjen e kontakteve, stafeta duhet të ndizet jo rastësisht, por në momentin kur vala e sinusit të tensionit kalon nëpër 0 Epo, në teori kjo mund të bëhet duke përdorur arduino-n tonë, thjesht lidheni duke ndarë të tre fazat dhe duke parë tensionin. Problemi është gjithashtu se stafeta ka njëfarë kohe përgjigjeje dhe, në fakt, ne ende duhet ta instalojmë atë në mënyrë empirike. Në përgjithësi, detyra nuk është aq e thjeshtë.

Dhe këtu ndeshem me të ashtuquajturin stafetë të gjendjes së ngurtë, me fjalë të tjera, një qark elektrik i montuar në një tiristor të fuqishëm në një rast të ngjashëm me një stafetë konvencionale. Nga avantazhet e tij - nuk ka mekanikë, asgjë nuk do të ngjitet. Nuk krijon ndërhyrje të fuqishme EM, e cila është e rëndësishme për ethernetin, e cila diskutohet më poshtë. Ata tashmë përmbajnë një qark që ndez dhe fiket stafetën kur kalon zero. Rele ka një tregues të ndezur. Epo, edhe ata heshtin, megjithëse për rastin tonë kjo nuk është aq e rëndësishme. Pas studimit të udhëzimeve dhe karakteristikave, u porosit SSR-40DA, që në rusisht do të thotë një stafetë e gjendjes së ngurtë me një rrymë kontrolli konstante prej 3-5V dhe një rrymë ngarkese deri në 40A. Në të njëjtën kohë, vendosa të devijoj pak nga parimi "më e thjeshtë-më mirë" dhe të bëj më shumë kontroll aktual në elementët e ngrohjes. Kjo do të bënte të mundur zbulimin e një elementi ngrohës/rele të ndezur ose një ndërprerje të energjisë në një nga fazat. I shtova porosisë një modul kontrolli të rrymës 20A, megjithëse ato dukeshin të dobëta për një rrymë të tillë (2,5 katrorë të kabllit as që futeshin në kapësen e tyre). Kur erdhën reletë dhe modulet e matjes aktuale, doli që reletë ishin mjaft të rëndë, kështu që u vendos që gjithçka që lidhet me pjesën e tensionit të lartë të transferohej në kutinë e re dhe të lihej arduino në atë të vjetër.

Pas eksperimenteve të para, doli që harrova plotësisht që këto stafetë, pasi janë montuar në tiristorë, nxehen mjaft. Pas një dite funksionimi, reletë u ngrohën aq shumë sa nuk mund të qëndroja duke mbajtur gishtin mbi to, domethënë gradë 60C, dhe kjo tashmë është afër 80C kritike. Përsëri hipa në Ali, duke pyetur veten se cilët radiatorë të përshtaten, dhe më pas kuptova se ka radiatorë të rregullt për këto SSR! Në kohën e instalimit të radiatorëve, zbulova gjithashtu se vetë një modul i kontrollit të rrymës nuk e kalon më rrymën dhe një gjurmë e djegur është e dukshme nga ana e tabelës. Një modul tjetër gjithashtu nuk frymëzoi besim, vendosa t'i heq të gjitha. Në këtë formë, ata janë ende mjaft të dobët dhe të rrezikshëm, por nuk ka shumë kuptim prej tyre. Problemi i fikjes së fazave apo elementeve të ngrohjes është shtyrë deri më tani si jo shumë i rëndësishëm, prej 3 vitesh as i pari dhe as i dyti nuk ka ndodhur më shumë se një herë.

Tani në lidhje me softuerin

Arduino

Menjëherë në shembujt, u gjet një pjesë që bëri të mundur kontrollin e fuqisë mesatare, duke pasur një kontroll binar - ndezur dhe fikur. Kuptimi është i thjeshtë, marrim një dritare të caktuar kohore, le të themi, 1 minutë, dhe në ciklin e ndezim ose fikim ngarkesën në varësi të kohës së kaluar. Kjo do të thotë, nëse kemi nevojë për 50% të fuqisë, atëherë e ndezim ngarkesën në 30 sekondat e para dhe e fikim në 30 të fundit, atëherë cikli përsëritet. E ribëra shpejt atë për 3 stafetë të pavarur, nëse fuqia është më shumë se 33%, atëherë ndez stafetën e dytë, nëse më shumë se 66%, atëherë të tretën, dhe të parën e ndez dhe fik sipas algoritmit kryesor . Tani lind pyetja kryesore, dhe me cilin algoritëm të zgjidhni fuqinë? Duke qenë një programues me profesion, në fillim vendosa që problemi ishte mjaft i thjeshtë, i ftohtë - shto, i ngrohtë - më se i mjaftueshëm dhe u përpoqa t'i kuptoja të gjitha në mendjen time.

Doli se nuk ishte aq e thjeshtë. Ishte e dobishme të shikoje se si e bëjnë atë në sistemet që shiten, doli që gjithçka është ose aq e thjeshtë sa të jetë e mundur, si në një hekur - +1C = fikur, -1 = ndezur. Por atëherë marrim lëkundje pothuajse 4C për shkak të inercisë së sistemit! Kjo është shumë e përafërt, sepse ne mund të marrim të dhëna me një saktësi prej një të dhjetës së shkallës. Shikova gjithashtu algoritmet e funksionimit duke përdorur temperaturën e ajrit të jashtëm, ato doli të ishin mjaft të thjeshta dhe punuan në tabela të gatshme që ishin të lidhura paraprakisht dhe thjesht ndryshuan në varësi të humbjes së nxehtësisë në shtëpi. Duke gërmuar gjithnjë e më thellë, arrita në fund të instalimeve industriale, ata përdorën algoritme të kontrolluesit PID kudo. Dhe, oh, lavdia e popullaritetit, rezulton se Arduino ka një bibliotekë PID falas!

Disa fjalë se çfarë është PID në lidhje me rastin tonë. Kuptimi i algoritmit është që ne t'i themi vlerën e kërkuar të një parametri të caktuar (temperatura brenda shtëpisë) dhe të kalojmë vlerën aktuale në lak, dhe ai na jep efektin e nevojshëm (fuqinë që duhet të furnizohet në bojler. ). Pa hyrë në detaje të modelit matematikor, si funksionon nga këndvështrimi i programuesit. Pra, ne kemi temperaturën në dhomë, le të themi 20C, temperatura e dëshiruar është 22C, dhe ia japim algoritmit tonë PID.

Vetë algoritmi ka 3 pjesë të pavarura, të quajtura P, I dhe D. Pjesa e parë është jashtëzakonisht e thjeshtë, duke parë ndryshimin midis temperaturës së dëshiruar dhe temperaturave aktuale. Kjo do të thotë, sa më i ftohtë, aq më shumë fuqi do të na japë algoritmi. Duket se kjo është e mjaftueshme, por ne kemi humbje të vazhdueshme të nxehtësisë në shtëpi, domethënë, për të mbajtur temperaturën e dëshiruar, duhet të japim vazhdimisht një lloj fuqie. Kjo do të thotë, edhe nëse temperatura në dhomë është e barabartë me atë të vendosur, nuk mund ta fikni bojlerin, por duhet të kërkoni disi një lloj fuqie të barabartë me humbjen e nxehtësisë. Dhe humbja e nxehtësisë ndryshon në varësi të temperaturës jashtë. Kjo është ajo që bën pjesa e dytë me emrin I. Algoritmi përpiqet të gjejë fuqinë në të cilën temperatura jonë do të jetë konstante. Dhe duket se gjithçka tashmë është këtu, por jo.

Fakti është se vetë kaldaja, ftohësi, dhe aq më tepër shtëpia, kanë një inerci shumë të madhe. Dhe nëse e keni ndezur bojlerin me 100%, atëherë duhet të ulni fuqinë shumë më herët sesa temperatura të arrijë atë të dëshiruar, përndryshe, edhe me një mbyllje të plotë, ne kemi ende kohë për të mbinxehur dhomën me 2 gradë. temperatura ka arritur nivelin e dëshiruar. Kjo është ajo që po bën pjesa e tretë e algoritmit D. Epo, tani, sigurisht, kjo është e gjitha, mbetet vetëm të kuptojmë se cilës pjesë duhet t'i jepet çfarë peshe, por kjo është ajo që bëjnë shumëzuesit e secilës pjesë, të cilët duhet të zgjidhen. . Nga rruga, zgjedhja e këtyre faktorëve është një problem matematikor i veçantë dhe mjaft i ndërlikuar, i zgjodha "me sy", duke kujtuar atë që u tha më lart. Së pari, vendosa të gjitha zerat, përveç P, dhe e zgjodha atë në mënyrë që vetë eksitimi të mos fillonte. Pastaj shtoi unë, dhe në fund dhe D.

Ne matim temperaturën

Për të matur temperaturën, sensorë dixhitalë të temperaturës të bazuara në DS18B20 u porositën në të njëjtin vend magjik. Vetë sensori është thjesht i mrekullueshëm, nuk ka nevojë të kalibrohet ose konfigurohet në asnjë mënyrë, ndërsa mund të matë temperaturën me një saktësi të caktuar dhe komunikon me Arduino duke përdorur protokollin OneWier. Kjo do të thotë, në 3 tela deri në 50 metra të gjatë, mund të varni një numër pothuajse të pakufizuar sensorësh. Nëse dëshironi, nuk mund t'i fuqizoni as ato, por punoni vetëm në 2 tela (në fakt, ato furnizohen me energji, por nga një tel me sinjal), por ato punojnë më ngadalë. Në rastin tim, i porosita sensorët në një kuti të mbyllur dhe i lidha me një kabllo të zakonshme çift të përdredhur. Kam vendosur 3 sensore nje ne kazan, nje ne shtepi ne dhome dhe nje ne papafingo nen tavan, papafingo nuk ngrohet ne asnje menyre dhe aty e marr temperaturen jashte.

Lista e hekurit të blerë

- Pllaka Arduino. Kam përdorur UNO r3. Çmimi është rreth 350 rubla.
- Mburoja Ethernet, rreth 500 rubla.
- Kabllo me çift të përdredhur (në varësi të sasisë që ju nevojitet), një gji prej 305 m do të kushtojë rreth 4 mijë rubla.
- Sensorët e temperaturës, rreth 200 r.
- Furnizimi me energji elektrike për 110-240 - 12V 2A, 420 rubla.
- Stabilizuesi LM7805, diku rreth 20 rubla.
- Rele SSR-40DA 3 copë. për 330 rubla
- Radiatorë për reletë 200 rubla secila.

Kjo do të thotë, pa llogaritur kabllon e çiftit të përdredhur dhe vetë bojlerin, i gjithë projekti përshtatet në 4 mijë rubla.

Ne i shtojmë të dhënat në bazën e të dhënave dhe i tregojmë.

Por e gjithë kjo, natyrisht, është e mirë, por nuk dua të qëndroj vazhdimisht pranë bojlerit me një kompjuter, prapë do të doja të dija për atë që po ndodh në shtëpi, nga distanca përmes internetit. Për një kohë të gjatë unë kisha tashmë serverin më të thjeshtë VPS nga majordomo për çfarëdo. Në të, unë krijova një bazë të dhënash MySQL për ruajtjen e të dhënave të temperaturës.

Tani duhet të vendosim disi të dhënat nga arduino në këtë bazë të dhënash. Për ta bërë këtë, natyrisht, do t'ju duhet të paktën të lidhni arduino me internetin, kjo nuk është e lehtë, por shumë e thjeshtë. Për këtë, ne kemi nevojë për Ethernet Shield dhe bibliotekën e saj. Një ruter i thjeshtë me një "bilbil" është instaluar prej kohësh në shtëpi, së pari nga megafon, dhe më pas nga yota. Ne tërheqim një kabllo standarde të çiftit të përdredhur në ruter dhe shtojmë transferimin e të dhënave në program. Transferimi kalon përmes një thirrjeje faqe në PHP me parametra - të dhëna. Krijo një faqe të quajtur temp.php në serverin tonë të internetit

Gabim i ngarkimit të të dhënave!

";) else (echo "";) mysql_close ($connect); ?>
Pas kësaj, kemi të dhëna për temperaturat dhe fuqinë e bojlerit, në mënyrë që sa herë të mos ngjitemi në bazën e të dhënave, por të shikojmë të dhënat më të fundit, kam shkruar një skript "të përkohshëm" në php, por, siç e dini. , nuk ka asgjë më të përhershme se gjërat e përkohshme, ndaj i përdor ato.
gettemp.php

\n"; ndërsa ($line = mysql_fetch_array($result, MYSQL_NUM)) (echo " linjë $"; jehonë" TempIN = $lineTempOUT = $line\n"; jehonë" TempKotel = $line\n"; jehonë" Fuqia = $line\n"; ) jehonë "\n"; mysql_free_result($result); mysql_close($connect); ?>

Çfarë do të dëshironit të shtonit në të ardhmen?

Sigurisht, ky është, në parim, një minimum, i cili, megjithatë, ju lejon të bëni një kontroll të plotë dhe mjaft të përshtatshëm të ngrohjes në një shtëpi të vogël. Edhe pse me disa ndryshime mund të përdoret në ndërtesa me shumë dhoma dhe në përgjithësi të çdo kompleksiteti, arduino mund të bëjë shumë këtu, nëse jo të gjitha. Është në këtë projekt që do të doja të shtoja në të ardhmen:
  • Rregullatori i temperaturës. Megjithëse praktika ka treguar se 22.5 është vlera mjaft optimale dhe, në parim, nuk kërkon rregullim. Përsëri, do të doja ta bëja rregullatorin nga distanca nga arduino kryesore, por kjo kërkon ose një qark kompleks ose një arduino tjetër. Në përgjithësi, ka diçka për të menduar.
  • Unë do të doja aftësinë për të lexuar jo vetëm temperaturën, por edhe për të ndryshuar parametrat PID në fluturim. Është e mundur të bëhet veçmas modaliteti i "nxehjes fillestare", përndryshe parametri I do të normalizohet për një kohë të gjatë pas çdo rinisjeje të programit.
  • Unë dua një aplikacion të thjeshtë për android, në mënyrë që të mos futem në një shfletues të vogël në telefonin tim. Kjo është më e thjeshta dhe tashmë në progres.
  • Sidoqoftë, lidhni sensorin e temperaturës së ftohësit dhe transmetoni të dhënat e tij, si dhe të dhëna të tjera të temperaturës.
  • Sinjalizimi i urgjencës. Kjo do të thotë, përcaktoni automatikisht humbjen e tensionit në linja, dështimin e stafetës ose elementëve të ngrohjes.
  • Bëni një "carousel", ndryshoni destinacionet e elementeve të ngrohjes. Përndryshe, rezulton se një element ngrohës funksionon gjithmonë më shumë se të tjerët, dhe në teori duhet të jetë i pari që dështon. Thjesht duhet të ndryshoni herë pas here kodin PIN në program. Duket e thjeshtë, por duart nuk do të arrijnë për të shtuar në asnjë mënyrë.
Teksti i programit për Arduino:

#përfshi #përfshi #përfshi #përfshi #përfshi #përfshi // Shembull i temperaturës OneWire DS18S20, DS18B20, DS1822 // // http://www.pjrc.com/teensy/td_libs_OneWire.html // // Biblioteka e DallasTemperature mund ta bëjë gjithë këtë punë për ju! // http://milesburton.com/Dallas_Temperature_Control_Library OneWire ds(6); // në pin 10 (është e nevojshme një rezistencë 4.7K) Sensorët e temperaturës Dallas(&ds); pritje logjikeTemp = false; int TEMPERATURE_PRECISION = 10; llambë int1 = 7; llambë int2 = 8; llambë int3 = 9; Adresa e pajisjes Inttermometri = ( 0x28, 0x8E, 0xF4, 0x28, 0x05, 0x00, 0x00, 0x07 ); Adresa e pajisjes Termometri i jashtëm = ( 0x28, 0x65, 0x15, 0x32, 0x05, 0x00, 0x00, 0xE2 ); Adresa e pajisjes Kattermometri = ( 0x28, 0x61, 0x43, 0x28, 0x05, 0x00, 0x00, 0x14 ); shtesa e bajtit; e panënshkruar e gjatë Koha e fillimit = 0; WorkWindow e gjatë e panënshkruar = 60000; // 10 minuta kohë e gjatë e panënshkruar, TenTime; float maxData = 100; noton celsius, temp; pikë e dyfishtë e vendosjes, hyrje, dalje; int Numri i termometrit; Termometri i Adresës së Pajisjes; PID myPID(&Hyrja, &Dalja, &Pika e vendosjes, 10, 0.1, 5, DIREKT); //0.000006 0.03 40 objektiv i dyfishtëTemp = 22.5; bajt mac = (0xE0, 0x69, 0x95, 0x72, 0x65, 0xE8); byte ip = (192, 168, 1, 100); server bajt = ( ?, ?, ?, ? ); Klienti EthernetClient; numërimi i faqeve në internet = 10; webcount byte = 0; konfigurimi i zbrazët (void) ( Serial.begin(9600); //Ethernet.begin(mac, ip); Ethernet.begin(mac); sensors.begin(); pinMode(lamp1, OUTPUT); pinMode(lamp2, OUTPUT) ; pinMode (llambë3, OUTPUT); Pika e caktuar = targetTemp; myPID.SetOutputLimits (0, maxData); myPID.SetMode (AUTOMATIC); Celsius = targetTemp; StartTime = millis (); ) filtër i gjatë (i gjatë x, i gjatë Nb, i gjatë k ) ( e gjatë statike y = 0, z = 0; z += (x - y); kthimi y = (Nb * z) >> k; ); void loop(void) (bajt i; lloji i bajtit; të dhënat e bajtit; i gjatë Out; nëse (millis ()< StartTime) { StartTime = millis(); } WorkTime = millis() - StartTime; if (WorkTime >WorkWindow) ( Work Time = Work Time - WorkWindow; StartTime = millis () + Work Time; ) //Serial.println ("cikli"); sensorë.kërkesëTemperatures(); celsius = sensorë.getTempC(Inttermometri); hyrje = celsius; if (webcount >= webskipcount) ( tampon char; Temperatura e vargutS1 = dtostrf(celsius, 2, 2, buffer); Temperatura e vargutS2 = dtostrf(sensors.getTempC(OutThermometer), 2, 2, buffer); Temperatura e vargutS3 = dtostrf(sensorët .getTempC (Kattermometri), 2, 2, buffer); Fuqia e daljes së vargut = dtostrf (Dalja, 2, 2, buffer); Mesazhi i vargut = "MERRNI /temp.php?t1="+ temperatureS1 + "&t2=" + temperaturaS2 + "&t3=" + temperatureS3 + "&p="+OutputPowerS; Serial.println(msg); client.connect(server, 80); client.println(msg); client.stop(); webcount = 0; ) other ( uebcount += 1; ) myPID.Compute(); //Serial.print(Input);Serial.print(" ");Serial.print(Output);Serial.print(" ");Serial.println(Setpoint); nëse (Output > maxData/3*2) (DixhitalWrite(llambë1, LARTË); DigitalWrite(llampë2, LARTË); Dalje = Dalje - maxData/3*2; ) tjetër nëse (Output > maxData/3) (DixhitalWrite(lamp1, LARTË); dixhitalWrite(lampë2, LOW); Out = Output - maxData/3; ) tjetër (DixhitalWrite(lamp1, LOW); DigitalWrite(llampa2, LOW); Out = Output; ) TenTime = harta (Out, 0, maxData/ 3, 0, dritare pune); Shtypja serike (celsius); printim serik (" "); Serial.print(sensors.getTempC(OutThermometer)); printim serik (" "); Serial.print(sensors.getTempC(KatTermometer)); printim serik (" "); Serial.print(Output); printim serik (" "); Serial.print(TenTime); printim serik (" "); Serial.println(Ora e punës); nëse (Koha e punës< TenTime) { digitalWrite(lamp3, HIGH); } if (WorkTime >TenTime) (DixhitalWrite (llambë3, LOW); ) )

Unë jam student i një universiteti teknik. Një ditë, të ulur në një kafe me një mik që studionte në një universitet mjekësor, ata vendosën të hapnin një bar. Kishte shumë ide që, në parim, meritonin vëmendje. Për shembull, një pistë kërcimi që ndryshon këndin e tij në varësi të stilit të muzikës... Por, krahas gjithë larmisë së ideve, kishte edhe një tjetër -

... dhe pse të mos krijojmë birrën tonë?

Disa javë më vonë, bëra një birrë duke përdorur përbërës nga një fabrikë birre ku punonte një mik i babait tim. Por shumë procese teknologjike u shkelën, kështu që në vend të birrës doli diçka me një erë jo shumë të këndshme.

Disa vite më vonë, vendosa të përsëris procesin, duke e automatizuar pak me Arduino UNO. Dhe ja çfarë ndodhi.

Do të filloj me atë që duhet të bëjë i gjithë konfigurimi.

  • Kontrolloni veten - a funksionon gjithçka, a është gjithçka e lidhur;
  • pastroni veten;
  • Përgatituni për procesin e birrës;
  • Krijoni birrën në modalitetin gjysmë automatik;
  • Krijoni birrën në modalitetin manual;
  • Krijo birrën në modalitetin automatik (si një makinë larëse që lan rrobat).

Pika e parë aktualisht nuk zbatohet. Deri më tani, nuk ka asnjë mendim se si të zbatohet.
E dyta gjithashtu nuk është e zbatuar, por do ta përfundoj në një të ardhme të afërt, vetëm prisni derisa pompat të dorëzohen nga ebay.
Pika e tretë është mjaft e thjeshtë.

Përgatitja për procesin e zierjes

Një mesazh nga sistemi që është e nevojshme të derdhet uji në kazan -> programi pret që të shtypet tasti OK -> programi dërgon një komandë në arduino për të ndezur relein e gjendjes së ngurtë -> gjendjen e ngurtë stafeta ndez tenn një kilovat në tenxhere, e çon në temperaturën 37 gradë, dërgon komandën në program që gjithçka është gati për gatim. Ruan një temperaturë prej 37 gradë.

Do të doja që të kishte një kontroll për praninë e ujit, por sensori ende pret largimin e tij nga "vëllezërit kinezë".

Pirja gjysmë automatike e birrës

Në parim, një procedurë e thjeshtë:

Ne shtypim butonin "Ngrohja" në programin e kontrollit, pjesa tjetër e butonave të kontrollit nuk janë aktiv;
- Pas ngrohjes, programi shfaq mesazhin "Gjithçka është gati, ju mund të gatuani";
- Plotësojmë përbërësit, zgjedhim programin e zierjes - butoni "bërja e birrës" bëhet aktiv;
- Shtypni butonin "bërja e birrës", procesi ka filluar;
- Më tej, sistemi do të njoftojë periodikisht me mesazhe informative se çfarë duhet të bëjë dhe kur.

Ju duhet të ndiqni udhëzimet.

Pirja e birrës me dorë

Ky proces ju lejon të vendosni parametrat e gatimit, t'i ndryshoni ato në ciklin e gatimit. Nuk e kam arritur akoma.

Gatim në modalitetin automatik

Kjo është një ëndërr. Aktualisht nuk ka komponentë për t'u zbatuar. Nuk ka mjaft pompa, sensorë të nivelit të ujit. Nuk e di se si të matet dendësia e mushtit, sa alkool ka në birrën e re dhe shumë më tepër. Por unë nuk dëshpërohem dhe do të automatizoj gradualisht derisa pirja e birrës të duket kështu:

I hodha përbërësit në tabakatë e duhura, shtypa butonin dhe ... në një muaj e gjysmë mora birrën e përfunduar.

Ky është procesi me pak fjalë, tani le të kalojmë në anën teknike.

Ana teknike e procesit

Siç u përmend më lart, mikrokontrolluesi i kontrollit është arduino UNO. 2 stafetë janë të lidhur me të, 2
termometri dixhital DS18B20 .

Arduino komunikon me programin kryesor përmes portës com. Sepse Unë nuk kam një mburojë në kohë reale për arduino, më është dashur të marr kohëmatësit nga vizuale c#. Unë nuk kam përvojë në shkrimin e programeve, kështu që nëse dikush ka ide, kritika është një nder. Kritikoni, tërhiqni, si të thuash, se papritmas nuk ju pëlqen.

Këtu është teksti i programit në arduino

#përfshi OneWire ds(8); // sensorët e temperaturës ulen në pinin 8 int rele1 = 13; stafetë int2 = 12; stafetë int3 = 11; stafetë int4 = 10; stafetë int5 = 7; //ndizni hijet int relay6 = 6; // mash tun float float temp1; float temp2; konfigurimi i zbrazët (void) ( Serial.begin(9600); pinMode(reley1,OUTPUT); pinMode(reley2,OUTPUT); pinMode(reley3,OUTPUT); pinMode(reley4,OUTPUT); pinMode(reley5,OUTPUT); pinMode( reley6,OUTPUT); digitalWrite(reley1,LOW); digitalWrite(reley2,LOW); digitalWrite(reley3,LOW); digitalWrite(reley4,LOW); digitalWrite(reley5,LOW); digitalWrite(reley6,LOW); ) qark i pavlefshëm (i pavlefshëm) ( if (Serial.available()) ( switch (Serial.read())( case "i": infuz(); break; case "p": progrev(); break; case "a": avariya (); break; rasti "v": varka (); break; rasti "t": temperatura (); break; ) ) ) void varka () ( digitalWrite(reley6, HIGH); while (Serial.read()! ="m") (temperatura(); nëse (temperatura 1 >= 52.00) dixhitaleWrite(reley6,LOW); përndryshe digitalWrite(reley6,HIGH); ) while(Serial.read()!="n") ( //digitalWrite (reley6,HIGH); temperatura(); if(temp1>= 62.00) digitalWrite(reley6,LOW); tjetër digitalWrite(reley6,HIGH); ) while(Serial.read()!="b") ( //digitalWrite (reley6,HIGH); temperatura (); nëse (temp1 >= 75.00) digitalWrite (rele6, LOW); tjetër digitalWrite (reley6,HIGH); ) DigitalWrite (reley6,LOW); ndërsa(Seriali.lexo()!="c") vonesë(1000); while(Serial.read()!="x") ( digitalWrite(reley5,HIGH); temperature(); ) digitalWrite(reley5,LOW); ) void infuz() ( //temperature(); //Serial.available(); ndërsa (Serial.read()!="s")( //fikni ciklin e përgatitjes së infuzionit nëse (temp.<=69.50) digitalWrite(reley5,HIGH); else digitalWrite(reley5,LOW); } digitalWrite(reley5,LOW); } void progrev() { while (temp1 <=36.00) temperature(); digitalWrite(reley6,HIGH); digitalWrite(reley6,LOW); //while (temperature() >40.0) //vonesa (1000); Serial.println("s"); ) void avariya()( digitalWrite(reley1,LOW); digitalWrite(reley2,LOW); digitalWrite(reley3,LOW); digitalWrite(reley4,LOW); digitalWrite(reley5,LOW); ) temperature e zbrazte() (bajt i; bajt i pranishëm = 0; të dhëna bajte; shtim bajt; zator bajt = (40, 23, 218, 43, 6, 0, 0, 22); // adresa e sensorit të temperaturës në bajtin e mbingarkesës varilka = (40, 255, 240, 115 , 59, 4, 0, 234); //adresa e sensorit të temperaturës në kavanozin e prodhimit të notimit celsius; // temperatura notuese; gde boolean; nëse (!ds.search(addr)) ( //Serial. println("Nuk ka më adresa."); //Serial.println(); ds.reset_search(); vonesë(250); // return; ) if (OneWire::crc8(addr, 7) != addr) ( Serial.println("CRC nuk është e vlefshme!"); // return; ) ds.reset(); ds.select(addr); ds.write(0x44, 1); // nis konvertimin, me ndezjen e parazitit në vonesa e përfundimit (840) ; // ndoshta 750 ms është e mjaftueshme, ndoshta jo // ne mund të bëjmë një ds.depower() këtu, por rivendosja do të kujdeset për të. present = ds.reset(); ds.select( addr); ds.write (0xBE); // Lexoni Scratchpad për (d.m.th = 0; i< 9; i++) { // we need 9 bytes data[i] = ds.read(); } int16_t raw = (data << 8) | data; byte cfg = (data & 0x60); if (cfg == 0x00) raw = raw & ~7; // 9 bit resolution, 93.75 ms else if (cfg == 0x20) raw = raw & ~3; // 10 bit res, 187.5 ms else if (cfg == 0x40) raw = raw & ~1; // 11 bit res, 375 ms celsius = (float)raw / 16.0; for(i = 0; i<8; i++) { if (addr[i] == zator[i]) gde = true; else { gde = false; break; } } if (gde) { Serial.print("t2 "); //temperatura варочника temp2 = celsius; Serial.print(temp2); Serial.println(); } else { Serial.print("t1 "); //температура затора temp2 = celsius; Serial.print(temp1); } }

Gjithçka do të ishte mirë, por për disa arsye sensori i tretë tregon vazhdimisht 85 gradë. Deri më tani nuk mund të them pse. Dhe është e nevojshme për automatizim të mëtejshëm - ruajtjen e temperaturës në frigorifer.

Përshkruani shkurt se çfarë bën programi.

Programi është i ndarë në nënprograme, secila prej të cilave aktivizohet nëse një karakter i caktuar shfaqet në portën e komunikimit. Për shembull, nëse shkronja "p" hyn në port, atëherë modaliteti "Ngrohja" është i aktivizuar. Ose, nëse "a" - atëherë thirret nënprogrami avariya() dhe çdo gjë fiket. Kur thirret nënprogrami temperature(), të dhënat shkruhen në variablat globale temp1, temp2. Nga atje ata futen në nënprogramet e nevojshme.

Në të ardhmen, do të ketë nënprograme për prodhimin e varieteteve të ndryshme dhe madje edhe dritën e hënës.

Tani, sa i përket programit kryesor të kontrollit.

Programi kryesor i kontrollit

Është shkruar në studion vizuale c#.

Kodi burimor i programit:

Kodi burimor i programit

duke përdorur Sistemin; duke përdorur System.Collections.Generic; duke përdorur System.ComponentModel; duke përdorur System.Data; duke përdorur System.Drawing; duke përdorur System.Linq; duke përdorur System.Text; duke përdorur System.Threading.Tasks; duke përdorur System.Windows.Forms; duke përdorur System.IO.Ports; hapësira e emrit WindowsFormsApplication1 ( klasa publike e pjesshme Form1: Form ( // Numri i portës së vargut; Porta Seriale1 = SerialPort i ri ("COM5", 9600); int s=0; Form1 publik () ( InitializeComponent(); ) /*konstancë private int = CP_NOCLOSE_BUTTON 0x200; anulim i mbrojtur CreateParams CreateParams ( merrni ( CreateParams myCp = base.CreateParams; myCp.ClassStyle = myCp.ClassStyle | CP_NOCLOSE_BUTTON; kthej myCp; ) )*/ private void Form1_Load(object. PortName; Port1.Open(); ) //Kontrollimi i butonit të zbrazëtisë private të harduerit1_Klikoni(dërguesi i objektit, EventArgs e) (nëse (Port1.IsOpen == false) ( provoni ( //programi mund të modifikohet informacioni nga podrugomu.com/ node/987 Port1.PortName = label2.Text; Port1.Open(); Port1.Write("Kontrollo"); //Port Serial2 = SerialPort i ri ("COM4", 9600); //Port2.Open(); / /label3. Tekst = Convert.ToString(Port2.ReadByte()); //Kontrollimi i leximeve të portit MessageBox.Show("Procesi i kontrollit të harduerit filloi", "Info mesazh degëzim"); richTextBox1.Text = richTextBox1.Text + "\n" + "Fillimi i procesit të kontrollit të harduerit"+" "+DateTime.Now.ToString("HH:mm"); button1.Enabled=false; button2.Enabled=false; button3.Enabled=false; if (Port1.ReadByte() == 1000) ( richTextBox1.Text = richTextBox1.Text + "\n" + "Fundi i procesit të kontrollit të harduerit"+" "+DateTime.Now.ToString("HH:mm"); butoni1 . Aktivizuar = e vërtetë; butoni2.Enabled = e vërtetë; button3.Enabled = e vërtetë; Port1.Close(); MessageBox.Show("Fundi i ciklit të testimit të harduerit" +" "+ DateTime.Now.ToString("HH:mm") ); richTextBox1.SaveFile ("CheckLOG.rtf"); ) ) kap ( richTextBox1.Text = richTextBox1.Text + "\n" + "Procesi i kontrollit të harduerit dështoi" +" "+ DateTime.Now.ToString("HH:mm "). ) ;) ) ) // Pastrimi i pajisjes butonin privat të zbrazëtisë3_Click(objekt dërgues, EventArgs e) (nëse (Port1.IsOpen == false) ( provo ( //programi mund të modifikohet informacion nga podrugomu.com/node/987 MessageBox .Show(" Ju keni derdhur patjetër dezinfektues", "PARALAJMËRIM", MessageBoxButtons.OK, MessageBoxIco n.Paralajmërim); porta 1. PortEmri = label2.Tekst; Port1.Open(); Port1.Write("Clean"); MessageBox.Show ("Procesi i pastrimit të harduerit filloi", "Mesazhi informativ"); button1.Enabled=false; button2.Enabled=false; button3.Enabled=false; nëse (Port1.ReadByte() == 1000) ( button1.Enabled = true; button2.Enabled = true; button3.Enabled = true; Port1.Close(); MessageBox.Show("Fundi i ciklit të pastrimit të pajisjeve"); ) ) catch ( MessageBox.Show ("Portë e gabuar e pajisjes u zgjodh. Procesi i pastrimit nuk mund të fillohet", "Vërejtje"); ) ) ) kontekst privat i zbrazëtMenuStrip1_Opening(dërguesi i objektit, CancelEventArgs e) ( ) i pavlefshëm privat coOM1ToolStripMenuItem_Click(objekt dërgues) ( SerialPort Port1 = new SerialPort ("COM1", 9600); // MessageBox.Show ("COM1 zgjedhur"); label1.Visible = true; label2.Text = "COM1"; ) private void label2_Click(object sender, EventArgs e ) ( ) void privat com2ToolStripMenuItem_Click(dërguesi i objektit, EventArgs e) (SerialPort1 = SerialPort i ri ("COM2", 9600); // MessageBox.Show ("porta COM2 e zgjedhur"); label1.E dukshme = e vërtetë; label2.Text = "COM2"; ) void privat com3ToolStripMenuItem_Click(dërguesi i objektit, EventArgs e) (SerialPort Port1 = new SerialPort ("COM3", 9600); // MessageBox.Show ("porta COM3 e zgjedhur"); etiketa1.E dukshme = e vërtetë; label2.Text = "COM3"; ) private void coOM4ToolStripMenuItem_Click(dërguesi i objektit, EventArgs e) (SerialPort1 = SerialPort i ri ("COM4", 9600); // MessageBox.Show ("porta COM4 e zgjedhur"); label1.E dukshme = e vërtetë; label2.Text = "COM4 "; ) private void coOM5ToolStripMenuItem_Click(dërguesi i objektit, EventArgs e) (SerialPort1 = SerialPort i ri ("COM5", 9600); // MessageBox.Show ("porta COM5 e zgjedhur"); label1.E dukshme = e vërtetë; label2.Text = "COM5"; ) void privat com6ToolStripMenuItem_Click(dërguesi i objektit, EventArgs e) (SerialPort Port1 = new SerialPort("COM6", 9600); // MessageBox.Show ("porta COM6 e zgjedhur"); label1.E dukshme = e vërtetë; etiketa2. Tekst = "COM6"; ) void privat com7ToolStripMenuItem_Click(dërguesi i objektit, EventArgs e) (SerialPort Port1 = new SerialPort("COM7", 9600); // MessageBox.Show("porta COM7 e zgjedhur"); label1.E dukshme = e vërtetë; label2.Text = "COM5"; ) private void brew programToolStripMenuItem_Click(object sender, EventArgs e) ( ) // Bërja e birrës private void button2_Click(object sender , EventArgs e) ( // nëse (Port1.IsOpen == false) //( // provo //( //programi mund të modifikohet informacioni nga podrugomu.com/node/987 //Port1.PortName = label2. teksti; //Port1.Open(); switch (label3.Text) (rasti "Përzgjedhur pure infuzioni": MessageBox.Show("Procesi i përzierjes së infuzionit filloi", "Mesazhi informacioni"); Port1.WriteLine("i"); timer1.Start(); pushim; rast " Cooper brew zgjedhur": MessageBox.Show ("Procesi i pure Cooper filloi", "Mesazhi informacioni"); Port1.WriteLine ("v"); timer3.Start(); break; ) button1.Enabled = false; button2.Enabled=false; button3.Enabled=false; // button5.Enabled = false; // richTextBox1.Text = Port1.ReadLine()+"\n"; /* nëse (Port1.ReadLine() == "e\r") ( button1.Enabled = true; button2.Enabled = true; button3.Enabled = true; button5.Enabled = true; */ //Port1.Close( ); // MessageBox.Show("Fundi i ciklit të prodhimit"); // ) // ) // kap //( // MessageBox.Show("Portë e gabuar e pajisjes është zgjedhur. Procesi i prodhimit nuk mund të fillohet", "Kujdes " ); //) // ) ) butoni privat i zbrazët5_Klikoni(dërguesi i objektit, EventArgs e) (Port1.Write("p"); butoni1.Enabled = false; button2.Enabled = false; button3.Enabled = false; timer2. Fillimi (); richTextBox1.Text = richTextBox1.Text + "\n" + "Filloni ngrohjen e ujit në mash tun në 37 gradë" + " " + DateTime.Now.ToString("HH:mm"); /* Port1.Open ( ); //Port1.Open(); //richTextBox1.Text = richTextBox1.Text + "\n" + Port1.ReadLine(); Port1.WriteLine ("o"); Port1.Close(); */) private void exitToolStripMenuItem_Click(dërguesi i objektit, EventArgs e) ( Mbyll(); ) buton i zbrazët privat4_Click(dërguesi i objektit, EventArgs e) ( ) infuzion privat i pavlefshëmOverwriteTool StripMenuItem_Click(dërguesi i objektit, EventArgs e) ( label3.Text = "Pure e infuzionit u zgjodh"; ) private void timer1_Tick(dërguesi i objektit, EventArgs e) ( textBox1.Text = Convert.ToString(Convert.ToInt32(s / 60)); textBox2.Text = Convert.ToString(Convert.ToInt32(s));s++; label5.Text = Port1.ReadLine(); nëse (s==4200)( //70 minuta është 4200 sekonda timer1.Stop(); //timer2.Start(); //Port1.Open(); Port1.WriteLine ("s"); // Port1.Close(); MessageBox.Show ("Pureja e infuzionit ka mbaruar, duhet të filtrohet lëngu"); button1.Enabled = e vërtetë; button2.Enabled = e vërtetë; button3.Enabled = e vërtetë; button5 .Enabled = true; textBox1.Text = ""; textBox2.Text = ""; ) //Port1.Close(); ) private void label4_Click(object sender, EventArgs e) ( ) private void timer2_Tick(object sender, EventArgs e ) ( label5 .Text = Port1.ReadLine(); if (Port1.ReadLine() == "s\r") ( timer2.Stop(); MessageBox.Show("Uji ka një temperaturë prej 37 gradë. Mund të shtoni malt dhe të aktivizoni modalitetin e puresë"); richTextBox1.Text = richTextBox1.Text + "\n" + "Përfundimi i procesit të puresë. T=37 gradë" + " " + DateTime.Now.ToString("HH:mm"); button2.Enabled = true; ) ) private void emergjenceDisableToolStripMenuItem_Click(dërguesi i objektit, EventArgs e) ( Port1.WriteLine("a"); MessageBox.Show("Përdoruesi mbyll të gjithë sistemin"); ) ToolStripMenuItem_Click(dërguesi i objektit, EventArgs e) (Port1.WriteLine("k"); MessageBox.Show("Mash tun simmer i aktivizuar. Ju lutemi prisni 60 minuta ") ; richTextBox1.Text = richTextBox1.Text + "\n" + "Modaliteti i zierjes Mash tun është i aktivizuar. Prisni 60 minuta" + " " + DateTime.Now.ToString("HH:mm"); ) timer privat i zbrazët3_Tick(objekt dërguesi, EventArgs e) ( vargu s1 = ""; Port1.ReadLine (); nëse (s1.Substring(0, 2) == "t1") label5.Text = s1.Substring(4, 5); nëse (s1 .Substring (0, 2) == "t2") label9.Text = s1.Substring(4, 5); s++; if (s == 900) ( Port1.WriteLine("m"); MessageBox.Show(" Faza e larjes në 62 gradë"); richTextBox1.Text = richTextBox1.Text + "\n" + "Pure hapi në 62 gradë x" + " " + DataTime.Now.ToString("HH:mm"); ) if(s== 2250) ( Port1.WriteLine("n"); MessageBox.Show("hapi i fshirjes 78 grade"); richTextBox1.Text = richTextBox1.Text + "\n" + "Hapi i fshirjes 78 grade " + " " + DateTime.Now.ToString("HH:mm"); ) if (s ==2700) ( Port1.WriteLine("b"); MessageBox.Show ("Pureja ka mbaruar, mund ta kullosh lythin") ; richTextBox1.Text = richTextBox1.Text + "\n" + "Mashimi ka mbaruar. Mund të kullosh lythin" + " " + DateTime.Now.ToString("HH:mm"); ) ) void private regularToolStripMenuItem_Click(objekt dërguesi , EventArgs e) ( label3.Text = "Përzgjedhur brew Cooper"; ) ) )

Programi komunikon me arduino përmes portës com. E vetmja gjë që nuk mund të fitoj është se gjatë votimit në portin com, programi nuk ngrin në kohën kur ekzekutohet nënprogrami. Pas përfundimit të nënprogramit, programi varet, por deri më tani kjo nuk është kritike dhe madje një plus i caktuar. I papërshtatshëm - të mos shtypni asgjë gjatë një procedure të caktuar.

Në total, programi mund

- të përgatisë pajisje për gatim;
- kuzhinier;
- shkruani një regjistër të thjeshtë të punës (shumë i dobishëm për analiza të mëtejshme të birrës);
- zgjidhni një port për t'u lidhur me kontrolluesin e kontrollit (arduino UNO);
ziejeni birrën dhe bëni pure kazanët.

Kur të mbërrijnë pompat dhe valvulat solenoid, unë do të automatizoj më tej. Ndërkohë çdo të diel do të shtoj një program gatimi. Gjithsej do të ketë 5 programe. Zbatimi i modalitetit manual po pret gjithashtu radhën.
Siç thonë ata,

vazhdon...

UPD:

Këtu janë disa foto të fabrikës së birrës

Kjo është një tenxhere gatimi. Unë kam dy nga këto. Një sensor i temperaturës DS18B20 në një kornizë të mbyllur është instaluar në anën.
Për një kohë të gjatë nuk mund ta kuptoja pse arduino varet në mënyrë periodike, derisa më kuptoi se gjithçka duhet të tokëzohet, së pari depërton në kasë, pastaj në kutinë e sensorit dhe në arduino.

Tubi i bakrit brenda është për filtrimin e lythit. Mund ta bëni më të bukur, por është më mirë të përdorni një fund të rremë. Për fat të keq, kinezët mbledhin pa nxitim për ta dërguar atë.

Është shumë herët për të folur për rezultatin, ja çfarë ndodhi

Pamja e përgjithshme e vatrës duket kështu.

Konektorë normalë të përdorur
për lidhjen e sensorëve të temperaturës të lidhur në një prizë të dyfishtë. Pajisjet më të lehta për t'u pastruar. E fiku dhe e çoi në banjë. I lare, i lidhur dhe cdo gje punon.

Gjithçka shkumonte sipas orarit, nuk kishte rrjedhje të tepërt. Dhe planet më të menjëhershme janë të kulloni një grumbull birre për fermentim, të krijoni një tjetër. Receta, në parim, mund të shihet në kodin në nënprogramin arduino varka ().

Më në fund mbërritën valvulat solenoid. Procesi i automatizimit vazhdon.

Artikujt kryesorë të lidhur