Bira fabrikası için otomasyonu tek kartta yapıyoruz. atmega644'ü keşfetmek. Bir fotorezist kullanarak bir tahta yapıyoruz. İnternete veri aktarımı ile arduino'da bir kır evini ısıtmak

  • 14.05.2019

Arduino'yu gerçek hayattaki görevlerde kullanmanın başka bir örneğini sunmak istiyorum. Burada Arduino tabanlı bir elektrikli kazan kullanarak ev ısıtmasını ayarlamak için en basit ama gerçekten çalışan projeyi sunacağım. Bu makalenin, birinin korkularını bir kenara bırakıp ellerini amaçlanan amaç için kullanmaya çalışmasına gerçekten yardımcı olacağını umuyorum, elleri, beyinleri çok iyi eğitiyor ve ilginç bir şey yaratmanın nadir bir tatmin duygusu veriyor. Bu kontrol cihazıyla çalışmaya başladığımda, onu kullanırken ortaya çıkan olasılıklar konusunda hala biraz kafam karıştı.

Tarih

Neden Arduino? Sadelik, erişilebilirlik, çok sayıda belge ve kitaplık. Birçokları gibi, uzun zamandır Arduino'ya yakından bakıyorum, çocukluğumdan beri her türlü pili ve motoru seviyorum ve işte yeni bir seviye, tam teşekküllü bir programlama dili ve bir sürü girdi-çıktı yeteneği. “Muhtemelen ekonomik ortaklarımız” onu üretmeye başladığında, fiyatları kabul edilebilir bir seviyeye düştü. Sonuç olarak, bir başlangıç ​​kiti satın aldım ve çok sayıda LED ve göstergeyi yanıp söndükten sonra, onu evde bir yerde kullanma arzum vardı.

ne ısıtıyoruz

Anneannem Moskova yakınlarında bir köy evinde yaşıyor, normal su kaynağı yok, gaz yok, ısıtma yok ve tüm bu sorunları çözmek büyük yatırımlar ya da el kullanımı gerektiriyor. Burada arduino'yu tam anlamıyla kullanabileceğiniz bir yer gördüm, dönebileceğiniz bir yer var. Köy evinin en büyük artısı geleneksel olarak küçük ve çok sade olmasıdır. Yani benim - 20. yüzyılın ortalarındaki tipik bir köylü ailesinin evi, büyük bir odası ve mutfağı olan bir kütük kulübesidir. Başka ısıtmalı oda olmaması bizim için bir artı, sıcaklığı tek bir odada tutmak ve kontrol etmek yeterli.

Isıtma

Isıtma ekipmanı. Geleneksel olarak, evde soba ısıtması vardı. Odada bir "Alman" soba (uzun bir sarma borusu nedeniyle ısınır), mutfakta ikinci "Rus" (şöminenin kendisinin büyük boyutu nedeniyle ısınır). Birisi sinema performanslarında sobanın havalı ve dahası doğal ve romantik olduğunu düşünüyorsa, o zaman bu insanların soba ısıtmalı bir evde hiç yaşamadıklarını varsayıyorum. Aslında çok rahat değil, rahatsız edici ve yangın tehlikesi var. Bu nedenle, 5 yıl önce, bir gaz kazanı ile en basit iki borulu ısıtmanın dağıtımı için bir proje sipariş edildi ve uygulandı. Kazanın gaz tüplerinden beslenmesi gerekiyordu.

Daha sonra, sistemin modernize edilmesine, soğutma sıvısının zorunlu devridaimi için bir pompa ve henüz çok soğuk olmadığında gaz ateşlemesinden muzdarip olmamak için 2 kilovatlık küçük bir elektrikli kazan eklenmesine karar verildi. Tüm otomasyon, duvarda büyük bir anahtarın varlığına kadar kaynadı, soğuyunca açtılar ve ısındığında kapattılar. 0 ° C'ye kadar bir yerde iki kilovat yeterliydi, o zaman son derece elverişsiz olan bir gaz veya soba yakmak gerekiyordu.

ekonomik uygunluk

Herhangi bir şeyi değiştirmeden önce, elbette, tüm bu fikrin mantıklı olup olmadığını hesaplamaya karar verildi. Silindirlerden gelen gaz tüketimini deneyimden hesapladıktan sonra, beklenen dizel yakıt tüketimini tahmin ettikten sonra, yeterli miktarda elektrik varsa bu tür ısıtmaların hiçbir anlamı olmadığı sonucuna vardım. Ayda 6-7 bin bir yerde çıkan silindirlerin fiyatında, dizel yakıt, kışın yanmış veya yazlık bir şey satın alırsanız, ayda 5 bin tüketime kadar tasarruf edebilirsiniz, temiz elektrikte ise 7 bin çıktı Buraya kazanın maliyetini, sürekli sürüklenen silindirleri ve maaş kokusunu da ekleyelim, elektriğin çok daha basit ve daha pahalı olmadığı anlaşılacaktır. Tabii ki, son zamanlarda moda olan pelet brülörleri var, ancak kendilerini nasıl ateşleyeceklerini bilmedikleri ve bu nedenle minimum güce sahip oldukları için bana uymadılar, üstelik hiç de küçük değil (yaklaşık 5 kW), 90 Zamanın %'sinde gidecek hiçbir yer yoktur ve bazen yapacak kimsenin olmadığı yakıtı doldurmak için haftada en az 2 kez gerekir. Ve kazanların maliyeti, önceki seçeneklerden daha yüksek bir büyüklük sırasıdır, bu nedenle benim durumumda değil, yüksek güç ve yüksek maliyetlerin gerekli olduğu büyük evler için uygundurlar.

Ağır donanım

Gaz tüketimine ve diğer tahminlere dayanarak gerekli gücü tahmin etmeye çalıştım, 6'lık bir marjla 4-5 kW'a ihtiyacımız olduğu ortaya çıktı. Piyasa incelemesi, buna benzer bir elektrikli kazan modeli olduğunu gösterdi. biri zaten kurulu, ancak her biri 2 kW'lık 3 ısıtma elemanı var. Üstelik yönetimsiz satıldı ki bu benim için daha da uygun ve ucuz oldu. Genel olarak, kazanın kendisi son derece basit bir tasarımdır, giriş ve çıkış borularına sahip metal bir silindir, üstüne ısıtma elemanlarının sabitlendiği cıvatalarla tutturulmuş bir kapak. Ek olarak, gövdeye gömülü 2 sensör, dirençli bir sıcaklık sensörü ve aşırı ısındığında kapanan bir sensör, her ikisi de araç soğutma sisteminden. Şimdi elektrikle ilgili soru ortaya çıktı. Evin yanında 3 fazın bağlı olduğu bir atölye olduğu gerçeğiyle durumum basitleştirildi (insanlar arasında - 380). Doğal olarak, her bir ısıtma elemanını kendi fazından beslemek için bir cazibe vardı, bu nedenle, yeraltı tesisatı için metal bir örgüde 4 damarlı özel bir kablo satın alındı ​​​​ve kazan dairesine döşendi. Kablo, seri bağlı RCD'ler ve her biri 10A'lik 3 makineden oluşan bir blok bulunan bir panele takılır. Ardından kablo doğrudan arduino ile kalkana ve oradan da elektrikli kazana gitti.

Hafif donanım

Isıtma elemanlarını arduino ile kontrol edeceğimiz açık, soru şu - nasıl? İlkeye bağlı kalarak - daha basit, daha güvenilir, herhangi bir geçiş seçeneği olmadan bir röle kullanarak bunları basitçe açıp kapatacağız. Aliexpress'e tırmanırken, aynı anda 5 güç hattını kontrol edebilen arduino için bir röle bloğu buldum. Bir problem, bu rölelerin dayanabileceği maksimum akım 10A'dır, ancak 2kW / 220V ~ 9A alıyorum. Bu pratik olarak maksimumdur, ancak en az %25'lik bir marj olması arzu edilir. Ancak, bir şans almaya karar verdim. Röleler dürüstçe neredeyse bir hafta sürdü, sonra erimeye başladılar. Bir şeyi hızlı ve hızlı bir şekilde çözmek gerekiyordu, çünkü kıştı ve ısınmayı durdurmak imkansızdı. Bu nedenle, ancak 12V sargılı 30A röleler satın alındı. Bu nedenle, onları 5V arduinodan açmak için her röleye hızlı bir şekilde bir transistör lehimledim.

Devre neredeyse bir ay boyunca iyi çalıştı ve sonra evde bir şekilde çok sıcak olduğunu fark ettim. Test, bir rölenin "sigortasının" açık konumda olduğunu gösterdi. Üzerine vurdum - tekrar çalıştı, ancak birkaç gün sürdü. Evlilik olması ümidiyle değiştirdim ama bir hafta sonra 2. rölede de aynı şey oldu. Son yedeği de koyarak Ali'ye döndü. Özel 40A Arduino röleleri bulundu! Bunlar kesinlikle yeterli olmalı, diye düşündüm. Birkaç hafta bekledikten sonra tekrar transistörleri atıyorum ve hazır çemberleme ve göstergeli yeni röleler koyuyorum. Sevinç kısa sürdü, 2-3 hafta sonra röle tekrar takıldı. Konuyu incelemeye başladım, röle üzerindeki yükü azaltmak ve kontakların arkını gidermek için rölenin rastgele değil, sinüzoid voltajının 0'dan geçtiği anda açılması gerektiği ortaya çıktı. Peki , teorik olarak bu, kendi arduino'muz kullanılarak yapılabilir, yalnızca üç fazı da bölmek ve voltajı izlemek için bağlanmak için. Sorun şu ki, rölenin bir tepki süresi var ve aslında onu hala ampirik olarak kurmamız gerekiyor. Genel olarak, görev o kadar basit değil.

