Посудомоечная машина

ВладиславНово
Offline
Зарегистрирован: 13.07.2018

Подкинули мне посудомойку бесплатно. Дело в том, что она без ЭБУ. Фирма не популярная. Все комплектующие работают. Решил я ее на китайской Uno сделать. Вот только она пинается. Я в IDE не спец, да и в программировании многого не знаю. В общем программа рабочая, но иногда слетает. Если код более менее правильный, дело может в посторонних шумах от 220?

ВладиславНово
Offline
Зарегистрирован: 13.07.2018

Вот код

ВладиславНово
Offline
Зарегистрирован: 13.07.2018
// Подключаем библиотеку прерывания по таймеру
#include <TimerOne.h>
// Вводим константы для пинов реле
const int releAS = 12;            // Реле аквастоп
const int relePD = 11;            // Реле привода дверцы моющего и дозатора ополаскивателя
const int releKS = 10;            // Реле клапана слива конденсата и сливного насоса
const int releCN = 9;             // Реле основного центробежного насоса
const int releVN = 8;             // Реле водяного нагревателя
// Начальное состояние реле соответственно   
boolean AS = false;
boolean PD = false;
boolean KS = false;
boolean CN = false;
boolean VN = false;
// Общие переменные для таймера
volatile unsigned long times = 0; 
volatile unsigned long timer = 0;
volatile unsigned long Times = 0;
volatile unsigned int summtimes = 0;
// Переменная кнопки "Пауза"
volatile boolean clickPause;
// Переменные для датчиков
volatile float temp;              // Датчик температуры воды
int b;                            // Сигал при наборе воды
volatile int regim;               // Переменная режима работы
volatile int r;                   // Счетчик режима
volatile int s;                   // Счетчик воды

boolean LED = false;
// Переменные режимов
int F1;           // пауза
int F2;           // слив
int F3;           // пауза
int F4;           // набор
int F5;           // пауза
int F6;           // полоскание
int F7;           // пауза
int F8;           // полоскание
int F9;           // пауза
int F10;          // слив
int F11;          // пауза
int F12;          // набор
int F13;          // пауза
int F14;          // полоскание
int F15;          // пауза
int F16;          // полоскание
int F17;          // пауза
int F18;          // слив
int F19;          // пауза
int F20;          // набор
int F21;          // пауза
int F22;          // полоскание
int F23;          // пауза
int F24;          // слив
int F25;          // финиш
int T1;           // 
int T0;           // 
int tempBrake;

// Функция настройки системы
void setup()
  {
      // Пины реле
      pinMode(releAS, OUTPUT);
      pinMode(relePD, OUTPUT);
      pinMode(releKS, OUTPUT);
      pinMode(releCN, OUTPUT);
      pinMode(releVN, OUTPUT);
      pinMode(13, OUTPUT);
      // Инициализация таймера
      Timer1.initialize(1000000);                 // шаг 1000000 мкрс. или 1 с.
      Timer1.attachInterrupt(UpTimer);
      // передача информации по серийному порту
      Serial.begin(9600);
      delay(1000);
  }
// Функция прерывания по таймеру
void UpTimer()
  {
    
    timer = timer + Times;
    LED = !LED;
    Serial.print("Температура:          ");
    Serial.println(temp);
    Serial.print("Мойка:                ");
    Serial.println(summtimes);
    Serial.print("Кнопка Play/Pause:    ");
    Serial.println(clickPause);
    Serial.print("Таймер:               ");
    Serial.println(times);
    Serial.print("Счетчик воды:         ");
    Serial.println(s);
    Serial.print("Режим:                ");
    Serial.println(regim);

    digitalWrite(releAS, AS);
    digitalWrite(relePD, PD);
    digitalWrite(releKS, KS);
    digitalWrite(releCN, CN);
    digitalWrite(releVN, VN);
  }
