Непонятное влияние напряжения 220 в на работу устройства.
- Войдите на сайт для отправки комментариев
Друзья, помогите разобраться!
Собрал на Ардуине систему с управлением от ПК. Обмениваюсь через порт. От Ардуины чтение на ПК идет штатно, в обратную сторону - тоже. Клапан, вентилятор и нагреватель управляются по цепочкам пин Ардуины -> мос3041 -> ВТА41-600. Для контроля работы "мосек" последовательны с их светодиодами поставлены внешние светодиоды. На всякий случай: +5в и +12 в беру от компьютерного БП. При работе же только от ПК все работает нормально. Скетч:
//__________________БЛОК ИЗМЕРЕНИЯ ТЕМПЕРАТУР #include <OneWire.h> //Подключение библиотеки термометров // Объявление пинов термометров ds18s20 int pin_sensor_colonna=A0; //Пин термодатчика колонны int pin_sensor_water=A1; //Пин термодатчика охлаждения int pin_sensor_cube=A2; //Пин термодатчика куба int pin_sensor_deflegmator=A3; //Пин термодатчика дефлегматора // Объявление пинов исполнения int pin_heat=8; //Синий - ТЭН int pin_cooler=9; //Красный - Вентилятор int pin_valve=10; //Зеленый - Клапан int pin_pump=11; //Белый - Насос (ШИМ) // Объявление пинов считывания из сети int pin_volt=A4; //Пин вольтметра int pin_zero=2; //Пин прерывания зеро-кросс //Cоздаём объекты класса OneWire для 4 датчиков температуры OneWire ds_colonna(pin_sensor_colonna); // Датчик T° колонны на пине A0 OneWire ds_water(pin_sensor_water); // Датчик T° охлаждения на пине A1 OneWire ds_cube(pin_sensor_cube); // Датчик T° куба на пине A2 OneWire ds_deflegmator(pin_sensor_deflegmator); // Датчик T° дефлегматора на пине A3 //________Объявляем переменные температур volatile int temp_colonna; // Температура ректификационной колонны volatile int temp_water; // Температура выходящей воды volatile int temp_cube; // Температура куба volatile int temp_deflegmator; // Температура дефлегматора //Переменная периода опроса термодатчиков long ds18b20_time; //Переменная периода связи ПК и Ардуино long string_time; //Подвязывание рабочих переменных к библиотеке датчиков byte i; byte present = 0; byte data[12]; byte addr_colonna[8]; byte addr_water[8]; byte addr_cube[8]; byte addr_deflegmator[8]; //Строки приема и посыла в порт String string_in; String string_out; //Переменные исполнения volatile int err = 0; //Ошибка дискретизации pdm-модулятора volatile int pp = 1; //Условный индикатор знака полупериода (1 - положительный, -1 - отрицательный) volatile int ps = 0; //ps пропорциональна постоянной составляющей volatile int status_heat=0; //Статус нагрева: 0-отключен, 1-рабочий нагрев, 2-турбо volatile int power_heat=0; //Мощность нагрева в % int pump_value=0; //Мощность насоса в % int valve_value=0; //Статус клапана int cooler_value=0; //Статус вентилятора //Переменные вольметра volatile unsigned long volt_summ=0; //Сумма volatile long volt_meas=0; //Измеренное напряжение volatile long volt_aver=0; //Среднее String volt; //Посыляемое напряжение в символах long time_volt_meas=0; //Период измерения напряжения int clc=0; //Число измерений void setup() { // Объявляем скорость порта Serial.begin(115200); attachInterrupt(0, ZEROCROSS, CHANGE); //Инициализация прерывания зеро-кросс (INT1) для нагрева //Инициализация пинов управления pinMode (pin_heat, OUTPUT); //Синий - ТЭН pinMode (pin_cooler, OUTPUT); //фиолетовыйй - Вентилятор pinMode (pin_valve, OUTPUT); //Серый - Клапан pinMode (pin_pump, OUTPUT); //Белый - Насос (ШИМ) //Инициализация пинов термодатчиков pinMode(pin_sensor_colonna, INPUT); //Термодатчик колонны pinMode(pin_sensor_cube, INPUT); //Термодатчик куба pinMode(pin_sensor_water, INPUT); //Термодатчик охлаждения pinMode(pin_sensor_deflegmator, INPUT); //Термодатчик дефлегматора //Инициализация пина вольтметра pinMode(pin_volt, INPUT); //Запрос термодатчикам на измерение температуры if ( !ds_colonna.search(addr_colonna)) {} if ( !ds_cube.search(addr_cube)) {} if ( !ds_water.search(addr_water)) {} if ( !ds_deflegmator.search(addr_deflegmator)) {} //Инициируем датчики температуры //Колонна ds_colonna.reset(); ds_colonna.select(addr_colonna); ds_colonna.write(0x44); //Куб ds_cube.reset(); ds_cube.select(addr_cube); ds_cube.write(0x44); //Охлаждение ds_water.reset(); ds_water.select(addr_water); ds_water.write(0x44); //Дефлегматор ds_deflegmator.reset(); ds_deflegmator.select(addr_deflegmator); ds_deflegmator.write(0x44); } void loop() { //Вольтметр if (millis()-time_volt_meas>2) //По прошествии 2 миллисекунды { //time_volt_meas=millis(); //Обнуляем таймер volt_meas=analogRead(pin_volt); //Измеряем напряжение в "0-1023" volt_meas=volt_meas*volt_meas; //Возводим к вадрат volt_summ=volt_summ+volt_meas; //Суммируем clc++; //Считаем количество измерений if (clc==571) //Если количество измерений = 571 { volt_aver=volt_summ/571; //Делим сумму на количество измерений volt_aver=sqrt(volt_aver); //Извлекаем корень volt_aver=volt_aver/2.51; //Переводим "0-1023" в вольты if (volt_aver<10) {volt="00" + String(volt_aver);} if (volt_aver<100 && volt_aver>9) {volt="0" + String(volt_aver);} if (volt_aver<1000 && volt_aver>99) {volt=String(volt_aver);} //volt="00" + String(volt_aver); volt_summ=0; volt_meas=0; volt_aver=0; clc=0; time_volt_meas=millis(); //Обнуляем таймер } } //Обмен данными ПК и Ардуино if (millis()-string_time>200) { //Читаем строку из порта //Формат: Доля мощности Статус нагрева Насос Клапан Вентилятор // p000 f0 s000 t0 v0#*/ //Читаем строку из порта до знака окончания "#" String string_in = Serial.readStringUntil('#'); int lenstr = string_in.length(); if (lenstr == 14) //Проверка длительности строки { //Вычленяем и управляем мощностью нагрева String status_heat_string = string_in.substring (5,6); //Чтение статуса нагрева status_heat = status_heat_string.toInt(); if (status_heat == 0) {digitalWrite (pin_heat, LOW);} //Нагрев запрещен if (status_heat == 2) {digitalWrite (pin_heat, HIGH);} //Турбонагрев String power_heat_string = string_in.substring (1,4); //Чтение мощности нагрева power_heat = power_heat_string.toInt(); //Вычленяем и управляем мощностью насоса String pump_string = string_in.substring (7,10); pump_value = pump_string.toInt(); analogWrite (pin_pump, pump_value); //Вычленяем и включаем/выключаем вентилятор String cooler_string = string_in.substring (13,14); cooler_value = cooler_string.toInt(); if (cooler_value==1) { digitalWrite (pin_cooler, HIGH); } else { digitalWrite (pin_cooler, LOW); } //Вычленяем и включаем/выключаем клапан String valve_string = string_in.substring (11,12); valve_value = valve_string.toInt(); if (valve_value==1) { digitalWrite (pin_valve, HIGH); } else { digitalWrite (pin_valve, LOW); } } //Посылаем строку температур и напряжения в порт //string_out='p' + String(power_heat) + 'f' + String(status_heat) + 's' + String(pump_value) + 't' + String(valve_value) + 'v' + String(cooler_value); string_out=String(temp_colonna) + '-' + String(temp_water) + '-' + String(temp_cube) + '-' + String(temp_deflegmator) + '-' + volt; Serial.println (string_out); string_time=millis(); //Временная петля 200 мс } //Опрос показаний датчиков температуры 1 раз в 850 мсек if (millis()-ds18b20_time>850) { //Опрашиваем датчик колонны present = ds_colonna.reset(); ds_colonna.select(addr_colonna); ds_colonna.write(0xBE); for ( i = 0; i < 9; i++) { data[i] = ds_colonna.read(); } int16_t raw = (data[1] << 8) | data[0]; temp_colonna=raw / 1.6; //Опрашиваем датчик куба present = ds_cube.reset(); ds_cube.select(addr_cube); ds_cube.write(0xBE); for ( i = 0; i < 9; i++) { data[i] = ds_cube.read(); } raw = (data[1] << 8) | data[0]; temp_cube=raw / 1.6; //Опрашиваем датчик охлаждения present = ds_water.reset(); ds_water.select(addr_water); ds_water.write(0xBE); for ( i = 0; i < 9; i++) { data[i] = ds_water.read(); } raw = (data[1] << 8) | data[0]; temp_water=raw / 1.6; //Опрашиваем датчик дефлегматора present = ds_deflegmator.reset(); ds_deflegmator.select(addr_deflegmator); ds_deflegmator.write(0xBE); for ( i = 0; i < 9; i++) { data[i] = ds_deflegmator.read(); } raw = (data[1] << 8) | data[0]; temp_deflegmator=raw / 1.6; //Очередной запрос датчикам на измерение температуры if ( !ds_colonna.search(addr_colonna)) {} if ( !ds_cube.search(addr_cube)) {} if ( !ds_water.search(addr_water)) {} if ( !ds_deflegmator.search(addr_deflegmator)) {} //Инициируем датчики температуры //Колонна ds_colonna.reset(); ds_colonna.select(addr_colonna); ds_colonna.write(0x44); //Куб ds_cube.reset(); ds_cube.select(addr_cube); ds_cube.write(0x44); //Охлаждение ds_water.reset(); ds_water.select(addr_water); ds_water.write(0x44); //Воздух ds_deflegmator.reset(); ds_deflegmator.select(addr_deflegmator); ds_deflegmator.write(0x44); ds18b20_time=millis(); } } void ZEROCROSS () //Переход через ноль (греем ТЭН по Брезенхему) { if (status_heat == 1) //Если нагрев в рабочем режиме { if (digitalRead (pin_zero)==LOW) { int pulse = 0; int lev = power_heat + err; // Текущий уровень с учетом ошибки дискретизации, сделанной на предыдущем полупериоде. if(lev >= 50) { pulse = 1; /* Нужно бы подать импульс, но проверим на постоянную составляющую. Если pulse == 1, но подача импульса приведет к увеличению постоянной составляющей, то отложим подачу импульса на следующий полупериод. Он будет другого знака, что приведет к уменьшению постоянной составляющей */ } if(ps*pulse*pp > 0) { pulse = 0; } if(pulse) { digitalWrite(pin_heat, HIGH); err = lev - 100; // Считаем ошибку для следующего полупериода } else { digitalWrite(pin_heat, LOW); err = lev; } ps += pp*pulse; // Считаем текущую постоянную составляющую pp = -pp; // Следующий полупериод будет другого знака } else { digitalWrite(pin_heat, LOW); } } else { digitalWrite(pin_heat, LOW); } }
При подключении питания 220в цепочка нагревателя перестает работать. Гаснет контрольный светодиод, естественно, никакой мощности в нагрузку не идет. Сначала думал, что дело в разводке. Обнюхал-перенюхал всё - никаких ошибок в монтаже. Для проверка с отчаяния обкорнал скетч до минимума. Все встало на место: при подключении 220в контрольный светодиод горит, мощность в нагреватель подается. Скетч:
//__________________БЛОК ИЗМЕРЕНИЯ ТЕМПЕРАТУР #include <OneWire.h> //Подключение библиотеки термометров // Объявление пинов термометров ds18s20 int pin_sensor_colonna=A0; //Пин термодатчика колонны int pin_sensor_water=A1; //Пин термодатчика охлаждения int pin_sensor_cube=A2; //Пин термодатчика куба int pin_sensor_deflegmator=A3; //Пин термодатчика дефлегматора // Объявление пинов исполнения int pin_heat=8; //Синий - ТЭН int pin_cooler=9; //Красный - Вентилятор int pin_valve=10; //Зеленый - Клапан int pin_pump=11; //Белый - Насос (ШИМ) // Объявление пинов считывания из сети int pin_volt=A4; //Пин вольтметра int pin_zero=2; //Пин прерывания зеро-кросс //Cоздаём объекты класса OneWire для 4 датчиков температуры OneWire ds_colonna(pin_sensor_colonna); // Датчик T° колонны на пине A0 OneWire ds_water(pin_sensor_water); // Датчик T° охлаждения на пине A1 OneWire ds_cube(pin_sensor_cube); // Датчик T° куба на пине A2 OneWire ds_deflegmator(pin_sensor_deflegmator); // Датчик T° дефлегматора на пине A3 //________Объявляем переменные температур volatile int temp_colonna; // Температура ректификационной колонны volatile int temp_water; // Температура выходящей воды volatile int temp_cube; // Температура куба volatile int temp_deflegmator; // Температура дефлегматора //Переменная периода опроса термодатчиков long ds18b20_time; //Переменная периода связи ПК и Ардуино long string_time; //Подвязывание рабочих переменных к библиотеке датчиков byte i; byte present = 0; byte data[12]; byte addr_colonna[8]; byte addr_water[8]; byte addr_cube[8]; byte addr_deflegmator[8]; //Строки приема и посыла в порт String string_in; String string_out; //Переменные исполнения volatile int err = 0; //Ошибка дискретизации pdm-модулятора volatile int pp = 1; //Условный индикатор знака полупериода (1 - положительный, -1 - отрицательный) volatile int ps = 0; //ps пропорциональна постоянной составляющей volatile int status_heat=0; //Статус нагрева: 0-отключен, 1-рабочий нагрев, 2-турбо volatile int power_heat=0; //Мощность нагрева в % int pump_value=0; //Мощность насоса в % int valve_value=0; //Статус клапана int cooler_value=0; //Статус вентилятора //Переменные вольметра volatile unsigned long volt_summ=0; //Сумма volatile long volt_meas=0; //Измеренное напряжение volatile long volt_aver=0; //Среднее String volt; //Посыляемое напряжение в символах long time_volt_meas=0; //Период измерения напряжения int clc=0; //Число измерений void setup() { // Объявляем скорость порта Serial.begin(115200); //Инициализация пинов управления pinMode (pin_heat, OUTPUT); //Синий - ТЭН pinMode (pin_cooler, OUTPUT); //фиолетовыйй - Вентилятор pinMode (pin_valve, OUTPUT); //Серый - Клапан pinMode (pin_pump, OUTPUT); //Белый - Насос (ШИМ) /*/Инициализация пинов термодатчиков pinMode(pin_sensor_colonna, INPUT); //Термодатчик колонны pinMode(pin_sensor_cube, INPUT); //Термодатчик куба pinMode(pin_sensor_water, INPUT); //Термодатчик охлаждения pinMode(pin_sensor_deflegmator, INPUT); //Термодатчик дефлегматора //Инициализация пина вольтметра pinMode(pin_volt, INPUT); //Запрос термодатчикам на измерение температуры if ( !ds_colonna.search(addr_colonna)) {} if ( !ds_cube.search(addr_cube)) {} if ( !ds_water.search(addr_water)) {} if ( !ds_deflegmator.search(addr_deflegmator)) {} //Инициируем датчики температуры //Колонна ds_colonna.reset(); ds_colonna.select(addr_colonna); ds_colonna.write(0x44); //Куб ds_cube.reset(); ds_cube.select(addr_cube); ds_cube.write(0x44); //Охлаждение ds_water.reset(); ds_water.select(addr_water); ds_water.write(0x44); //Дефлегматор ds_deflegmator.reset(); ds_deflegmator.select(addr_deflegmator); ds_deflegmator.write(0x44);*/ } void loop() { /*/Вольтметр if (millis()-time_volt_meas>2) //По прошествии 2 миллисекунды { //time_volt_meas=millis(); //Обнуляем таймер volt_meas=analogRead(pin_volt); //Измеряем напряжение в "0-1023" volt_meas=volt_meas*volt_meas; //Возводим к вадрат volt_summ=volt_summ+volt_meas; //Суммируем clc++; //Считаем количество измерений if (clc==571) //Если количество измерений = 571 { volt_aver=volt_summ/571; //Делим сумму на количество измерений volt_aver=sqrt(volt_aver); //Извлекаем корень volt_aver=volt_aver/2.51; //Переводим "0-1023" в вольты if (volt_aver<10) {volt="00" + String(volt_aver);} if (volt_aver<100 && volt_aver>9) {volt="0" + String(volt_aver);} if (volt_aver<1000 && volt_aver>99) {volt=String(volt_aver);} //volt="00" + String(volt_aver); volt_summ=0; volt_meas=0; volt_aver=0; clc=0; time_volt_meas=millis(); //Обнуляем таймер } }*/ //Обмен данными ПК и Ардуино if (millis()-string_time>200) { digitalWrite (pin_heat, HIGH); //Турбонагрев analogWrite (pin_pump, 255); digitalWrite (pin_cooler, HIGH); digitalWrite (pin_valve, HIGH); //string_out=String(temp_colonna) + '-' + String(temp_water) + '-' + String(temp_cube) + '-' + String(temp_deflegmator) + '-' + volt; //Serial.println (string_out); string_time=millis(); //Временная петля 200 мс } }
Понял, что где-то напортачил в скетче. Стал искать - измучился, два дня не могу найти, где-то мне знаний не хватает. Посмотрите, пожалуйста, свежим оком - может, что бросится в глаза? Или подскажите, где копать?
Заранее благодарен!
Протокол, идущий в Ардуину:
"p000f0s000t0v0", где:
p000 - доля мощности нагрева в %
f0 - статус нагрева (0 - отключен, 1 - рабочий режим, 2 - разгон)
s000 - доля мощности насоса (управляю по ШИМ)
t0 - статус клапана (0 - закрыт, 1 - открыт)
v0 - статус вентилятора автономного охлаждения (0 - выключен, 1 - включен)
Я бы вольтметр сначала отключил, заменив на постоянныем значения
Спасибо, попробую. Ну, я на него в первую очередь грешил, однако на первый (мой, неквалифицированный) взгляд как-то связи не угляделось. Тем не менее, вечером попробую. Уточните: надо отрубить поступающее на него напряжение (там трансформатор, мост и чтение аналоговым пином с пересчетом RMS)? Или оставить его включенным, но переменную напряжения считать не среднеквадратично, а просто присвоить ей некое значение? И тут еще один момент: напруга 220в никак не влияет на совершенно идентичные другие две ветки (те же моськи с нагрузкой сисмистором), а только конкретно на эту.
переменную напряжения считать не среднеквадратично, а просто присвоить ей некое значение
Я это имел ввиду. Чтобы он как-бы работал, но был прост и "прозрачен")). Если нет - дальше отключать по блочно.
Понил, мурси :)
Попытка отрубить вольтметр ни к чему не привела. Значит, дело не в нем. Уточню ситуацию. При подключении 220в (статус нагрева при этом подается в Ардуину как ==2, то есть полная мощность) лампа на нагрузке, имитирующая ТЭН, хаотически слабенько (не в полную мощность) мигает. При отключении провода от детектора нуля к пину прерывания int0 (220в при этом подается) работа в этом режиме восстанавливается (лампа горит в полный накал). При статусе нагрева == 0, естественно, нагрев отрубается, лампа гаснет. То есть, несмотря на четкое указание в скетче, что если статус нагрева == 2 (строка 147) и надо бы открыть трак полностью, прерывание почему-то влияет на работу пина, управляющего триаком нагрева. Не могу понять, почему.
Проверь контакты в проводке 220В, скорее всего где-то плохой контакт ну и сам понимаешь к чему это может привести. Что можно пропаять - пропаять, где нельзя спаять - облупить что возможно и на болтовое соединение.
Возможно неправильно выписаноиусловие ст258 и 292. т.е не учитывается статус==2
Проводка качественная. Проверил, естественно. К тому же, отключение системы зерокросс приводит к нормальному функционированию. Так что, 220в само по себе ни при чем :(
Спасибо, надо будет подумать. С другой стороны, вся процедура в ZEROCROSS по идее должна выполняться только при условии статуса ==1.
Спасибо, надо будет подумать. С другой стороны, вся процедура в ZEROCROSS по идее должна выполняться только при условии статуса ==1.
Да, но
else { digitalWrite(pin_heat, LOW); }
А иначе, может быть и 0, и 2. Поэтому при статус==2, в прерывании всегда
digitalWrite(pin_heat, LOW);, отсюда и мигание ИМХО
Таааак, логично. Надо проверить! Спасибо!
Прописал возможные статусы нагрева в этом "else" :
ПОБЕДА!!!!!!!!!
Друзья, всем спасибо за помощь!
Таааак, логично. Надо проверить! Спасибо!
Прописал возможные статусы нагрева в этом "else" :
ПОБЕДА!!!!!!!!!
Друзья, всем спасибо за помощь!
Как я понимаю, так вы и операции людям делаете...(((
Не, там я профи, а в программировании пока еще ламер позорный.
Ага. А кто оценивает? Или сам себя не похвалишь... Удобно ведь, согласитесь?
Люди говорят, что я лекарь толковый. Да и 42 года стажа - тоже не хухры-мухры. Но это похвальба, а констатация: в своем деле я явно лучше, нежели в программировании. :)
Поздравляю!))
Поясните мне, пожалуйста, в чем в моем случае разница между attachInterrupt(0, ZEROCROSS, CHANGE); и attachInterrupt(0, ZEROCROSS, RISING); ?
Чтобы не плодить многострочные посты - это про фрагмент моего скетча из первого поста, тот, что
void
ZEROCROSS () - управление нагревом по прерыванию. Работают оба варианта аттача, но RISING временами сбоит, что проявляется в кратковременном, не всегда появляющимся коротком частом мерцании контрольной лампочки. Если определять уровень, приходящий с детектора перехода через ноль, как сделано в исходном скетче (cHANGE), то все отрабатывается правильно. Хотя, вроде бы и там и там мы схватываем высокий уровень. Добавлю, что в приведенном в первом посте скетче в строке 260 была сделана описка, надо:
if
(digitalRead (pin_zero)==HIGH), но для сути вопроса это не важно.
Чем же в данном случае
отличаются RISING и CHANGE?Заранее спасибо!
Rising срабатывает только по переднему фронту, а Change - по обоим
Да это я в курсе. Вопрос в другом. Чендж по заднему фронту в скетче игнорируется. То есть, и там и там отлавливается одна и та же ситуация: либо передний фронт, результатом которого будет высокий уровень либо сам высокий уровень.
А почему при этом одно сбоит, а другое - нет - непонятно.
Чендж по заднему фронту в скетче игнорируется. То есть, и там и там отлавливается одна и та же ситуация: либо передний фронт, результатом которого будет высокий уровень либо сам высокий уровень.
У Вас, что, уже другой скетч? В #1 такого не вижу
И, кстати, а какая схема контроля перехода через 0?
Люди говорят, что я лекарь толковый. Да и 42 года стажа - тоже не хухры-мухры. Но это похвальба, а констатация: в своем деле я явно лучше, нежели в программировании. :)
у меня тут в твоём деле есть некий когнитивный диссонанс, можешь глянуть?
Если да, дай знать куда написать...
Конечно, если в силах - решим когнитивный вопрос. почта bma280156@mail.ru Один момент: как с работы уйду (после суток), а тут почта вырублена. До домашнего ПК доберусь завтра после 15:00. Не горит?
Димыч, если не возражаете, перенесем разговор на завтра. Я на сутках. Выложу и скетч и схему. Но из дома (всё там). Скетч, кстати тот же самый, только с опиской (я уже выше указал).
Я к тому, что при CHANGE, всё же отрабатываются условия после else, стр.293. по заднему фронту. А главное - какая схема?
Я, кстати, тоже уже буду занят на несколько часов...
Может просто не успевает из прерывания выйти?
Там времени хоть ж....й ешь. Завтра выложу рабочий скетч, схему и осциллограммы. Вопрос о неуспевании отпадет сразу.
Ты же ченьж с ризинг сравниваешь, откуда такая уверенность?
Бум, лучше не "на пальцах". После обеда выложу предмет обсуждения, и тогда... ага?
Вот посмотри вариант автоматики. https://www.youtube.com/watch?v=g4k4wOmfxXc&t=3s Работает очень хорошо, и достаточно простая. Управление или с сенсорного экрана или с компа или с телефона по вай фай. В комментариях, в конце есть ссылка на стабилизированный регулятор мощности. Может работать как автономно так и от автоматики по КОМ порту. Мощность может задаваться от 0 до 100%.
СВМ, спасибо, посмотрел. Но это готовое устройство. Мне интересно сделать все самому. Это первое. Второе - почему сделал смычку ПК-Ардуино - на экране монитора все лучше видно, а тыкание пальцем в маленький экран - так себе по удобству управления. Но в целом - спасибо, интересно.
Друзья, затыку с райзингом нашел: при выводе на осциллограф видны всплески по обоим фронтам, видимо, Ардуина их беспорядочно понимает. При чендже считывается конечный (HIGH) уровень, и все работает стабильно. Так что, оставлю чендж и голову себе не буду ломать удалением всплесков. Так что, всем спасибо.
ua6em, письмо пришло, но оно пустое. Пишите, что хочется спросить.
видны всплески по обоим фронтам
Возможно поможет конденсатор ~100пкф
P.S. Да и кривой скетч, может быть причиной "всплесков"
СВМ, спасибо, посмотрел. Но это готовое устройство. Мне интересно сделать все самому. Это первое. Второе - почему сделал смычку ПК-Ардуино - на экране монитора все лучше видно, а тыкание пальцем в маленький экран - так себе по удобству управления. Но в целом - спасибо, интересно.
Почему готовое? Там есть исходники, достаточно хорошо прокомментированные. А главное есть алгоритм дистилляции и ректификации, составленный гуру самогоноварения. И управление с компьютера достаточно удобное. Крупные картинки, выбор всех параметров и информативны графики температур, с возможностью записи на карту для анализа. Я в начале запустил на ESP-01. Только с датчиками температуры и клапаном отбора тела. Попробовал работать, но оказалось что при сильном отличии атмосферного давления от 765 при отсутствии датчика давления, работа колонны не идеальна, т.к. не учитывается температура кипения спирта в зависимости от давления. И вместо 96.6 можно получить 94, а то и 92. После включения датчика давления, стабильно 96.6 за все время перегона. Конечно на вкус различия не чувствуется, но надо стремиться к идеалу, т.к. я на старости лет решил вести ЗОЖ. Кроме самогона еще и табак в этом году посадил.
Это я себе все содрал беззастенчиво, поизучаю обязательно: теорией брезговать грех. А вот с проблемой насчет неучета температуры кипения спирта на фоне гуляния давления и как её следствия - получения меньшей спиртуозности не сталкивался ни разу. Уж не знаю, как можно в домашних условиях это контролировать иначе чем АСП-3 (лучше, конечно, АСП-1, но у меня такого большого "попугая нет") :). У меня два регулятора: на РМ-2 (стабилизированный источник мощности - режет полупериоды) и моя "какашка" (алгоритм Брезенхема, пока без стабилизации оной, но если надо будет - доделаю). Так вот, столкнулся со странной ситуацией, идущей в разрез с теорией и мнением гуру самогонщиков. В частности, категорическое утверждение, что мощность нагрева надо подавать исключительно стабильно, меня сразу немного смутило. Если бы речь шла о нагревателе в 1 квт и литровом кубе - еще можно об этом говорить. Но когда дело касается утепленного кега - 30ки или 50-ки, то тепловая инерция системы там такая, что сгладит любые колебания напряжения в сети (в разумных пределах, конечно). У меня колонна с отсечкой хвостов, регуляцией отбора клапаном и управлением автономной системой охлаждения. То есть, полная автоматика: включил, настроил и периодически приглядывай не всякий случай. Провел эксперимент в прошлом еще году. Постарался выдержать одинаковые температурные (и прочие) условия в двух вариантах: нагрев стабилизированный на РМ-2 и на моей "системе". На выходе - абсолютно равное количество продукта крепостью чуть больше 96° при температуре 20°С (ареометр "тонет" чуть-чуть ниже отметки 96°). Разумеется, на вкус никакой разницы нет.Вот и думаю, надо ли ваять стабилизатор мощности? Напруга гуляет несильно, обычно в пределах 210-230 вольт в розетке. Хотя, программно это сделать не так сложно: дельта доли мощности ТЭНа пропорциональна квадрату дельты напряжения. Как-то так. Прошу попинать мощными аргументами :)
Всплески на "ноге" детектора, так что, скетч тут не очень-то причем :) Конденсатор поставил в первую очередь, "борода" уменьшилась, но проблема не ушла. Пока плюнул, оставил CHANGE - работает стабильно.
Всплески на "ноге" детектора, так что, скетч тут не очень-то причем :) Конденсатор поставил в первую очередь, "борода" уменьшилась, но проблема не ушла. Пока плюнул, оставил CHANGE - работает стабильно.
замерить длительность этих всплесков и "программная защита дребезга"
Пока плюнул, оставил CHANGE - работает стабильно.
Принято! Как говорится, работает - не трогай!
И всё же приятно, когда код работает, не как ему всбрендится, а как задумано))
Лень родилась раньше нас, старик. Как говорил, оставлю в покое нормально работающий CHANGE. :) Но в плане - замена триггера. Он хамит, как выяснилось, битый, наверное, но я с таким никогда не сталкивался. Обычно или работает или нет. На вход с детектора фронты приходят вполне пристойные. Добегу до чипдипа только.
Кстати, где письмо? Скинь на почту, пока я дома.
Вот и думаю, надо ли ваять стабилизатор мощности? Напруга гуляет несильно, обычно в пределах 210-230 вольт в розетке. Хотя, программно это сделать не так сложно: дельта доли мощности ТЭНа пропорциональна квадрату дельты напряжения. Как-то так. Прошу попинать мощными аргументами :)
Ну у меня условия хуже. Нахожусь почти в конце улицы и передо мной есть достаточно мощные потребители. Поэтому напряжение гуляет 200 - 250 вольт. Если с мощностью ТЭНа вопрос решен, то автономная система охлаждения подводит. Там стоит обычный циркуляционный насос на 220 В и вентилятор тоже на 220. Последний раз из-за повышения напряжения получился захлеб и спиртовая баня. Благо все отключилось по датчику паров спирта. Все произошло из за переохлаждения флегмы. При 230В температура на выходе дефлегматора 37-40 градусов, а при 250 упала до 28 и в результате захлеб. Так что стабилизатор наверное придется ставить, а то процесс длительный 10-12 часов и следить за напряжением и переключать режимы насоса проблематично. Правда можно попробовать медленный ШИМ (включать/выключать систему охлаждения), но это уже наверное осенью, т.к. сейчас 30 соток земли не оставляют свободного времени.
Письмо посмотрел, по мере сил ответил. Немного не мой профиль, но на первый взгляд - не катастрофично.
Уточните, в чем подводит автономка-то? И ее конструкция какая? Циркуляционник даже при пониженном напряжении должен обеспечивать охлаждение, так что странно. У меня вообще стоит 12-вольтовая помпа "Умница": https://avatars.mds.yandex.net/get-mpic/5229821/img_id7118185316040464228.png/orig и пашет как папакарло. А у него производительность куда ниже любого циркуляционника. Я установил алгоритм так: пока идет разогрев ("тапок в пол"), насос выключен. Когда Т° колонны дойдет до 66°С, ТЭН переключается в режим рабочего нагрева, включается насос. Когда Т° воды на выходе автономки дойдет до 36°С (это устанавливается), включается вентилатор, как упадет - вентилятор выключается. Автономка держит температуру охлаждения +/- 3°С от установленной. Этого вполне достаточно и от напруги в сети не зависит: просто вентилятор включается или чаще или реже. Так что, регулировать охлаждение надо не насосом, а вентилятором.
Уточните, в чем подводит автономка-то? И ее конструкция какая? Циркуляционник даже при пониженном напряжении должен обеспечивать охлаждение, так что странно. У меня вообще стоит 12-вольтовая помпа "Умница": https://avatars.mds.yandex.net/get-mpic/5229821/img_id7118185316040464228.png/orig и пашет как папакарло. А у него производительность куда ниже любого циркуляционника. Я установил алгоритм так: пока идет разогрев ("тапок в пол"), насос выключен. Когда Т° колонны дойдет до 66°С, ТЭН переключается в режим рабочего нагрева, включается насос. Когда Т° воды на выходе автономки дойдет до 36°С (это устанавливается), включается вентилатор, как упадет - вентилятор выключается. Автономка держит температуру охлаждения +/- 3°С от установленной. Этого вполне достаточно и от напруги в сети не зависит: просто вентилятор включается или чаще или реже. Так что, регулировать охлаждение надо не насосом, а вентилятором.
Подводит из за того, что я надеялся на неизменные характеристики и сделал только контроль за температурами и расходом воды. А в реальности охлаждение сильно зависит от напряжения. Если при 230В расход около 180 л/час то при 250 уже 400, отсюда и переохлаждение. Нужно немного доработать скетч и поставить пару релюшек для насоса и вентилятора. Но со временем пока туго. А конструкцию можно посмотреть тут https://www.youtube.com/watch?v=g19EroMPwL8&t=1s
Я не совсем понял, в чем надобность контролировать расход воды? Повторюсь, его можно сделать постоянным. Я свой не измерял, но по паспорту Умница качает 3,5 литра воды в минуту. Учитывая, что я его ШИМом питаю на 50%, то расход ЗНАЧИТЕЛЬНО меньше, но этого хватает за глаза. Регулировать же охлаждение по моему мнению надо работой вентилятора. Это проще и эффективнее: температурный датчик на выход воды и от его показаний включать или выключать пропеллер. И все, никакого переохлаждения или недоохлаждения не будет.
Как-то вот так: https://www.youtube.com/watch?v=8UYblNeYzZI
Я не совсем понял, в чем надобность контролировать расход воды? Повторюсь, его можно сделать постоянным. Я свой не измерял, но по паспорту Умница качает 3,5 литра воды в минуту. Учитывая, что я его ШИМом питаю на 50%, то расход ЗНАЧИТЕЛЬНО меньше, но этого хватает за глаза. Регулировать же охлаждение по моему мнению надо работой вентилятора. Это проще и эффективнее: температурный датчик на выход воды и от его показаний включать или выключать пропеллер. И все, никакого переохлаждения или недоохлаждения не будет.
Как-то вот так: https://www.youtube.com/watch?v=8UYblNeYzZI
Расход в принципе не нужен, но просто датчик был, вот и поставил. Но благодаря ему я обратил внимание на большую зависимость системы от напряжения сети. Ну и возможно подключу его к системе безопасности. Мало ли что трубка какая слетит или насос встанет. Ну а управление вентилятором, я так-же планировал. Просто сначала хотел посмотреть как это все работает, но временное как правило становится постоянным.
Можно даже и не смотреть :) У меня система автономки (я описывал выше) уже три сезона трудится без проблем. Еще раз:
1. Радиатор хоть от авто, хоть от кондиционера
2. Воду подавать постоянно, не меняя, достаточно 5 л/мин за глаза.
3. Вентилятор запускать и останавливать по устанавливаемой температуры с термодатчика на обратке.
4. Датчик расхода на аварийный сигнал - правильное решение.
Временное-постоянное - вопрос дискутабельный. Я в юности довольно много паял, правда, дело имел больше с аналогом (УНЧ, гитарные примочки и т.д.), неплохо зарабатывал на местных ВИА :). Сейчас вспомнил молодость, приложил умение держать паяльник в самогоноварению, ну и понеслось. Сейчас у меня уже 5-й вариант автоматики, каждый сложнее и лучше предыдущего. Так что, не делай временное постоянным :)
Можно даже и не смотреть :) У меня система автономки (я описывал выше) уже три сезона трудится без проблем. Еще раз:
1. Радиатор хоть от авто, хоть от кондиционера
2. Воду подавать постоянно, не меняя, достаточно 5 л/мин за глаза.
3. Вентилятор запускать и останавливать по устанавливаемой температуры с термодатчика на обратке.
4. Датчик расхода на аварийный сигнал - правильное решение.
Временное-постоянное - вопрос дискутабельный. Я в юности довольно много паял, правда, дело имел больше с аналогом (УНЧ, гитарные примочки и т.д.), неплохо зарабатывал на местных ВИА :). Сейчас вспомнил молодость, приложил умение держать паяльник в самогоноварению, ну и понеслось. Сейчас у меня уже 5-й вариант автоматики, каждый сложнее и лучше предыдущего. Так что, не делай временное постоянным :)
Полностью согласен со всеми пунктами, но стабилизатор на циркуляционный насос надо искать. В последний раз запустил процесс, дождался пока колонна стабилизируется (головы были уже отобраны), запустил отбор тела и пошел спать. Часа в два ночи завыла сирена. Сосед выключил поливалку, а она у него жрет 11 КВт и напряжение подскочило на 30 вольт. В результате насос и вентилятор закрутились бодрее и температура с 40 упала ло 28 градусов. В результате захлеб и паровая баня. Спас датчик паров спирта. ТЭН отключился и процесс остановился по аварии.
А насчет молодости, ситуация аналогичная. Тоже занимался изготовлением примочек и ремонтом оборудования ВИА. Особенно запомнилось, что 2-3 раза в месяц приходилось таскать домой КИНАПовские динамики на перемотку. Уж больно басист любил мощщи поддать.
Понятно, сосед свои 11 квт на одну фазу посадил. У тебя другая фаза, а ноль хреновый, вот его сосед на себя и потащил со своей мощностью. Значит, на двух других фазах напруга подскочит. Вот поэтому и надо поставить помпу 12-вольтовую. Подойдет Умница, да любой аквариумный или фонтанный насосик. Его вполне хватит, и от напруги он сильнее качать не будет.
А насчет перемотки кинаповских динамиков - да, та еще песня. Да и качество их так себе было. Вот собрать в кучку несколько 8-ГД-1 - вот это классная колонка для баса получалась. А усилки мы ребятам копировали Маршаллы на сдвоенных Е27 (кажись так они назывались).
А насчет перемотки кинаповских динамиков - да, та еще песня. Да и качество их так себе было. Вот собрать в кучку несколько 8-ГД-1 - вот это классная колонка для баса получалась. А усилки мы ребятам копировали Маршаллы на сдвоенных Е27 (кажись так они назывались).
да нормально они мотаются и СССР любые тоже, ты бы японские попробовал перематывать, было бы с чем сравнивать ))) у меня пара динамиков имеется (4A32 или 4A28), всё хотел колонки сделать, а приятель сделал по маршаловской (Биговской) схеме 2 по 100 на ГУ-50, а предварительные гитарные были в нём жеж но уже на транзисторах, ох он и поездил по Сочам )))
А вот цифровой ревербератор это да, на РУ3, у Барыкина был такой жеж, с хорусом...давненько это было 1978-80 где-то