Непонятное влияние напряжения 220 в на работу устройства.

Sonologist
Sonologist аватар
Offline
Зарегистрирован: 08.06.2018

Друзья, помогите разобраться!

Собрал на Ардуине систему с управлением от ПК. Обмениваюсь через порт. От Ардуины чтение на ПК идет штатно, в обратную сторону - тоже. Клапан, вентилятор и нагреватель управляются по цепочкам пин Ардуины -> мос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 мс 
  }
    
}

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

Заранее благодарен!

 

Sonologist
Sonologist аватар
Offline
Зарегистрирован: 08.06.2018

Протокол, идущий в Ардуину:

"p000f0s000t0v0", где:

p000 - доля мощности нагрева в %

f0 - статус нагрева (0 - отключен, 1 - рабочий режим, 2 - разгон)

s000 - доля мощности насоса (управляю по ШИМ)

t0 - статус клапана (0 - закрыт, 1 - открыт)

v0 - статус вентилятора автономного охлаждения (0 - выключен, 1 - включен)

 

Дим-мычъ
Offline
Зарегистрирован: 20.03.2021

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

Sonologist
Sonologist аватар
Offline
Зарегистрирован: 08.06.2018

Спасибо, попробую. Ну, я на него в первую очередь грешил, однако на первый (мой, неквалифицированный) взгляд как-то связи не угляделось. Тем не менее, вечером попробую. Уточните: надо отрубить поступающее на него напряжение (там трансформатор, мост и чтение аналоговым пином с пересчетом RMS)? Или оставить его включенным, но переменную напряжения считать не среднеквадратично, а просто присвоить ей некое значение? И тут еще один момент: напруга 220в никак не влияет на совершенно идентичные другие две ветки (те же моськи с нагрузкой сисмистором), а только конкретно на эту.

Дим-мычъ
Offline
Зарегистрирован: 20.03.2021

Sonologist пишет:

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

Я это имел ввиду. Чтобы он как-бы работал, но был прост и "прозрачен")). Если нет - дальше отключать по блочно.

Sonologist
Sonologist аватар
Offline
Зарегистрирован: 08.06.2018

Понил, мурси :)

 

Sonologist
Sonologist аватар
Offline
Зарегистрирован: 08.06.2018

Попытка отрубить вольтметр ни к чему не привела. Значит, дело не в нем. Уточню ситуацию. При подключении 220в (статус нагрева при этом подается в Ардуину как ==2, то есть полная мощность) лампа на нагрузке, имитирующая ТЭН, хаотически слабенько (не в полную мощность) мигает. При отключении провода от детектора нуля к пину прерывания int0 (220в при этом подается) работа в этом режиме восстанавливается (лампа горит в полный накал).  При статусе нагрева == 0, естественно, нагрев отрубается, лампа гаснет. То есть, несмотря на четкое указание в скетче, что если статус нагрева == 2 (строка 147) и надо бы открыть трак полностью, прерывание почему-то влияет на работу пина, управляющего триаком нагрева. Не могу понять, почему.

BOOM
BOOM аватар
Offline
Зарегистрирован: 14.11.2018

Проверь контакты в проводке 220В, скорее всего где-то плохой контакт ну и сам понимаешь к чему это может привести. Что можно пропаять - пропаять, где нельзя спаять - облупить что возможно и на болтовое соединение.

Дим-мычъ
Offline
Зарегистрирован: 20.03.2021

Возможно неправильно выписаноиусловие ст258 и 292. т.е не учитывается статус==2

Sonologist
Sonologist аватар
Offline
Зарегистрирован: 08.06.2018