// Основной код программы
void loop()
  
  {
    
noInterrupts();
times = timer;
interrupts();
r = analogRead(1);
if (times == 0)
{  
if (r > 500 && r < 600)
{
regim = 1;
F1 = 0;
F2 = 5;
F3 = 30;
F4 = 35;
F5 = 155;
F6 = 160;
F7 = 760;
F8 = 1060;
F9 = 1660;
F10 = 1960;
F11 = 1985;
F12 = 1990;
F13 = 2110;
F14 = 2115;
F15 = 2715;
F16 = 2720;
F17 = 3320;
F18 = 3325;
F19 = 3350;
F20 = 3355;
F21 = 3475;
F22 = 3480;
F23 = 4080;
F24 = 4085;
F25 = 4110;
T1 = 70;
T0 = 65;
}

if (r > 400 && r < 500)
{
regim = 2;
F1 = 0;
F2 = 5;
F3 = 30;
F4 = 35;
F5 = 155;
F6 = 160;
F7 = 660;
F8 = 780;
F9 = 1280;
F10 = 1400;
F11 = 1425;
F12 = 1430;
F13 = 1550;
F14 = 1555;
F15 = 2155;
F16 = 2160;
F17 = 2760;
F18 = 2765;
F19 = 2790;
F20 = 2795;
F21 = 2915;
F22 = 2920;
F23 = 3520;
F24 = 3525;
F25 = 3550;
T1 = 65;
T0 = 60;
}

if (r > 250 && r < 350)
{
regim = 3;
F1 = 0;
F2 = 5;
F3 = 30;
F4 = 35;
F5 = 155;
F6 = 160;
F7 = 460;
F8 = 580;
F9 = 880;
F10 = 1000;
F11 = 1025;
F12 = 1030;
F13 = 1150;
F14 = 1155;
F15 = 1455;
F16 = 1460;
F17 = 2060;
F18 = 2360;
F19 = 2385;
F20 = 2390;
F21 = 2510;
F22 = 2515;
F23 = 3115;
F24 = 3120;
F25 = 3145;
T1 = 50;
T0 = 45;
}

if (r > 650 && r < 750)
{
regim = 4;
F1 = 0;
F2 = 5;
F3 = 30;
F4 = 35;
F5 = 155;
F6 = 160;
F7 = 460;
F8 = 760;
F9 = 1060;
F10 = 1360;
F11 = 1385;
F12 = 1390;
F13 = 1510;
F14 = 1515;
F15 = 1815;
F16 = 1820;
F17 = 2120;
F18 = 2420;
F19 = 2445;
F20 = 2450;
F21 = 2570;
F22 = 2575;
F23 = 3175;
F24 = 3180;
F25 = 3205;
T1 = 50;
T0 = 45;
}

if (r > 50 && r < 150)
{
regim = 5;
F1 = 0;
F2 = 5;
F3 = 30;
F4 = 35;
F5 = 155;
F6 = 160;
F7 = 760;
F8 = 1060;
F9 = 1660;
F10 = 1960;
F11 = 1985;
F12 = 1990;
F13 = 2110;
F14 = 2115;
F15 = 2415;
F16 = 2420;
F17 = 2810;
F18 = 2815;
F19 = 2840;
F20 = 2845;
F21 = 2965;
F22 = 2970;
F23 = 3570;
F24 = 3575;
F25 = 3600;
T1 = 60;
T0 = 55;
}

if (r > 150 && r < 250)
{
regim = 6;
F1 = 0;
F2 = 5;
F3 = 30;
F4 = 35;
F5 = 155;
F6 = 160;
F7 = 460;
F8 = 520;
F9 = 820;
F10 = 825;
F11 = 850;
F12 = 855;
F13 = 975;
F14 = 980;
F15 = 1280;
F16 = 1285;
F17 = 1585;
F18 = 1590;
F19 = 1615;
F20 = 1620;
F21 = 1740;
F22 = 1745;
F23 = 2345;
F24 = 2350;
F25 = 2375;
T1 = 45;
T0 = 40;
}
}
  // НАБОР ВОДЫ СЧЕТЧИК
  boolean But = digitalRead(0);
  if(But) b = 1;
  if(!But && b == 1)
  {
    s++;
    b = 0;
    delay(50);
  }
  // ТЕМПЕРАТУРЫ ВОДЫ ДАТЧИК
    float v = analogRead(3) * 5.0 / 1024.0;
    temp = (10.0 / (v * v) + 0.5) * 10;
    clickPause = digitalRead(2);
  // УСЛОВИЯ ПОСТАНОВКИ НА ПАУЗУ 
    if (clickPause)
    {
        if (summtimes == 1 && clickPause)
        {
          summtimes = 0;
          while(clickPause)
        {
          clickPause = digitalRead(2);
        }
        
        }
        if (summtimes == 0 && clickPause)
        {
          summtimes = 1;
          while(clickPause)
        {
          clickPause = digitalRead(2);
        }
        
        }
        
        
    }
    else Times = summtimes;
    
                                                        // ЦИКЛ ОПОЛАСКИВАНИЕ
    
    if (summtimes == 0)
    {
      digitalWrite(13, LED);
      AS = false;
      PD = false;
      KS = false;
      CN = false;
      VN = false;
    }
    if (summtimes == 1)
    {
    digitalWrite(13, HIGH);  
    if(times > F1 && times < F2)
    {
      AS = false;
      PD = false;
      KS = false;
      CN = false;
      VN = false;
    }
    if(times > F2 && times < F3)
    {
      AS = false;
      PD = false;
      KS = true;
      CN = false;
      VN = false;
    }
    if(times > F3 && times < F4)
    {
      AS = false;
      PD = false;
      KS = false;
      CN = false;
      VN = false;
    }
    if(times > F4 && times < F5)
    {
      tempBrake = 1;
      if(s < 750)
      {
      AS = true;
      PD = false;
      KS = false;
      CN = false;
      VN = false;
      }
      if(s > 750)
      {
      AS = false;
      PD = false;
      KS = false;
      CN = false;
      VN = false;
      timer = F5;  
      }
    }

    if(times > F5 && times < F6)
    {
      AS = false;
      PD = false;
      KS = false;
      CN = false;
      VN = false;
    }
    
    if(times > F6 && times < F7)
    {
      AS = false;
      PD = false;
      KS = false;
      CN = true;
      if(temp < T1 && tempBrake == 1)
      {
        VN = true;
      }
      if(temp > T1 && tempBrake == 1) 
      {
        tempBrake = 0;
        VN = false;
      }
      if(temp < T0 && tempBrake == 0) tempBrake = 1;
    }
    
    if(times > F7 && times < F8)
    {
      AS = false;
      PD = false;
      KS = false;
      CN = false;
      VN = false;
    }

    if(times > F8 && times < F9)
    {
      AS = false;
      PD = false;
      KS = false;
      CN = true;
      if(temp < T1 && tempBrake == 1)
      {
        VN = true;
      }
      if(temp > T1 && tempBrake == 1) 
      {
        tempBrake = 0;
        VN = false;
      }
      if(temp < T0 && tempBrake == 0) tempBrake = 1;
    }
    
    if(times > F9 && times < F10)
    {
      AS = false;
      PD = false;
      KS = false;
      CN = false;
      VN = false;
    }

    if(times > F10 && times < F11)
    {
      AS = false;
      PD = false;
      KS = true;
      CN = false;
      VN = false;
    }
    if(times > F11 && times < F12)
    {
      AS = false;
      PD = false;
      KS = false;
      CN = false;
      VN = false;
    }
    if(times > F12 && times < F13)
    {
      tempBrake = 1;
      if(s < 1500)
      {
      AS = true;
      PD = false;
      KS = false;
      CN = false;
      VN = false;
      }
      if(s > 1500)
      {
      AS = false;
      PD = false;
      KS = false;
      CN = false;
      VN = false;
      timer = F5;  
      }
    }

    if(times > F13 && times < F14)
    {
      AS = false;
      PD = false;
      KS = false;
      CN = false;
      VN = false;
    }
    
    if(times > F14 && times < F15)
    {
      AS = false;
      PD = false;
      KS = false;
      CN = true;
      if(temp < T1 && tempBrake == 1)
      {
        VN = true;
      }
      if(temp > T1 && tempBrake == 1) 
      {
        tempBrake = 0;
        VN = false;
      }
      if(temp < T0 && tempBrake == 0) tempBrake = 1;
    }
    
    if(times > F15 && times < F16)
    {
      AS = false;
      PD = true;
      KS = false;
      CN = false;
      VN = false;
    }

    if(times > F16 && times < F17)
    {
      AS = false;
      PD = false;
      KS = false;
      CN = true;
      if(temp < T1 && tempBrake == 1)
      {
        VN = true;
      }
      if(temp > T1 && tempBrake == 1) 
      {
        tempBrake = 0;
        VN = false;
      }
      if(temp < T0 && tempBrake == 0) tempBrake = 1;
    }
    
    if(times > F17 && times < F18)
    {
      AS = false;
      PD = false;
      KS = false;
      CN = false;
      VN = false;
    }

    if(times > F18 && times < F19)
    {
      AS = false;
      PD = false;
      KS = true;
      CN = false;
      VN = false;
    }
    if(times > F19 && times < F20)
    {
      AS = false;
      PD = false;
      KS = false;
      CN = false;
      VN = false;
    }
    if(times > F20 && times < F21)
    {
      tempBrake = 1;
      if(s < 2250)
      {
      AS = true;
      PD = false;
      KS = false;
      CN = false;
      VN = false;
      }
      if(s > 2250)
      {
      AS = false;
      PD = false;
      KS = false;
      CN = false;
      VN = false;
      timer = F5;  
      }
    }

    if(times > F21 && times < F22)
    {
      AS = false;
      PD = false;
      KS = false;
      CN = false;
      VN = false;
    }
    
    if(times > F22 && times < F23)
    {
      AS = false;
      PD = false;
      KS = false;
      CN = true;
      if(temp < T1 && tempBrake == 1)
      {
        VN = true;
      }
      if(temp > T1 && tempBrake == 1) 
      {
        tempBrake = 0;
        VN = false;
      }
      if(temp < T0 && tempBrake == 0) tempBrake = 1;
    }

    if(times > F23 && times < F24)
    {
      AS = false;
      PD = false;
      KS = false;
      CN = false;
      VN = false;
    }

    if(times > F24 && times < F25)
    {
      AS = false;
      PD = false;
      KS = true;
      CN = false;
      VN = false;
    }
    if(times > F25)
    {
      timer = 0;
      Times = 0;
      summtimes = 0; 
    }
    }
    
    
       
    
  }

 

