ОТКРЫТИЕ МАГАЗИНА ХД
Сайт Барахолка Магазинновый ОТКРЫТИЕ МАГАЗИНА ХД

Smart Distiller (Умный дистиллятор с управлением по интернет)

Форум самогонщиков Автоматика
1 2 3 4 5 ... 12 2
C-Bell Научный сотрудник Улан-Удэ 1674 1244
Отв.20  05 Мая 14, 03:02
capsolo, нет, дорогой коллега, ШИМа не будет.
Не будет никакого управления питанием (наверное нагрев подразумевался).
Выпрямителя тоже не будет.

Вся автоматика уже представлена в электробоксе и содержит:
- одноплатный компьютер pcDuino;
- четырехрелейный модуль;
- 1-wire адаптер USB9097.

Ещё есть провода, соединители, блок питания 5V/2A.
Четыре релюхи будут включать/отключать два электроклапана от стиралки и два ТЭНа по 1,25kW.

Будет релейное управление клапанами, мощность ТЭНов будут регулироваться алгоритмом Брезенхема.

Повторюсь, что стараюсь всё делать из готовых блоков с минимумом пайки.
сообщения удалены (3)
Sambedded Кандидат наук Vancouver 366 86
Отв.21  05 Мая 14, 11:47
что -то я не совсем понял как ты на механическом реле управление мощностью по брезинхему собрался делать?
capsolo Профессор Зелик 4773 1540
Отв.22  05 Мая 14, 12:00, через 14 мин
capsolo, нет, дорогой коллега, ШИМа не будет.C-Bell, 05 Мая 14, 03:02

Ну я Брезенхема имел в виду в качестве софтовой реализации ШИМ. С клапанами понятно, вобщем. Один клапан на подачу воды в контур, включается и выключается по Ткуба.
Второй на отбор: открывается по ТКуба, потом головы с одним интервалом между открытием - закрытием, тело с другим интервалом, закрытие по ТКуба.
Не понятно с ТЭНами: ты хочешь их включать-отключать релюхами, эмулируя любую заданную вливаемую мощность? Или для начала просто отрубать один ТЭН при достижении Траб и работать на 1.25КВт?

UPD я первый пост невнимательно читал. У тебя дистиллятор с укреплением. И схема приведена.
capsolo Профессор Зелик 4773 1540
Отв.23  05 Мая 14, 15:02
Ну что же раз так - надо уже гнать! Для разминки публикую код для получения СС. Код не отлаженный, поскольку железки такой пока нет Улыбающийся
Просьба C-Bell проверить код с термометром и спичкой Улыбающийся

#coding=utf8
"""
$Id: Pervak.py,v 1.2 2014/05/05 13:19:30 alfille Exp $
   Версия capsolo @ forum.homedistiller.ru
Эта программа использует один термометр и три реле для реализации алгоритма получения СС.
1. При запуске программы замыкаются первое и второе реле для включения двух ТЭНОв и режима "Разгона"
2. В цикле считываются показания первого термометра, вставленного в куб.
3. При превышении температуры определенного порога Траб один тен отключается, открывается клапан подачи воды. Система переходит в рабочий режим.
4. В цикле считываются показания первого термометра, вставленного в куб.
5. При превышении температуры определенного порога Тстоп оба тена отключаются, вода перекрывается.

Условия работы программы:
должны быть установлены пакеты:
owserver
python-ow
должен быть запущен owserver
в файле /etc/owfs.conf должна быть добавлена строка:
'server: device = /dev/ttyUSB0' (для USB9097)
(или для DS9490 раскомментировать строку 'server: usb = all' )
К первому и второму реле подключены ТЭНы по 1.25КВт.
К третьему реле подключен клапан подачи воды на рубашку дистиллятора.
Первый термометр подключен к штуцеру в кубе.
Адреса термометров поменять на свои
"""

# подключение необходимых библиотек
import time, ow, gpio


def setup():
#Задаем температуры начала работы и стопа работы
TempRab = 82.0
TempStop = 98.0

#Задаем пины реле
led_ten1 = "gpio2"
led_ten2 = "gpio4"
led_valve1 = "gpio7"
led_valve2 = "gpio8"

