Автоматизированные системы на основе микроконтроллера Arduino. Делаем автоматику для пивоварни на одной плате. Изучаем atmega644. Изготавливаем плату с помощью фоторезиста

Я студент технического ВУЗа. Однажды, сидя в кафе с другом, который тогда учился в медицинском университете, решили открыть бар. Было много идей, которые, в принципе, заслуживали некоторого внимания. Например, танц-пол, который изменяет угол наклона в зависимости от стиля музыки… Но, наряду со всем многообразием идей, так же была еще одна -

… а не сварить ли нам свое пиво?

Через пару недель я сварил пиво, взяв ингредиенты с пивзавода, на котором работал друг отца. Но многие технологические процессы были нарушены, поэтому вместо пива вышло что-то с не очень приятным запахом.

Через несколько лет решил повторить процесс, немного автоматизировав его с помощью Arduino UNO. И вот, что получилось.

Начну с того, что должна делать вся установка.

  • Проверять себя - все ли работает, все ли подключено;
  • Чистить себя;
  • Подготавливаться к процессу пивоварения;
  • Варить пиво в полуавтоматическом режиме;
  • Варить пиво в ручном режиме;
  • Варить пиво в автоматическом режиме (как стиральная машина стирает белье).

Первый пункт в данный момент не реализован. Пока даже мыслей нет, как реализовать.
Второй - тоже не реализован, но в ближайшее время доделаю, только дождусь, когда доставят насосы с ebay.
Третий пункт - достаточно простой.

Подготовка к процессу пивоварения

Сообщение от системы о том, что необходимо залить воду в чан -> программа ждет нажатия клавиши ОК - > программа посылает arduino команду на включение твердотельного реле -> твердотельное реле включает однокиловатный тенн в чане, доводит до температуры 37 градусов, отсылает программе команду, что все готово для варки. Поддерживает температуру 37 градусов.

Хочется, чтобы была проверка на наличие воды, но датчик еще ждет своего отправления от «китайских братьев».

Варка пива в полуавтоматическом режиме

В принципе, несложная процедура:

Нажимаем в управляющей программе кнопку «Прогрев», остальные управляющие кнопки не активны;
- После прогрева программа выводить сообщение «Все готово, можно варить»;
- Засыпаем ингредиенты, выбираем программу для варки - кнопка «Варка пива» становится активной;
- Нажимаем кнопку «Варка пива», процесс пошел;
- Далее система периодически будет оповещать информационными сообщениями, что делать и когда.

Нужно следовать инструкциям.

Варка пива в ручном режиме

Данный процесс позволяет задавать параметры варки, изменять их в цикле варки. До него еще не дошел.

Варка в автоматическом режиме

Это мечта. В данный момент нет компонентов для реализации. Не хватает насосов, датчиков уровня воды. Не знаю, как мерить плотность сусла, сколько алкоголя в молодом пиве и еще много чего. Но я не отчаиваюсь и буду автоматизировать постепенно, пока варка пива не будет выглядеть так:

Закинул ингредиенты в соответствующие лотки, нажал кнопку и… через полтора месяца получил готовое пиво.

Это вкратце о процессе, а теперь перейдем к техническое стороне.

Техническая сторона процесса

Как сказано выше за управляющий микроконтроллер выступает arduino UNO. К нему подключены 2 реле, 2
цифровых термометра DS18B20 .

Arduino общается с основной программой через com порт. Т.к. у меня нет шильда реального времени к arduino, пришлось таймеры брать из visual c#. Опыта написания программ у нет, так что, если вдруг у кого есть идеи, критика - почту за честь. Критикуйте, дербаньте, так сказать, что вдруг не нравится.

Вот текст программы на arduino