Проводка качественная. Проверил, естественно. К тому же, отключение системы зерокросс приводит к нормальному функционированию. Так что, 220в само по себе ни при чем :(

Sonologist
Sonologist аватар
Offline
Зарегистрирован: 08.06.2018

Спасибо, надо будет подумать. С другой стороны, вся процедура в ZEROCROSS по идее должна выполняться только при условии статуса ==1. 

Дим-мычъ
Offline
Зарегистрирован: 20.03.2021

Sonologist пишет:

Спасибо, надо будет подумать. С другой стороны, вся процедура в ZEROCROSS по идее должна выполняться только при условии статуса ==1. 

Да, но

else { digitalWrite(pin_heat, LOW); }

А иначе, может быть и 0, и 2. Поэтому при статус==2, в прерывании всегда

digitalWrite(pin_heat, LOW);, отсюда и мигание ИМХО

 

Sonologist
Sonologist аватар
Offline
Зарегистрирован: 08.06.2018

Таааак, логично. Надо проверить! Спасибо!

Прописал возможные статусы нагрева в этом "else" :

 ...
 else (строка )
  {
    if (status_heat == 2) {digitalWrite(pin_heat, HIGH);}
    if (status_heat == 0) {digitalWrite(pin_heat, LOW);}
  }
...

ПОБЕДА!!!!!!!!!

Друзья, всем спасибо за помощь!

Sonologist
Sonologist аватар
Offline
Зарегистрирован: 08.06.2018

Sonologist пишет:

Таааак, логично. Надо проверить! Спасибо!

Прописал возможные статусы нагрева в этом "else" :

 ...
 else
  {
    if (status_heat == 2) {digitalWrite(pin_heat, HIGH);}
    if (status_heat == 0) {digitalWrite(pin_heat, LOW);}
  }
...

ПОБЕДА!!!!!!!!!

Друзья, всем спасибо за помощь!

Green
Offline
Зарегистрирован: 01.10.2015

Как я понимаю, так вы и операции людям делаете...(((

Sonologist
Sonologist аватар
Offline
Зарегистрирован: 08.06.2018

Не, там я профи, а в программировании пока еще ламер позорный.

Green
Offline
Зарегистрирован: 01.10.2015

Ага. А кто оценивает? Или сам себя не похвалишь... Удобно ведь, согласитесь?

Sonologist
Sonologist аватар
Offline
Зарегистрирован: 08.06.2018

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

Дим-мычъ
Offline
Зарегистрирован: 20.03.2021

 

Sonologist пишет:
ПОБЕДА!!!!!!!!!

 Поздравляю!))

Sonologist
Sonologist аватар
Offline
Зарегистрирован: 08.06.2018

Поясните мне, пожалуйста, в чем в моем случае разница между  attachInterrupt(0, ZEROCROSS, CHANGE); и attachInterrupt(0, ZEROCROSS, RISING); ?

Чтобы не плодить многострочные посты - это про фрагмент моего скетча из первого поста, тот, что  void ZEROCROSS () - управление нагревом по прерыванию. Работают оба варианта аттача, но RISING временами сбоит, что проявляется в кратковременном, не всегда появляющимся коротком частом мерцании контрольной лампочки. Если определять уровень, приходящий с детектора перехода через ноль, как сделано в исходном скетче (cHANGE), то все отрабатывается правильно. Хотя, вроде бы и там и там мы схватываем высокий уровень. Добавлю, что в приведенном в первом посте скетче в строке 260 была сделана описка, надо: if (digitalRead (pin_zero)==HIGH), но для сути вопроса это не важно.

Чем же в данном случае отличаются RISING и CHANGE?

Заранее спасибо!


DetSimen
DetSimen аватар
Offline
Зарегистрирован: 25.01.2017

Rising срабатывает только по переднему фронту, а Change - по обоим

Sonologist
Sonologist аватар
Offline
Зарегистрирован: 08.06.2018

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

А почему при этом одно сбоит, а другое - нет - непонятно. 

Дим-мычъ
Offline
Зарегистрирован: 20.03.2021

Sonologist пишет:

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

У Вас, что, уже другой скетч? В #1 такого не вижу

И, кстати, а какая схема контроля перехода через 0?

ua6em
ua6em аватар
Offline
Зарегистрирован: 17.08.2016

Sonologist пишет:

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

у меня тут в твоём деле есть некий когнитивный диссонанс, можешь глянуть?
Если да, дай знать куда написать...

Sonologist
Sonologist аватар
Offline
Зарегистрирован: 08.06.2018

Конечно, если в силах - решим когнитивный вопрос. почта bma280156@mail.ru Один момент: как с работы уйду (после суток), а тут почта вырублена. До домашнего ПК доберусь завтра после 15:00. Не горит?

Sonologist
Sonologist аватар
Offline
Зарегистрирован: 08.06.2018

Димыч, если не возражаете, перенесем разговор на завтра. Я на сутках. Выложу и скетч и схему. Но из дома (всё там). Скетч, кстати тот же самый, только с опиской (я уже выше указал).

Дим-мычъ
Offline
Зарегистрирован: 20.03.2021

Я  к тому, что при CHANGE, всё же отрабатываются условия после else, стр.293.  по заднему фронту. А главное - какая схема?

Я, кстати, тоже уже буду занят на несколько часов...

 

BOOM
BOOM аватар
Offline
Зарегистрирован: 14.11.2018

Может просто не успевает из прерывания выйти?

Sonologist
Sonologist аватар
Offline
Зарегистрирован: 08.06.2018

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

BOOM
BOOM аватар
Offline
Зарегистрирован: 14.11.2018

Ты же ченьж с ризинг сравниваешь, откуда такая уверенность?

Sonologist
Sonologist аватар
Offline
Зарегистрирован: 08.06.2018

Бум, лучше не "на пальцах". После обеда выложу предмет обсуждения, и тогда... ага?

svm
Offline
Зарегистрирован: 06.11.2016

Вот посмотри вариант автоматики. https://www.youtube.com/watch?v=g4k4wOmfxXc&t=3s Работает очень хорошо, и достаточно простая. Управление или с сенсорного экрана или с компа или с телефона по вай фай. В комментариях, в конце есть ссылка на стабилизированный регулятор мощности. Может работать как автономно так и от автоматики по КОМ порту. Мощность может задаваться от 0 до 100%.

Sonologist
Sonologist аватар
Offline
Зарегистрирован: 08.06.2018

СВМ, спасибо, посмотрел. Но это готовое устройство. Мне интересно сделать все самому. Это первое. Второе - почему сделал смычку ПК-Ардуино - на экране монитора все лучше видно, а тыкание пальцем в маленький экран - так себе по удобству управления. Но в целом - спасибо, интересно.

Sonologist
Sonologist аватар
Offline
Зарегистрирован: 08.06.2018

Друзья, затыку с райзингом нашел: при выводе на осциллограф видны всплески по обоим фронтам, видимо, Ардуина их беспорядочно понимает. При чендже считывается конечный (HIGH) уровень, и все работает стабильно. Так что, оставлю чендж и голову себе не буду ломать удалением всплесков. Так что, всем спасибо.

ua6em, письмо пришло, но оно пустое. Пишите, что хочется спросить.

Дим-мычъ
Offline
Зарегистрирован: 20.03.2021

Sonologist пишет:

 видны всплески по обоим фронтам

Возможно поможет конденсатор ~100пкф

P.S. Да и кривой скетч, может быть причиной "всплесков"

svm
Offline
Зарегистрирован: 06.11.2016

Sonologist пишет:

СВМ, спасибо, посмотрел. Но это готовое устройство. Мне интересно сделать все самому. Это первое. Второе - почему сделал смычку ПК-Ардуино - на экране монитора все лучше видно, а тыкание пальцем в маленький экран - так себе по удобству управления. Но в целом - спасибо, интересно.

Почему готовое? Там есть исходники, достаточно хорошо прокомментированные. А главное есть алгоритм дистилляции и ректификации, составленный гуру самогоноварения. И управление с компьютера достаточно удобное. Крупные картинки, выбор всех параметров и информативны графики температур, с возможностью записи на карту для  анализа.  Я в начале запустил на ESP-01. Только с датчиками температуры и клапаном отбора тела. Попробовал работать, но оказалось что при сильном отличии атмосферного давления от 765 при отсутствии датчика давления, работа колонны не идеальна, т.к. не учитывается температура кипения спирта в зависимости от давления. И вместо 96.6 можно получить 94, а то и 92. После включения датчика давления, стабильно 96.6 за все время перегона. Конечно на вкус различия не чувствуется, но надо стремиться к идеалу, т.к. я на старости лет решил вести ЗОЖ. Кроме самогона еще и табак в этом году посадил.

Sonologist
Sonologist аватар
Offline
Зарегистрирован: 08.06.2018

Это я себе все содрал беззастенчиво, поизучаю обязательно: теорией брезговать грех. А вот с проблемой насчет неучета температуры кипения спирта на фоне гуляния давления и как её следствия - получения меньшей спиртуозности не сталкивался ни разу. Уж не знаю, как можно в домашних условиях это контролировать иначе чем АСП-3 (лучше, конечно, АСП-1, но у меня такого большого "попугая нет") :). У меня два регулятора: на РМ-2 (стабилизированный источник мощности - режет полупериоды) и моя "какашка" (алгоритм Брезенхема, пока без стабилизации оной, но если надо будет - доделаю). Так вот, столкнулся со странной ситуацией, идущей в разрез с теорией и мнением гуру самогонщиков. В частности, категорическое утверждение, что мощность нагрева надо подавать исключительно стабильно, меня сразу немного смутило. Если бы речь шла о нагревателе в 1 квт и литровом кубе - еще можно об этом говорить. Но когда дело касается утепленного кега - 30ки или 50-ки, то тепловая инерция системы там такая, что сгладит любые колебания напряжения в сети (в разумных пределах, конечно). У меня колонна с отсечкой хвостов, регуляцией отбора клапаном и управлением автономной системой охлаждения. То есть, полная автоматика: включил, настроил и периодически приглядывай не всякий случай. Провел эксперимент в прошлом еще году. Постарался выдержать одинаковые температурные (и прочие) условия в двух вариантах: нагрев стабилизированный на РМ-2 и на моей "системе". На выходе - абсолютно равное количество продукта крепостью чуть больше 96° при температуре 20°С (ареометр "тонет" чуть-чуть ниже отметки 96°). Разумеется, на вкус никакой разницы нет.Вот и думаю, надо ли ваять стабилизатор мощности? Напруга гуляет несильно, обычно в пределах 210-230 вольт в розетке. Хотя, программно это сделать не так сложно: дельта доли мощности ТЭНа пропорциональна квадрату дельты напряжения. Как-то так. Прошу попинать мощными аргументами :)