#Задаем адреса термометров
temp_cube =  28.0C56A8000000
temp_colon = 28.AE71A8000000
temp_def = 28.A58CA8000000
temp_prod =  28.DD43A8000000

# инициализация ow - указание адреса и порта owserver (см. /etc/owfs.conf)
ow.init('localhost:4304')
print ('инициализация ow на порт localhost:4304')

# создание объекта, отражающего сеть 1-wire
onewire=ow.Sensor('/')
print ('создание объекта Sensor')

# включение кэширования owserver
onewire.useCache(True)
print ('включение кэширования owserver')

# получение списка цифровых термометров DS18B20 на шине 1-wire
sensors=onewire.find(type='DS18B20')
print ('получение списка цифровых термометров DS18B20 на шине 1-wire')

# получение адресов термометров
termometrs=[]
for ts in sensors:
termometrs.append('/'+ts.family+'.'+ts.id)
print ('получение адресов термометров')

# инициализация реле

gpio.pinMode(led_ten1, gpio.OUTPUT)
gpio.pinMode(led_ten2, gpio.OUTPUT)
gpio.pinMode(led_valve1, gpio.OUTPUT)
gpio.pinMode(led_valve2, gpio.OUTPUT)

#фиксация времени начала погона
timeStart=time.time()

# запуск температурного преобразования всех термометров
ow._put('/simultaneous/temperature','1')

# спим сколько надо секунд
time.sleep(0.95)

def acceleration():
#врубаем ТЭНЫ
gpio.digitalWrite(led_ten1, gpio.HIGH)
gpio.digitalWrite(led_ten2, gpio.HIGH)
#Инициализируем переменную температуры
CurTemp = 0
while CurTemp < TempRab:
# запуск температурного преобразования всех термометров
ow._put('/simultaneous/temperature','1')
# спим сколько надо секунд
time.sleep(0.95)
# читаем термометр в кубе и сравниваем с рабочей температурой
CurTemp = float(ow._get(temp_cube+'/temperature').strip())
else:
print('Разгон окончен. Время разгона %s сек. Температура в кубе %s' % (time.time()-timeStart),CurTemp)
print ('')

def gonka ():
      #фиксация времени начала добычи СС
timeStart=time.time()
#вырубаем 1 ТЭН
gpio.digitalWrite(led_ten1, gpio.LOW)
#врубаем водяное охлаждение дистиллятора
gpio.digitalWrite(led_valve1, gpio.HIGH)
#ГОНИМ до TempStop
CurTemp = 0
while CurTemp < TempStop:
# запуск температурного преобразования всех термометров
ow._put('/simultaneous/temperature','1')
# спим сколько надо секунд
time.sleep(0.95)
# читаем термометр в кубе и сравниваем с температурой стопа гонок
CurTemp = float(ow._get(temp_cube+'/temperature').strip())
else:
print('Гонки окончены. Время гонок %s сек. Температура в кубе %s ' % (time.time()-timeStart),CurTemp)
print ('')

def turnoff():
#вырубаем второй ТЭН
gpio.digitalWrite(led_ten2, gpio.LOW)
#вырубаем водяное охлаждение дистиллятора
gpio.digitalWrite(led_valve1, gpio.LOW)
print('Оборудование обесточено. Водяное охлаждение выключено')

def main():
setup()
acceleration()
gonka ()
turnoff()

main()

C-Bell Научный сотрудник Улан-Удэ 1674 1244
Отв.24  05 Мая 14, 17:40
capsolo, да, уже можно начальный самый примитивный механизм перегонки реализовать.

Только отсутствует механизм контроля и регулировки параметров, а он у меня задуман через web-интерфейс.