Ve sonra, sıradan bir röleye benzer bir durumda, güçlü bir tristör üzerine monte edilmiş bir elektrik devresi olan Katı Hal Rölesi olarak adlandırılanla karşılaşıyorum. Avantajlarından - mekanik yok, hiçbir şey yapışmaz. Aşağıda açıklanan ethernet için önemli olan güçlü elektromanyetik parazit oluşturmaz. Sıfırı geçerken röleyi açıp kapatan bir devre zaten içeriyorlar. Rölenin açık göstergesi vardır. Eh, onlar da sessizler, ancak bizim durumumuz için bu çok alakalı değil. Talimatları ve özellikleri inceledikten sonra, Rusça'da 3-5V sabit kontrol akımına ve 40A'ya kadar yük akımına sahip katı hal rölesi anlamına gelen bir SSR-40DA sipariş edildi. Aynı zamanda, "daha basit-daha iyi" ilkesinden biraz sapmaya ve ısıtma elemanlarındaki akımı daha fazla kontrol etmeye karar verdim. Bu, fazlardan birinde yanmış bir ısıtma elemanı / röle veya elektrik kesintisi hakkında bilgi edinmeyi mümkün kılacaktır. Siparişe 20A'lık bir akım kontrol modülü ekledim, ancak böyle bir akım için çürük görünseler de (2,5 kare kablo kelepçelerine bile sığmadı). Röleler ve akım ölçüm modülleri geldiğinde, rölelerin oldukça hantal olduğu ortaya çıktı, bu nedenle yüksek voltajlı kısım ile bağlantılı her şeyin yeni bir kutuya aktarılmasına ve arduino'nun eski kutuda bırakılmasına karar verildi.

İlk deneylerden sonra, bu rölelerin tristörlere monte edildikleri için oldukça ısındığını tamamen unuttum. Bir günlük çalışmadan sonra röleler o kadar ısındı ki parmağımı üzerlerinde tutmaya dayanamadım, yani 60C derece ve bu zaten kritik 80C'ye yakın. Yine Ali'ye girdim, hangi radyatörlere adapte olacağımı buldum ve sonra bu SSR'ler için standart radyatörler olduğunu öğrendim! Radyatörleri kurarken, bir akım kontrol modülünün kendisinin artık akımı geçmediğini ve kartın yanından yanmış bir iz göründüğünü keşfettim. Başka bir modül de güven vermedi, hepsini kaldırmaya karar verdim. Bu formda, hala oldukça zayıf ve tehlikelidirler, ancak onlardan pek bir anlam yoktur. Fazlar veya ısıtma elemanlarının bağlantısının kesilmesi sorunu çok acil olmadığı için bugüne kadar ertelendi, 3 yıldır ne birincisi ne de ikincisi gerçekleşmedi.

Şimdi yazılım hakkında

Arduino

Örneklerde hemen, ortalama gücü kontrol etmeyi mümkün kılan, ikili kontrole sahip - açık ve kapalı bir parça bulundu. Anlamı basit, belirli bir zaman aralığı alıyoruz, diyelim 1 dakika ve döngüde geçen süreye bağlı olarak yükü açıp kapatıyoruz. Yani gücün %50'sine ihtiyacımız varsa, ilk 30 saniyede yükü açıp son 30 saniyede kapatıyoruz, ardından döngü tekrar ediyor. Güç% 33'ten fazlaysa, 3 bağımsız röle için çabucak yeniden düzenledim, sonra ikinci röleyi,% 66'dan fazlaysa üçüncüyü açarım ve ilkini ana algoritmaya göre açıp kapatırım. Şimdi asıl soru ortaya çıkıyor, gücü seçmek için hangi algoritma kullanılmalıdır? Mesleğe göre bir programcı olarak, ilk başta sorunun oldukça basit, soğuk - ekle, sıcak - fazlasıyla yeterli olduğuna karar verdim ve hepsini kafamda çözmeye çalıştım.

O kadar kolay olmadığı ortaya çıktı. Satılan sistemlerde bunun nasıl yapıldığını görmek faydalı oldu, her şeyin bir demir gibi mümkün olduğunca basit olduğu ortaya çıktı - + 1C = kapalı, -1 = açık. Ama sonra sistemin ataleti nedeniyle neredeyse 4C salınımlar elde ediyoruz! Bu çok kaba, çünkü verileri bir derecenin onda biri doğrulukla elde edebiliyoruz. Ayrıca dış hava sıcaklığını kullanma algoritmalarına da baktım, oldukça basit oldukları ortaya çıktı ve önceden kablolanmış ve evdeki ısı kaybına bağlı olarak basitçe değiştirilen hazır tablolar üzerinde çalıştılar. Gittikçe daha derine inerek endüstriyel kurulumların dibine indim, her yerde PID kontrol algoritmaları kullandılar. Ve, popülaritenin şerefine, Arduino'nun ücretsiz bir PID kütüphanesi olduğu ortaya çıktı!

Bizim durumumuzda PID'nin ne olduğu hakkında birkaç söz. Algoritmanın anlamı, belirli bir parametrenin (evin içindeki sıcaklık) gerekli değerini ona söylememiz ve döngüde mevcut değeri geçmemiz ve bize gerekli etkiyi (altyapıya verilmesi gereken güç) vermesidir. Kazan). Matematiksel modelin detaylarına girmeden, bir programcının bakış açısından nasıl çalışır? Yani, odadaki sıcaklığı, diyelim ki 20C, istenen sıcaklık 22C'ye sahibiz ve bunları PID algoritmamıza veriyoruz.

Algoritmanın kendisinde P, I ve D adlı 3 bağımsız bölüm vardır. İlk bölüm son derece basit çalışır, istenen sıcaklık ile mevcut sıcaklıklar arasındaki farka bakar. Yani, ne kadar soğuk olursa, algoritma bize o kadar fazla güç verecektir. Bu yeterli gibi görünüyor, ancak sonuçta evde sürekli ısı kayıplarımız var, yani istenen sıcaklığı korumak için sürekli bir tür güç sağlamamız gerekiyor. Yani, odadaki sıcaklık ayarlanmış olana eşit olsa bile, kazanı kapatamazsınız, ancak bir şekilde ısı kaybına eşit bir tür güç aramalısınız. Ve ısı kaybı dışarıdaki sıcaklığa bağlı olarak değişir. Bu benim adı altındaki ikinci kısmın yaptığı şey.Algoritma, sıcaklığımızın sabit olacağı gücü seçmeye çalışıyor. Ve öyle görünüyor ki her şey zaten orada, ama hayır.

Gerçek şu ki, kazanın kendisi, soğutma sıvısı ve hatta evin kendisi çok yüksek bir eylemsizliğe sahiptir. Ve kazanı% 100 açarsanız, sıcaklığın istenen sıcaklığa ulaşmasından çok daha önce gücü azaltmanız gerekir, aksi takdirde, tamamen kapatılsa bile, odayı 2 derece aşırı ısıtmak için hala zamanımız olacaktır. sıcaklık istenen sıcaklığa ulaştı. Algoritma D'nin üçüncü kısmı bunu yapıyor.Şimdi, elbette, hepsi bu, sadece hangi kısma hangi ağırlığın verileceğini anlamak için kalır, ancak bu, seçilmesi gereken her bir parçanın çarpanları tarafından yapılır. Bu arada, bu faktörlerin seçimi ayrı ve oldukça karmaşık bir matematik problemidir, yukarıda söylenenleri hatırlatarak onları "gözle" seçtim. İlk olarak, P hariç tüm sıfırları koydu ve heyecanın başlamaması için onu seçti. Sonra I'i ve sonunda D'yi ekledi.

Sıcaklığı ölçüyoruz

Sıcaklığı ölçmek için aynı sihirli sitede DS18B20 tabanlı dijital sıcaklık sensörleri sipariş edildi. Sensörün kendisi tek kelimeyle harika, kalibre edilmesi veya bir şekilde yapılandırılması gerekmiyor, sıcaklığı belirli bir doğrulukla ölçebiliyor ve OneWier protokolünü kullanarak Arduino ile iletişim kuruyor. Yani 50 metre uzunluğa kadar 3 kabloya neredeyse sınırsız sayıda sensör asılabilir. İstenirse, onlara güç bile veremezsiniz, ancak yalnızca 2 kablo üzerinde çalışırlar (aslında, çalıştırılırlar, ancak sinyalli bir kablodan), ancak daha yavaş çalışırlar. Benim durumumda, sensörleri kapalı bir kutuda sipariş ettim ve onları geleneksel bir bükümlü çift ile bağladım. Biri kazan dairesine, biri evin içine, odaya, biri de tavan arasına, tavanın altına 3 sensör yerleştirdim, tavan arası hiçbir şekilde ısıtılmıyor ve dışarıdaki sıcaklığı alıyorum.

Satın alınan donanımların listesi