Sonologist
Sonologist аватар
Offline
Зарегистрирован: 08.06.2018

Всплески на "ноге" детектора, так что, скетч тут не очень-то причем :) Конденсатор поставил в первую очередь, "борода" уменьшилась, но проблема не ушла. Пока плюнул, оставил CHANGE - работает стабильно.

ua6em
ua6em аватар
Offline
Зарегистрирован: 17.08.2016

Sonologist пишет:

Всплески на "ноге" детектора, так что, скетч тут не очень-то причем :) Конденсатор поставил в первую очередь, "борода" уменьшилась, но проблема не ушла. Пока плюнул, оставил CHANGE - работает стабильно.

замерить длительность этих всплесков и "программная защита дребезга"

Дим-мычъ
Offline
Зарегистрирован: 20.03.2021

Sonologist пишет:

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

Принято! Как говорится, работает - не трогай!

И всё же приятно, когда код работает, не как ему всбрендится, а как задумано))

Sonologist
Sonologist аватар
Offline
Зарегистрирован: 08.06.2018

Лень родилась раньше нас, старик. Как говорил, оставлю в покое нормально работающий CHANGE. :) Но в плане - замена триггера. Он хамит, как выяснилось, битый, наверное, но я с таким никогда не сталкивался. Обычно или работает или нет. На вход с детектора фронты приходят вполне пристойные. Добегу до чипдипа только.