ВладиславНово
Offline
Зарегистрирован: 13.07.2018

Код большой, чтобы сильно не вникать... Прерывание по таймеру, оно же таймер. Согласно заданного режима работы переменным ряда F(x) и T(x) присваиваются значения. Через оператор условия if выполняются циклы согласно показаний датчиков температуры, счетчика воды. Обычно клинит в начале на 12 секунде или в конце цикла мойки перед последним сливом.

ЕвгенийП
ЕвгенийП аватар
Offline
Зарегистрирован: 25.05.2015

ВладиславНово пишет:
Вот только она пинается.

С этим Вам вот сюда.

А если у Вас техническая проблема, то потрудитесь объяснить её понятным техническим языком.

Или Вы думаете, что кто-то начнёт подробно изучать Ваш код с целью определить как именно и зачем она у Вас "пинается"?

ВладиславНово пишет:
 дело может в посторонних шумах от 220?

Схему соединений и фото монтажа выложите, пожалуйста.

На будущее - это раздел для готовых проектов. Для вопросов и просьб о помощи есть другие разделы.

mykaida
mykaida аватар
Offline
Зарегистрирован: 12.07.2018

ВладиславНово пишет:

Код большой, чтобы сильно не вникать... Прерывание по таймеру, оно же таймер. Согласно заданного режима работы переменным ряда F(x) и T(x) присваиваются значения. Через оператор условия if выполняются циклы согласно показаний датчиков температуры, счетчика воды. Обычно клинит в начале на 12 секунде или в конце цикла мойки перед последним сливом.