- arduino kartı. UNO r3 kullandım. Fiyatı yaklaşık 350 ruble.
- Ethernet Kalkanı, yaklaşık 500 s.
- Bükümlü çift (ne kadar gerekli olduğuna bağlı olarak), 305m'lik bir koy yaklaşık 4 bine mal olacak.
- Sıcaklık sensörleri, yaklaşık 200 r.
- 110-240 - 12V 2A, 420 ruble için güç kaynağı ünitesi.
- Sabitleyici LM7805, yaklaşık 20 ruble.
- Röle SSR-40DA 3 adet. 330 s.
- 200 r röleler için radyatörler.

Yani, bükümlü çifti ve kazanın kendisini saymazsak, tüm proje 4 bin rubleye sığıyor.

Verileri veritabanına ekliyoruz ve gösteriyoruz.

Ancak tüm bunlar elbette iyidir, ancak bilgisayarla sürekli kazanın yanında durmamak için, evde neler olup bittiğini uzaktan İnternet üzerinden bilmek istiyorum. Uzun zamandır, hemen hemen her şey için majordomo'nun en basit VPS sunucusuna sahiptim. Üzerinde sıcaklık verilerini depolamak için bir MySQL veritabanı oluşturdum.

Şimdi bir şekilde arduinodan gelen verileri bu üsse koymamız gerekiyor. Bunu yapmak için elbette en azından arduino'yu internete bağlamanız gerekecek, bu kolay değil, çok basit. Bunun için Ethernet Shield ve kütüphanesine ihtiyacımız var. "Düdük" olan basit bir yönlendirici, önce megafondan, sonra da yota'dan eve uzun süredir kuruldu. Standart bükümlü çift kabloyu yönlendiriciye çekip programa veri aktarımı ekliyoruz. Aktarım, PHP'de parametrelerle - verilerle bir sayfaya yapılan bir çağrıdan geçer. İnternet sunucumuzda temp.php adında bir sayfa oluşturuyoruz

Veri yükleme hatası!

";) else (echo" ";) mysql_close ($ connect);?>
Bundan sonra, kazanın sıcaklıkları ve gücü hakkında verilerimiz var, böylece her seferinde veritabanına girmeyiz, ancak en son verileri görürüz, php'de “geçici” bir komut dosyası yazdık, ancak bildiğiniz gibi, geçici şeylerden daha kalıcı bir şey yok, bu yüzden kullanıyorum.
gettemp.php

\ n "; while ($ satır = mysql_fetch_array ($ sonuç, MYSQL_NUM)) (eko" $ satırı"; Eko" TempIN = $ satırıTempOUT = $ satırı\ n "; yankı" TempKotel = $ satırı\ n "; yankı" Güç = $ satırı\ n ";) yankı"\ n "; mysql_free_result ($ sonuç); mysql_close ($ connect);?>

gelecekte ne eklemek istersin

Tabii ki, bu prensipte minimumdur, ancak küçük bir evde tam ve oldukça uygun bir ısıtma kontrolü yapmanıza izin verir. Bazı değişikliklerle çok odalı ve herhangi bir karmaşıklığa sahip genel binalarda kullanılabilse de, arduino burada her şey olmasa da çok şey yapabilir. Gelecekte eklemek istediğim bu projede:
  • Sıcaklık regülatörü. Uygulama, 22.5'in oldukça optimal bir değer olduğunu ve prensipte ayarlama gerektirmediğini gösterse de. Yine regülatörü ana arduinodan uzak yapmak istiyorum ama bunun için ya karmaşık bir devre ya da başka bir arduino gerekiyor. Genel olarak, düşünülecek bir şey var.
  • Sadece sıcaklığı okumakla kalmayıp, aynı zamanda anında PID parametrelerini de değiştirebilmeyi istiyorum. Ayrı bir "ilk ısınma" modu yapmak mümkündür, aksi takdirde parametre I, programın her yeniden başlatılmasından sonra uzun bir süre normalize edilecektir.
  • Android için basit bir uygulama istiyorum, böylece telefonunuzda küçük bir tarayıcıya girmenize gerek kalmaz. Bu en basit ve zaten süreçte.
  • Bununla birlikte, soğutma suyu sıcaklık sensörünü bağlayın ve diğer sıcaklık verileri gibi verilerini iletin.
  • Acil durum alarmı. Yani, hatlardaki voltaj kaybını, rölenin veya ısıtma elemanlarının arızasını otomatik olarak belirlemek için.
  • Bir "atlıkarınca" yapın, ısıtma elemanlarının hedefini değiştirin. Aksi takdirde, bir ısıtma elemanının her zaman diğerlerinden daha fazla çalıştığı ve teorik olarak reddeden ilk kişi olması gerektiği ortaya çıkıyor. Programdaki PIN'leri zaman zaman değiştirmeniz yeterlidir. Basit görünüyor, ancak eller hiçbir şekilde ulaşmayacak.
Arduino kodu:

#Dahil etmek #Dahil etmek #Dahil etmek #Dahil etmek #Dahil etmek #Dahil etmek // OneWire DS18S20, DS18B20, DS1822 Sıcaklık Örneği // // http://www.pjrc.com/teensy/td_libs_OneWire.html // // DallasTemperature kitaplığı tüm bu işleri sizin için yapabilir! // http://milesburton.com/Dallas_Temperature_Control_Library OneWire ds (6); // pin 10'da (4.7K direnç gereklidir) DallasSıcaklık sensörleri (& ds); boolean waithTemp = yanlış; int TEMPERATURE_PRECISION = 10; int lamba1 = 7; int lamba2 = 8; int lamba3 = 9; CihazAdresi İntTermometre = (0x28, 0x8E, 0xF4, 0x28, 0x05, 0x00, 0x00, 0x07); DeviceAddress OutTermometre = (0x28, 0x65, 0x15, 0x32, 0x05, 0x00, 0x00, 0xE2); CihazAdresi KatTermometre = (0x28, 0x61, 0x43, 0x28, 0x05, 0x00, 0x00, 0x14); bayt adresi; imzasız uzun StartTime = 0; imzasız uzun WorkWindow = 60000; // 10dk imzasız uzun WorkTime, TenTime; float maxData = 100; yüzer santigrat, sıcaklık; çift ​​Ayar Noktası, Giriş, Çıkış; int TermometreSayım; DeviceAddress Termometre; PID myPID (& Giriş, & Çıkış, & Ayar noktası, 10, 0.1, 5, DOĞRUDAN); //0.000006 0.03 40 çift hedefTemp = 22.5; bayt mac = (0xE0, 0x69, 0x95, 0x72, 0x65, 0xE8); bayt ip = (192, 168, 1, 100); bayt sunucusu = (?,?,?,?); EthernetClient istemcisi; bayt web atlama sayısı = 10; bayt web sayısı = 0; void setup (void) (Serial.begin (9600); //Ethernet.begin(mac, ip); Ethernet.begin (mac);ensor.begin (); pinMode (lamba1, ÇIKIŞ); pinMode (lamba2, ÇIKIŞ) ; pinMode (lamp3, OUTPUT); Ayar noktası = targetTemp; myPID.SetOutputLimits (0, maxData); myPID.SetMode (OTOMATİK); celsius = targetTemp; StartTime = millis ();) uzun filtre (uzun x, uzun Nb, uzun k ) (statik uzun y = 0, z = 0; z + = (x - y); dönüş y = (Nb * z) >> k;); void döngüsü (void) (bayt i; bayt type_s; bayt verisi; uzun Çıkış; if (milis ()< StartTime) { StartTime = millis(); } WorkTime = millis() - StartTime; if (WorkTime >WorkWindow) (WorkTime = WorkTime - WorkWindow; StartTime = millis () + WorkTime;) //Serial.println("döngü"); sensörler.requestSıcaklıklar (); santigrat = sensor.getTempC (IntTermometre); Girdi = santigrat; if (webcount> = webskipcount) (char arabelleği; Dizi sıcaklığıS1 = dtostrf (santigrat, 2, 2, arabellek); Dizi sıcaklığıS2 = dtostrf (sensors.getTempC (OutThermometer), 2, 2, arabellek); Dizi sıcaklığıS3 = dtostrf (sensörler .getTempC (KatThermometer), 2, 2, arabellek); String OutputPowerS = dtostrf (Output, 2, 2, arabellek); String msg = "GET /temp.php?t1="+ sıcaklıkS1 +" & t2 = "+ sıcaklıkS2 + "& t3 =" + sıcaklıkS3 + "& p =" + OutputPowerS; Serial.println (msg); client.connect (sunucu, 80); client.println (msg); client.stop (); webcount = 0; ) else ( webcount + = 1;) myPID.Compute(); //Serial.print (Giriş); Serial.print (""); Serial.print (Çıkış); Seri.print (""); Seri.println (Ayar noktası); if (Output> maxData / 3 * 2) (digitalWrite (lamp1, HIGH); digitalWrite (lamp2, HIGH); Out = Output - maxData / 3 * 2;) else if (Output> maxData / 3) (digitalWrite (lamp1, YÜKSEK); digitalWrite (lamba2, DÜŞÜK); Çıkış = Çıkış - maxData / 3;) else (digitalWrite (lamba1, DÜŞÜK); digitalWrite (lamba2, DÜŞÜK); Çıkış = Çıkış;) TenTime = harita (Çıkış, 0, maxData / 3, 0, Çalışma Penceresi); Seri.baskı (santigrat); Seri.baskı (""); Seri.print (sensors.getTempC (OutThermometer)); Seri.baskı (""); Serial.print (sensors.getTempC (KatThermometer)); Seri.baskı (""); Seri.print (Çıktı); Seri.baskı (""); Serial.print (TenTime); Seri.baskı (""); Serial.println (Çalışma Zamanı); if (Çalışma Zamanı< TenTime) { digitalWrite(lamp3, HIGH); } if (WorkTime >TenTime) (digitalWrite (lamba3, DÜŞÜK);))