Кстати, где письмо? Скинь на почту, пока я дома.

svm
Offline
Зарегистрирован: 06.11.2016

Sonologist пишет:

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

Ну у меня условия хуже. Нахожусь почти в конце улицы и передо мной есть достаточно мощные потребители. Поэтому напряжение гуляет 200 - 250 вольт. Если с мощностью ТЭНа вопрос решен, то автономная система охлаждения подводит. Там стоит обычный циркуляционный насос на 220 В и вентилятор тоже на 220. Последний раз из-за повышения напряжения получился захлеб и спиртовая баня. Благо все отключилось по датчику паров спирта. Все произошло из за переохлаждения флегмы. При 230В температура на выходе дефлегматора 37-40 градусов, а при 250 упала до 28 и в результате захлеб. Так что стабилизатор наверное придется ставить, а то процесс длительный 10-12 часов и следить за напряжением и переключать режимы насоса проблематично. Правда можно попробовать медленный ШИМ (включать/выключать систему охлаждения), но это уже наверное осенью, т.к. сейчас 30 соток земли не оставляют свободного времени.

Sonologist
Sonologist аватар
Offline
Зарегистрирован: 08.06.2018

Письмо посмотрел, по мере сил ответил. Немного не мой профиль, но на первый взгляд - не катастрофично.

