1 (2015-07-02 16:24:28 отредактировано Николя)

Тема: Автоматика на Arduino для ректификации и дистилляции (схема-прошивки)

Автоматика на Arduino для ректификации и дистилляции. Схема сборки с прошивками для контроля и термостатирования дистилляторов и колонн.

Сейчас конечно есть готовые термушки для клапанов и прочие штучки, но хочется опять чего то самому изобразить!
В общем планирую проект с возможностью расширения функций. Каждая версия будет идти V_1, V_2 и так далее, дабы избежать путаницы.
   Устройство которое сейчас буду показать :) прототип, но все функции работают. Проверил в железе на скорою руку.

   
Функции устройства:

  • -Индикация процесса "Ректификация" (планирую и дистилляцию, пиво тоже, что бы один блок все умел).

  • -Индикация положения клапана отбора. (ON/OFF)

  • -Индикация текущей температуры в колонне.

  • -Индикация зафиксированной температуры стабилизации. (От нее + 0,1 С -сработка клапана.)

  • -Передача на android устройства показаний датчиков.

Модули для сборки:

  • -Arduino Nano 328, 16 МГц, 5V (пойдет любая, хоть про мини).

  • -Дисплей (пойдет тоже любой, скетч подкорректировать). 0.96" IIC/I2C Serial 128x64 OLED

  • -Блютуз модуль. Bluetooth-RF-Transceiver-Module-HC-06-RS232

  • -Клапан отбора (по возможности приобретайте нержавейку)

  • -Модуль управления скоростью отбора (возможно в перспективе программно будет).

  • -Реле для коммутации питания клапана отбора.

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

Пока для начала вроде как все.
Добавлено: 2015-07-01 19:31:39

Скетч пока в том виде как есть

//Автосамогон, автоматика самогоноварения и прочего винокурения. Версия: v_1 OLED 0.96" IIC/I2C Serial 128x64 
//Проект открытый и доступен  на сайте http://alcodistillers.ru
// Связь с автором проекта krdub@ya.ru

#include <OneWire.h>
OneWire  ds(10);  // Подключаем датчик к 10 цифровому пину
// Для дисплея
#include <SPI.h>
#include <Wire.h>
#include <Adafruit_GFX.h>
#include <Adafruit_SSD1306.h>
#define OLED_RESET 4
Adafruit_SSD1306 display(OLED_RESET);

float setTmp; // переменная для заданного значения температуры
float celsius; // переменная для текущего значения температуры


int buttFixPin = 2;     // пин кнопки
int buttFixPinCurentState = LOW;       // текущее состояние кнопки 
const int ledPin =  13;      //  LED pin
//int buttonState = 0;         // статус кнопки

void setup(void) {
 
  pinMode(buttFixPin, INPUT_PULLUP); //подтягиваем входы кнопок к плюсу встроенными резисторами
  pinMode(ledPin, OUTPUT);      //13й вывод индикация нажатия кнопки
  
   pinMode(3, OUTPUT); //пин реле клапана отбора
  
  display.begin(SSD1306_SWITCHCAPVCC, 0x3C);  
  display.clearDisplay();
  
  Serial.begin(9600);
 
}