Modern toplumda otomasyon gerekli bir önlemdir, çünkü dijital çağda, ürün kalitesini standartlaştırmak ve iyileştirmek için çeşitli endüstrilerde insan faktörünü dışlamak son derece önemlidir. İnsanların robotların yapabildiklerini basitçe yapamayacağı alanlar da vardır, örneğin nano-malzemelerin ve mikro-tahtaların üretimi.

Ancak otomasyon sadece üretimde yardımcı olmakla kalmaz, aynı zamanda ortalama bir insan için de faydalı olabilir. Örneğin, bir arduino bira fabrikasının otomasyonu, bir ürünün üretim sürecini büyük ölçüde kolaylaştırabilir. Arduino ve diğer şeyler için otomatik düzeltmenin nasıl yardımcı olabileceğini anlayalım ve örnekleri ele alalım.

Arduino mikrodenetleyicisine dayalı otomatik sistemlerin ana avantajları

Hiç kimse, kendi kartınızı lehimlemenizi ve düşük seviyeli diller kullanarak programlamanızı yasaklamıyor. Ancak arduino ve hazır mikrodenetleyiciler üzerinde otomasyon, tüm süreci büyük ölçüde kolaylaştıracak ve zamandan tasarruf sağlayacaktır. Sonuçta, bir dizi kitaplık içeren hazır bir ürünü satın almak ve ihtiyaçlarınıza göre uyarlamak çok daha kolay. Ve arduino mega 2560'taki mevcut otomasyon, akıllı bir ev için ses anahtarlarından hareket dedektörlü elektrikli mandallara kadar hayatın birçok alanında faydalı olabilir. Arduino otomasyonunun ünlü olduğu başlıca avantajlar şunlardır:

  1. Düşük giriş eşiği. Mühendislik eğitimi almanıza gerek yok, sadece birkaç eğitim videosu izleyin ve programlamada bir temele sahip olun.
  2. Çok sayıda önceden hazırlanmış kütüphane. Arduino, BDT'de birçok robotik amatörü tarafından, çeşitli elektroniklerin üretimi hobi haline geldiği ölçüde kullanılmaktadır. Buna göre, kullanıcı topluluğu ağda son derece aktiftir, çok sayıda şablon gönderir ve herhangi bir sorunu çözmenize yardımcı olmaya hazırdır. Düşük giriş eşiği nedeniyle kütüphanelerin kalitesi zarar görür, ancak hiç kimse kendinizinkini yaratmayı yasaklamaz, C ++ dilinin anlamını incelemek veya hazır çevirmenler kullanmak yeterlidir.
  3. Çok sayıda çevre birimi. Bir Arduino sera otomasyonuna veya bir ışık sensörüne ihtiyacınız olup olmadığı önemli değil, ses sensörleri ve ses tanıyıcılara kadar herhangi bir modül bulacaksınız. Evet, bazı kartlar çok pahalıya mal oluyor, ancak her zaman ucuz analoglar bulabilirsiniz, örneğin, resmi olandan 10 kat daha ucuz olan üçüncü taraf üreticilerin esp8269 wi-fi modülü.
  4. Bir sürü bilgi. Karşılaştığınız herhangi bir sorun zaten birileri tarafından yaşanmıştır ve büyük olasılıkla Google'da buna bir çözüm bulacaksınız. Kendinizi tanıyabileceğiniz tam teşekküllü bir literatür de var.

Ancak, Arduino'nun hiçbir kusuru olmadığını düşünmeyin. Kart, düşük performansıyla ünlüdür. Özellikle karmaşık görevlerde ve çok miktarda kodla, yanıt süresi mikrodenetleyiciler için kabul edilemez olan 1 saniyeye ulaşabilir. Çoğu modülün flash belleği 1 MB'ı geçmez, bu da sinir ağları oluşturmak veya medya dosyalarını kullanmak için yeterli değildir. Tabii ki, yardımcı bir hafıza kartı bağlayabilirsiniz, ancak bu aynı zamanda yanıt süresini de artırır, güç kaynağı için ek kaynaklar gerektirir ve yarı el yapımı bir şekilde yapılır.

Bununla birlikte, örneğin bira veya seralar için basit otomatik sistemler, ödemenin sağlayabileceği kaynakların bir kısmını bile gerektirmez. Buna göre, çoğu kullanıcı için bu eksiklikler anlamsız görünecektir. Kendi 3 boyutlu yazıcınızı veya daha karmaşık bir tasarımı bir araya getirmeye karar verirseniz, analoglara daha yakından bakmalısınız. Ancak Arduino'nun rakipleri için giriş eşiği çok daha yüksek olacaktır.

mk Arduino'ya dayalı bir süreç otomasyonu örneği

Sürecin otomasyonunun en basit örneği, bir arduino üzerinde bir sera olabilir. Herhangi bir sistem oluşturmak için, gerçekleştirmesi gereken görevleri açıkça belirtmeye değer. Örnek olarak bir sera kullanarak, bu şöyle olacaktır:

  1. Özel bir iklimin yaratılması.
  2. Aydınlatmayı zamanında açma ve kapatma.
  3. Bitkilerin zamanında sulanması ve hava nemini aynı seviyede tutmak.

Bu görevlere dayanarak, ana kart için ne satın almanız gerektiğini hemen fark edebilirsiniz:

  1. Sıcaklık sensörü. Programın öngördüğü sınırlar dahilinde havanın ısınmamasını veya soğumamasını sağlayacaktır. Sıcaklık değişikliği durumunda, kart klimayı veya elektronik pilleri açacaktır.
  2. Işık sensörü. Tabii ki, kendinizi bir yazılım çözümüyle sınırlayabilir ve gün ışığını taklit eden pahalı lambalar satın alabilirsiniz. Ancak tam teşekküllü bir sera oluşturmak istiyorsanız, Arduino tarafından kontrol edilecek otomatik bir tavan kurmak çok daha uygun olacaktır.
  3. Nem sensörü. Burada her şey sıcaklıkla aynıdır, öngörülen senaryoya göre, pano gerekirse püskürtücüler ve nemlendiriciler içerecektir.

Gerekli tüm modülleri satın aldığınızda, geriye sadece onları programlamak kalır. Sonuçta, bir kod olmadan, bunlar sadece demir parçalarıdır, hiçbir şey yapamazlar.

Proses otomasyonu için MK Arduino programlama. Örnek

Bir önceki paragrafta olduğu gibi, görevi ayrı alt öğelere bölmek ve sırayla gerçekleştirmek programlama için önemlidir. Arduino programlaması, hazırlanan kütüphaneler kullanılarak AT ve AT+ arayüzündeki komutlar sayesinde gerçekleşir. Buna göre, tüm komut dosyaları C++ dilinde özel bir ortamda yazılır ve herhangi bir şey yapmadan önce anlambilimini incelemeye zaman ayırın. Sistem, basit işlevleri gerçekleştirmenin yanı sıra, bu örnekte ihtiyacımız olan şey olan flash bellekte komut dosyalarını saklama yeteneğine de sahiptir.

Her sensörden gelen bilgilerin gerçek zamanlı ve değişkenler olarak geldiğini unutmayın, ancak her zaman kaynak harcamaya ve her parametreyi ölçmeye gerek olmadığı için yanıt süresini sınırlayabilirsiniz. Buna göre, her sensör için açma ve kapama sürelerini ayarlayın veya belirli bir süre için tepki süresini ayarlayın.

Neden otomasyona ihtiyacım vardı?

Süreci kolaylaştırmak için otomasyona ihtiyaç vardır, çünkü bu kontrolörün kendisi sıcaklığı izleyecek, koruyacak ve gerekli sıcaklık duraklamasına yükseltecektir. Ayrıca gerekli müdahaleyi sesli bir sinyalle bildirin, örneğin maltı doldurmanız veya iyot testi yaptırmanız gerekir.

Bitmiş bir projeden kendi otomasyonumu yapmaya karar verdim. Arduino üzerinde çalışır, bir sıcaklık sensörü, iki röle, bir ekran ve ona butonlar bağlıdır. İlk röle ısıtma elemanını kontrol eder, ikinci röle pompayı kontrol eder. Püre pompası çok kullanışlıdır çünkü tüm ezme işlemi için püreyi karıştırmaya gerek yoktur (biranın nasıl demleneceği hakkında daha fazla ayrıntı için öncekileri okumanızı tavsiye ederim)

Modülleri kullanarak ilk otomasyonu kurdum:

- Arduino mini
- İki röle 15A bloğu
- Ekran 2004
- Sıcaklık sensörü
- 4 düğme
- 5 volt güç kaynağı ünitesi
Modüler montajın rahatlığı, yalnızca tüm parçaları elde etmenin zor olmayacağı ve lehim için neredeyse hiçbir şeye gerek olmadığı gerçeğinde yatmaktadır. Ancak en büyük dezavantaj, çok sayıda kablo ve ucuz bir Çin rölesi ekrana müdahale etti, bu nedenle mekanik rölenin katı hal ile değiştirilmesi gerekiyordu.