Данунах, код у него большой. Там и датчиков куча. 

Датчик - 500 евро

реле - 300 евро

нетолерантный софт - 2000евро

mykaida
mykaida аватар
Offline
Зарегистрирован: 12.07.2018

Извините, уважаемый.

Но соглашусь с ЕвгенийП.

Придумайте свой алоритм и его программируйте.

Удачи!

mykaida
mykaida аватар
Offline
Зарегистрирован: 12.07.2018

Еще раз, извините.

Ваша программа не читаема. При этом скорость выполнения очень маленькая.

Может стоит все-таки перейти на ООП?

И события по прерываниям?

ВладиславНово
Offline
Зарегистрирован: 13.07.2018

Не пойму этих высказываний про евро... Сразу накинулись как шакалы. Проект готовый. Машинка работает. А кому в лом в код вникать — не утруждайте себя в комментариях.

Чечако
Offline
Зарегистрирован: 15.06.2018

ВладиславНово пишет:
Не пойму этих высказываний про евро... Сразу накинулись как шакалы. Проект готовый. Машинка работает. А кому в лом в код вникать — не утруждайте себя в комментариях.

Уважаемый, а как нам понять Ваше "пинается"? Вот прям натурально берет Вас за шкирятник, размахивается дверцей, и по жопе?  Тогда я понимаю, почему Вы такой нервный, конечно, но - может Вы что-то другое имели ввиду?

Изложите на понятном языке, что именно происходит не так. Код Ваш и правда сложен для понимания, поскольку комментариев там практически нет, зато есть неимоверное количество переменных с ничего не говорящими именами, зато повторяющимеся функциями, если верить тем немногим комментарием, которые там есть. :)

 

sadman41
Offline
Зарегистрирован: 19.10.2016

Подкинули мне бричку бесплатно, фирма непопулярная. Проблема в том, что под капотом пусто. Решил сделать движитель из своего металлолома. Только вот она сопротивляется. В автоделах я не спец, да и вообще не много в этой теме знаю. Вобщем-то всё рычит и дым пускает, только на выезде из гаража встает колом. Если я все правильно собрал, может дело в заливке пола гаража?

ВладиславНово
Offline
Зарегистрирован: 13.07.2018

Расскажу по порядку.

Пины с 8 по 12 подключены через мосфеты к реле. 

// Вводим константы для пинов реле
const int releAS = 12;            // Реле аквастоп
const int relePD = 11;            // Реле привода дверцы моющего и дозатора ополаскивателя
const int releKS = 10;            // Реле клапана слива конденсата и сливного насоса
const int releCN = 9;             // Реле основного центробежного насоса
const int releVN = 8;             // Реле водяного нагревателя
// Начальное состояние реле соответственно   
boolean AS = false;
boolean PD = false;
boolean KS = false;
boolean CN = false;
boolean VN = false;

Соответственно под них идут булевые переменные.

// Общие переменные для таймера
volatile unsigned long times = 0; 
volatile unsigned long timer = 0;
volatile unsigned long Times = 0;
volatile unsigned int summtimes = 0;

Переменная times считывается в цикле loop() и присваевает значение переменной timer счетчика (прерывание по таймеру). Так как прерывания срабатывают с момента запуска программы, переменная Times дает возможность прерывать увеличение значения таймера.

timer = timer + Times;

В свою очередь в цикле loop() происходит изменение значения Times:

if (clickPause)
    {
        if (summtimes == 1 && clickPause)
        {
          summtimes = 0;
          while(clickPause)
        {
          clickPause = digitalRead(2);
        }
        
        }
        if (summtimes == 0 && clickPause)
        {
          summtimes = 1;
          while(clickPause)
        {
          clickPause = digitalRead(2);
        }
        
        }
        
        
    }
    else Times = summtimes;

Если кнопка Пуск/Пауза нажата проверяется условие прерывания счетчика, если отпущена - присваевается соответствующее значение для Times.