void loop(void) {
  // считываем состояние кнопок
   buttFixPinCurentState = digitalRead(buttFixPin);
  
  if (buttFixPinCurentState == LOW)digitalWrite(ledPin, HIGH ); //Зажигаем светодиод по нажатию кнопки 
  else digitalWrite(ledPin, LOW); 
  
 //Запись температуры фиксации в переменную    
  if (buttFixPinCurentState == LOW && setTmp == 0)
    {setTmp=celsius;  //Если нажата кнопка, пишем в переменную текущее значение температуры
     Serial.println(setTmp);}  
  
  if (celsius > (setTmp+0.1))digitalWrite(3, LOW  );  // Если температура выше зафиксированной на 0,1 С, клапан закрыт         
  else digitalWrite(3, HIGH); 
      
  byte i;
  byte type_s;
  byte data[12];
  byte addr[8];
 
   // Ищем адрес датчика
  if ( !ds.search(addr))
  {
    ds.reset_search();
    delay(250);
    return;
  }
  // Проверяем не было ли помех при передаче
  if (OneWire::crc8(addr, 7) != addr[7]) {
     Serial.println("CRC is not valid!");
     return;
  }
  Serial.println();
  // Определяем серию датчика
  switch (addr[0]) {
  case 0x10:
    Serial.println("  RECTIFICAT");  
    type_s = 1;
    break;
  case 0x28:
    Serial.println("  CRECTIFICAT");
    type_s = 0;
    break;
  case 0x22:
    Serial.println("  RECTIFICAT");
    type_s = 0;
    break;
  default:
    Serial.println("Device is not a DS18x20 family device.");
    return;
  } 

  ds.reset();            
  ds.select(addr);       // Выбираем адрес
  ds.write(0x44, 1);     // Производим замер, в режиме паразитного питания
  delay(1000);    

  ds.reset();
  ds.select(addr);    
  ds.write(0xBE);         // Считываем оперативную память датчика

  for ( i = 0; i < 9; i++) {           
    data[i] = ds.read();  // Заполняем массив считанными данными
  }
  // Данные о температуре содержатся в первых двух байтах, переведем их в одно значение и преобразуем в шестнадцатиразрядное число
  int16_t raw = (data[1] << 8) | data[0];
    if (type_s) {
    raw = raw << 3; 
    if (data[7] == 0x10) {
      raw = (raw & 0xFFF0) + 12 - data[6];
   }
   } 
  else 
  {
    byte cfg = (data[4] & 0x60);
    if (cfg == 0x00) raw = raw & ~7; 
    else if (cfg == 0x20) raw = raw & ~3; 
    else if (cfg == 0x40) raw = raw & ~1; 
  } 
  celsius =  (float)raw / 16.0;
  Serial.print("T = ");
  Serial.print(celsius);
  Serial.print(" C   ");
  Serial.print("setTmp  ");
  Serial.print(setTmp);
  
 //Работа Дисплея
  display.clearDisplay();
  display.setCursor(0,5);
  display.setTextSize(2);
  display.setTextColor(WHITE);
  display.println("RECTIFICAT"); //Надпись сверху дисплея
  display.setCursor(10,27);
  display.setTextSize(1);
  display.setTextColor(WHITE);
  display.println("KLAPAN"); //Знак температуры
  display.setCursor(60,23);
  display.setTextSize(2);
  display.setTextColor(WHITE);
  if (digitalRead(3)) display.println("ON"); // показываем состояние выхода
    else display.println(" OFF");
  display.setCursor(0,39);
  display.setTextSize(2);
  display.setTextColor(WHITE);
  display.print(celsius); //Выводим на дисплей текущую температуру в колонне
  display.setCursor(98,42);
  display.setTextSize(1);
  display.setTextColor(WHITE);
  display.println("O"); // знак градуса
  display.setCursor(110,43);
  display.setTextSize(3);
  display.setTextColor(WHITE);
  display.println("C"); // знак Цельсия
  display.setCursor(0,57);
  display.setTextSize(1);
  display.setTextColor(WHITE);
  display.print("setTmp"); //Выводим зафиксированную температуру на дисплей
  display.setCursor(40,57);
  display.setTextSize(1);
  display.setTextColor(WHITE);
  display.print(setTmp); //Выводим переменную зафиксированной температуры на дисплей
  display.display();
  delay(1000);

 }
  
 

Все необходимые библиотеки, которые у меня работают.

https://drive.google.com/file/d/0B5BI-x … sp=sharing

Обновлено 31.01.17

Очередное продолжение версии что в начале темы на дисплее  0.96" IIC/I2C 128x64 OLED
Автоматика на Arduino для ректификации и дистилляции (схема-прошивки)

На дисплей выводятся показания 4х датчиков ds18b20 и давления BMP 180
Код по ссылке  https://drive.google.com/file/d/0B5BI-x … sp=sharing

Ленивые всё делают быстро, что бы скорее отделаться от работы и делают хорошо, чтобы не переделывать.
С уважением, Николай.
Моё оборудование : → Винокурня Николя

2 (2015-07-06 12:26:44 отредактировано Николя)

Re: Автоматика на Arduino для ректификации и дистилляции (схема-прошивки)

Сразу написал для дисплея LCD Display Module 20х4. Дисплей подключен по  I2C шине (пин А4 и А5 ардуины).

//АвтоСамогон, автоматика для самогоноварения и прочего винокурения. Версия: v_1 LCD 20x4
//Проект открытый и доступен на сайте http://alcodistillers.ru 
// Связь с автором проекта krdub@ya.ru



#include <Wire.h> 
#include <OneWire.h>
OneWire  ds(10);  // Подключаем датчик к 10 цифровому пину
// Для дисплея
#include <LiquidCrystal_I2C.h>
LiquidCrystal_I2C lcd(0x27,20,4); // инициализация библиотеки с перечнем задействованных выводов

float setTmp; // переменная для заданного значения температуры
float celsius; // переменная для текущего значения температуры


int buttFixPin = 2;     // Пин кнопки
int buttFixPinCurentState = LOW;       // текущее состояние кнопки 
const int ledPin =  13;      //  LED pin
//int buttonState = 0;         // статус кнопки

void setup(void) 
{
lcd.init();  
lcd.backlight();

  pinMode(buttFixPin, INPUT_PULLUP); //подтягиваем входы кнопок к плюсу встроенными резисторами
  pinMode(ledPin, OUTPUT);      //13 пин светодиод -индикация нажатия кнопки
  pinMode(3, OUTPUT); // Пин реле клапана отбора
  
  Serial.begin(9600);
 
}

