В помощь самогонщику!

Гонщик-самогонщик
Offline
Зарегистрирован: 18.06.2015

  Гоню, да гоню, а что делать? Иногда хочется пригубить, а магазинную душа не принимает, блюёт она после нее, простите за подробности. А вот от своей домашней, только положительные эмоции и легкий подъем утром, да и этого тоже!

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

-При достижении заданной температуры в кубе Т1 (бак с брагой или спиртом-сырцом), блок подаст сигнал что пора уже к нему подойти. Настраиваем все необходимое -воду, нагрев регулируем.

- Отбираем головы. Температура в колонне Т2 стабилизируется. При повышении на 0,1*С опять сигнал, нужно опять подойти. Ну и так далее.

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

  

  

 

Гонщик-самогонщик
Offline
Зарегистрирован: 18.06.2015

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

Думаю что в дополнение к пищалке при повышении температуры на 0,2*С, будет закрываться клапан отбора, это в режиме ректификации, а в режиме бражной колонны увеличиваться подача воды на дефлегматор, тем самым прекращая отбор.

inspiritus
Offline
Зарегистрирован: 17.12.2012

Гы. Фракцыонная разгонка, попробуйте в поднебольшим вакуумированием и Вы удивитесь :)

а разделять H2О и HDO никогда не пробовали ;)

где насадку берете ?

Гонщик-самогонщик
Offline
Зарегистрирован: 18.06.2015

Вах, да я не один здесь самогонщик то!

Насадку сам кручу. Спиральную В плане СПН, но пока руки до оснастки не дошли. По ссылк еВаша система?

Гонщик-самогонщик
Offline
Зарегистрирован: 18.06.2015

inspiritus пишет:

 Фракцыонная разгонка, попробуйте в поднебольшим вакуумированием и Вы удивитесь 

а разделять H2О и HDO никогда не пробовали ;)

где насадку берете ?

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

inspiritus
Offline
Зарегистрирован: 17.12.2012

Написал много потом стер. skype- alxemmax. 

bwn
Offline
Зарегистрирован: 25.08.2014

inspiritus пишет:

Написал много потом стер. skype- alxemmax. 