#include OneWire ds(8); // датчики температуры сидят на 8 пине int reley1 = 13; int reley2 = 12; int reley3 = 11; int reley4 = 10; int reley5 = 7; //включение тен int reley6 = 6; // тен на заторном чане float temp1; float temp2; void setup(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 loop(void) { if (Serial.available()) { switch (Serial.read()){ case "i": infuz(); break; case "p": progrev(); break; case "a": avariya(); break; case "v": varka(); break; case "t": temperature(); break; } } } void varka() { digitalWrite(reley6, HIGH); while(Serial.read()!="m") { temperature(); if (temp1 >= 52.00) digitalWrite(reley6,LOW); else digitalWrite(reley6,HIGH); } while(Serial.read()!="n") { //digitalWrite(reley6,HIGH); temperature(); if(temp1>= 62.00) digitalWrite(reley6,LOW); else digitalWrite(reley6,HIGH); } while(Serial.read()!="b") { //digitalWrite(reley6,HIGH); temperature(); if(temp1 >= 75.00) digitalWrite(reley6,LOW); else digitalWrite(reley6,HIGH); } digitalWrite(reley6,LOW); while(Serial.read()!="c") delay(1000); while(Serial.read()!="x") { digitalWrite(reley5,HIGH); temperature(); } digitalWrite(reley5,LOW); } void infuz() { //temperature(); //Serial.available(); while (Serial.read()!="s"){ //выключение цикла инфузионной варки if (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) //delay(1000); Serial.println("s"); } void avariya(){ digitalWrite(reley1,LOW); digitalWrite(reley2,LOW); digitalWrite(reley3,LOW); digitalWrite(reley4,LOW); digitalWrite(reley5,LOW); } void temperature() { byte i; byte present = 0; byte data; byte addr; byte zator = {40, 23, 218, 43, 6, 0, 0, 22}; // адрес температурного датчика в заторе byte varilka = {40, 255, 240, 115, 59, 4, 0, 234}; //адрес температурного датчика в варильном чане float celsius; // float temp; boolean gde; if (!ds.search(addr)) { //Serial.println("No more addresses."); //Serial.println(); ds.reset_search(); delay(250); // return; } if (OneWire::crc8(addr, 7) != addr) { Serial.println("CRC is not valid!"); // return; } ds.reset(); ds.select(addr); ds.write(0x44, 1); // start conversion, with parasite power on at the end delay(840); // maybe 750ms is enough, maybe not // we might do a ds.depower() here, but the reset will take care of it. present = ds.reset(); ds.select(addr); ds.write(0xBE); // Read Scratchpad for (i = 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); } }

Все бы хорошо, но почему-то третий датчик показывает постоянно 85 градусов. Пока не могу сказать, почему. А нужен он для дальнейшей автоматизации - поддержание температуры в холодильнике.

Вкратце опишу, что делает программа.

Программа разделена на подпрограммы, каждая из которых активируется, если на com порту появляется определенный символ. Например, если в порт попадает буква «p», то включается режим «Прогрев». Или же, если «a» - то вызывается подпрограмма avariya() и все отключается. При вызове подпрограммы temperature() данные записываются в глобальные переменные temp1, temp2. Оттуда и попадают в нужные подпрограммы.

В будущем появятся подпрограммы для варки различных сортов и даже самогона.

Теперь, что касается основной программы управления.

Основная программа управления

Она написана на visual studio c#.

Исходный код программы:

Исходный код программы