что -то я не совсем понял как ты на механическом реле управление мощностью по брезинхему собрался делать?
Sambedded, 05 Мая 14, 11:47
придётся потерпеть, потом всё опишу.
capsolo Профессор Зелик 4773 1540
Отв.25  06 Мая 14, 17:09
Сегодня варим пивко от засыпки до момента фильтрации! Можно также автоматизировать варку и охлаждение чиллером. Это существенно проще. Опять же код не отлажен пока.
#coding=utf8
"""
$Id: Pivko.py,v 1.2 2014/06/05 17:01:30 alfille Exp $
    Версия capsolo @ forum.homedistiller.ru
Эта программа использует один термометр и три реле для реализации алгоритма варки пивка.
1. При запуске программы замыкаются первое, второе и третье реле для включения двух ТЭНов и мешалки.
2. В цикле считываются показания первого термометра, вставленного в куб.
3. При достижении температуры первой паузы T1 выключаем ТЭНы и мешалку.
4. При падении температуры на DeltaT включаем один ТЭН и мешалку и поднимаем температуру до T1+DeltaT.
5. Повторяем 3 и 4 до истечения времени P1
6. Повторяем 1-5 для всех 4 пауз.

Условия работы программы:
должны быть установлены пакеты:
owserver
python-ow
должен быть запущен owserver
в файле /etc/owfs.conf должна быть добавлена строка:
'server: device = /dev/ttyUSB0' (для USB9097)
(или для DS9490 раскомментировать строку 'server: usb = all' )
К первому и второму реле подключены ТЭНы по 1.25КВт.
К третьему реле подключена мешалка.
Первый термометр подключен к штуцеру в кубе.
Адреса термометров поменять на свои
"""

# подключение необходимых библиотек
import time, ow, gpio


def setup():
#Задаем температуры и длительность пауз в секундах
#кислотная
T1 = 38.0
P1 = 1800
#белковая
T2 = 58.0
P2 = 1800
#осахаривание
T3 = 66.0
P3 = 1800
#мэшаут
T4 = 77.0
P4 = 300
#Задаем максимальную просадку по температуре, после которой надо подогреть.
DeltaT = 1.0

#Задаем пины реле
led_ten1 = "gpio2"
led_ten2 = "gpio4"
led_meshalka = "gpio7"
led_valve2 = "gpio8"

#Задаем адреса термометров
temp_cube =  28.0C56A8000000
temp_colon = 28.AE71A8000000
temp_def = 28.A58CA8000000
temp_prod =  28.DD43A8000000

# инициализация ow - указание адреса и порта owserver (см. /etc/owfs.conf)
ow.init('localhost:4304')
print ('инициализация ow на порт localhost:4304')

# создание объекта, отражающего сеть 1-wire
onewire=ow.Sensor('/')
print ('создание объекта Sensor')

# включение кэширования owserver
onewire.useCache(True)
print ('включение кэширования owserver')

# получение списка цифровых термометров DS18B20 на шине 1-wire
sensors=onewire.find(type='DS18B20')
print ('получение списка цифровых термометров DS18B20 на шине 1-wire')

# получение адресов термометров
termometrs=[]
for ts in sensors:
termometrs.append('/'+ts.family+'.'+ts.id)
print ('получение адресов термометров')

# инициализация реле

gpio.pinMode(led_ten1, gpio.OUTPUT)
gpio.pinMode(led_ten2, gpio.OUTPUT)
gpio.pinMode(led_meshalka, gpio.OUTPUT)
gpio.pinMode(led_valve2, gpio.OUTPUT)

#фиксация времени начала погона
timeStart=time.time()

# запуск температурного преобразования всех термометров
ow._put('/simultaneous/temperature','1')

# спим сколько надо секунд
time.sleep(0.95)

def acceleration(T):

#врубаем ТЭНЫ и мешалку
gpio.digitalWrite(led_ten1, gpio.HIGH)
gpio.digitalWrite(led_ten2, gpio.HIGH)
gpio.digitalWrite(led_meshalka, gpio.HIGH)
#Инициализируем переменную температуры
CurTemp = 0
while CurTemp < T:
# запуск температурного преобразования всех термометров
ow._put('/simultaneous/temperature','1')
# спим сколько надо секунд
time.sleep(0.95)
# читаем термометр в кубе и сравниваем с рабочей температурой
CurTemp = float(ow._get(temp_cube+'/temperature').strip())
else:
print('Разгон1 окончен. Время разгона1 %s сек. Температура в кубе %s' % (time.time()-timeStart),CurTemp)
print ('')