void loop(void) {
  // считываем состояние кнопок
   buttFixPinCurentState = digitalRead(buttFixPin);
  
  if (buttFixPinCurentState == LOW)digitalWrite(ledPin, HIGH ); //Зажигаем светодиод по нажатию кнопки 
  else digitalWrite(ledPin, LOW); 
  
 //Запись температуры фиксации в переменную    
  if (buttFixPinCurentState == LOW && setTmp == 0)
    {setTmp=celsius;  //Если нажата кнопка, пишем в переменную текущее значение температуры
     Serial.println(setTmp);}  
  
  if (celsius > (setTmp+0.1))digitalWrite(3, LOW  );  // Если температура выше зафиксированной на 0,1 С, клапан закрыт         
  else digitalWrite(3, HIGH); 
      
  byte i;
  byte type_s;
  byte data[12];
  byte addr[8];
 
   // Ищем адрес датчика
  if ( !ds.search(addr))
  {
    ds.reset_search();
    delay(250);
    return;
  }
  // Проверяем не было ли помех при передаче
  if (OneWire::crc8(addr, 7) != addr[7]) {
     Serial.println("CRC is not valid!");
     return;
  }
  Serial.println();
  // Определяем серию датчика
  switch (addr[0]) {
  case 0x10:
    Serial.println("  RECTIFICAT");  
    type_s = 1;
    break;
  case 0x28:
    Serial.println("  CRECTIFICAT");
    type_s = 0;
    break;
  case 0x22:
    Serial.println("  RECTIFICAT");
    type_s = 0;
    break;
  default:
    Serial.println("Device is not a DS18x20 family device.");
    return;
  } 

  ds.reset();            
  ds.select(addr);       // Выбираем адрес
  ds.write(0x44, 1);     // Производим замер, в режиме паразитного питания
  delay(1000);    

  ds.reset();
  ds.select(addr);    
  ds.write(0xBE);         // Считываем оперативную память датчика

  for ( i = 0; i < 9; i++) {           
    data[i] = ds.read();  // Заполняем массив считанными данными
  }
  // Данные о температуре содержатся в первых двух байтах, переведем их в одно значение и преобразуем в шестнадцатиразрядное число
  int16_t raw = (data[1] << 8) | data[0];
    if (type_s) {
    raw = raw << 3; 
    if (data[7] == 0x10) {
      raw = (raw & 0xFFF0) + 12 - data[6];
   }
   } 
  else 
  {
    byte cfg = (data[4] & 0x60);
    if (cfg == 0x00) raw = raw & ~7; 
    else if (cfg == 0x20) raw = raw & ~3; 
    else if (cfg == 0x40) raw = raw & ~1; 
  } 
  celsius =  (float)raw / 16.0;
  Serial.print("T = ");
  Serial.print(celsius);
  Serial.print(" C   ");
  Serial.print("setTmp  ");
  Serial.print(setTmp);
  
 //Работа Дисплея
   lcd.setCursor(0, 0);  // устанавливаем курсор в 0-ом столбце,0 строка (начинается с 0)
   lcd.print("RECTIFICAT AutoSem"); // наименование процесса
   lcd.setCursor(0, 1);             // устанавливаем курсор в 0-ом столбце, 1 строка (начинается с 0)
   lcd.print(" Steam temp. ");     
   lcd.print(celsius);              // Температура в верхней точке колонны
   lcd.print((char)223);            // Знак градуса
   lcd.setCursor(0, 2);                
   lcd.print("Valve Selection");
   if (digitalRead(3)) lcd.print(" ON"); // показываем состояние выхода
   else lcd.print(" OFF"); 
   lcd.print("   ");
   lcd.setCursor(0, 3);             // устанавливаем курсор в 0-ом столбце, 3 строка (начинается с 0)
   lcd.print("SetTemp  ");     
   lcd.print(setTmp);              // Температура в верхней точке колонны
   lcd.print((char)223);            // Знак градуса 

 }
  
 

Библиотеки для дисплея здесь
https://drive.google.com/file/d/0B5BI-x … sp=sharing
https://drive.google.com/file/d/0B5BI-x … sp=sharing


Ну и версия для LCD 16x2. Здесь добавлено время с начала запуска блока управления.

//АвтоСамогон, автоматика для самогоноварения и прочего винокурения.
#include <Wire.h> 
#include <OneWire.h>
OneWire  ds(10);  // Подключаем датчик к 10 цифровому пину
// Для дисплея
#include <LiquidCrystal_I2C.h>
LiquidCrystal_I2C lcd(0x27,20,4); // инициализация библиотеки с перечнем задействованных выводов

float setTmp; // переменная для заданного значения температуры
float celsius; // переменная для текущего значения температуры


int buttFixPin = 2;     // пин кнопки
int buttFixPinCurentState = LOW;       // текущее состояние кнопки 
const int ledPin =  13;      //  LED pin
//int buttonState = 0;         // статус кнопки

unsigned long time; // объявление переменной time типа unsigned long

void setup(void) 
{
lcd.init();  
lcd.backlight();

  pinMode(buttFixPin, INPUT_PULLUP); //подтягиваем входы кнопок к плюсу встроенными резисторами
  pinMode(ledPin, OUTPUT);      //13й вывод индикация нажатия кнопки
  pinMode(3, OUTPUT); //пин реле клапана отбора
  
  Serial.begin(9600);
 
}