От так всегда, как что интересное, сразу в патентное бюро((((.

Zaliv
Offline
Зарегистрирован: 05.03.2011

Ну вот... Интересно же

Гонщик-самогонщик
Offline
Зарегистрирован: 18.06.2015

Александр, действительно в кратце черкните а уж там посмотрим иначе народ слюной изойдет. :)

Andrey_Y_Ostanovsky
Offline
Зарегистрирован: 03.12.2012

Гонщик-самогонщик пишет:
Собственно заковыка сейчас у меня вот в чем. Как только Т2 стабилизировалась, нужно ее зафиксировать, и кконтроллер уже от нее пляшет. Не знаю как это реализовать. Помогите за неполный стакан красного.

Вообще говоря, при классической ректификации, заданная температура куба поддерживается внешним регулятором, а температура T2 (вернее состав ректификата) - поддерживается интенсивностью возврата флегмы в колонну.

Гонщик-самогонщик пишет:
Не умею я под вакуумом, растолкуйте , здесь вроде можно.

И не надо под вакуумом: там температуры кипения компоненнов не только снижаются, но и сближаются между собой.

Гонщик-самогонщик
Offline
Зарегистрирован: 18.06.2015

Andrey_Y_Ostanovsky пишет:

Вообще говоря, при классической ректификации, заданная температура куба поддерживается внешним регулятором, а температура T2 (вернее состав ректификата) - поддерживается интенсивностью возврата флегмы в колонну.

Это да, вот для этого и нужна отправная точка. По сигналу можно подправить возврат флегмы. А так около колонны сидеть приходиться. Я пока работаю на БК, Рк в перспективе.

bwn
Offline
Зарегистрирован: 25.08.2014

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

Гонщик-самогонщик
Offline
Зарегистрирован: 18.06.2015

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

Я тоже приобрел клапаны и управление на 555 таймере

http://www.ebay.com/itm/221663246081?_trksid=p2057872.m2749.l2649&ssPage...

 

http://www.ebay.com/itm/351391245534?_trksid=p2057872.m2749.l2648&ssPage...

Andrey_Y_Ostanovsky
Offline
Зарегистрирован: 03.12.2012

Гонщик-самогонщик пишет:
Это да, вот для этого и нужна отправная точка. По сигналу можно подправить возврат флегмы.

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

Andrey_Y_Ostanovsky
Offline
Зарегистрирован: 03.12.2012

Гонщик-самогонщик пишет:
регулирую отбор дефлегматором. Можно вообще остановить отбор добавив охлаждения.

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

Гонщик-самогонщик
Offline
Зарегистрирован: 18.06.2015

Я не работал на РК, только теория. На Бк отбор дефом и регулирую.

Что касается ардуины- я не знаю как програмно, например нажав кнопку и установить эту контрольную точку.

Andrey_Y_Ostanovsky
Offline
Зарегистрирован: 03.12.2012

Гонщик-самогонщик пишет:
Что касается ардуины- я не знаю как програмно, например нажав кнопку и установить эту контрольную точку.

Это уже второй вопрос. :)

Для автоматизации - заранее пишется сценарий, после чего делается его коррекция, или предусматривается возможность коррекции параметров. Лезть в автоматику руками с кнопками - дурной тон, и признак того, что автоматика тут - явно лишняя. :)

Гонщик-самогонщик
Offline
Зарегистрирован: 18.06.2015

Гонщик-самогонщик пишет:

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

  

Пока речь не идет о полной автоматизации, в перспективе, когда РК построю, а только о некоторых ее моментах

Гонщик-самогонщик
Offline
Зарегистрирован: 18.06.2015

К тому же, я сразу и написал, что я не ас в ардуине, делаю по мере сил.

bwn
Offline
Зарегистрирован: 25.08.2014

Эту точка должна ловиться сама. В течении 5 минут, при отсутствии отбора, температура стоит на одном уровне  - запомнили значение. Начали отбор и мониторим температуру. Начала повышатся, прекратили или уменьшили отбор. Вернулась к запомненному уровню, продолжаем.

Гонщик-самогонщик
Offline
Зарегистрирован: 18.06.2015

bwn пишет:

запомнили значение

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

Можно через меню ввести эту температуру, я тоже не сумел это сделать. Короче двоешник!

 

bwn
Offline
Зарегистрирован: 25.08.2014

Гонщик-самогонщик пишет:

bwn пишет:

запомнили значение

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

Можно через меню ввести эту температуру, я тоже не сумел это сделать. Короче двоешник!

 

В скетч не надо, она всегда разная. Запомнили в переменную и от нее отталкиваемся. В скетч можно коридор забить 0,1-0,3 градуса.

bwn
Offline
Зарегистрирован: 25.08.2014

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

Andrey_Y_Ostanovsky
Offline
Зарегистрирован: 03.12.2012

bwn пишет:
В скетч не надо, она всегда разная.

Как это "разная"? :) Там будет коридор, например: "78 - 86 градусов", и температура для одной и той же конструкции и термометра - не должна быть сильно разной.

bwn
Offline
Зарегистрирован: 25.08.2014

Andrey_Y_Ostanovsky пишет:

bwn пишет:
В скетч не надо, она всегда разная.

Как это "разная"? :) Там будет коридор, например: "78 - 86 градусов", и температура для одной и той же конструкции и термометра - не должна быть сильно разной.

Коридор оптимальный составляет 0,2 градуса. У меня на разных ректификациях стабилизируется от 77,2 до 78. Сильно зависит от атмосферного давления.

bwn
Offline
Зарегистрирован: 25.08.2014

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