def pause(T,P):
#фиксация времени начала паузы 1
timeStart=time.time()
#вырубаем ТЭНЫ и мешалку
gpio.digitalWrite(led_ten1, gpio.LOW)
gpio.digitalWrite(led_ten2, gpio.LOW)
gpio.digitalWrite(led_meshalka, gpio.LOW)
while time.time() < timeStart + P:
# запуск температурного преобразования всех термометров
ow._put('/simultaneous/temperature','1')
# спим сколько надо секунд
time.sleep(0.95)
# читаем термометр в кубе и сравниваем с рабочей температурой
CurTemp = float(ow._get(temp_cube+'/temperature').strip())
#Если температура выше нужной на дельту - вырубаем тен и мешалку. Здесь может быть косяк что нам не дадут вырубить уже вырубленное.
if CurTemp > T+DeltaT:
gpio.digitalWrite(led_ten1, gpio.LOW)
gpio.digitalWrite(led_meshalka, gpio.LOW)
#Если температура ниже нужной на дельту - врубаем тен и мешалку. Здесь может быть косяк что нам не дадут врубить уже врубленное.
if CurTemp > T-DeltaT:
gpio.digitalWrite(led_ten1, gpio.HIGH)
gpio.digitalWrite(led_meshalka, gpio.HIGH)

else:
print('Пауза окончена. Время паузы %s сек. Температура в кубе %s' % (time.time()-timeStart),CurTemp)
print ('')


def turnoff():
#вырубаем ТЭНЫ и мешалку
gpio.digitalWrite(led_ten1, gpio.LOW)
gpio.digitalWrite(led_ten2, gpio.LOW)
gpio.digitalWrite(led_meshalka, gpio.LOW)
print('Оборудование обесточено')

def main():
setup()
acceleration(T1)
pause(T1,P1)
acceleration(T2)
pause(T2,P2)
acceleration(T3)
pause(T3,P3)
acceleration(T4)
pause(T4,P4)
turnoff()

main()
C-Bell Научный сотрудник Улан-Удэ 1674 1244
Отв.26  20 Мая 14, 18:08
Несмотря на посевную и выпавший за ней снег, добил таки модуль сбора показаний в базу данных в отдельном потоке, заодно собрал программу в пакет.
Всё это поместил в пост Пакеты, базы данных, потоки и пр.
Получившийся пакет: Distiller-0.1
C-Bell Научный сотрудник Улан-Удэ 1674 1244
Отв.27  21 Мая 14, 07:21
Брезенхем на реле (как регулировать нагрев релюшками)
В процессе перегона необходимо регулировать мощность нагрева куба.
Если до начала закипания кубовой жидкости (режим разгона) необходимо подавать всю имеющуюся мощность, то после закипания мощность необходимо ограничивать на определенном уровне.

Значение мощности при выходе на режим перегона определяется захлёбной характеристикой имеющейся колонны и зависит от спиртуозности кубовой жидкости.
У моей спиралевидной колонны при изменении содержания спирта от 80% об. до 1% об. предзахлёбная мощность повышается с 30% до 50% от полной мощности ТЭНов 2,5 кВт.

Регулировать мощность с помощью реле можно включая/отключая их на определенный период времени.
Так работают широтно-импульсные модуляторы (ШИМ).
Но есть более изящный способ размазывания квантов мощности по определенному периоду - алгоритм Брезенхема.
Очень удачное описание использования этого алгоритма для регулирования мощности приведено на сайте trolsoft.

Шаг квантования в алгоритме Брезенхема определяет точность установки мощности.
Например, шаг в 1/100 от периода алгоритма позволяет устанавливать мощность с шагом 1%.

При работе с реле задаемся шагом квантования в 1 секунду (минимальное время включенного состояния).
Если регулировать с точностью 1%, то потребуется период алгоритма Брезенхема в 100 секунд.
Естественно, оперативность управления при такой точности никакая.

Поэтому требуется разумный компромисс при использовании алгоритма Брезенхема для работы с релюшками.
Повысить оперативность регулирования в 10 раз (до 10 секунд) можно увеличив шаг квантования в 10 раз.
То есть шаг регулирования составит 10% от полной мощности.
Если ещё поделить мощность между двумя ТЭНами, то период уменьшится ещё в 2 раза до 5 секунд.
Это уже приемлемая оперативность управления.

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