using System; using System.Collections.Generic; using System.ComponentModel; using System.Data; using System.Drawing; using System.Linq; using System.Text; using System.Threading.Tasks; using System.Windows.Forms; using System.IO.Ports; namespace WindowsFormsApplication1 { public partial class Form1: Form { // String portnumber; SerialPort Port1 = new SerialPort("COM5", 9600); int s=0; public Form1() { InitializeComponent(); } /*private const int CP_NOCLOSE_BUTTON = 0x200; protected override CreateParams CreateParams { get { CreateParams myCp = base.CreateParams; myCp.ClassStyle = myCp.ClassStyle | CP_NOCLOSE_BUTTON; return myCp; } }*/ private void Form1_Load(object sender, EventArgs e) { label2.Text = Port1.PortName; Port1.Open(); } //Проверка оборудования private void button1_Click(object sender, EventArgs e) { if (Port1.IsOpen == false) { try { //программу можно доработать информация из podrugomu.com/node/987 Port1.PortName = label2.Text; Port1.Open(); Port1.Write("Check"); //SerialPort Port2 = new SerialPort("COM4", 9600); //Port2.Open(); //label3.Text = Convert.ToString(Port2.ReadByte()); //проверка показаний порта MessageBox.Show("Процес проверки оборудования запущен", "Инфорамационное сообщение"); richTextBox1.Text = richTextBox1.Text + "\n" + "Запуск процесса проверки оборудования"+" "+DateTime.Now.ToString("HH:mm"); button1.Enabled = false; button2.Enabled = false; button3.Enabled = false; if (Port1.ReadByte() == 1000) { richTextBox1.Text = richTextBox1.Text + "\n" + "Окончание процесса проверки оборудования"+" "+DateTime.Now.ToString("HH:mm"); button1.Enabled = true; button2.Enabled = true; button3.Enabled = true; Port1.Close(); MessageBox.Show("Конец Цикла проверки оборудования" +" "+ DateTime.Now.ToString("HH:mm")); richTextBox1.SaveFile("CheckLOG.rtf"); } } catch { richTextBox1.Text = richTextBox1.Text + "\n" + "Ошибка процесса проверки оборудования" +" "+ DateTime.Now.ToString("HH:mm"); MessageBox.Show("Неверно выбран порт устройства. Процесс проверки не может быть запущен", "Warninig"); richTextBox1.SaveFile("log/Check_"+DateTime.Now.ToString("ddMMyyyy")+".rtf"); } } } // Чистка оборудования private void button3_Click(object sender, EventArgs e) { if (Port1.IsOpen == false) { try { //программу можно доработать информация из podrugomu.com/node/987 MessageBox.Show("Вы точно налили дезинфектор", "WARNING", MessageBoxButtons.OK, MessageBoxIcon.Warning); Port1.PortName = label2.Text; Port1.Open(); Port1.Write("Clean"); MessageBox.Show("Процес чистки оборудования запущен", "Инфорамационное сообщение"); button1.Enabled = false; button2.Enabled = false; button3.Enabled = false; if (Port1.ReadByte() == 1000) { button1.Enabled = true; button2.Enabled = true; button3.Enabled = true; Port1.Close(); MessageBox.Show("Конец Цикла чистки оборудования"); } } catch { MessageBox.Show("Неверно выбран порт устройства. Процесс чистки не может быть запущен", "Warninig"); } } } private void contextMenuStrip1_Opening(object sender, CancelEventArgs e) { } private void cOM1ToolStripMenuItem_Click(object sender, EventArgs e) { SerialPort Port1 = new SerialPort("COM1", 9600); // MessageBox.Show("Выбран порт COM1"); label1.Visible = true; label2.Text = "COM1"; } private void label2_Click(object sender, EventArgs e) { } private void cOM2ToolStripMenuItem_Click(object sender, EventArgs e) { SerialPort Port1 = new SerialPort("COM2", 9600); // MessageBox.Show("Выбран порт COM2"); label1.Visible = true; label2.Text = "COM2"; } private void cOM3ToolStripMenuItem_Click(object sender, EventArgs e) { SerialPort Port1 = new SerialPort("COM3", 9600); // MessageBox.Show("Выбран порт COM3"); label1.Visible = true; label2.Text = "COM3"; } private void cOM4ToolStripMenuItem_Click(object sender, EventArgs e) { SerialPort Port1 = new SerialPort("COM4", 9600); // MessageBox.Show("Выбран порт COM4"); label1.Visible = true; label2.Text = "COM4"; } private void cOM5ToolStripMenuItem_Click(object sender, EventArgs e) { SerialPort Port1 = new SerialPort("COM5", 9600); // MessageBox.Show("Выбран порт COM5"); label1.Visible = true; label2.Text = "COM5"; } private void cOM6ToolStripMenuItem_Click(object sender, EventArgs e) { SerialPort Port1 = new SerialPort("COM6", 9600); // MessageBox.Show("Выбран порт COM6"); label1.Visible = true; label2.Text = "COM6"; } private void cOM7ToolStripMenuItem_Click(object sender, EventArgs e) { SerialPort Port1 = new SerialPort("COM7", 9600); // MessageBox.Show("Выбран порт COM7"); label1.Visible = true; label2.Text = "COM5"; } private void программаВаркиToolStripMenuItem_Click(object sender, EventArgs e) { } // Варка пива private void button2_Click(object sender, EventArgs e) { // if (Port1.IsOpen == false) //{ // try //{ //программу можно доработать информация из podrugomu.com/node/987 //Port1.PortName = label2.Text; //Port1.Open(); switch (label3.Text) { case "Выбрано инфузионное затирание": MessageBox.Show("Процесс инфузионного затирания Запущен", "Инфорамационное сообщение"); Port1.WriteLine("i"); timer1.Start(); break; case "Выбрана варка Cooper": MessageBox.Show("Процесс затирания Cooper запущен", "Инфорамационное сообщение"); Port1.WriteLine("v"); timer3.Start(); break; } button1.Enabled = false; button2.Enabled = false; button3.Enabled = false; // button5.Enabled = false; // 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("Конец Цикла варки пива"); // } // } // catch //{ // MessageBox.Show("Неверно выбран порт устройства. Процесс варки не может быть запущен", "Warninig"); //} // } } private void button5_Click(object sender, EventArgs e) { Port1.Write("p"); button1.Enabled = false; button2.Enabled = false; button3.Enabled = false; timer2.Start(); richTextBox1.Text = richTextBox1.Text + "\n" + "Запуск подогрева воды в заторном чане до 37 градусов" + " " + DateTime.Now.ToString("HH:mm"); /* Port1.Open(); //Port1.Open(); //richTextBox1.Text = richTextBox1.Text + "\n" + Port1.ReadLine(); Port1.WriteLine("o"); Port1.Close(); */ } private void выходToolStripMenuItem_Click(object sender, EventArgs e) { Close(); } private void button4_Click(object sender, EventArgs e) { } private void инфузионноеЗатираниеToolStripMenuItem_Click(object sender, EventArgs e) { label3.Text = "Выбрано инфузионное затирание"; } private void timer1_Tick(object sender, 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 минут это 4200 секунд timer1.Stop(); //timer2.Start(); //Port1.Open(); Port1.WriteLine("s"); // Port1.Close(); MessageBox.Show("инфузионное затирание окончено необходимо отфильтровать сусло"); button1.Enabled = true; button2.Enabled = true; button3.Enabled = true; 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("Вода имеет температуру 37 градусов. Можно засыпать солод и включать режим затирания"); richTextBox1.Text = richTextBox1.Text + "\n" + "Окончание процесса подготовки заторного чана. Т=37 градусов" + " " + DateTime.Now.ToString("HH:mm"); button2.Enabled = true; } } private void аварийноеОтключениеToolStripMenuItem_Click(object sender, EventArgs e) { Port1.WriteLine("a"); MessageBox.Show("Пользователь аварийно отключил всю систему"); } private void заторногоКотлаToolStripMenuItem_Click(object sender, EventArgs e) { Port1.WriteLine("k"); MessageBox.Show("Включен режим кипячения заторного чана. Ждите 60 минут"); richTextBox1.Text = richTextBox1.Text + "\n" + "Включен режим кипячения заторного чана. Ждите 60 минут" + " " + DateTime.Now.ToString("HH:mm"); } private void timer3_Tick(object sender, 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 градусах"); richTextBox1.Text = richTextBox1.Text + "\n" + "Этап затирания при 62 градусах" + " " + DateTime.Now.ToString("HH:mm"); } if(s== 2250) { Port1.WriteLine("n"); MessageBox.Show("Этап затирания при 78 градусах"); richTextBox1.Text = richTextBox1.Text + "\n" + "Этап затирания при 78 градусах" + " " + DateTime.Now.ToString("HH:mm"); } if (s ==2700) { Port1.WriteLine("b"); MessageBox.Show("Этап затирания закончен, можно сливать сусло"); richTextBox1.Text = richTextBox1.Text + "\n" + "Этап затирания окончен. Можно сливать сусло" + " " + DateTime.Now.ToString("HH:mm"); } } private void обычнаяToolStripMenuItem_Click(object sender, EventArgs e) { label3.Text = "Выбрана варка Cooper"; } } }

Программа общается с arduino через com порт. Единственное, никак не могу победить, чтобы при опрашивании com порта программа не подвисала на момент выполнения подпрограммы. После окончания подпрограммы программа отвисает, но пока это не критично и даже некий плюс. Защита от дурака - чтобы не нажать ничего во время определенной процедуры.

Итого, программа умеет

- готовить оборудование к варке;
- варить;
- писать простенький лог работы (очень полезно при дальнейшем анализе варки);
- выбирать порт для подключение к управляющему контроллеру(arduino UNO);
кипятить варочник и заторный чаны.

Когда придут помпы и солинойдные клапаны, буду автоматизировать дальше. А пока каждое воскресение буду добавлять по одной программе варки. В сумме будет 5 программ. Так же ждет своей очереди реализация ручного режима.
Как говорится,

to be continued...

UPD:

Вот несколько фотографий пивоварни

Это варочный котел. Таких у меня два. С боку установлен датчик температуры DS18B20 в герметичной оправе.
Долго не мог понять, почему периодически arduino виснет, пока не осенило, что нужно все заземлить, наче пробивает на корпус, далее на корпус датчика и на arduino.

Медная трубка внутри - это для фильтрования сусла. Можно сделать красивее, но лучше использовать фальшдно. К сожалению китайские собрать не торопятся высылать его.

Пока рано говорить о результате, вот что получилось

Общий вид чана выглядит вот так.

Использовал обычные коннекторы
для подключения датчиков температуры, подключающиеся к двойной розетке. Удобнее мыть оборудование. Отключил, понес в ванную. Помыл, подключил и все работает.

Все пенилось по графику, лишнего не вытекало. А самых ближайших планах - слить на дображивание партию пива, сварить еще одну. Рецепт, в принципе можно посмотреть в коде в подпрограмме varka() у arduino.

Наконец-то пришли соленойдные клапаны. Процесс автоматизации продолжается.

Добрый день, уважаемые коллеги. Предлагаю универсальный контроллер.

Вариант с пассивным охлаждением с радиатором площадью 600см2 (сейчас это основной вариант исполнения контроллера)


Основной блок идет в таком составе - блок и три датчика температуры на шлейфе. Длина провода шлейфа датчиков температуры от 2.5 до 3 метров. Длина провода подключения к розетке - около 2 метров.

Стоимость основного блока в стандартной комплектации составляет 10500 рублей.

Внимание, новинка!

Андроидная версия автоматики. Управление производится посредством графического интерфейса на планшете или смартфоне. Плотность экрана должно быть не менее 400dpi на 600 dpi. Версия андроида от 4.0 и выше. Как правило, все смартфоны и планшеты, купленные не позднее 5 лет назад удовлетворяют этим требованиям.

Вот так выглядят экраны для смартфона и планшета при работе в режиме пивоварения.

Стоимость базового блока Андроидной версии составляет 19900 рублей. В комплект входит сам блок, шлейф с тремя датчиками температуры, один датчик уровня жидкости и Wi-Fi модуль с модифицированной прошивкой.

За отдельную плату желающим можно в комплекте поставить андроид-планшет. Выберите любой, какой Вам нужен, главное, чтобы я смог его купить в своем городе. Есть недорогие планшеты в Ашане за 2500-3400 рублей и в Технопоинте от 2500 рублей. Гарантию на планшет будет производить тот магазин, в котором я его куплю, поэтому смотрите, чтобы наличие сервисных служб в своем регионе.

Управление Андроидным контроллером будет возможно как через прямое подключение к нему, так и через удаленный сервер.

Для тех, кто желает произвести апгрейд автоматики на новую версию будет высылаться прошитая плата Ардуино и Wi-Fi модуль. Старую плату надо будет вытащить из блока, новую вставить. Стоимость комплекта будет составлять 7400 для тех пользователей, кто ранее приобретал у меня Wi-Fi модуль и 9400 для тех, кто такой модуль не приобретал.

Видео-обзор новой версии автоматики HelloDistiller

В стандартную комплектацию также включен один датчик уровня:

Стоимость контроллера в такой комплектации (основной блок, шлейф из 3 датчиков температуры, один датчик уровня), без комплектации клапанами отбора составляет 10500.00 рублей.

Изделие рассчитано на ТЭНы максимальной мощностью 3.5Квт. При необходимости можно увеличить максимальную мощность до 4.5 квт, доплата за повышенную мощность составит 1500 руб.

Также возможно расширение мощности однофазной автоматики до 6 Квт. Стоимость такой автоматики возрастает на 5000 руб, по сравнению со стандартной, то есть базовый блок будет стоить 15500.00 руб.
Вот, фото такой 6-киловатной автоматики

Для тех, кто желает подключить польский буфер есть возможность вывести дополнительный канал управления клапаном польского буфера

Стоимость такой доработки 2000.00 руб

Клапан поставляется в следующей комплектации:


Стоимость такого клапана 1000.00 рублей

Для подключения клапанов с розеткой или автономной системы охлаждения есть такой переходник.

Стоимость такого переходника 100.00 рублей

Примечание 1: Диаметр датчиков температуры 6 мм, учитывайте это при планировании оборудования.

Примечание 2: Доставка за счет покупателя. Доставка до "Почта РФ" осуществляется силами Продавца, Доставка до иных транспортных компаний - за счет Покупателя (через услугу "Забор груза"), оплата согласно тарифам ТК. Стоимость доставки "Почтой РФ" оплачивается предоплатой Продавцу.

Гарантийный срок составляет 6+6 месяцев. Гарантия первые 6 месяцев. Если в течение этого периода что-то сломается, то ремонт бесплатный.
Расширенная гарантия еще 6 месяцев. Если в течение этого периода что-то выйдет из строя по вине Продавца, то, что можно заменить самостоятельно (например датчик температуры), то эту деталь я заказываю на адрес покупателя из Китая или отправляю почтой РФ, если таковая деталь имеется в наличии и даю инструкции по замене.
К гарантийным случаям не относятся поломки, произошедшие в результате неправильных действий Покупателя, например короткое замыкание, механические повреждение, попадание жидкости внутрь изделия, самостоятельная доработка изделия.
Гарантийный срок на клапана 1 месяц.

Вариант для работы с НБК, включает в себя насос и датчик давления (можно без датчика давления, но тогда не будет возможности авто-регулировки подачи браги ).
Вот шестеренчатый насос.

Стоимость насоса 3500 руб.
Внимание! Для насоса нужен еще блок питания на 9-12В током от 2А и выше. Подходящие блоки питания обычно продаются там, где торгуют светодиодной продукцией. Насос не имеет встроенной схемы управления, управление внешнее от контроллера. На насосе имеется кнопка для тестирования либо для кратковременного включения в режиме полной подачи.
Кроме того система умеет управлять любыми насосами для НБК сторонних производителей, управляемым в режиме ШИМ и имеющими вход для управления TTL уровня.

Для внешнего управления насосами сторонних производителей, есть такой шлейф

Шлейф управления насосом НБК, управление которых производится с помошью ШИМ. Период ШИМ 1 секунда. В секунду может подваться до 125 импульсов. То есть скорость управления насосом 0 - это 0 процентов, насос остановлен, 125 - Это 100 процентов. С помощью этого шлейфа можно управлять, например, насосами, которые производит Игорь223.

Стоимость шлейфа управления насосом 300 руб.

Датчик давления на основе MPX5010DP. Датчик давления позволяет смотреть текущее давление на экране с точностью до 0.1 мм рт.ст, а также отключать систему по превышению заданного давления и регулировать подачу браги в НБК .

Стоимость датчика давления 2500руб.

Дополнительный датчик уровня голов, разлития воды
В комплекте с контроллером идет только один датчик уровня. Если нужен дополнительный, например датчик уровня голов, датчик разлития воды, то можно его изготовить самостоятельно, либо купить.
Стоимость дополнительного датчика 200 руб/шт .
Фото датчика:

GSM/GPRS модуль для контроллера, стоимость модуля 3000.00 рублей:

Модуль позволяет:
1) Полностью управлять контроллером через GPRS при наличии интернета и доступности сервера через приложение на Android , Windows или Web-интерфейс Зарегистрируйтесь или авторизуйтесь для просмотра ссылок! )
2) Управлять (останавливать и запускать процесс) и получать состояния контроллера посредством SMS в случае ошибок доступа к серверу либо к интернету.