if (summtimes == 0)
    {
      digitalWrite(13, LED);
      AS = false;
      PD = false;
      KS = false;
      CN = false;
      VN = false;
    }
    if (summtimes == 1)
    {
     .......
     .......
     }

И проверяется условие на выполнение работы или ее прерывание.

Череда if() можно бы и упрастить в виде case()... Но в целом это последовательность условий по запуску или остановке блоков посудомоечной машины.

// НАБОР ВОДЫ СЧЕТЧИК
  boolean But = digitalRead(0);
  if(But) b = 1;
  if(!But && b == 1)
  {
    s++;
    b = 0;
    delay(50);
  }
  // ТЕМПЕРАТУРЫ ВОДЫ ДАТЧИК
    float v = analogRead(3) * 5.0 / 1024.0;
    temp = (10.0 / (v * v) + 0.5) * 10;
    clickPause = digitalRead(2);

Счетчик воды - крыльчатка с магнитом и герконом. Производится считывание количества оборотов колеса. Температура считывается по собственной формуле через термопару машины.

if(times > F25)
    {
      timer = 0;
      Times = 0;
      summtimes = 0;
      s = 0;
      timer = 0;
      tempBrake = 0;
      AS = false;
      PD = false;
      KS = false;
      CN = false;
      VN = false;
      delay(10000);
       
    }

По итогу выполнения последнего условия машинка должна сброситься в ноль, но это не всегда происходит. Да и почему программа после 12 секунд работы производит сброс данных переменных до начальных?..

ВладиславНово
Offline
Зарегистрирован: 13.07.2018

sadman41 пишет:

Подкинули мне бричку бесплатно, фирма непопулярная. Проблема в том, что под капотом пусто. Решил сделать движитель из своего металлолома. Только вот она сопротивляется. В автоделах я не спец, да и вообще не много в этой теме знаю. Вобщем-то всё рычит и дым пускает, только на выезде из гаража встает колом. Если я все правильно собрал, может дело в заливке пола гаража?

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

ВладиславНово
Offline
Зарегистрирован: 13.07.2018

Просто здесь поязвить любят, да под**бнуть. На другое видимо мозг истощен))))

Ворота
Ворота аватар
Offline
Зарегистрирован: 10.01.2016

Т.е. как именно пинается нам так и не расскажут? Судя по коду, там до хрена где пинаться можно. ну, например,

if(times > F1 && times < F2)
... 
if(times > F2 && times < F3)
...
if(times > F3 && times < F4)
...
if(times > F4 && times < F5)
...
if(times > F5 && times < F6)
...
if(times > F6 && times < F7)
...
и т.д.

А что делать, если она, сцуко, равна F2 или там F3, ну и далее по списку? Ничго не делать, получается.

Та же хрень про ифы, связанные с r чуть повыше.