void loop(void)
{
 
   lcd.setCursor(15,0);
     lcd.print("R"); 
     
if (time/60/60<10) {lcd.print ("0"); }
Serial.print (time/60/60);
Serial.print (":");  
if (time/60/60<10) { Serial.print ("0"); }
   lcd.setCursor(0, 0);             // устанавливаем курсор в 0-ом столбце, 1 строка (начинается с 0)     
   lcd.print(time/60/60);   
   lcd.setCursor(2, 0);             // устанавливаем курсор в 0-ом столбце, 1 строка (начинается с 0)     
   lcd.print(":");  
if (time/60%60<10) { Serial.print ("0"); }
Serial.print ((time/60)%60);
Serial.print (":");
if (time/60%60<10) { lcd.print ("0"); }
   lcd.setCursor(4, 0);             // устанавливаем курсор в 0-ом столбце, 1 строка (начинается с 0)     
   lcd.print((time/60)%60);   
   lcd.setCursor(5, 0);             // устанавливаем курсор в 0-ом столбце, 1 строка (начинается с 0)     
   //lcd.print(":");  
if (time%60<10) { Serial.print ("0"); }
Serial.println (time%60);
//if (time%60<10) {  lcd.print ("0"); }
   //lcd.setCursor(6, 0);             // устанавливаем курсор в 0-ом столбце, 1 строка (начинается с 0)     
   //lcd.print(time%60);  
    
 time = millis()/1000;
 
 lcd.setCursor(9, 0);             // устанавливаем курсор в 0-ом столбце, 1 строка (начинается с 0)
   //lcd.print(" Steam temp. ");     
   lcd.print(celsius);   

  
  //Работа Дисплея
   lcd.setCursor(7, 0);
   lcd.print("T="); 
   lcd.setCursor(9, 0);             // устанавливаем курсор в 0-ом столбце, 1 строка (начинается с 0)
   //lcd.print(" Steam temp. ");     
   lcd.print(celsius);              // Температура в верхней точке колонны
   lcd.print((char)223);   // Знак градуса
   lcd.setCursor(11, 1);                
   lcd.print("V");
   if (digitalRead(3)) lcd.print(" ON"); // показываем состояние выхода
   else lcd.print(" OFF"); 
   lcd.print("   ");
   lcd.setCursor(0, 1);             // устанавливаем курсор в 0-ом столбце, 3 строка (начинается с 0)
   lcd.print("SetT=");     
   lcd.print(setTmp);              // Температура в верхней точке колонны
   lcd.print((char)223);            // Знак градуса 
 
  // считываем состояние кнопок
   buttFixPinCurentState = digitalRead(buttFixPin);
  
 // float celsius=celsius; // переменная для текущего значения температуры 
 // buttonState = digitalRead(buttonPin);
  
  if (buttFixPinCurentState == LOW)digitalWrite(ledPin, HIGH ); //Зажигаем светодиод по нажатию кнопки 
  else digitalWrite(ledPin, LOW); 
  
 //Запись температуры фиксации в переменную    
  if (buttFixPinCurentState == LOW && setTmp == 0)
    {setTmp=celsius;  //Если нажата кнопка, пишем в переменную текущее значение температуры
     Serial.println(setTmp);}  
  
  if (celsius > (setTmp+0.1))digitalWrite(3, HIGH  );  // Если температура выше зафиксированной на 0,1 С, клапан закрыт         
  else digitalWrite(3, LOW); 
      
  byte i;
  byte type_s;
  byte data[12];
  byte addr[8];
 
   // Ищем алрес датчика
  if ( !ds.search(addr))
  {
    ds.reset_search();
    delay(250);
    return;
  }
  // Проверяем не было ли помех при передаче
  if (OneWire::crc8(addr, 7) != addr[7]) {
     Serial.println("CRC is not valid!");
     return;
  }
  Serial.println();
  // Определяем серию датчика
  switch (addr[0]) {
  case 0x10:
    Serial.println("  RECTIFICAT");  
    type_s = 1;
    break;
  case 0x28:
    Serial.println("  CRECTIFICAT");
    type_s = 0;
    break;
  case 0x22:
    Serial.println("  RECTIFICAT");
    type_s = 0;
    break;
  default:
    Serial.println("Device is not a DS18x20 family device.");
    return;
  } 

  ds.reset();            
  ds.select(addr);       // Выбираем адрес
  ds.write(0x44, 1);     // Производим замер, в режиме паразитного питания
  delay(750);    

  ds.reset();
  ds.select(addr);    
  ds.write(0xBE);         // Считываем оперативную память датчика

  for ( i = 0; i < 9; i++) {           
    data[i] = ds.read();  // Заполняем массив считанными данными
  }
  // Данные о температуре содержатся в первых двух байтах, переведем их в одно значение и преобразуем в шестнадцатиразрядное число
  int16_t raw = (data[1] << 8) | data[0];
    if (type_s) {
    raw = raw << 3; 
    if (data[7] == 0x10) {
      raw = (raw & 0xFFF0) + 12 - data[6];
   }
   } 
  else 
  {
    byte cfg = (data[4] & 0x60);
    if (cfg == 0x00) raw = raw & ~7; 
    else if (cfg == 0x20) raw = raw & ~3; 
    else if (cfg == 0x40) raw = raw & ~1; 
  } 
  celsius =  (float)raw / 16.0;
  Serial.print("T = ");
  Serial.print(celsius);
  Serial.print(" C   ");
  Serial.print("setTmp  ");
  Serial.print(setTmp);
  
 

 }
  
 