Фото модуля:

Wi-Fi модуль для контроллера, стоимость модуля 2000.00 рублей:

Модуль позволяет:
1) Полностью управлять контроллером при наличии интернета и доступности сервера и Wi-Fi роутера через приложение на Android , Windows или Web-интерфейс (приложения доступны в облаке Ссылки могут видеть только зарегистрированные пользователи. Зарегистрируйтесь или авторизуйтесь для просмотра ссылок! ).

Фото модуля:

Также имеется возможность изготовить трехфазный контроллер.

Длина проводов датчиков температуры со шлейфом около 4 метров.
Длина провода подключения входа (провод ПВС 5х1.5) трехфазной вилки (вилка 5-контактная на 16 или 32А IEK) 3 метра.
Длина провода подключения выхода (провод ПВС 5х1.5) розетки (розетка 5-контактная на 16 или 32А IEK) 1.5 метра.
Стоимость такого изделия, максимальной мощностью 3.5 квт на фазу составляет 31500.00 руб
При необходимости можно увеличить максимальную мощность до 4.5 квт на фазу, доплата за повышенную мощность составит 2500 руб.
Трехфазные изделия изготавливаются вне очереди.
Также разрабатывается аналогичное изделие, но с поддержкой управления НПГ.

Всем привет!
С момента, когда я решил построить свою автоматизированную пивоварню прошло много времени. Вот первый пост .
Сегодня контроллер полностью готов, осталось сделать само варочно-фильтровальное устройство. Все делалось моими собственными руками. Прошу не судить строго, у меня нет инженерного образования, я простой гуманитарий! Расскажу по-порядку, как и из чего это делалось. Внимание, траффик, много фоток! Коротко о разработке. Выполнено на Arduino. Звуковая, световая индикация, индикация тока и напряжения (т.к. аппарат отладочный, мне необходимо следить за этими показателями). Аварийное отключение. Вся система на полупроводниковых реле. Силовая часть развязана с цифровой. Управление 4 нагрузками 25-40А (масштабируется), память рецептов на 8 штук. 8 температурных пауз. Интуитивно понятный интерфейс. Полностью ручной или полностью автоматический режим. Автоматическая CIP мойка. 2 температурных датчика с точностью 0,1гр. Датчик жидкости в котле. Датчик жидкости при перекачке. Производительность - от 20л до 1000л. Управление аэрацией, вирпулом, помпой, резервный выход. Настраиваемый PID, под разные емкости (beta), USB для обновления софта, в скором будущем - дистанционное управление с iPhone/iPad. Сейчас можно управлять с компа, с экрана монитора, даже через интернет.
Начнем. Сначала я выбрал в магазине корпус. Цены очень разные. Выбрал приемлемый по размеру и цене, забегая вперед, скажу, что начинка влезла на пределе, в меньший корпус не поместилась бы:

Сложная работа по разметке управляющих элементов. Все начинка, кроме корпуса, проводов и контактора, были куплены за рубежом. В этой стране по внятной цене ничего не купить.


С конфигурацией определился, нижний ряд кнопок оставлен на будущее, под расширение возможностей:

Наклеил малярный скотч и нарисовал карандашом разметку.

Дело за малым. Вырезать отверстия. Прямоугольные делались электролобзиком, пилкой с самым мелким зубом. Круглые - ступенчатым сверлом-ёлочкой. Мелкие круглые - дрелью.

Все отверстия обрабатывались напильником.

И покрасил. Замечу, сделал я это зря, краска нещадно откалывается при любом контакте. Красил на 3-4 слоя. Грунт не использовал.

Подождал сутки, когда высохнет краска и разместил элементы.


Радиатор я купил по объявлению, он с местного телецентра, стоял на ТВ передатчике на местной телевышке, пришлось отпилить, отдавал на завод, т.к. лобзик не берет, он тяжеленный из неведомого сплава.

С обратной стороны.

Внутри.

В сборе.

Проверка электроники.

Набросал очень сложную схему, без схемы - никуда!

Подключил все и припаял. Пошагово не снимал, не до этого было.

Еще один вид. Каждую компрессионною клемму я пропаиваю.