Andrey_Y_Ostanovsky
Offline
Зарегистрирован: 03.12.2012

bwn пишет:

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

Нет, именно на выходе из колонны будет такая температура. В кубе (баке) - будет под 90 и выше к концу отгонки.

Гонщик-самогонщик
Offline
Зарегистрирован: 18.06.2015

Все уже украдено до нас

http://hbpro.ru/threads/kontroller-na-arduino-mega-2560-tft.146/page-3

http://forum.homedistiller.ru/index.php?topic=118518.0

Не нравиться только, что мегу нужно заказывать. У меня куча нано и промини есть

bwn
Offline
Зарегистрирован: 25.08.2014

Andrey_Y_Ostanovsky пишет:

bwn пишет:

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

Нет, именно на выходе из колонны будет такая температура. В кубе (баке) - будет под 90 и выше к концу отгонки.

Значит у меня неправильная колонна. Выше 0,5 градусов от точки равновесия можно смело в помойку выливать. (Колонна ректификационная, самогон не делаю).

Andrey_Y_Ostanovsky
Offline
Зарегистрирован: 03.12.2012

bwn пишет:
Значит у меня неправильная колонна. Выше 0,5 градусов от точки равновесия можно смело в помойку выливать. (Колонна ректификационная, самогон не делаю).

http://www.homedistiller.ru/teoria-rektifikacii.htm, хотя Вы - вправе делать все, что хотите. :)

bwn
Offline
Зарегистрирован: 25.08.2014

Andrey_Y_Ostanovsky пишет:

bwn пишет:
Значит у меня неправильная колонна. Выше 0,5 градусов от точки равновесия можно смело в помойку выливать. (Колонна ректификационная, самогон не делаю).

http://www.homedistiller.ru/teoria-rektifikacii.htm, хотя Вы - вправе делать все, что хотите. :)

И что здесь противоречит тому, что я написал?

"Исключением является только точка А - пересечение кривой равновесия с диагональю, где X=Y=96,4%. Это особая точка азеотропы."

"Водно-спиртовая смесь в особой точке азеотропы называется “этиловый спирт-ректификат (СР)”. Именно к этой точке стремится процесс ректификации, именно она является предельной концентрацией спирта в этом процессе, и именно в этой точке водно-спиртовая смесь имеет минимальную температуру кипения (tкип=78,15°C при 760мм.рт.ст. см. рис.1)."

"Действительно, имея профессиональное ректификационное оборудование и электронный термометр, способный с высокой точностью определять температуру спиртовых паров, Вы с удивлением можете обнаружить, что его показания отличаются изо дня в день. Если вчера Вы наблюдали температуру кипения спирта 77,0ºC, а сегодня – 78,0ºC, то это означает не изменение спиртового состава или неисправность ректификационного устройства, а всего лишь изменение атмосферного давления: вчера было - 730мм.рт.ст., а сегодня – 755мм.рт.ст."

Гонщик-самогонщик
Offline
Зарегистрирован: 18.06.2015

Ну что товарищи самогонщики, так я и не осилил сию задачу.

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



#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 tempRect=0; //переменная для текущего значения температуры
//float tempFix=0; //переменная для зафиксированной температуры
//int setTmp=0; // переменная для заданного значения температуры

void setup(void) {
 
  display.begin(SSD1306_SWITCHCAPVCC, 0x3C);  
  display.clearDisplay();
  
  Serial.begin(9600);
  pinMode(3, OUTPUT); //пин реле 
  digitalWrite(3, LOW);  // Включаем реле
}