Zamanla, otomasyonumu 64 kb belleğe sahip bir çipte (arduino mini'de sadece 32 kb var) bir kartta birleştirmem gerektiği sonucuna vardım. Hazır bir çözüm bulamadım, bu yüzden kendim bir devre ve ardından zanaatım için bir tahta oluşturmaya başladım.

Şema:

Şemayı geliştirdim ve tabiri caizse dizimde ve kendim için çizdim, bu yüzden bazı eksiklikler olabilir, ancak şema tamamen çalışıyor:

Ödemek:

Şemayı çizdim, sonra tahtayı çizmeye devam ediyor, önce programı kullanarak çizdim Sprint Düzeni 6, çok kullanışlı, ancak içinde yeterli işlevsellik yok, bu yüzden onu program yönünde bırakmaya karar verdim DipTrace ve aldığım şey bu:

Kaynakları indirebilirsiniz.
Gördüğünüz gibi, bira fabrikama QRBeer adını verdim ve bu zaten sürüm 0.5 ...

Tahta hazır, bir şekilde yapılmaya devam ediyor. Bunun için kullanmaya karar verdim. Neden LUT değil de tam olarak onlar? Az önce kendim için böyle yeni bir teknolojiyi denemeye karar verdim, LUT'u zaten denedim, hissettim, tabiri caizse hoşuma gitti demeyeceğim...

Fotorezist:

Bir fotorezist kullanarak baskılı devre kartları üretmek için ihtiyacınız olacak:
- Yazıcı için film
-
- Ultraviyole lamba
- Soda külü

ultraviyole lamba

Başlangıç ​​olarak, işimi nasıl yaptığımla ilgili bilgileri paylaşacağım. UV lambası... İlk başta hazır bir lamba kullanmak istedim ve sonra onu altı adet 3W LED'e monte etmeye karar verdim:
ve aynısını Tao'dan aldım:


LED'leri radyatöre yapıştırdım, ancak bunları bir PCB'ye monte etmek mümkün olsa da, aşırı ısınacaklarından şüpheliyim.
Ben de öyle yaptım:


Tahtanın imalatı

1. Böylece şablonu hazırladım, sadece filme basmak için kalıyor. Yukarıda yazdığım gibi, bir yazıcı için bir filme ihtiyacınız var, hem lazer yazıcı hem de inkjet yazıcı için film denedim, en iyi seçenek sadece inkjet filmde elde ediliyor. Negatif ve ayna görüntüsünde yazdırmanız gerekir:

Parmak izlerinin ve kalıntıların kolayca yıkanabilmesi için şablonu hemen lamine ettim.
2. Ardından, gelecekteki tahtamızı (sahte cam elyafı) zımparalamanız gerekir. Bunun için hafif nemlendirilmiş normal bir sünger veya melamin sünger uygundur:


3. Bu işlemden sonra bakırın hala asetonla yağdan arındırılması gerekir:


Fotoğrafımda görebileceğiniz gibi, sıradan bir peçete ile yağdan arındırdım ve bir şişe peroksit içine aseton döktüm, bu yüzden almak daha uygun ...
4. Bir sonraki adım, gelecekteki kartınız için fotorezisti bir kenar boşluğu ile hafifçe kesmek ve zarar vermemek için üst koruyucu filmi dikkatlice çıkarmaktır. Fotorezist yerli ise mat tarafını soymanız gerekiyor, Çinli ise fark yok...
5. Ardından, fotorezisti textolite üzerine yapıştırın, böylece fotorezistin altında hava kabarcıkları görünmez, aksi takdirde izler bu tür yerlerde görünmez, fazlalığı kesin ...
Fotorezist yapıştırma işlemi, ekran koruyucuyu telefona yapıştırmaya benzer.


6. Fotorezist yapıştırıldığında, beraberindeki textolite 2-3 kez laminatörden geçirilmeli veya ılık bir ütü kullanılmalı ve iki kez katlanmış bir kağıt yaprağından ütülenmelidir:


Ana şey, fotorezisti aşırı ısıtmamaktır, aksi takdirde şöyle olur:


Fotorezist yapıştırırken bir söve alırsanız, onu çıkarmak (yıkayın veya kazıyın) ve yeniden yapıştırmak daha iyidir, aksi takdirde tahtayı aşındırdıktan sonra üzücü olur ... Bu fotorezisti kaldırmayacağım , size nihai sonucu göstereceğim.
7. Bir fotorezist ile textolite bir şablon koyduk ve camla bastırdık (eski bir fotoğraf çerçevesinden aldım) ve camın üzerine bir yük koyduk:


8. Fotorezisti bir UV lambası kullanarak aydınlatıyoruz. Lambam yaklaşık 2 dakika sürer:


Gördüğünüz gibi, yanan fotorezistin rengi açık maviden koyu maviye değişti ve maruz kalan fotorezist çok kırılgan.
9. Camı ve şablonu çıkarıyoruz. Fazla fotorezist (isteğe bağlı olarak) kesilebilir ve cımbızla dikkatlice ayrılabilir:


10. Bir sonraki adım, gelişmemiş fotorezistin alkali ile yıkanmasıdır, bunun için 2 bardak su ve bir çorba kaşığı soda külü alıyoruz, iyice karıştırıyoruz. Fotorezistin üst koruyucu filmini soyarız ve textolite'imizi alkali bir çözeltiye indiririz.


11. Alkalide bir fırça ve üç fotorezist alıyoruz, yavaş yavaş gelişmemiş fotorezist yıkanıyor:


Alkali dökülemez, ancak bir sonraki panoya bırakılabilir veya dağlama işleminden sonra fotorezistin yıkanması için, ancak daha sonra ...
12. Dağlama tahtası:
En erişilebilir iki yöntem vardır: demir klorür veya peroksit + sitrik asit ve tuz ile aşındırma. Ferrik klorür hakkında yazmayacağım ama muhtemelen peroksit ile anlatacağım:
- 100 ml. hidrojen peroksit% 3 - eczanede 7-12 rubleye satılıyor
- 30 gr. sitrik asit (herhangi bir markette bulunur)
- 1 yemek kaşığı. bir kaşık tuz (hem ince hem de taş uygundur)


Bütün bunlar bir kapta karıştırılır ve hazır fotorezistli bir tahta oraya daldırılır, bir süre sonra tahtada kabarcıklar belirir:


Ve bir süre sonra "çıplak bakır" tamamen kazınır:


Bu arada, örneğin bir akkor lambanın yakınında veya bir su banyosunda daha yüksek bir sıcaklıkta aşındırma yapılırsa, aşındırma üçe düşer, asıl şey aşırıya kaçmamaktır, aksi takdirde fazlalık kazınır ...
13. Fotorezistin, aşındırılmamış fotorezistin yıkandığı aynı alkalide çıkarılması en uygunudur, yaklaşık 20 dakika sonra kendiliğinden kaybolacaktır ve hiçbir şeyi ovalamanıza gerek yoktur ...

Ve işte benim "sövelerim":


Önemli olmasa da, yine de, dikkatsizlik her şey için suçlanıyor, fotorezist altında hava kabarcıkları fark etmedi veya aşırı ısındı ...

Aşağıdaki panonun "temiz" olduğu ortaya çıktı:


14. Ardından, delikler açıp tahtayı tamir ediyoruz:


15. Tüm detayları lehimliyoruz ve fazla akıyı yıkıyoruz:


SMD bileşenlerini çok uygun bir Çin kızılötesi lehimleme istasyonuyla lehimledim:

Hepsi bu, en zor şey bitti, kısa devre için parçaları çalmaya ve çipi programlamaya başlamaya devam ediyor.

Atmega644 programlama

1. Programlamaya başlamak için önyükleyiciyi içine yüklemeniz gerekir. Arduino UNO ile bunu yapmak zor değil ama önce programı indirip kurmanız gerekiyor.
2. Bir sonraki adım, kurulu programa hazır bir montaj eklemek veya almaktır:
3. UNO taslağı ArduinoISP'yi doldurun:

4. Ve kartımızı UNO'ya bağlayın:


Çizim talimatlarına göre:
// pin adı // bağımlı sıfırlama: 10: // MOSI: 11: // MISO: 12: // SCK: 13:
Benim şemama göre şöyle çıkıyor:

5. Ardından, panomuzu ayarlara kurun ve önyükleyiciyi yükleyin:




Her şey yolunda giderse, "Bootloader kaydı tamamlandı" mesajını göreceğiz.
Bu, önyükleyiciyi "yükleme işlemini tamamlar, ekranı, düğmeleri, sıcaklık sensörünü bağlayabilir ve doldurabilirsiniz. Ben bir teknik üniversite öğrencisiyim. Bir zamanlar, o zamanlar tıp üniversitesinde okuyan bir arkadaşımla bir kafede otururken, bir bar açmaya karar verdik.Prensipte ilgiyi hak eden birçok fikir vardı.Örneğin, müzik tarzına göre eğim açısını değiştiren dans pisti... fikirlerin yanı sıra bir tane daha vardı -

...ama kendi biramızı üretmemiz gerekmez mi?

Birkaç hafta sonra, babamın arkadaşının çalıştığı bira fabrikasının malzemelerini kullanarak bira ürettim. Ancak birçok teknolojik süreç kesintiye uğradı, bu yüzden bira yerine pek hoş olmayan bir kokuyla bir şey çıktı.

Birkaç yıl sonra, Arduino UNO'yu kullanarak biraz otomatikleştirerek süreci tekrarlamaya karar verdim. Ve olan buydu.

Tüm kurulumun ne yapması gerektiği ile başlayacağım.

  • Kendinizi kontrol edin - her şey çalışıyorsa, her şey bağlıysa;
  • Kendinizi temizleyin;
  • Demleme işlemi için hazırlanın;
  • Yarı otomatik modda bira demleyin;
  • Birayı manuel olarak demleyin;
  • Otomatik modda bira demleyin (çamaşır makinesinin çamaşır yıkaması gibi).

İlk madde şu anda uygulanmadı. Şimdiye kadar, bunu nasıl uygulayacağımı bile düşünmedim.
İkincisi de uygulanmadı ama yakın zamanda bitireceğim, sadece ebay'den pompaların gelmesini bekleyebilirim.
Üçüncü nokta oldukça basittir.

Demleme işlemi için hazırlık

Sistemden kazana su dökülmesi gerektiğine dair bir mesaj -> program OK tuşuna basılmasını bekler -> program arduino'ya katı hal rölesini açması için bir komut gönderir -> katı hal rölesi kazandaki bir kilovatlık tenni açar, 37 dereceye getirir, programa her şeyin pişmeye hazır olduğu komutu gönderir. 37 derecelik bir sıcaklık korur.

Su olup olmadığını kontrol etmek istiyorum, ancak sensör hala "Çinli kardeşler" den ayrılmasını bekliyor.

Yarı otomatik modda bira demleme

Prensip olarak, basit bir prosedür:

Kontrol programında "Isınma" düğmesine basın, kontrol düğmelerinin geri kalanı etkin değildir;
- Isındıktan sonra program "Her şey hazır, pişirebilirsiniz" mesajını görüntüler;
- Malzemeleri doldurun, demleme programını seçin - "Demleme" düğmesi aktif hale gelir;
- "Bira hazırlama" düğmesine basın, işlem başladı;
- Ayrıca, sistem periyodik olarak ne yapılması ve ne zaman yapılması gerektiğini bilgilendirme mesajları ile bilgilendirecektir.

Talimatları takip etmeniz gerekiyor.

Manuel bira yapımı

Bu işlem, pişirme parametrelerini ayarlamanıza, pişirme döngüsünde değiştirmenize olanak tanır. Henüz ulaşmadım.

Otomatik pişirme

Bu bir rüya. Şu anda uygulanacak hiçbir bileşen yok. Yeterli pompa, su seviye sensörü yok. Şarabın ağırlığını, genç bir birada ne kadar alkol olduğunu ve çok daha fazlasını nasıl ölçeceğimi bilmiyorum. Ama umutsuzluğa kapılmıyorum ve bira demleme şuna benzeyene kadar yavaş yavaş otomatikleştireceğim:

Malzemeleri uygun tepsilere koydum, düğmeye bastım ve ... bir buçuk ay sonra bitmiş birayı aldım.

Bu kısaca süreçle ilgili ama şimdi teknik tarafa geçelim.

Sürecin teknik yönü

Yukarıda bahsedildiği gibi, arduino UNO, bir kontrol mikrodenetleyicisi görevi görür. 2 adet röle bağlı, 2 adet
dijital termometre DS18B20.

Arduino, ana program ile com portu üzerinden iletişim kurar. Çünkü Arduino için gerçek zamanlı bir kalkanım yok, görsel c#'dan timer almak zorunda kaldım. Program yazma konusunda deneyimim yok, bu yüzden aniden birinin fikirleri, eleştirisi varsa - onur için posta. Eleştirin, derbante, tabiri caizse, birdenbire hoşlanmadığınızı.

İşte arduino'daki programın metni

#Dahil etmek OneWire ds (8); // sıcaklık sensörleri pin 8'de int reley1 = 13; int reley2 = 12; int reley3 = 11; int reley4 = 10; int reley5 = 7; // on'u aç int reley6 = 6; // mayşe küvetinde on şamandıra temp1; yüzer temp2; void kurulumu (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);) void döngüsü (void) (if (Serial.available ()) (switch (Serial.read ()) (durum "i": infuz (); break; case "p": progrev (); break; durum "a": avariya (); break; case "v": varka (); break; case "t": sıcaklık (); break;))) void varka () (digitalWrite (reley6, HIGH); while (Serial.read ()! = "m") (sıcaklık (); if (temp1> = 52.00) digitalWrite (reley6, LOW); başkası digitalWrite (reley6, HIGH);) while (Serial.read ()! = "n") (// digitalWrite (reley6, HIGH); sıcaklık (); if (temp1> = 62.00) digitalWrite (reley6, LOW); başkası digitalWrite (reley6, HIGH);) while (Serial.read ()! = "b") (// digitalWrite (reley6, YÜKSEK); sıcaklık (); if (temp1> = 75.00) digitalWrite (reley6, DÜŞÜK); başka digitalWrite (reley6, YÜKSEK); ) digitalWrite (reley6, DÜŞÜK); while (Serial.read ()! = "c") gecikme (1000); while (Serial.read ()! = "x") (digitalWrite (reley5, YÜKSEK); sıcaklık ();) digitalWrite (röle5, DÜŞÜK); ) void infuz () (// sıcaklık (); //Serial.available (); while (Serial.read ()! = "s") (// if (temp) infüzyon demleme döngüsünü kapatın<=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) // gecikme (1000); Serial.println ("s"); ) void avariya () (digitalWrite (reley1, LOW); digitalWrite (reley2, LOW); digitalWrite (reley3, LOW); digitalWrite (reley4, LOW); digitalWrite (reley5, LOW);) boş sıcaklık () (bayt i; bayt mevcut = 0; bayt verisi; bayt adres; bayt zator = (40, 23, 218, 43, 6, 0, 0, 22); // jam'deki sıcaklık sensörünün adresi bayt varilka = (40, 255, 240, 115 , 59, 4, 0, 234)); // demleme kazanındaki sıcaklık sensörünün adresi float santigrat; // float temp; boolean gde; if (! Ds.search (addr)) (//Serial. println("Artık adres yok. "); //Serial.println (); ds.reset_search (); gecikme (250); // dönüş;) if (OneWire :: crc8 (adr, 7)! = Adres) ( Serial.println ("CRC geçerli değil! "); // dönüş;) ds.reset (); ds.select (addr); ds.write (0x44, 1); // dönüştürmeyi başlat, parazit gücü açıkken bitiş gecikmesi (840); // belki 750ms yeterlidir, belki değil // burada bir ds.depower() yapabiliriz, ancak sıfırlama bunu halledecektir.present = ds.reset(); ds.select ( addr); ds.write (0xBE); // (i için Scratchpad'i oku = 0; ben< 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); } }

Her şey güzel olurdu ama nedense üçüncü sensör her zaman 85 dereceyi gösteriyor. Nedenini henüz söyleyemem. Ve daha fazla otomasyon için gereklidir - buzdolabında sıcaklığın korunması.

Programın ne yaptığını kısaca anlatacağım.

Program, com portunda belirli bir sembol göründüğünde her biri etkinleştirilen alt programlara bölünmüştür. Örneğin, "p" harfi bağlantı noktasına çarparsa, "Isınma" modu etkinleştirilir. Veya "a" ise - o zaman avariya () alt yordamı çağrılır ve her şey kapatılır. Sıcaklık () alt programı çağrıldığında, veriler temp1, temp2 global değişkenlerine yazılır. Oradan gerekli alt programlara girerler.

Gelecekte, çeşitli çeşitleri ve hatta ay ışığını pişirmek için alt programlar olacak.

Şimdi ana kontrol programı için.

Ana kontrol programı

Visual studio c# ile yazılmıştır.

Programın kaynak kodu:

Programın kaynak kodu

Sistemi kullanarak; System.Collections.Generic kullanarak; System.ComponentModel kullanarak; System.Data kullanarak; System.Drawing'i kullanarak; System.Linq kullanarak; System.Text'i kullanarak; System.Threading.Tasks kullanarak; System.Windows.Forms'u kullanarak; System.IO.Port'ları kullanarak; ad alanı WindowsFormsApplication1 (genel kısmi sınıf Form1: Form (// Dize bağlantı noktası numarası; SerialPort Bağlantı Noktası1 = yeni Seri Bağlantı Noktası ("COM5", 9600); int s = 0; genel Form1 () (InitializeComponent ();) / * özel const int CP_NOCLOSE_BUTTON = 0x200; korumalı geçersiz kılma CreateParams CreateParams (get (CreateParams myCp = base.CreateParams; myCp.ClassStyle = myCp.ClassStyle | CP_NOCLOSE_BUTTON; return myCp;)) * / private void Form1_Load (nesne gönderici, Event.Args Bağlantı Noktası Adı;1) ( .Open ();) // Ekipman özel void kontrol ediliyor button1_Click (object sender, EventArgs e) (if (Port1.IsOpen == false) (deneyin (// program bilgileri podrugomu.com/node/987 adresinden değiştirilebilir) Port1.PortName = label2.Text; Port1.Open (); Port1.Write ("Kontrol et"); // SerialPort Port2 = yeni SeriPort ("COM4", 9600); //Port2.Open (); // etiket3. Text = Convert.ToString (Port2.ReadByte()); // port okumalarının kontrol edilmesi MessageBox.Show ("Ekipman kontrol süreci başladı", "Bilgi çözüm mesajı "); richTextBox1.Text = richTextBox1.Text + "\ n" + "Donanım kontrol sürecini başlat" + "" + DateTime.Now.ToString ("SS: mm"); button1.Enabled = yanlış; button2.Enabled = yanlış; button3.Enabled = yanlış; if (Port1.ReadByte () == 1000) (richTextBox1.Text = richTextBox1.Text + "\ n" + "Ekipman doğrulama işleminin sonu" + "" + DateTime.Now.ToString ("SS: mm"); button1 Enabled = true; button2.Enabled = true; button3.Enabled = true; Port1.Close (); MessageBox.Show ("Ekipman kontrol döngüsü sonu" + "" + DateTime.Now.ToString ("SS: mm") ); richTextBox1.SaveFile ("CheckLOG.rtf"));)) yakalama (richTextBox1.Text = richTextBox1.Text + "\ n" + "Donanım kontrol işlemi hatası" + "" + DateTime.Now.ToString ("SS: mm "); MessageBox.Show ("Cihaz bağlantı noktası yanlış seçilmiş. Kontrol işlemi başlatılamıyor", "Warninig"); richTextBox1.SaveFile ("log / Check _" + DateTime.Now.ToString ("ddMMyyyy") + ". Rtf") ;))) // Ekipmanın temizlenmesi private void button3_Click (object sender, EventArgs e) (if (Port1.IsOpen == false) (deneyin (// program bilgileri podrugomu.com/ adresinden değiştirilebilir) node/987 MessageBox.Show ("Kesinlikle dezenfektan döktünüz "," UYARI ", MessageBoxButtons.OK, MessageBoxIco n.Uyarı); bağlantı noktası1. Bağlantı NoktasıAdı = label2.Text; Port1.Aç (); Port1.Write ("Temiz"); MessageBox.Show ("Ekipman temizleme işlemi başladı", "Bilgi mesajı"); button1.Enabled = yanlış; button2.Enabled = yanlış; button3.Enabled = yanlış; if (Port1.ReadByte () == 1000) (button1.Enabled = true; button2.Enabled = true; button3.Enabled = true; Port1.Close (); MessageBox.Show ("Ekipman Temizleme Döngüsünün Sonu");) ) catch (MessageBox.Show ("Geçersiz cihaz bağlantı noktası seçildi. Temizleme işlemi başlatılamıyor", "Uyarı");))) private void contextMenuStrip1_Opening (object sender, CancelEventArgs e) () private void cOM1ToolStripMenuItem_Click (nesne gönderici, EventArgs e) (SerialPort Port1 = new SerialPort ("COM1", 9600); // MessageBox.Show ("COM1 bağlantı noktası seçili"); label1.Visible = true; label2.Text = "COM1";) private void label2_Click (nesne gönderici, EventArgs e) () private void cOM2ToolStripMenuItem_Click (nesne gönderici, EventArgs e) (SerialPort Port1 = new SerialPort ("COM2", 9600); // MessageBox.Show ("COM2 bağlantı noktası seçildi"); label1.Visible = true; label2. Metin = "COM2";) özel void cOM3ToolStripMenuItem_Click (nesne gönderici, EventArgs e) (SerialPort Port1 = new SerialPort ("COM3", 9600); // MessageBox.Show ("COM3 bağlantı noktası seçildi"); etiket1.Görünür = doğru; label2.Text = "COM3"; ) private void cOM4ToolStripMenuItem_Click (nesne gönderici, EventArgs e) (SerialPort Port1 = new SerialPort ("COM4", 9600); // MessageBox.Show ("COM4 seçildi"); label1.Visible = true; label2.Text = "COM4 ";) private void cOM5ToolStripMenuItem_Click (nesne gönderici, EventArgs e) (SerialPort Port1 = new SerialPort (" COM5 ", 9600); // MessageBox.Show (" COM5 seçili "); label1.Visible = true; label2.Text = "COM5";) private void cOM6ToolStripMenuItem_Click (nesne gönderici, EventArgs e) (SerialPort Port1 = new SerialPort ("COM6", 9600); // MessageBox.Show ("COM6 bağlantı noktası seçili"); label1.Visible = true; label2 Text = "COM6";) private void cOM7ToolStripMenuItem_Click (nesne gönderici, EventArgs e) (SerialPort Port1 = new SerialPort ("COM7", 9600); // MessageBox.Show ("COM7 seçili"); label1.Visible = true ; label2.Text = "COM5";) private void programıVarki ToolStripMenuItem_Click (nesne gönderici, EventArgs e) () // bira demleme private void button2_Click (nesne gönderici , EventArgs e) (// if (Port1.IsOpen == false) // (// dene // (// program podrugomu.com/node/987 //Port1.PortName = label2 adresindeki bilgilerle değiştirilebilir. Metin; //Port1.Aç (); switch (label3.Text) ("Infusion mash seçildi" vakası: MessageBox.Show ("Infusion mash işlemi Başlatıldı", "Bilgi mesajı"); Port1.WriteLine ("i"); timer1.Start (); ara; durum " Cooper brew seçildi ": MessageBox.Show (" Cooper ezme işlemi başladı "," Bilgi mesajı "); Port1.WriteLine (" v "); timer3.Start (); break;) button1.Enabled = false; button2.Enabled = yanlış; button3.Enabled = yanlış; // button5.Enabled = yanlış; // richTextBox1.Text = Port1.ReadLine () + "\ n"; / * if (Port1.ReadLine () == "e \ r") (button1.Enabled = true; button2.Enabled = true; button3.Enabled = true; button5.Enabled = true; * / //Port1.Close ( ); // MessageBox.Show ("Demleme Döngüsünün Sonu"); //) //) // catch // (// MessageBox.Show ("Cihaz bağlantı noktası yanlış seçilmiş. Demleme işlemi başlatılamıyor" , "Warninig "); //) //)) private void button5_Click (nesne gönderici, EventArgs e) (Port1.Write (" p "); button1.Enabled = false; button2.Enabled = false; button3.Enabled = false ; timer2. Start (); richTextBox1.Text = richTextBox1.Text + "\ n" + "Mash tun'da suyu 37 dereceye ısıtmaya başlayın" + "" + DateTime.Now.ToString ("SS: mm"); / * Port1.Open (); //Port1.Open (); //richTextBox1.Text = richTextBox1.Text + "\ n" + Port1.ReadLine (); Port1.WriteLine ("o"); Port1.Close () ; * /) private void çıkış ToolStripMenuItem_Click (nesne gönderici, EventArgs e) (Close ();) private void button4_Click (nesne gönderici, EventArgs e) () private void infusion mash Aracı StripMenuItem_Click (nesne gönderici, EventArgs e) (label3.Text = "Infusion Mash Seçildi"; ) private void timer1_Tick (nesne gönderici, EventArgs e) (textBox1.Text = Convert.ToString (Convert.ToInt32 (s / 60)); textBox2.Text = Convert.ToString (Convert.ToInt32 ((s))); s + +; label5.Text = Port1.ReadLine (); if (s == 4200) (// 70 dakika 4200 saniyedir timer1.Stop (); //timer2.Start (); //Port1.Open (); Port1 .WriteLine ("s"); // Port1.Close (); MessageBox.Show ("infüzyon mash bitti, wort'u filtrelemeniz gerekiyor"); button1.Enabled = true; button2.Enabled = true; button3.Enabled = true; button5.Enabled = true; textBox1.Text = ""; textBox2.Text = "";) //Port1.Close ();) private void label4_Click (nesne gönderici, EventArgs e) () private void timer2_Tick (nesne) sender, EventArgs e) (label5 .Text = Port1.ReadLine (); if (Port1.ReadLine () == "s \ r") (timer2.Stop (); MessageBox.Show ("Su 37 derecedir. Malt ekleyebilir ve ezme modunu açabilirsiniz "); richTextBox1.Text = richTextBox1.Text +" \ n "+" Püre teknesi hazırlama işleminin sonu. Т = 37 derece "+" "+ DateTime.Now.ToString (" SS: mm "); button2.Enabled = true;)) özel void acilToolStripMenuItem_Click (nesne gönderici, EventArgs e) (Port1.WriteLine (" a "); MessageBox.Show ("Kullanıcı tüm sistemi anormal bir şekilde kapattı");) mashBoil ToolStripMenuItem_Click'in özel geçersizliği (nesne gönderici, EventArgs e) (Port1.WriteLine ("k"); MessageBox.Show ("Push kdv açık. 60 dakika bekleyin") ; richTextBox1.Text = richTextBox1.Text + "\ n" + "Püre kaynatma modu etkinleştirildi. 60 dakika bekleyin" + "" + DateTime.Now.ToString ("SS: mm") ;) private void timer3_Tick (nesne gönderici, EventArgs e) (string s1 = ""; Port1.ReadLine (); if (s1.Substring (0, 2) == "t1") label5.Text = s1.Substring (4 , 5); if (s1.Substring (0, 2) == "t2") label9.Text = s1.Substring (4, 5); s ++; if (s == 900) (Port1.WriteLine (" m"); MessageBox.Show ("62 derecede ezme aşaması "); richTextBox1.Text = richTextBox1.Text +" \ n "+" 62 derecede ezme adımı x "+" "+ DateTime.Now.ToString (" SS: mm "); ) if (s == 2250) (Port1.WriteLine ("n"); MessageBox.Show ("78 derecede harmanlama aşaması"); richTextBox1.Text = richTextBox1.Text + "\ n" + "78 derecede harmanlama aşaması "+" "+ DateTime.Now.ToString (" HH: mm ");) if (s == 2700) (Port1.WriteLine (" b "); MessageBox.Show (" Ezme aşaması bitti, boşaltabilirsiniz şıra "); richTextBox1.Text = richTextBox1.Text + "\ n" + "Ezme aşaması bitti. şırayı boşaltabilirsiniz" + "" + DateTime.Now.ToString ("HH: mm"));) private void normal ToolStripMenuItem_Click (nesne gönderici, EventArgs e) (label3.Text = "Cooper brew seçildi";)))

Program arduino ile com portu üzerinden haberleşir. Tek şey, hiçbir şekilde kazanamam, böylece com portunu sorgularken, program alt yordam yürütme sırasında donmaz. Alt rutinin bitiminden sonra program kilitleniyor, ancak şu ana kadar bu kritik değil ve hatta kesin bir artı. Kusursuz - belirli bir prosedür sırasında hiçbir şeye basmamak.

Toplam, program

- yemek pişirmek için ekipman hazırlamak;
- pişirmek;
- basit bir çalışma günlüğü yazın (pişirmenin daha fazla analizi için çok kullanışlıdır);
- kontrol denetleyicisine (arduino UNO) bağlantı için bir bağlantı noktası seçin;
su ısıtıcısını kaynatın ve fıçıları ezin.

Pompalar ve selenoid valfler gelince daha da otomasyona geçeceğim. Bu arada her Pazar bir yemek programı ekleyeceğim. Toplam 5 program olacak. Manuel modun uygulanması da sırasını bekliyor.
Söyledikleri gibi,

devam edecek ...

UPD:

İşte bira fabrikasının bazı resimleri

Bu bir pişirme kabı. Bende iki tane var. Yana kapalı bir çerçeve içinde bir DS18B20 sıcaklık sensörü monte edilmiştir.
Uzun bir süre, arduino'nun neden her şeyi topraklama ihtiyacı ortaya çıkana kadar periyodik olarak askıda kaldığını anlayamadım, önce kasaya, sonra sensör kasasına ve arduino'ya yumruk attı.

İçindeki bakır boru, wort'u filtrelemek içindir. Daha güzel yapabilirsiniz, ancak sahtesini kullanmak daha iyidir. Ne yazık ki Çinliler onu göndermek için acele etmiyorlar.

Sonuç hakkında konuşmak için çok erken, olan buydu.

Kazanın genel görünümü bu şekildedir.

Kullanılan normal konektörler
sıcaklık sensörlerini bağlamak için, çift sokete bağlanmak için. Ekipmanı yıkamak daha uygundur. Bağlantı kesildi, banyoya taşındı. Yıkadım, bağladım ve her şey çalışıyor.

Her şey programa göre köpürüyordu, çok fazla akmıyordu. Ve en yakın plan, daha fazla fermantasyon için bir parti birayı boşaltmak, bir tane daha demlemek. Tarif, prensip olarak, arduino'nun varka () alt rutinindeki kodda görüntülenebilir.

Solenoid valfler nihayet geldi. Otomasyon süreci devam ediyor.

Herkese merhaba!
Otomatik bira fabrikamı kurmaya karar vermemin üzerinden uzun zaman geçti. İşte ilk yazı.
Bugün kontrolör tamamen hazır, demleme ve filtreleme cihazının kendisini yapmaya devam ediyor. Her şey kendi ellerimle yapıldı. Lütfen kesinlikle yargılamayın, mühendislik eğitimim yok, basit bir hümanistim! Nasıl ve neyden yapıldığını sırasıyla anlatacağım. Dikkat, trafik, bol resim! Gelişme hakkında kısaca. Arduino'da yapılmıştır. Ses, ışık göstergesi, akım ve voltaj göstergesi (cihaz hata ayıklama yaptığı için bu göstergeleri izlemem gerekiyor). Acil kapatma. Tüm sistem katı hal rölelerine dayanmaktadır. Güç bölümü dijital olandan ayrılmıştır. 4 yükün kontrolü 25-40A (ölçeklenebilir), 8 parça için reçete hafızası. 8 sıcaklık kırılması. Sezgisel arayüz. Tam manuel veya tam otomatik mod. Otomatik CIP yıkama. 0,1 g hassasiyete sahip 2 sıcaklık sensörü. Kazan sıvı sensörü. Pompalama sıvısı sensörü. Verimlilik - 20L'den 1000L'ye. Havalandırma, girdap, pompa, yedek çıkış kontrolü. Yapılandırılabilir PID, farklı kapasiteler (beta), yazılım güncellemeleri için USB, yakın gelecekte - iPhone / iPad'den uzaktan kumanda. Artık bir bilgisayardan, bir monitör ekranından, hatta İnternet üzerinden bile kontrol edilebiliyor.
Hadi başlayalım. İlk önce mağazada bir kasa seçtim. Fiyatlar çok farklı. Kabul edilebilir bir boyut ve fiyat seçtim, ileriye bakarak, dolgunun sınıra tırmandığını, daha küçük bir kasaya sığmayacağını söyleyeceğim:

Kontrolleri işaretlemenin karmaşık çalışması. Kasa, teller ve kontaktör hariç tüm dolgular yurtdışından satın alındı. Bu ülkede makul bir fiyata hiçbir şey satın alamazsınız.


Yapılandırmaya karar verdim, olasılıkları genişletmek için alt sıradaki düğmeler geleceğe bırakıldı:

Maskeleme bandı yapıştırdım ve işaretleri kurşun kalemle çizdim.

Dava küçük. Delikleri kesin. Dikdörtgen olanlar, en küçük dişe sahip bir dosya olan bir yapbozla yapıldı. Yuvarlak - adımlı matkap-balıksırtı. Küçük yuvarlak olanlar - bir matkapla.

Tüm delikler açıldı.

Ve boyadı. Boşuna yaptığımı unutmayın, boya herhangi bir temasla acımasızca bölünür. 3-4 kat boyanmıştır. Primer kullanmadım.

Boyanın kuruması için bir gün bekledim ve elemanları yerleştirdim.


Bir reklama göre radyatör aldım, yerel bir TV merkezindendi, yerel bir TV kulesinde bir TV vericisinin üzerinde durdum, kesmek zorunda kaldım, fabrikaya verdim çünkü dekupaj testeresi almaz, bilinmeyen bir alaşımdan ağırdır.

Arka yüzünde.

İçeri.

Birleştirilmiş.

Elektronik kontrol.

Çok karmaşık bir diyagram çizdim, diyagram olmadan - hiçbir yerde!

Her şeyi bağladım ve lehimledim. Adım adım ateş etmedim, bunun için zamanım yoktu.

Başka bir görünüm. Her sıkıştırma terminalini lehimliyorum.


Yönetici cihazları için yuvalar.

SSR rölesi. İki mezhep ve farklı üreticiler kullandım, bu daha ilginç.

İşte olanlar. Seçim butonları daha farklı, daha kullanışlı ve yeşil yani bence daha güzel duruyor yoksa çok fazla kırmızı var :)


Masada biraz toparlandı ve test için! Isıtma elemanları yerine, yük ve ısıtma elemanı olarak eski bir masa lambası kullanılır.

Moment Crystal üzerine yapıştırılan plakalar. Şirketten sipariş edilen özel plakalar. Fiyat, kalite ve dayanıklılık açısından farklılık gösteren iki tip Graverton ve Gedakolor vardır. Hangileri bende, hatırlamıyorum bile. Ve işin bitti!


Bu arada, en son gelişme için yeni olanaklara sahip yeni bir beyin zaten masada bekliyor! :)

Bir sonraki adım, bira üreticisi ve nihai yapı için bileşenlerin seçimidir. Ama bir sonraki bölümde daha fazlası.

Ne yaparsam yapayım, farklı bir şekilde boyamazdım, fotoğraflarda çok sayıda çip görünüyor. Ancak ünite duvara monte sabit kurulum için tasarlanmıştır, bu nedenle boya bu şekilde savaşmaz. Şu anda, her şey beklendiği gibi çalışıyor, tencereyi tüm borularla bitirmeye devam ediyor. Zaman ve para meselesi.

Acemi biracılar için dileğim, hemen otomatik bir makine yapmaya çalışmayın, işe yaramaz. Öncelikle tüm detaylara girmeli, paranızı ve zamanınızı çöpe atmalısınız.

Kodun yazarı ile anlaşarak, kod birkaç nedenden dolayı kamuya açık hale getirilmemiştir: program benim spesifik gelişimime, belirli bir döngüye göre düzenlenmiştir ve muhtemelen gelecekte ticari bir ürüne dönüşecektir. Ben sadece bir örnek gösterdim.

Fotoğrafların kalitesi için özür dilerim, her şey telefonda yapıldı. Sonuna kadar okuyan herkese teşekkürler!

Evde bira yapmak isteyenler için,