Ленивые всё делают быстро, что бы скорее отделаться от работы и делают хорошо, чтобы не переделывать.
С уважением, Николай.
Моё оборудование : → Винокурня Николя

3 (2015-07-02 15:39:21 отредактировано Николя)

Re: Автоматика на Arduino для ректификации и дистилляции (схема-прошивки)

Чертить схему не стал, нет на рабочем компе спец программ, нарисовал  "от руки" для наглядности.

Программа для Android устройств здесь  https://play.google.com/store/apps/deta … th_Arduino

Там еще есть видео автора, тоже полезно будет посмотреть.

Ленивые всё делают быстро, что бы скорее отделаться от работы и делают хорошо, чтобы не переделывать.
С уважением, Николай.
Моё оборудование : → Винокурня Николя

4

Re: Автоматика на Arduino для ректификации и дистилляции (схема-прошивки)

Так пока тестирую на столе. Работает стабильно.

Ленивые всё делают быстро, что бы скорее отделаться от работы и делают хорошо, чтобы не переделывать.
С уважением, Николай.
Моё оборудование : → Винокурня Николя

5

Re: Автоматика на Arduino для ректификации и дистилляции (схема-прошивки)

Клапан откель выдернут?

У вас в жизни всегда будет все, что вы хотите, если вы будете помогать другим людям получать то, чего хотят они.
Внимание! Через приват НЕ КОНСУЛЬТИРУЮ! Пишите в паблик.

6 (2015-07-05 11:09:00 отредактировано Николя)

Re: Автоматика на Arduino для ректификации и дистилляции (схема-прошивки)

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

Отладил полностью, затолкал в коробушку, как только допаяю колонну, буду полевые испытания проводить, потом модернизация и добавление функций, для совсем ленивых. Наверное видео сниму, если соберусь, заодно разбор полетов первой полноценной ректификации потом проведем, надеюсь на это.

Ленивые всё делают быстро, что бы скорее отделаться от работы и делают хорошо, чтобы не переделывать.
С уважением, Николай.
Моё оборудование : → Винокурня Николя

7

Re: Автоматика на Arduino для ректификации и дистилляции (схема-прошивки)

Уважаемые коллеги, требуется консультация. Что бы закончить процесс ректификации по температуре в кубе, из чего исходить, не отжимая хвосты до последнего?
Я вижу так:
- Температура в кубе привязана к количеству спирта в нем.
Если мы оставляем грубо 5% хвостов, то при какой то заданной (усредненной) температуре стоп машина. Какую температуру ставить???
Тоже самое для дистилляции.
Помогайте пожалуйста.

Ленивые всё делают быстро, что бы скорее отделаться от работы и делают хорошо, чтобы не переделывать.
С уважением, Николай.
Моё оборудование : → Винокурня Николя

8

Re: Автоматика на Arduino для ректификации и дистилляции (схема-прошивки)

Николя пишет:

закончить процесс ректификации по температуре в кубе,

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

9

Re: Автоматика на Arduino для ректификации и дистилляции (схема-прошивки)

Ivanov & Co пишет:

Только термометр в колонне покажет  значения, по которым можно достоверно понимать, что  происходит внутри,

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

Ленивые всё делают быстро, что бы скорее отделаться от работы и делают хорошо, чтобы не переделывать.
С уважением, Николай.
Моё оборудование : → Винокурня Николя

10

Re: Автоматика на Arduino для ректификации и дистилляции (схема-прошивки)

Николя пишет:

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

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

Алкоголь не помогает найти ответ,
он помогает забыть вопрос!

11

Re: Автоматика на Arduino для ректификации и дистилляции (схема-прошивки)

Николя пишет:

Когда банка с заранее настроенным противовесом на определенный вес,  замыкает контакт, первый клапан закрывается, а второй на тело открывается.

Зачем так мудрить? Два электрода в банку на нужный уровень. При замыкании их спиртом появляется проводимость (очень маленькая, но можно усилить, мне хватило одного кт3102е). Ориентируйся на сопротивление в 300-500КОм, хотя зависит от площади контакта.
Добавлено: 2015-07-06 19:26:25

Николя пишет:

Вот по Т куба и интересует, можно завершить или нет.

Температура кипения в кубе зависит от концентрации спирта и других примесей, а так-же от давления в кубе. Не стоит брать её за основу, проверено. Уже наступал когда-то на эти грабли.

12

Re: Автоматика на Arduino для ректификации и дистилляции (схема-прошивки)

al пишет:

Я пользуюсь температурой паров в кубе чисто для прикидок,

Спасибо за табличку, это и имел ввиду.

Vlad1975 пишет:

Два электрода в банку на нужный уровень

Благодарю, сейчас такой вариант и рассматриваю, а с противовесом было до того. С проводимостью спирта был вопрос. Попробую, есть блок- усилитель сигнала, попробую с ним.
Добавлено: 2015-07-06 13:28:42