void loop(void) {
  byte i;
  byte type_s;
  byte data[12];
  byte addr[8];
  float celsius, fahrenheit;

  // Ищем алрес датчика
  if ( !ds.search(addr)) {
    //Serial.println("No more addresses.");
    //Serial.println();
    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;
  fahrenheit = celsius * 1.8 + 32.0;
  Serial.print("T = ");
  Serial.print(celsius);
  Serial.print(" C");
  //Serial.print(fahrenheit);
 // Serial.println(" F");
 
 //Работа Дисплея
  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.println("ON"); //Импровезированный знак градуса
  //display.setCursor(115,5);
  //display.setTextSize(2);
  //display.setTextColor(WHITE);
  //display.println("C"); //Импровезированный знак Цельсия
  display.setCursor(0,43);
  display.setTextSize(3);
  display.setTextColor(WHITE);
  display.print(celsius); //Выводим переменную на дисплей
  display.setCursor(98,43);
  display.setTextSize(1);
  display.setTextColor(WHITE);
  display.println("O"); //Импровезированный знак градуса
  display.setCursor(110,43);
  display.setTextSize(3);
  display.setTextColor(WHITE);
  display.println("C"); //Импровезированный знак Цельсия
  display.display();
  delay(1000);

  // Если температура достигает температуры  отключаем  
  if (celsius >72)
  //{
    digitalWrite(3, HIGH); 
    else digitalWrite(3, LOW); 
 // }
}

 

Гонщик-самогонщик
Offline
Зарегистрирован: 18.06.2015

bwn пишет:

Andrey_Y_Ostanovsky пишет:

bwn пишет:
Значит у меня неправильная колонна. Выше 0,5 градусов от точки равновесия можно смело в помойку выливать. (Колонна ректификационная, самогон не делаю).

http://www.homedistiller.ru/teoria-rektifikacii.htm, хотя Вы - вправе делать все, что хотите. :)

 

 Если вчера Вы наблюдали температуру кипения спирта 77,0ºC, а сегодня – 78,0ºC, то это означает не изменение спиртового состава или неисправность ректификационного устройства, а всего лишь изменение атмосферного давления: вчера было - 730мм.рт.ст., а сегодня – 755мм.рт.ст."

Вот по этой причине и нужно мне фиксировать температуру в конкркетный момент.

bwn
Offline
Зарегистрирован: 25.08.2014

Код не напишу, направление задам.
1. Задаете пин и подвешиваете кнопку.

2. Вашу setTmp делаете float.
3. В цикле постоянно опрашиваете кнопку. Когда температура стабилизировалась, нажимаем кнопку. И setTmp=celsius;
4. Далее мониторим celsius и сравниваем с setTmp. При превышении на >0,2 обрабатываем реле.
5. Для корректной работы п.4 сперва проверяем, что setTmp>0. По этому условию, также блокируем кнопку.
6. Если нажмете кнопку раньше, начнут работать пп.4,5. Коррекция через перезагрузку.
Это самый простой алгоритм, но не самый лучший. Сильно зависит от человека.

Гонщик-самогонщик
Offline
Зарегистрирован: 18.06.2015

Благодарю за направление, попробую изобразить.

JollyBiber
JollyBiber аватар
Offline
Зарегистрирован: 08.05.2012

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

Гонщик-самогонщик
Offline
Зарегистрирован: 18.06.2015

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

#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=0; // переменная для заданного значения температуры
float celsius=celsius; // переменная для текущего значения температуры

const int buttonPin = 2;     // пин кнопки
const int ledPin =  13;      //  LED pin
int buttonState = 0;         // статус кнопки

//#define button_pin 2 //пин кнопки 
#define klapan_pin 3 //пин реле клапана

void setup(void) {
 
  buttonState = digitalRead(buttonPin); //read the state of the pushbutton value
  
  pinMode(buttonPin, INPUT_PULLUP); //подтягиваем входы кнопок к плюсу встроенными резисторами
  pinMode(ledPin, OUTPUT);      //13й вывод - выход 
  
   pinMode(3, OUTPUT); //пин реле 
  digitalWrite(3, LOW);  // Включаем реле
  
  display.begin(SSD1306_SWITCHCAPVCC, 0x3C);  
  display.clearDisplay();
  
  Serial.begin(9600);
 
}

void loop(void) {
  
   // read the state of the pushbutton value:
  buttonState = digitalRead(buttonPin);

  if (buttonState == HIGH) {     
    // turn LED on:    
    digitalWrite(ledPin, LOW );  
  } 
  else {                            // Если кнопка нажата, горит светодиод, иначе нет.
    // turn LED off:
    digitalWrite(ledPin, HIGH); 
  }
 
    
  if (buttonState == HIGH) {     
    
   setTmp=celsius;  
  } 
  else {                         // Если кнопка нажата, записываем в переменную текущую температуру
    
    setTmp=0;  
  }
  
    if (setTmp>0) {     
    pinMode(buttonPin, OUTPUT); //Если переменная больше 0, кнопка активно, иначе заблокирована
    //setTmp= celsius 
  } 
  else {
   pinMode(buttonPin, INPUT_PULLUP); 
  }
  
  if (celsius > (setTmp+0.1)) 
  digitalWrite(3, LOW  );  // Если температура выше зафиксированной на 0,1 С, клапан закрыт {     
    // turn LED on:    
    digitalWrite(3, LOW );  
 // } 
  //else 
    // turn LED off:
     //digitalWrite(3, HIGH); 
   
  
  
  byte i;
  byte type_s;
  byte data[12];
  byte addr[8];
  float celsius, fahrenheit;
  
 

  // Ищем алрес датчика
  if ( !ds.search(addr)) {
    //Serial.println("No more addresses.");
    //Serial.println();
    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;
  //fahrenheit = celsius * 1.8 + 32.0;
  Serial.print("T = ");
  Serial.print(celsius);
  Serial.print(" C");
  //Serial.print(fahrenheit);
 // Serial.println(" F");
 
 //Работа Дисплея
  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.println("ON"); // знак градуса
  //display.setCursor(115,5);
  //display.setTextSize(2);
  //display.setTextColor(WHITE);
  //display.println("C"); // Цельсия
  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);


  
  }

 

Гонщик-самогонщик
Offline
Зарегистрирован: 18.06.2015

Только не смейтесь, я не програмист

bwn
Offline
Зарегистрирован: 25.08.2014

Строки 57-60 после отпускания сбрасывают вашу температуру.
В 53 добавьте второе условие setTemp==0. После фиксации температуры опрос кнопки будет просто игнорироватся и код для блокировки не потребуется.

Гонщик-самогонщик
Offline
Зарегистрирован: 18.06.2015

Благодарю за наводку, завтра поковыряю.

Гонщик-самогонщик
Offline
Зарегистрирован: 18.06.2015

Вроде все делаю как советуете, но не пишется в переменную температура! Замучился с ней. Вывел строчку на экран для нее, показывает тоже нули.

#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) {
 
 // buttonState = digitalRead(buttonPin); //read the state of the pushbutton value
  //pinMode(2, OUTPUT); //пин реле клапана отбора
  pinMode(buttFixPin, INPUT_PULLUP); //подтягиваем входы кнопок к плюсу встроенными резисторами
  //pinMode(buttonPin, INPUT_PULLUP); //подтягиваем входы кнопок к плюсу встроенными резисторами
  pinMode(ledPin, OUTPUT);      //13й вывод индикация нажатия кнопки
  
   pinMode(3, OUTPUT); //пин реле клапана отбора
  //digitalWrite(3, LOW);  // Включаем реле
  
  display.begin(SSD1306_SWITCHCAPVCC, 0x3C);  
  display.clearDisplay();
  
  Serial.begin(9600);
 
}