Sonologist
Sonologist аватар
Offline
Зарегистрирован: 08.06.2018

Уточните, в чем подводит автономка-то? И ее конструкция какая? Циркуляционник даже при пониженном напряжении должен обеспечивать охлаждение, так что странно. У меня вообще стоит 12-вольтовая помпа "Умница": https://avatars.mds.yandex.net/get-mpic/5229821/img_id7118185316040464228.png/orig и пашет как папакарло. А у него производительность куда ниже любого циркуляционника. Я установил алгоритм так: пока идет разогрев ("тапок в пол"), насос выключен. Когда Т° колонны дойдет до 66°С, ТЭН переключается в режим рабочего нагрева, включается насос. Когда Т° воды на выходе автономки  дойдет до 36°С (это устанавливается), включается вентилатор, как упадет - вентилятор выключается. Автономка держит температуру охлаждения +/- 3°С от установленной. Этого вполне достаточно и от напруги в сети не зависит: просто вентилятор включается или чаще или реже. Так что, регулировать охлаждение надо не насосом, а вентилятором.

svm
Offline
Зарегистрирован: 06.11.2016

Sonologist пишет:

Уточните, в чем подводит автономка-то? И ее конструкция какая? Циркуляционник даже при пониженном напряжении должен обеспечивать охлаждение, так что странно. У меня вообще стоит 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

Sonologist
Sonologist аватар
Offline
Зарегистрирован: 08.06.2018

Я не совсем понял, в чем надобность контролировать расход воды? Повторюсь, его можно сделать постоянным. Я свой не измерял, но по паспорту Умница качает 3,5 литра воды в минуту. Учитывая, что я его ШИМом питаю на 50%, то расход ЗНАЧИТЕЛЬНО меньше, но этого хватает за глаза. Регулировать же охлаждение по моему мнению надо работой вентилятора. Это проще и эффективнее: температурный датчик на выход воды и от его показаний включать или выключать пропеллер. И все, никакого переохлаждения или недоохлаждения не будет.

Как-то вот так: https://www.youtube.com/watch?v=8UYblNeYzZI

svm
Offline
Зарегистрирован: 06.11.2016

Sonologist пишет:

Я не совсем понял, в чем надобность контролировать расход воды? Повторюсь, его можно сделать постоянным. Я свой не измерял, но по паспорту Умница качает 3,5 литра воды в минуту. Учитывая, что я его ШИМом питаю на 50%, то расход ЗНАЧИТЕЛЬНО меньше, но этого хватает за глаза. Регулировать же охлаждение по моему мнению надо работой вентилятора. Это проще и эффективнее: температурный датчик на выход воды и от его показаний включать или выключать пропеллер. И все, никакого переохлаждения или недоохлаждения не будет.

Как-то вот так: https://www.youtube.com/watch?v=8UYblNeYzZI

Расход в принципе не нужен, но просто датчик был, вот и поставил. Но благодаря ему я обратил внимание на большую зависимость системы от напряжения сети. Ну и возможно подключу его к системе безопасности. Мало ли что трубка какая слетит или насос встанет. Ну а управление вентилятором, я так-же планировал. Просто сначала хотел посмотреть как это все работает, но временное как правило становится постоянным.

Sonologist
Sonologist аватар
Offline
Зарегистрирован: 08.06.2018

Можно даже и не смотреть :) У меня система автономки (я описывал выше) уже три сезона трудится без проблем. Еще раз:

1. Радиатор хоть от авто, хоть от кондиционера

2. Воду подавать постоянно, не меняя, достаточно 5 л/мин за глаза.