Розетки на исполнительные устройства.

SSR реле. Использовал двух номиналов и разных производителей, так интереснее.

Вот, что получилось. Кнопки выбора поставил другие, более удобные и зеленые, так, я думаю выглядит красивее, а то красного слишком много:)


Немного прибрался на столе и на тест! Вместо ТЭН, нагрузкой и нагревающим элементом является винтажная настольная лампа.

Наклеил таблички на Момент Кристалл. Таблички специальные, заказанные в фирме. Бывают двух видов Гравертон и Гедаколор, отличаются по цене, качеству и стойкости. Какие у меня, уже и не помню. И все готово!


А тем временем, на столе уже ждет новый мозг с новыми возможностями для новейшей разработки! :)

Следующий этап, подбор компонентов для варочника и окончательная постройка. Но об этом в следующей части

Чтобы я сделал, по-другому, не стал бы красить, на фотках видны многочисленные сколы. Но блок предназначен к настенной стационарной установке, поэтому краска не будет так отбиваться. На данный момент все работает как положено, осталось доделать варочник со всей обвязкой. Вопрос времени и денег.

Мое пожелание начинающим пивоварам, не пытайтесь сразу строить автомат, не выйдет. Нужно сначала, вникнуть во все детали, выбросите деньги и время.

По договоренности с автором кода, код не выкладывается в открытый доступ по нескольким причинам: программа заточена под мою конкретную разработку, под конкретный цикл, и возможно, в дальнейшем, превратится в коммерческий продукт. Я лишь показал пример.

