anders ©:Ардуинщикам повезло больше всех. Все уже у них есть, только надо знать что и где искать.
Есть у меня и такая хрень. Только и без нее можно, просто два электрода в спирт, видит ардуина спирт, правда у меня под рукой только изопропиловый, на него четко реагирует, а вот она без ардуины не видит спирт, воду отлично видит. Буду вводить в прогу, как дополнительное баловство.
Добавлено: 2015-07-08 17:37:58
Продолжение АвтоСем Внимание. Прошивка обновлена, исправлены некоторые ошибки.
Модификация AutoSem v1.
-Добавлены часы и минуты сначала запуска устройства.
-Добавлена индикация температуры на 2/3 высоты колонны (датчик ХВОСТ)
-Добавлен контроль по датчику на 2/3 высоты. Можно реле на отключение или сигналку повесить.
// АвтоСамогон, автоматика для самогоноварения и прочего винокурения. Версия: AutoSem LCD 16*2 v1
// Проект открытый и доступен на сайте https://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 С сделал.
Ленивые всё делают быстро, что бы скорее отделаться от работы и делают хорошо, чтобы не переделывать.С уважением, Николай.
Моё оборудование : → Винокурня Николя