3. Вентилятор запускать и останавливать по устанавливаемой температуры с термодатчика на обратке.

4. Датчик расхода на аварийный сигнал - правильное решение.

Временное-постоянное - вопрос дискутабельный. Я в юности довольно много паял, правда, дело имел больше с аналогом (УНЧ, гитарные примочки и т.д.), неплохо зарабатывал на местных ВИА :). Сейчас вспомнил молодость, приложил умение держать паяльник в самогоноварению, ну и понеслось. Сейчас у меня уже 5-й вариант автоматики, каждый сложнее и лучше предыдущего. Так что, не делай временное постоянным :)

svm
Offline
Зарегистрирован: 06.11.2016

Sonologist пишет:

Можно даже и не смотреть :) У меня система автономки (я описывал выше) уже три сезона трудится без проблем. Еще раз:

1. Радиатор хоть от авто, хоть от кондиционера

2. Воду подавать постоянно, не меняя, достаточно 5 л/мин за глаза.

3. Вентилятор запускать и останавливать по устанавливаемой температуры с термодатчика на обратке.

4. Датчик расхода на аварийный сигнал - правильное решение.

Временное-постоянное - вопрос дискутабельный. Я в юности довольно много паял, правда, дело имел больше с аналогом (УНЧ, гитарные примочки и т.д.), неплохо зарабатывал на местных ВИА :). Сейчас вспомнил молодость, приложил умение держать паяльник в самогоноварению, ну и понеслось. Сейчас у меня уже 5-й вариант автоматики, каждый сложнее и лучше предыдущего. Так что, не делай временное постоянным :)

Полностью согласен со всеми пунктами, но стабилизатор на циркуляционный насос надо искать. В последний раз запустил процесс, дождался пока колонна стабилизируется (головы были уже отобраны), запустил отбор тела и пошел спать. Часа в два ночи завыла сирена. Сосед выключил поливалку, а она у него жрет 11 КВт и напряжение подскочило на 30 вольт. В результате насос и вентилятор закрутились бодрее и температура с 40 упала ло 28 градусов. В результате захлеб и паровая баня. Спас датчик паров спирта. ТЭН отключился и процесс остановился по аварии.

А насчет молодости, ситуация аналогичная. Тоже занимался изготовлением примочек и ремонтом оборудования ВИА. Особенно запомнилось, что 2-3 раза в месяц приходилось таскать домой КИНАПовские динамики на перемотку. Уж больно басист любил мощщи поддать.

Sonologist
Sonologist аватар
Offline
Зарегистрирован: 08.06.2018

Понятно, сосед свои 11 квт на одну фазу посадил. У тебя другая фаза, а ноль хреновый, вот его сосед на себя и потащил со своей мощностью. Значит, на двух других фазах напруга подскочит. Вот поэтому и надо поставить помпу 12-вольтовую. Подойдет Умница, да любой аквариумный или фонтанный насосик. Его вполне хватит, и от напруги он сильнее качать не будет. 

А насчет перемотки кинаповских динамиков - да, та еще песня. Да и качество их так себе было. Вот собрать в кучку несколько 8-ГД-1 - вот это классная колонка для баса получалась. А усилки мы ребятам копировали Маршаллы на сдвоенных Е27 (кажись так они назывались).

ua6em
ua6em аватар
Offline
Зарегистрирован: 17.08.2016

Sonologist пишет:

А насчет перемотки кинаповских динамиков - да, та еще песня. Да и качество их так себе было. Вот собрать в кучку несколько 8-ГД-1 - вот это классная колонка для баса получалась. А усилки мы ребятам копировали Маршаллы на сдвоенных Е27 (кажись так они назывались).

да нормально они мотаются и СССР любые тоже, ты бы японские попробовал перематывать, было бы с чем сравнивать ))) у меня пара динамиков имеется (4A32 или 4A28), всё хотел колонки сделать, а приятель сделал по маршаловской (Биговской) схеме 2 по 100 на ГУ-50, а предварительные гитарные были в нём жеж но уже на транзисторах, ох он и поездил по Сочам )))

А вот цифровой ревербератор это да, на РУ3, у Барыкина был такой жеж, с хорусом...давненько это было 1978-80 где-то