две кнопки, два реле, millis, Непонятное поведение контроллера.

sanekru
Offline
Зарегистрирован: 05.12.2017

Доброго дня!

Имеется arduino pro mini 328p

Две кнопки "Stop","Start"

Два реле:

  первое и второе реле включается сразу, 

   через 3 сек. второе реле выключается.

Блокирую кнопку "Start" после включения.

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

 

#include <Button.h>

#define RELE_1 2  // on/off
#define RELE_2 3  // starting

#define BUTTON_1_PIN 4 //Stop
#define BUTTON_2_PIN 5 //Start

boolean startStop = false;
boolean blockStart = false;

Button button1(BUTTON_1_PIN, 1500);
Button button2(BUTTON_2_PIN, 1500);

unsigned long timing;

void setup() {
pinMode(RELE_1, OUTPUT);
pinMode(RELE_2, OUTPUT);
digitalWrite(RELE_1, HIGH);
digitalWrite(RELE_2, HIGH);

}

void loop() {

button1.scanState();
button2.scanState();

if ( button1.flagClick == true ) //stop
    {
  button1.flagClick = false;
  digitalWrite (RELE_1, HIGH);
  digitalWrite (RELE_2, HIGH);
  blockStart = false;
      }
if ( (button2.flagClick == true) && (blockStart == false) ) //start
      {
      button2.flagClick = false;
      blockStart = true;
      startStop = true;
      timing = millis();
      digitalWrite (RELE_1, LOW);
      digitalWrite (RELE_2, LOW);
                 
      }

if ( (millis() - timing > 3000) && (startStop == true) )//stop r2 через 3 сек. 
      { 

      startStop = false;
      digitalWrite (RELE_2, HIGH);

       }

}

 

sanekru
Offline
Зарегистрирован: 05.12.2017

Вопрос Можно закрывать!

flagClick Ведь остаётся, а по нажатию Stop ещё и block переходит в false, соответственно снова включается start...

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

sanekru пишет:

две кнопки, два реле, millis,

Так надо было и miilis'а два использовать!

sanekru
Offline
Зарегистрирован: 05.12.2017

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

/*
Управление воздушным компрессором с 3х Фазным двигателем подключенным к однофазной сети и соединенным звездой
или треугольником и использующего фазосдвигающие и пусковые ёмкости.
Так же имеется вход концевого выключателя клапана давления.
При нажатии кнопки Start оба реле замыкаются и через три секунды пусковая отключается,
далее размыкание Питающей реле выключается либо по нажатии кнопки Stop, либо размыкании 
клапана давления. При замыкании клапана давления (если не нажималась Stop) вновь замыкаются
оба реле и через три секунды пусковое снова отключается.
Библиотека обработки дребезга Скачана с сайта mypr actic. ru
*/

#include <Button.h>

#define RELE_1 2 // Питание
#define RELE_2 3 // Пусковая

#define BUTTON_1_PIN 4 //Stop
#define BUTTON_2_PIN 5 //Start
#define PRESSURE 6  // Клапан давления

boolean startState = false; // Переменная статуса включено
boolean autoStart = false; // Переменная статуса автозапуска по давлению
boolean startStop = false; // Статус выключения пускового реле
boolean blockStart = false; // Переменная блокировки кнопки Start
boolean stopClick = true; // Переменная сброса Click

Button button1(BUTTON_1_PIN, 15);
Button button2(BUTTON_2_PIN, 15);
Button button3(PRESSURE, 15);

unsigned long timing;

void setup() {
  
pinMode(RELE_1, OUTPUT);
pinMode(RELE_2, OUTPUT);
digitalWrite(RELE_1, HIGH);
digitalWrite(RELE_2, HIGH);

}

void loop() {

button1.scanState();
button2.scanState();
button3.scanState();

if ( button1.flagClick == true )
       {
  button1.flagClick = false;
  stopClick = true;
  digitalWrite (RELE_1, HIGH);
  digitalWrite (RELE_2, HIGH);
  startState = false;
  blockStart = false;
        }
if ( (button2.flagClick == true) && (blockStart == false))
       {
      button2.flagClick = false;
      startState = true;
      stopClick = false;
      startStop = true;
      timing = millis();
      digitalWrite (RELE_1, LOW);
      digitalWrite (RELE_2, LOW);
      blockStart = true;
      
        }

if ((button2.flagClick == true) && (blockStart == true)) button2.flagClick = false;
        
if (button3.flagPress == false && startState == true)
       {
        digitalWrite (RELE_1, HIGH);
        digitalWrite (RELE_2, HIGH);
        autoStart = true;
      
        }  
if (button3.flagPress == true && startState == true && autoStart == true && stopClick == false)
       {
        autoStart = false;
        digitalWrite (RELE_1, LOW);
        digitalWrite (RELE_2, LOW);
        timing = millis();
        startStop = true;
              
        }

if ((millis() - timing > 3000) && (startStop == true))  // установка времени поддержки пускового реле 1000 = 1 сек.
      { 
       
      startStop = false;
      digitalWrite (RELE_2, HIGH);
      
       }

}

 

Вопрос? Как улучшить код в плане правильности программирования? может лучше использовать switch case или for ?

sanekru
Offline
Зарегистрирован: 05.12.2017

В будущем планируется доработать устройство путём добавления датчика холла, сенсора давления и возможно жк дисплея. Буду переделывать алгоритм по отключению пускового реле по оборотам двигателя и отключение включение двигателя по определённому давлению  Хотя данный алгоритм вполне справляется со своей работой, но при первом включении компрессора запуск происходит быстрее т.к. нагрузка на ротор меньше из-за отсутствия давления в системе, что соответственно приводит к передерживанию пускового реле, и вилка по давлению от 5 до 8 bar, а хотелось бы 10 -12 bar с возможностью регулировки. 

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

sanekru пишет:

может лучше использовать switch case или for ?

Лучше для чего?