Нижеприведенный код на Python реализует алгоритм Брезенхема.
0 в последовательности обозначает выключенное состояние реле, 1 - включенное.
# -*- coding: utf-8 -*-

Pmax=5

for P in range(Pmax+1):
    ErrP=Pmax-P
    Bresenham=''
    for x in range(Pmax):
        if ErrP<Pmax/2:
            ErrP+=Pmax
            Bresenham+="1"
        else:
            Bresenham+="0"
        ErrP-=P
    print ("Мощность=%s из %s, последовательность Брезенема=%s"%(P,Pmax,Bresenham))


--------------------------------------
Colored with http://dumpz.org


Диаграммы работы алгоритма Брезенхема:
Smart Distiller (Умный дистиллятор с управлением по интернет)
Smart Distiller (Умный дистиллятор с управлением по интернет). Автоматика.
ys1797 Доцент Санкт-Петербург 1005 334
Отв.28  21 Мая 14, 11:58

Лампочки будут мигать, разовьется Паркинсон от этого Улыбающийся
capsolo Профессор Зелик 4773 1540
Отв.29  21 Мая 14, 17:57
Все посмотрел. Как же просто в Питоне работать с Sqlite. Просто супер! И с потоками тоже прикольно.

Теперь замечания (в качестве конструктивной критики, улучшающей состояние проекта):
1. Пустой Readme. Можно просто скопировать текст поста про пак, немного модифицировав.
2. Почему релюхи отключаются gpio.pinMode(pin,gpio.INPUT) а не
gpio.digitalWrite(pins['blabla'],gpio.HIGH)? Подозреваю, что так, как у тебя в коде, будет работать, но такой способ вызывает недоумение.
3. Брезенхем и ТЭНы: внутри ТЭНа нихромовая спиралька. Если взять во внимание, что лампочки перегорают на включении предполагаю, что такое насилие над тэнами резко сократит срок их службы.
C-Bell Научный сотрудник Улан-Удэ 1674 1244
Отв.30  22 Мая 14, 04:13
1. Readme допишу, он не был пустым, просто рассинхронизировался яндекс диск под Linux и в пакет попал пустой файл.
2. Я уже писал, что мои релюхи включаются низким потенциалом на GPIO. Это приводит к включению всех реле при выключении pcDuino, если оставить GPIO на вывод. Перевод выводов в состояние ввода (высокоимпедансное) позволит гарантированно выключить реле.
3. Чем то придется жертвовать ради простоты схемы. Не нашел я готовых подходящих тиристорных модулей. Могу спаять свои, но это противоречит заложенной идее "из доступных деталей".
msg31 Научный сотрудник Барнаул 4537 2369
Отв.31  22 Мая 14, 04:58, через 45 мин
3. Чем то придется жертвовать ради простоты схемы. Не нашел я готовых подходящих тиристорных модулей. Могу спаять свои, бно это противоречит заложенной идее "из доступных деталей".
C-Bell, 22 Мая 14, 04:13
Может SSR использовать. Тверодотельные реле весьма доступны в китае. Еще один момент - при нестабильном напряжении в сети мощность будет плавать.
Братан Специалист Юзовка 135 5
Отв.32  22 Мая 14, 08:03
Еще один момент - при нестабильном напряжении в сети мощность будет плавать.
msg31, 22 Мая 14, 04:58
И этот фактор ставит крест на качественной ректификации! Автоматика для дистилятора.
capsolo Профессор Зелик 4773 1540
Отв.33  22 Мая 14, 10:39
Может SSR использовать. Тверодотельные реле весьма доступны в китае. Еще один момент - при нестабильном напряжении в сети мощность будет плавать.
msg31, 22 Мая 14, 04:58