void loop(void) {
  // считываем состояние кнопок
   buttFixPinCurentState = digitalRead(buttFixPin);
  
  float celsius=celsius; // переменная для текущего значения температуры 
 // buttonState = digitalRead(buttonPin);
  
  if (buttFixPinCurentState == HIGH)digitalWrite(ledPin, LOW ); //Зажигаем светодиод по нажатию кнопки 
  else digitalWrite(ledPin, HIGH); 
  
 //Запись температуры фиксации в переменную    
  if (buttFixPinCurentState == HIGH) 
  {     
     setTmp=celsius;  //Если нажата кнопка, пишем в переменную текущее значение температуры
  } 
  if (buttFixPinCurentState == HIGH)
  {
    setTmp==0;      //Если значение переменной >0, игнорируем нажатие кнопки 
  } 
 // else {                           
  //setTmp=celsius;  
  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");
 //Работа Дисплея
  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.println("ON"); // знак градуса
  //display.setCursor(115,5);
  //display.setTextSize(2);
  //display.setTextColor(WHITE);
  //display.println("C"); // Цельсия
  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);

 }
  
 // }

JollyBiber
JollyBiber аватар
Offline
Зарегистрирован: 08.05.2012

посмотрите строку 55

Гонщик-самогонщик
Offline
Зарегистрирован: 18.06.2015