Vlad1975 пишет:

Уже наступал когда-то на эти грабли.

Значит буду думать другой алгоритм.

Ленивые всё делают быстро, что бы скорее отделаться от работы и делают хорошо, чтобы не переделывать.
С уважением, Николай.
Моё оборудование : → Винокурня Николя

13

Re: Автоматика на Arduino для ректификации и дистилляции (схема-прошивки)

Николя пишет:

Значит буду думать другой алгоритм

Так, вариант один. Датчик на 2/3 высоты рк.
Добавлено: 2015-07-06 19:33:34

Николя пишет:

Попробую, есть блок- усилитель сигнала, попробую с ним.

Вы в аналоговых схемах разбираетесь? Минимальных знаний достаточно, чтобы собрать усилитель постоянного сигнала (хоть на транзисторах хоть на операционнике). Могу помочь.

14

Re: Автоматика на Arduino для ректификации и дистилляции (схема-прошивки)

Спасибо, сейчас отлучусь, попозже продолжим.

Ленивые всё делают быстро, что бы скорее отделаться от работы и делают хорошо, чтобы не переделывать.
С уважением, Николай.
Моё оборудование : → Винокурня Николя

15

Re: Автоматика на Arduino для ректификации и дистилляции (схема-прошивки)

Николя пишет:

Хотел переключение с голов на тело автоматизировать.

Количество голов всегда разное, зависит от состава браги. Испортите тело и все.

Алкоголь не помогает найти ответ,
он помогает забыть вопрос!

16

Re: Автоматика на Arduino для ректификации и дистилляции (схема-прошивки)

Vlad1975 пишет:

Так, вариант один. Датчик на 2/3 высоты рк.

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

Vlad1975 пишет:

чтобы собрать усилитель постоянного сигнала

Под рукой транзисторы китайские есть, операционники надо дома искать.
Сейчас пробую напрямую на аналоговый вход ардуинки с простым скетчем, работает, спирт тоже видит.
Добавлено: 2015-07-06 19:29:51

al пишет:

Количество голов всегда разное, зависит от состава браги. Испортите тело и все.

Все эти прибамбасы я характеризую "для ленивых", на самом деле как вариант если вдруг проморгал, ну бывает такое, и переставить банку забыл. Тут хоть АвтоСем переключит. Уровень голов ставить естественно с запасом, ну потеряется немного товарного спирта.

Ленивые всё делают быстро, что бы скорее отделаться от работы и делают хорошо, чтобы не переделывать.
С уважением, Николай.
Моё оборудование : → Винокурня Николя

17

Re: Автоматика на Arduino для ректификации и дистилляции (схема-прошивки)

Николя пишет:

ну бывает такое, и переставить банку забыл. Тут хоть АвтоСем переключит

Всё равно РК без присмотра не оставить. Вместо клапанов можно поставить звуковую сигнализацию на определённые параметры (уровень жидкости, превышение или понижение Т воды на обратке, превышение Т на высоте 2/3 РК).

18

Re: Автоматика на Arduino для ректификации и дистилляции (схема-прошивки)

Николя пишет:

С проводимостью спирта был вопрос.

1.3 ома в 1 см если не ошибаюсь (в регламенте на ректификат видел). Это для концентрации 96.2.

У вас в жизни всегда будет все, что вы хотите, если вы будете помогать другим людям получать то, чего хотят они.
Внимание! Через приват НЕ КОНСУЛЬТИРУЮ! Пишите в паблик.

19

Re: Автоматика на Arduino для ректификации и дистилляции (схема-прошивки)

Иван пишет:

1.3 ома в 1 см если не ошибаюсь

Чистый спирт - не электролит (диэлектрик). В смеси с водой облалает не большой проводимостью. Сопротивление исчисляется Мегаомами, даже сотнями МОм.

20

Re: Автоматика на Arduino для ректификации и дистилляции (схема-прошивки)

Vlad1975 пишет:

Иван пишет:
1.3 ома в 1 см если не ошибаюсь

Ардуинщикам повезло больше всех. Все уже у них есть, только надо знать что и где искать.
Например этот датчик воды используется и на "мокрый пол" и на наполнение емкости спиртом.
Цена вопроса до 100р.

ПС: если заранее определить обьем голов, то можно сделать так, чтобы этот датчик "позвал" оператора для смены емкости.

21

Re: Автоматика на Arduino для ректификации и дистилляции (схема-прошивки)

Vlad1975 пишет:

Чистый спирт - не электролит (диэлектрик).

Надо сперва получить чистый спирт :)
  По справочным данным среднее значение 1,5 · 10 в минус пятой.  У нас в самом идеальном варианте 97.2% далеко не у всех.  Сам процесс замера сопротивления вызовет химическую реакцию окисления, сопротивление будет меняться, при хранении тоже кстати меняется.  Так что датчик можно сделать смело, но только как датчик уровня.  1.3 (тоже среднее) было взято из реального регламента на ректификат 96.2%, но я эти цифры не проверял и ничего объективного сказать не могу. Просто не интересовало, так как постоянные значения получить не реально, тут еще и примеси будут вносить "поправку" ...