А вообще, когда в коде видишь глобальные переменные times и Times - рупь за сто - толком работать не будет :(

ВладиславНово
Offline
Зарегистрирован: 13.07.2018

Это условия временных промежутков. F0 = 0, F1 = 5, F3 = 35... Если время по таймеру в промежутке от F0 до F1, то есть больше 0 и меньше 5, происходит одно действие. Почему не будет работать, если глобальные переменные Times и times?

Простите, про переменную r не упомято... Это считывается сопротивление на тумблере выбора режима работы. Тумблер — шесть делителей напряжения. Выбираешь режим, временнЫм переменным ряда F и T присваиваются значения. Это при условии, что таймер не был запущен.

ВладиславНово
Offline
Зарегистрирован: 13.07.2018

Ворота пишет:

Т.е. как именно пинается нам так и не расскажут? Судя по коду, там до хрена где пинаться можно. ну, например,

 

Выше написано 

ВладиславНово пишет:

По итогу выполнения последнего условия машинка должна сброситься в ноль, но это не всегда происходит. Да и почему программа после 12 секунд работы производит сброс данных переменных до начальных?..

ВладиславНово
Offline
Зарегистрирован: 13.07.2018

Принцип работы.

 

Действия пользователя : Подаем питание >> Выбираем режим>> Нажимаем кнопку Play/Pause

Если мойка еще не производится, т.е. таймер равен 0, режим можно изменить. Выбрали к примеру режим 1. Делитель напряжения на тумлере переключения выдает на ардуино 2.5V, или значение 524. Оно может выдаваться 523, 520. Для этого выставлено условие с нижней и верхней границей if (r > 500 && t < 600). Происходит присвоение переменных ряда F и T. 

if (r > 500 && r < 600)
{
regim = 1;
F1 = 0;
F2 = 5;
F3 = 30;
F4 = 35;
F5 = 155;
F6 = 160;
F7 = 760;
F8 = 1060;
F9 = 1660;
F10 = 1960;
F11 = 1985;
F12 = 1990;
F13 = 2110;
F14 = 2115;
F15 = 2715;
F16 = 2720;
F17 = 3320;
F18 = 3325;
F19 = 3350;
F20 = 3355;
F21 = 3475;
F22 = 3480;
F23 = 4080;
F24 = 4085;
F25 = 4110;
T1 = 70;
T0 = 65;
}

Далее выполняются условия

То есть:

1.

if(times > F1 && times < F2)              
    {
      AS = false;
      PD = false;
      KS = false;
      CN = false;
      VN = false;
    }

если (times > 0 && times < 5) значение выводов реле LOW ( временная задержка);

2.

if(times > F2 && times < F3)
    {
      AS = false;
      PD = false;
      KS = true;
      CN = false;
      VN = false;
    }

если (times > 5 && times < 30) значение выводов реле LOW, кроме KS (происходит слив воды);

3. Вторая временная задержка;

4.

if(times > F4 && times < F5)
    {
      tempBrake = 1;
      if(s < 750)
      {
      AS = true;
      PD = false;
      KS = false;
      CN = false;
      VN = false;
      }
      if(s > 750)
      {
      AS = false;
      PD = false;
      KS = false;
      CN = false;
      VN = false;
      timer = F5;  
      }

если (times > 35 && times < 155)

Отключается блокировка нагрева для следующего условия по таймеру (times > 160 && times < 760) работы насоса мойки и нагревателя:

tempBrake = 1;

Если счетчик воды (s < 750), аквастоп открыт, если (s > 750), аквастоп закрыт и происходит скачок по времени. Напор воды бывает разный, поэтому на набор выделяется 120 секунд. В среднем набор воды занимает 65 - 70 секунд. 

Так согласно значению таймера происходит последовательное выполнение условий if. 

ВНИМАНИЕ!!! 

ВОПРОС: "ПО КАКОЙ ПРИЧИНЕ ПРОИСХОДИТ СБОЙ - СБРОС ПЕРЕМЕННЫХ ТАЙМЕРА НА 12 СЕКУНДЕ?

volatile unsigned long times = 0; 
volatile unsigned long timer = 0;
volatile unsigned long Times = 0;
volatile unsigned int summtimes = 0;

void setup()
  {
     
      // Инициализация таймера
      Timer1.initialize(1000000);                 // шаг 1000000 мкрс. или 1 с.
      Timer1.attachInterrupt(UpTimer);
      //Включена передача информации по серийному порту
      Serial.begin(9600);
      delay(1000);
  }

void UpTimer()
  {
    
    timer = timer + Times;
  }

void loop()
  {
    noInterrupts();
    times = timer;
    interrupts();

if(times > 0 && times < 5)
    {
    .......
    }
    if(times > 5 && times < 30)
    {
    .......
    }
    if(times > 30 && times < 35)
    {
    .......
    }
   }

 P.S. " Если и дальше в комментариях писать чушь, которая не относится к данной теме, то проблему не решить"

Чечако
Offline
Зарегистрирован: 15.06.2018

ВладиславНово пишет:
Почему не будет работать, если глобальные переменные Times и times?

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

ВладиславНово
Offline
Зарегистрирован: 13.07.2018

Всем спасибо!!!

Проблема решена

Ворота
Ворота аватар
Offline
Зарегистрирован: 10.01.2016

ВладиславНово пишет:
Это условия временных промежутков. F0 = 0, F1 = 5, F3 = 35... Если время по таймеру в промежутке от F0 до F1, то есть больше 0 и меньше 5, происходит одно действие.

Ты вообще читал, что тебе пишут? А если равно 5, то в какую категорию попадает? Ни в какую. И так же про всё остальное.

ВладиславНово пишет:
Почему не будет работать, если глобальные переменные Times и times?

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

Опыт показывает, что программы с такими закидонами нормально не работают.

ВладиславНово пишет:

Проблема решена

Судя по коду, решена до следующего глюка.

 

ВладиславНово
Offline
Зарегистрирован: 13.07.2018

ВладиславНово
Offline
Зарегистрирован: 13.07.2018

Ворота пишет:

Ты вообще читал, что тебе пишут? А если равно 5, то в какую категорию попадает? Ни в какую. И так же про всё остальное.

А нафига мне эта 5???

Я мог написать >= или <=, но это так ринципиально потерять в таймере секунду?

ВладиславНово
Offline
Зарегистрирован: 13.07.2018

По поводу Times и times... Это разные переменные и я это учитываю. Не наю кому как, а мне так проще...

 

sadman41
Offline
Зарегистрирован: 19.10.2016

ВладиславНово пишет:

Я мог написать >= или <=, но это так ринципиально потерять в таймере секунду?

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

Ворота
Ворота аватар
Offline
Зарегистрирован: 10.01.2016

Ну, проще, так проще. Сюда-то зачем пришёл, если всё лучше всех знаешь? Делай как хочешь. Только не плачь потом, что глючит.

qwone
qwone аватар
Offline
Зарегистрирован: 03.07.2016

Да и про программирования через цифровой автомат ТС не слышал ни разу.

ПС:#258

ВладиславНово
Offline
Зарегистрирован: 13.07.2018

Кстати про категории... 

А если (timer > 20  &&  timer < 40) одно действие, а если (timer > 80 && timer < 120) второе действие, куда здесь выпадет промежуток 40 - 80???

Переменные не меняюстя, первое действие продолжается до 81.

В моем случае, (timer > 20  &&  timer < 40) процесс длится 20 секунд, как мне и нужно, а не 19...

 

 

 

ВладиславНово
Offline
Зарегистрирован: 13.07.2018
  
    if(times == 1)
    {
      AS = false;
      PD = false;
      KS = false;
      CN = true;
      VN = false;
    }
    if(times == 40)
    {
      AS = false;
      PD = false;
      KS = true;
      CN = false;
      VN = false;
    }
    if(times ==80)
    {
      AS = false;
      PD = true;
      KS = false;
      CN = false;
      VN = false;
    }

В данномслучае по событию присвоится значение и будет выполняться до следующего события. Или я не прав? 

ЕвгенийП
ЕвгенийП аватар
Offline
Зарегистрирован: 25.05.2015

ВладиславНово пишет:

В моем случае, (timer > 20  &&  timer < 40) процесс длится 20 секунд, как мне и нужно, а не 19...

А посчитать пальцев не хватает? Ваш процесс состоит из

21, 22,  ... 29, 30 ... привлекаем пальцы ног ... 31, ..., 39  ой!!! всего 19 получилось :((((

ЕвгенийП
ЕвгенийП аватар
Offline
Зарегистрирован: 25.05.2015

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

ВладиславНово
Offline
Зарегистрирован: 13.07.2018

Может я не программист и не все знаю

int v;
int timer;
boolean led;

void setup()
  {
    pinMode(9, OUTPUT);
    
  }

void loop()
  {
    if(timer > 5  && timer < 7)  led = true;
    if(timer > 15 && timer < 17) led = false;
    if(timer > 25 && timer < 27) led = true;
    if(timer > 35 && timer < 37) led = false;
    if(timer > 45 && timer < 47) led = true;
    if(timer > 50) timer = 0;
    digitalWrite(9, led);
    delay(1000);
    timer=timer+1;
  }

Почему этот код работает так как я хотел:

timer = 6 - светодиод загорается

timer = 26 - светодиод гаснет

timer = 36 - светодиод загорается

timer = 46 - светодиод гаснет

и почему-то здесь между зажиганием и угасание светодиода 26 - 6 = 20 секунд...

Почему это неправильно?

 

И горит с 6 по 16 секунды

ВладиславНово
Offline
Зарегистрирован: 13.07.2018
int v;
int timer;
boolean led;

void setup()
  {
    pinMode(9, OUTPUT);
    
  }

void loop()
  {
    if(timer == 6)  led = true;
    if(timer == 16) led = false;
    if(timer == 26) led = true;
    if(timer == 36) led = false;
    if(timer == 46) led = true;
    if(timer > 50) timer = 0;
    digitalWrite(9, led);
    delay(1000);
    timer=timer+1;
  }

И может это тоже самое?

qwone
qwone аватар
Offline
Зарегистрирован: 03.07.2016

ВладиславНово, а теперь тоже самое но через millis() без delay()

ВладиславНово
Offline
Зарегистрирован: 13.07.2018

Просто сравнение 

(timer == 6)

можно пропустить, а вот 

(timer > 5 && timer < 15) 

программа полюбому прочитает

Ворота
Ворота аватар
Offline
Зарегистрирован: 10.01.2016

qwone пишет:

ВладиславНово, а теперь тоже самое но через millis() без delay()

Нафига? У ТС и так всё работает :)

ВладиславНово
Offline
Зарегистрирован: 13.07.2018
int v;
int timer;
int times;
boolean led;

void setup()
  {
    pinMode(9, OUTPUT);
    
  }

void loop()
  {
    timer = millis() - times;
    if(timer > 5000  && timer < 7000)  led = true;
    if(timer > 15000 && timer < 17000) led = false;
    if(timer > 25000 && timer < 27000) led = true;
    if(timer > 35000 && timer < 37000) led = false;
    if(timer > 45000 && timer < 47000) led = true;
    if(timer > 50000) times = millis();
    digitalWrite(9, led);
    
  }

 

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

Так что было то?

ВладиславНово
Offline
Зарегистрирован: 13.07.2018

Типы переменных в уравнениях и сравнениях не совпадали и в кодировке после набора воды F12 -F13 ошибка была, таймеру присваивальсь значение F5 вместо F13. 

qwone
qwone аватар
Offline
Зарегистрирован: 03.07.2016
ВладиславНово
Offline
Зарегистрирован: 13.07.2018

Хаха

ВладиславНово
Offline
Зарегистрирован: 13.07.2018

Люди. Я не хочу показать, что я супер программист и мне пофиг на Ваше мнение. Я бы не написал бы сюда... Если вы не можете или не хотите объяснить, прошу, пожалуйста скиньте ссылку на умные книжки по программированию. 

А пока я вижу кучу умников в коронах.

qwone
qwone аватар
Offline
Зарегистрирован: 03.07.2016

ВладиславНово, зачем вам ссылки на умные книги. Их надо не только периодически читать, но и понимать что в них написано. И блин на каждую надо потритить не меньше недели. Опять же книги делятся на Синтаксис языка Си и на умение правильно организовывать программу. А у вас F5 вместо F13, а дальше что E2 на E4 и потом прикрыться конем , мат на 10 шагу. Ведь Си это язык высокого уровня, так почему вы на нем пишете как на ассемблере .

ВладиславНово
Offline
Зарегистрирован: 13.07.2018

Потому что я программирую 4 месяца.

ВладиславНово
Offline
Зарегистрирован: 13.07.2018

Если не считать года в шараге на Pascal. 

ВладиславНово
Offline
Зарегистрирован: 13.07.2018

И то это было 8 лет назад. А душа рвется... Вот посудомойке мозг приделал... Работает... Как надо работает. Но согласно подсказкам выше, это не правильно, потому что ВЫСОКАЯ ЛОГИКА и мое низкое знание сделали кое-как работающую говнопрограмму. 

Ворота
Ворота аватар
Offline
Зарегистрирован: 10.01.2016

ВладиславНово пишет:

Если вы не можете или не хотите объяснить, прошу, пожалуйста скиньте ссылку на умные книжки по программированию. 

Дорогой, Вот ты написал, что оказывается перепутал переменные.

ВладиславНово пишет:

в кодировке после набора воды F12 -F13 ошибка была, таймеру присваивальсь значение F5 вместо F13. 

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

Ворота пишет:

ВладиславНово пишет:
Почему не будет работать, если глобальные переменные Times и times?

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

Опыт показывает, что программы с такими закидонами нормально не работают.

Писал.

Но ты не слушаешь, что тебе говорят специалисты, ты послал меня "на" и сказал, что тебе так удобнее.

Ну, удобнее, так удобнее, только нахрена потом заявлять, что

ВладиславНово пишет:

А пока я вижу кучу умников в коронах.

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

Давай я не буду писать тебе кого вижу я, а то роскомнадзор сайт закроет.

ЕвгенийП
ЕвгенийП аватар
Offline
Зарегистрирован: 25.05.2015

ВладиславНово пишет:

Вот посудомойке мозг приделал... Работает... Как надо работает. Но согласно подсказкам выше, это не правильно, потому что ВЫСОКАЯ ЛОГИКА и мое низкое знание сделали кое-как работающую говнопрограмму. 

Вы совешенно правы. Вы умнее всех. Собравшиеся здесь придурки только и могут, что щёки надувать и неостроумно стебаться. Молодец. А теперь успокойтесь и продолжайте с этим жить. Кстати, почитайте пост #46, внимательно. А теперь окончательно успокойтесь и продолжайте с этим жить.

ВладиславНово
Offline
Зарегистрирован: 13.07.2018

Ворота пишет:

Я был не прав... Соглашусь не совсем, что писали вы. Но что за чушь пишут другие?

Я ошибся в том, что скопировал код условия

if(times > F4 && times < F5)
    {
      tempBrake = 1;
      if(s < 750)
      {
      AS = true;
      PD = false;
      KS = false;
      CN = false;
      VN = false;
      }
      if(s > 750)
      {
      AS = false;
      PD = false;
      KS = false;
      CN = false;
      VN = false;
      timer = F5;  
      }

В условие 

if(times > F12 && times < F13)
{
      tempBrake = 1;
      if(s < 750)
      {
      AS = true;
      PD = false;
      KS = false;
      CN = false;
      VN = false;
      }
      if(s > 750)
      {
      AS = false;
      PD = false;
      KS = false;
      CN = false;
      VN = false;
      timer = F5;  
      }
}

Поэтому программа возвращалась к циклу 4. 

Некоторые переменные (temp и T1(T0) имели разные типы данных.

После этих исправлений все лаги пропали. Посудомойска отработала 10 циклов из 10 без нареканий согласно кода. 

Никого на*** я не посылал, а если все сообщения принимать только на себя, то это нужно быть очень толерантным.

 

 

ВладиславНово
Offline
Зарегистрирован: 13.07.2018

Я не считаю здесь идиотами никого - ни Вас, ни себя. 

А если в переменных проблема, то тут черт ногу сломит

http://arduino.ru/forum/proekty/sistema-kontrolya-grouboksa-stolknulsya-...

qwone
qwone аватар
Offline
Зарегистрирован: 03.07.2016

ВладиславНово пишет:

Я не считаю здесь идиотами никого - ни Вас, ни себя. 

А если в переменных проблема, то тут черт ногу сломит

http://arduino.ru/forum/proekty/sistema-kontrolya-grouboksa-stolknulsya-s-problemoi

А кто говорит что это "эталон". Народ книгу о синтаксе Си "принципиально не читает". А все потому что "русские книг не читают, потому что нет времени когда пьют водку". А вот о книгах как правильно писать программы , не это не видели, патамушто много букафф.

ПС: Если вам хочется увидеть как писать код чуть получше то отсюда #25