Попрошу прощение за качество фоток, все делалось на телефон. Спасибо всем, кто дочитал до конца!

Для тех, кого заинтересовало домашнее пивоварение,

Автоматика для пивоварни на arduino
Всем доброго дня, сегодня тема будет просвещенна любителям настоящего ПИВА, а именно я хочу Вам рассказать как можно самому сделать неплохую автоматику для пивоварни, как сделать саму пивоварню, смотрите ссылочку под видео, как просто сделал я.

Вот готовая автоматика которую я сделал на заказ, кому будет интересно как ее сделать самому, читайте статью до конца, я постараюсь наглядно Вам все показать и рассказать, если кто-то захочет заказать готовую, пишите в комментариях.

Подробно как выставлять параметры рецепта, а также как производить варку на данной автоматике, я расскажу и покажу в конце этой статьи.

Необходимые компоненты для сборки
Сейчас поговорим о том какие компоненты для сборки автоматики нам понадобятся:

  • Корпус, я использовал пластиковый «КОРПУС Z3» светло-серый с размером: длина 110 мм, ширина 150 мм, высота 70 мм, заказывал с отверстиями для вентиляции. Зарегистрируйтесь или авторизуйтесь для просмотра ссылок!
  • Для оформления передней и задней панели, нам понадобится: скотч, малярный двух сторонний скотч, фото бумага. Бесплатная программа Ссылки могут видеть только зарегистрированные пользователи. Зарегистрируйтесь или авторизуйтесь для просмотра ссылок! (программа предназначена для рисования лицевых панелей корпусов), Ссылки могут видеть только зарегистрированные пользователи. Зарегистрируйтесь или авторизуйтесь для просмотра ссылок!

    magtop.biz​

  • Разъемы GX12-4 две штуки и GX20-4 также два. Один GX12-4 для подключения температурного датчика, второй для подключения насоса. Разъем GX12-4 один для подключения сети 220в, второй для подключения ТЭНА. Ссылки могут видеть только зарегистрированные пользователи. Зарегистрируйтесь или авторизуйтесь для просмотра ссылок!
  • Выключатель, можно взять любой, но можно по меньше.
  • Два светодиода, для индикации включения насоса и тэна. ​

  • Вентилятор с решеткой для обдува и охлаждения твердотельного реле, я использовал 50х50х10мм Yoc 50 мм x 50 мм x 10 мм DC 12 В 0.1A 2Pin, и четыре болтика с гайкой на 3мм.
  • Сердцем нашей автоматики является Arduino MEGA 2560 R3 с 3.2 TFT – дисплеем touch, а также шилд, переходная плата между Arduino и дисплеем. Лучше купить сразу нужный комплект в сборе, который заточен под мою прошивку, в ином случае просто запустить автоматику может не получится, это касается самого монитора. КУПИТЬ МОЖНО ТУТ
  • Блок питания, я использовал на 9в 0,5А, более мощный блок питания нет смысла использовать, та и цена будет дороже. КУПИТЬ МОЖНО ТУТ ​

  • Твердотельное реле с радиатором, SSR 40A 3-32 В DC/90-480, будьте внимательны при покупке, цепь на управление нужно чтобы была от 3-32В, а то есть варианты с более высоким напряжением для цепей управления. КУПИТЬ МОЖНО ТУТ
  • Модуль реле 5в на управление и 250в для силовой коммутации.КУПИТЬ МОЖНО ТУТ РЕЛЕ 5V ​

    Часы реального времени, советую использовать DS3231 AT24C32 IIC КУПИТЬ МОЖНО ТУТ ​

    Пассивный зуммер модуль.КУПИТЬ МОЖНО ТУТ ​

    Датчик ds18b20, лучше использовать с кабелем и колбой из нержавейки.КУПИТЬ МОЖНО ТУТ ​

  • Также дополнительно понадобится термоклей, двухсторонний скотч 3М, монтажный провод, кабель, вилка, припой. Ну наверное и все что нам будет нужно, ну и конечно немного терпения.

Подготовка корпуса
Начнем с корпуса, необходимо напечатать на принтере лицевую и заднюю этикетку нашего блока автоматики, готовый чертеж можно Ссылки могут видеть только зарегистрированные пользователи. Зарегистрируйтесь или авторизуйтесь для просмотра ссылок! .