С погрешностью 10%, заложенной алгоритмом управления, это не сильно принципиально. Если хочешь перестраховаться от избыточной мощности, просто устанавливаешь мощность на шаг меньше.
C-Bell Научный сотрудник Улан-Удэ 1674 1244
Отв.34  22 Мая 14, 10:56, через 18 мин
Может SSR использовать. Тверодотельные реле весьма доступны в китае. Еще один момент - при нестабильном напряжении в сети мощность будет плавать.
msg31, 22 Мая 14, 04:58
А вообче-то говоря,
Голубей ругают зря.
Голубь — ежели в подливке -
Не хужее глухаря!..
Безусловно! Твердотельные реле лучше:
- Они больше;
- Требуют красивого радиатора и с ним они ещё больше!
А ещё у них негуманный ценник (особенно у радиаторов).

Перевесят ли отсутствие шума и "мягкое включение/выключение" при переходе через ноль вышеперечисленные "достоинства"?

Релюхи меньше и сильно дешевле, единственный недостаток - щёлкают.
Придется плату с релюхами клеить через амортизатор.
Контакты реле будут работать на активную нагрузку (ТЭНы) и слаботочную индуктивную (электроклапана), их должно хватить надолго.

Лампочки будут мигать, разовьется Паркинсон от этого Улыбающийсяys1797, 21 Мая 14, 11:58
Сейчас моими ТЭНами управляет компаратор, он периодически включает одновременно оба ТЭНа.
Действительно, при этом лампочка накаливания в ванной, где работает аппаратура, несколько притухает.
Видимо от развившейся болезни Паркинсона я схватился сочинять новую автоматику.
Лечится лампочное моргание очень просто - установкой светодиодного светильника взамен лампы накаливания.

И этот фактор ставит крест на качественной ректификации! Автоматика для дистилятора.
Братан, 22 Мая 14, 08:03
Немного заблуждаешься.
Подаваемая на ТЭНы мощность будет довольно грубо устанавливаться на предзахлебном значении для данной колонны.
Естественно, это несколько снизит производительность, зато колонна будет работать в беззахлебном (читай с максимальным разделением) режиме.
Тонкая регулировка будет осуществляться посредством регулировки отбора через проходной дефлегматор.
Об этом позже в алгоритмах управления.
capsolo Профессор Зелик 4773 1540
Отв.35  22 Мая 14, 11:27, через 31 мин
Для тех, кому неймется (например мне). Пошерстил инет, все можно сравниельно быстро достать.

Чип И Дип
http://www.chipdip.ru/product/ds9490r/
http://www.chipdip.ru/product1/8418586651/
http://www.chipdip.ru/product/sn18b20/

Или вот:
http://www.electronshik.ru/...0-1-ggts-118772
http://www.electronshik.ru/...-arduino-119477
А по поводу датчика в этом варианте можно попробовать договориться с игорь223, чтобы изготовили партию 18b20 по трехпроводной схеме.
C-Bell Научный сотрудник Улан-Удэ 1674 1244
Отв.36  22 Мая 14, 11:48, через 21 мин
capsolo, не хочу тебя расстраивать, но ценники по твоим ссылкам какие-то космические.
И pcDuino без WiFi.
Я с аукциона на ebay купил Pcduino Lite WiFi за 430 рублей.
capsolo Профессор Зелик 4773 1540
Отв.37  22 Мая 14, 12:12, через 25 мин
capsolo, не хочу тебя расстраивать, но ценники по твоим ссылкам какие-то космические.
И pcDuino без WiFi.
Я с аукциона на ebay купил Pcduino Lite WiFi за 430 рублей.
C-Bell, 22 Мая 14, 11:48

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

Как минимум заслуживают внимания термометры в стальных гильзах, спаянные по трехпроводной схеме, дешевле, чем у игорь223. Мы же хотим уйти от пайки вообще?
Братан Специалист Юзовка 135 5
Отв.38  22 Мая 14, 17:54
C-Bell, поясни пожалуйста. Для получения действительно качественного ректификата необходимо стабилизировать выходное напряжение вплоть до одного вольта, с чем прекрасно справляется РМ-2. В твоем случае, при разбросе входного напряжения скажем ±5 В, как будет себя вести выходное?
capsolo Профессор Зелик 4773 1540
Отв.39  22 Мая 14, 21:59
Братан, почитай первый пост, посмотри картинки, присмотрись какой аппарат автоматизируется. Вопросы могут исчезнуть.