anders пишет:

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

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

У вас в жизни всегда будет все, что вы хотите, если вы будете помогать другим людям получать то, чего хотят они.
Внимание! Через приват НЕ КОНСУЛЬТИРУЮ! Пишите в паблик.

22

Re: Автоматика на Arduino для ректификации и дистилляции (схема-прошивки)

Иван пишет:

в детстве такие схемки паяли в кружке

Точно. Да и сейчас можно. Что получится - см. в параллельной теме. Номиналы можно прогуглить.

23 (2015-08-04 10:56:44 отредактировано Николя)

Re: Автоматика на Arduino для ректификации и дистилляции (схема-прошивки)

anders пишет:

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

Есть у меня и такая хрень. Только и без нее можно, просто два электрода в спирт, видит ардуина спирт, правда у меня под рукой только изопропиловый, на него четко реагирует, а вот она без ардуины не видит спирт, воду отлично видит.  Буду вводить в прогу, как дополнительное баловство.
Добавлено: 2015-07-08 17:37:58

Продолжение АвтоСем Внимание. Прошивка обновлена, исправлены некоторые ошибки.
Модификация AutoSem v1. 
-Добавлены часы и минуты сначала запуска устройства.
-Добавлена индикация температуры на 2/3 высоты колонны (датчик ХВОСТ)
-Добавлен контроль по датчику на 2/3 высоты. Можно реле на отключение или сигналку повесить.

// АвтоСамогон, автоматика для самогоноварения и прочего винокурения. Версия: AutoSem LCD 16*2 v1
// Проект открытый и доступен на сайте http://alcodistillers.ru 
// Связь с автором проекта krdub@ya.ru
// Для дисплея 16*2 раскоментируйте соответствующие строчки, и удалите или закоментируйте для 20*4 или наоборот
// Перезапуск только через RESET или отключение питания.
// Реле клапана отбора на пин D3, реле отключения всей системы по датчику подхода хвотов пин D4. Можно включать сигнализацию.
// После нажатия кнопки, температура фиксируется как в верхней точке, так и на 2/3 колонны.
// Кнопка не активна до перезапуска программы.

#include <Wire.h> 
#include <OneWire.h>
#include <DallasTemperature.h>
#define ONE_WIRE_BUS 10
OneWire oneWire(ONE_WIRE_BUS);
DallasTemperature sensors(&oneWire);
// Для дисплея
#include <LiquidCrystal_I2C.h>
LiquidCrystal_I2C lcd(0x27,16,2); // инициализация библиотеки с перечнем задействованных выводов
//LiquidCrystal_I2C lcd(0x27,16,2); // инициализация библиотеки с перечнем задействованных выводов
float setTmp; // переменная для заданного значения температуры
float XBOCT;  // переменная для хранения температуры на 2/3 высоты колонны, для отсечки хвостов и остановки погона.

int buttFixPin = 2;     // пин кнопки
int buttFixPinCurentState = LOW;       // текущее состояние кнопки 
const int ledPin =  13;      //  LED pin 
unsigned long time; // объявление переменной time типа unsigned long 
 