Закоментировал, ни чего не произошло

У меня уже остатки мозга закипели :)

JollyBiber
JollyBiber аватар
Offline
Зарегистрирован: 08.05.2012

естественно, потому что она была "ни о чем" :)

теперь смотрите "срабатывает"-ли условие в строке 49

Гонщик-самогонщик
Offline
Зарегистрирован: 18.06.2015

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

JollyBiber
JollyBiber аватар
Offline
Зарегистрирован: 08.05.2012

Это Вы предчуствуете или вставляли вывод в сериал значение переменной в условии?

Гонщик-самогонщик
Offline
Зарегистрирован: 18.06.2015

В сериал идет 0.00

bwn
Offline
Зарегистрирован: 25.08.2014

if ( buttFixPinCurentState == HIGH && setTmp==0 ) c 53 по 58 выкинуть

после setTmp=celsius добавьте Serial.println(setTmp);

Доктор зря не присоветует.

bwn
Offline
Зарегистрирован: 25.08.2014

if не обязан иметь одно условие для сравнения. Условия объединяются посредством логических операторов, читаем здесь

Гонщик-самогонщик
Offline
Зарегистрирован: 18.06.2015
#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) {
 
 // buttonState = digitalRead(buttonPin); //read the state of the pushbutton value
  //pinMode(2, OUTPUT); //пин реле клапана отбора
  pinMode(buttFixPin, INPUT_PULLUP); //подтягиваем входы кнопок к плюсу встроенными резисторами
  //pinMode(buttonPin, INPUT_PULLUP); //подтягиваем входы кнопок к плюсу встроенными резисторами
  pinMode(ledPin, OUTPUT);      //13й вывод индикация нажатия кнопки
  
   pinMode(3, OUTPUT); //пин реле клапана отбора
  //digitalWrite(3, LOW);  // Включаем реле
  
  display.begin(SSD1306_SWITCHCAPVCC, 0x3C);  
  display.clearDisplay();
  
  Serial.begin(9600);
 
}

void loop(void) {
  // считываем состояние кнопок
   buttFixPinCurentState = digitalRead(buttFixPin);
  
  float celsius=celsius; // переменная для текущего значения температуры 
 // buttonState = digitalRead(buttonPin);
  
  if (buttFixPinCurentState == LOW)digitalWrite(ledPin, HIGH ); //Зажигаем светодиод по нажатию кнопки 
  else digitalWrite(ledPin, LOW); 
  
 //Запись температуры фиксации в переменную    
  if (buttFixPinCurentState == LOW)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.println("ON"); // знак градуса
  //display.setCursor(115,5);
  //display.setTextSize(2);
  //display.setTextColor(WHITE);
  //display.println("C"); // Цельсия
  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);

 }
  
 // }

 

Гонщик-самогонщик
Offline
Зарегистрирован: 18.06.2015

В сериал нули идут