Распечатать можно сразу на простой бумаге, для отметки центров окружности бедующих отверстий нашей панели. После того как все отверстия перенесены на панель, придется немного постараться и все аккуратно вырезать, я с этим справился очень быстро используя мини дрель Dremel с насадками.

После того как Мы просверлим и обработаем все отверстия, приступим к печати лицевой и задней панели на фото бумаге. Далее вырезаем нашу панельку, оклеиваем двухсторонним скотчем, на задней части, и оклеиваем лицевую сторону простым скотчем, по желания можно использовать ламинатор, после приклеиваем к панельке корпуса.

Монтируем все разъемы на панель, выключатель, диоды, GX разъемы и вентилятор. Пол дела сделано.

Программирование контроллера
Следующим делом будем программировать наши плату ардуино. Вот здесь можете скачать все что вам понадобится, а именно программа 1.0.6, более ранние версии могут не принять скетч. В том же файле найдете все необходимые библиотеки. Как это делается, кто не знает я сейчас расскажу.

Устанавливаем программу 1.0.6, находим папку Libreris, и меняем ее на ту что скачали с программой.

В программе 1.0.6 устанавливаем контроллер мега, и ком порт к которому она подключена, запускаем скачанную прошивку, и заливаем в контроллер.

После загрузки на экране появится кнопка ПУСК, жмем и наслаждаемся, наш контроллер готов к работе, осталось подключить оставшиеся модули, и в перед готовить пиво.

Подключение модулей
Первое с чего я начинал, это сборку передней панели, вставляем плату контроллера в сборе в переднюю панель, возле выключателя приклеиваю блок питания, один провод ‘’-» подпаиваю к ‘’-» ардуино, второй ‘’+» через выключатель к ‘’+» ардуино, сетевые провода блока питания подключаем к сетевому разъему или кабелю. На задней плате ардуино на термоклей приклеиваю часы реального времени, зуммер.

На двухсторонний скотч клею управляющее реле насоса, для изоляции силовой части. Впаиваем подтягивающий резистор на 4,7 кОм от +5в до 12 пина. Припаиваем провода вентилятора к блоку питания, через выключатель. Крепить твердотельное реле к корпусу, так чтобы обеспечить хороший обдув ребер радиатора реле.

И так наша автоматика готова к работе.

Настройка рецепта
(Важно перед включением проверьте, чтобы ТЭН, НАСОС, датчик температуры были подключены – на силовых разъемах имеется высокое напряжение)

Подключаем питание, включаем тумблер.

На экране отобразится надпись «ГОТОВИМ ПИВО» и «ПУСК», прозвучит звуковой сигнал.

Режим затирание
Жмем кнопку «ПУСК», переходим в меню «ЗАТИРАНИЕ», в первой графе выбираем необходимую пауз, выставляем согласно рецепта, температуру и время. Самая нижняя строка, «МЕШАУТ», по умолчанию стоит 78 градусов и время «0», при необходимости меняем значения, если оставить время «0» функция «МЕШАУТ» не задействуется.

Режим кипячение
Жмем «ДАЛЕЕ». Переходим в режим «КИПЯЧЕНИЕ» в первой строке кипячение, задаем нужный параметр согласно рецепта.

В второй строке «ВИРПУЛ» устанавливаем только температуру при охлаждении сусла (25-30 градусов)

Ниже строки внесения хмеля, задаем по рецепту. ГЛАВНОЕ при варке в установленное время внесения хмеля будет звучать сигнал, не пропустите.

Начало варки.
На экране видим действительную температуру воды, и кнопку «СТАРТ», жмем «СТАРТ», насос начнет прокачку с паузами, для удаления пузырьков воздуха из системы прокачки, после чего включится в работу, если температура воды для внесения солода мала, включится тэн.

После набора температуры, до заданной, для внесения солода, прозвучит звуковой сигнал, отключится насос и тэн. После чего производим засып солода, и жмем «СТАРТ».

Далее автоматика произведет все температурные паузы, согласно установленного рецепта. По завершению режима затирания прозвучит звуковой сигнал, насос и тэн отключится. Удаляем дробину и переходим в режим кипячения.

Кипячение
На автоматике жмем «СТАРТ», пойдет набор температуры (по умолчанию установлено 96 градусов, при этой температуре сусло активно кипит), в случае если Вам нужно снизить активность кипения, делаем это с помощью стрелок PID регулятора вверх или в низ (уменьшаем или увеличиваем мощность тэна). Сигнал о внесении хмеля прозвучит согласно установленного рецепта.

Вирпул
После окончания варки, автоматика перейдет в режим «ВИРПУЛ», охлаждаем сусло, на экране видим реальную температуру сусла.

ПОДРОБНЕЕ В ВИДЕО

  • Сергей Савенков

    какой то “куцый” обзор… как будто спешили куда то