void setup(void){
Serial.begin(9600);// Запускаем Seriak порт
sensors.begin();   // Запуск датчика ds1820
lcd.init();        // Инициализация дисплея
lcd.backlight();   // Включаем подсветку дисплея
  pinMode(buttFixPin, INPUT_PULLUP); //подтягиваем входы кнопки к плюсу встроенными резисторами
  pinMode(ledPin, OUTPUT); // 13й вывод индикация нажатия кнопки
  pinMode(3, OUTPUT);      // 3й пин реле клапана отбора
  pinMode(4, OUTPUT);      // 4й пин реле остановки погона (по подходу хвостов)
  
  // Просто заставка на дисплей при запуске 
  lcd.clear(); 
  lcd.setCursor(0, 0);
  lcd.print("initializing....");
  lcd.setCursor(0, 1);
  delay(2000);
  lcd.clear();
  lcd.setCursor(2, 1);
  lcd.print("AutoSem v1");
  delay(3000);
}
void loop(void){
sensors.requestTemperatures();

//Serial.print("T0=");
//Serial.println(sensors.getTempCByIndex(0));
//delay(200);
//Serial.print("T1=");
//Serial.println(sensors.getTempCByIndex(1));
//delay(200);
//celsius=sensors.getTempCByIndex(0)
//Serial.print("T2=");
//Serial.println(sensors.getTempCByIndex(2));
//lcd.setCursor(15,0);
//lcd.print("R"); 

//Индиккация времени работы программы
 if (time/60/60<10) { Serial.print ("0");}
 Serial.print (time/60/60);
 Serial.print (":");  
  lcd.setCursor(0, 0);
  lcd.print (time/60/60);
  lcd.setCursor(2, 0);
  lcd.print (":");
 if (time/60%60<10) { Serial.print ("0"); }
 Serial.print ((time/60)%60);
 Serial.print (":");
  lcd.setCursor(3, 0);
  lcd.print ((time/60)%60);
 if (time%60<10) { Serial.print ("0"); }
 Serial.println (time%60);
 
  time = millis()/1000;

//Работа Дисплея 16*2
  //lcd.setCursor(6, 0);
  //lcd.print("RTF"); 
  //lcd.setCursor(10, 0);
  //lcd.print(sensors.getTempCByIndex(0));   // Температура в верхней точке колонны
  //lcd.print((char)223);                    // Знак градуса  
  //lcd.setCursor(0, 1); 
  //lcd.print("S");     
  //lcd.print(setTmp);                       // Температура стабилизации колонны
  //lcd.setCursor(6, 1);             
  //lcd.print("X");     
  //lcd.print(sensors.getTempCByIndex(1));   // Температура на высоте 2/3 колонны
 //lcd.setCursor(13, 1);                
  // if (digitalRead(3)) lcd.print(" ON");   // Состояние клапана отбора
    //else lcd.print("OFF"); 
  //lcd.print("   ");
  
  

//Работа Дисплея 20*4
   lcd.setCursor(0, 1);  // устанавливаем курсор в 0-ом столбце,2 строка (начинается с 0)
   lcd.print("t1="); // Логотип
   lcd.setCursor(3, 1);  // устанавливаем курсор в 3-ом столбце,2 строка (начинается с 0)
   lcd.print(sensors.getTempCByIndex(0));      // Температура в верхней точке колонны
   lcd.print((char)223);            // Знак градуса
   lcd.setCursor(0, 2);             // устанавливаем курсор в 0-ом столбце,  строка 3 (начинается с 0)
   lcd.print("tX");     // Температура на высоте 2/3 колонны, отлов хвостов
   lcd.print(sensors.getTempCByIndex(1));              // Температура в верхней точке колонны
   lcd.print((char)223);            // Знак градуса
   lcd.setCursor(0, 3);  // устанавливаем курсор в 0-ом столбце, 4 строка (начинается с 0)
   lcd.print("St1"); 
   lcd.print(setTmp); // Температура стабилизации по верхней точке колонны 
   lcd.setCursor(0, 3);  // устанавливаем курсор в 8-ом столбце,4 строка (начинается с 0)
   lcd.print("tX"); 
   lcd.print(XBOCT); // Температура стабилизации по 2/3 высоты колонны 
   lcd.setCursor(10, 1);                
   lcd.print("Valve");
   lcd.setCursor(11, 2);                
   lcd.print("Valve");
    if (digitalRead(3)) lcd.print(" ON"); // показываем состояние выхода
       else lcd.print(" OFF"); 
   lcd.print("   ");
    
  // считываем состояние кнопки
   buttFixPinCurentState = digitalRead(buttFixPin);
  if (buttFixPinCurentState == LOW)digitalWrite(ledPin, HIGH ); //Зажигаем светодиод по нажатию кнопки 
  else digitalWrite(ledPin, LOW); 
 //Запись температуры фиксации в переменную setTmp 
  if (buttFixPinCurentState == LOW && setTmp == 0)
    {setTmp=sensors.getTempCByIndex(0);  //Если нажата кнопка, пишем в переменную setTmp текущее значение температуры, она же температура стабилизации колонны
     Serial.println(setTmp);}  
  if (sensors.getTempCByIndex(0) > (setTmp+0.1))digitalWrite(3, HIGH  );  // Если температура выше зафиксированной на 0,1 С, клапан отбора закрыт         
  else digitalWrite(3, LOW); 
  //Запись температуры фиксации в переменную XBOCT
  if (buttFixPinCurentState == LOW && XBOCT == 0)
    {XBOCT=sensors.getTempCByIndex(1);  //Если нажата кнопка, пишем в переменную XBOCT текущее значение температуры
     Serial.println(XBOCT);}    
  if (sensors.getTempCByIndex(1) > (XBOCT+0.1))digitalWrite(4, HIGH  );  // Если температура выше зафиксированной на 0,1 С, останавливаем погон, хвосты пошли        
  else digitalWrite(4, LOW); 
  } 
 

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


Но вот вопрос меня мучает, подскажите из практики. На датчик хвостов какую отсечку ставить, 0,1 С, или другую. Пока 0,1 С сделал.

Ленивые всё делают быстро, что бы скорее отделаться от работы и делают хорошо, чтобы не переделывать.
С уважением, Николай.
Моё оборудование : → Винокурня Николя

24

Re: Автоматика на Arduino для ректификации и дистилляции (схема-прошивки)

Иван пишет:

По справочным данным среднее значение 1,5 · 10 в минус пятой.

Это проводимость,  величина обратная сопротивлению.

25

Re: Автоматика на Arduino для ректификации и дистилляции (схема-прошивки)

Vlad1975 пишет:

Это проводимость,  величина обратная сопротивлению.

Так какое сопротивление получается в 1 см между электродами?

У вас в жизни всегда будет все, что вы хотите, если вы будете помогать другим людям получать то, чего хотят они.
Внимание! Через приват НЕ КОНСУЛЬТИРУЮ! Пишите в паблик.