Помощь в написании скетча для станка.

pred161
Offline
Зарегистрирован: 11.02.2019

Доброго времени суток Уважаемые Форумчане ! хочу свой *станочек* автоматизировать. Но с ардуино пока дружу не долго(((  В общем написал скетч - все работает как и хотелось, но еще хочется прикрутить к ардуинке кнопку - нажал - программа запустилась циклично, нажал повторно - программа дошла до конца и цикл завершился. Может кто поможет?  Вот программка:

int in1 = 5;              // Реле подачи воздуха (цифровой 5 пин)
int in2 = 6;              // Реле работы двигателя шнека (цифровой 6 пин)
 
void setup()
{
 pinMode(in1, OUTPUT);    // Установим вывод 5 как выход
 pinMode(in2, OUTPUT);    // Установим вывод 6 как выход
}
void loop()
{
 delay(4000);              // Задержка перед началом работы
 digitalWrite(in1, HIGH);  // Включаем реле подачи воздуха пресс формы
 delay(3000);              // Пауза 3 сек
 digitalWrite(in2, HIGH);  // Включаем реле
 delay(5000);              // Задержка работы двигателя шнека
 digitalWrite(in2, LOW);   // Выключаем двигатель шнека
 delay(5000);              // Пауза 5 сек
 digitalWrite(in1, LOW);   // Выключаем реле подачи воздуха пресс формы
 delay(3000);              // Пауза перед повторным циклом  
}
pred161
Offline
Зарегистрирован: 11.02.2019

и хотелось бы прикрутить светодиды для индикации - включили- засветился светодиод, выключили - засветился второй светодиод, а первый потух.

 

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

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

pred161
Offline
Зарегистрирован: 11.02.2019

к сожалению - да(( Могу только готовые проекты повторять(((( но вот загорелся сам сделать.. но увы тяму не хватает((( проект разовый.. но интерес огромный..

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

Поставьте кнопку с фиксацией и подсветкой. В конце лупа проверяйте её состояние: замкнута - тормозим и ждём, пока разокнётся;, разомкнута - заходим на новый круг.

pred161
Offline
Зарегистрирован: 11.02.2019

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

Pyotr
Offline
Зарегистрирован: 12.03.2014

ЕвгенийП доходчиво расписал http://arduino.ru/forum/programmirovanie/7-i-zonnoe-osveshchenievklvykl-s-raznykh-vyklyuchatelei#comment-404598

Если переходы между состояниями конечного автомата только по времени, то можно еще проще.

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

Тогда в начале лупа проверку состояния кнопки с фиксацией: нажата - проходим дальше и "включаем/выключаем" пины, не нажата - не проходим и ничего не делаем.

pred161
Offline
Зарегистрирован: 11.02.2019

такая реализация подходит замечательно)) вот только как это программно реализовать.. по поводу написания такого - опилки в голове (пока что... думаю дальше разберусь.) 

sadman41
Offline
Зарегистрирован: 19.10.2016
pred161
Offline
Зарегистрирован: 11.02.2019
 а как сделать когда кнопка разомкнута, чтоб не запускал цикл?
 
const int buttonPin = 2;     // номер входа, подключенный к кнопке
int buttonState = 0;         // переменная для хранения состояния кнопки
 
int in1 = 5;              // Реле подачи воздуха (цифровой 5 пин)
int in2 = 6;              // Реле работы двигателя шнека (цифровой 6 пин)
 
void setup()
{
 pinMode(buttonPin, INPUT); 
 pinMode(in1, OUTPUT);    // Установим вывод 5 как выход
 pinMode(in2, OUTPUT);    // Установим вывод 6 как выход
}
void loop()
{
 buttonState = digitalRead(buttonPin);
 if (buttonState == HIGH)
 delay(2000);              // Задержка перед началом работы
 digitalWrite(in1, HIGH);  // Включаем реле подачи воздуха пресс формы
 delay(3000);              // Пауза 3 сек
 digitalWrite(in2, HIGH);  // Включаем реле
 delay(5000);              // Задержка работы двигателя шнека
 digitalWrite(in2, LOW);   // Выключаем двигатель шнека
 delay(5000);              // Пауза 5 сек
 digitalWrite(in1, LOW);   // Выключаем реле подачи воздуха пресс формы
 delay(3000);              // Пауза перед повторным циклом  
}
 
sadman41
Offline
Зарегистрирован: 19.10.2016

Можно вывалиться из loop() через if(проверка_на_разомкнутую_кнопку) return; или же сделать бесконечный цикл while(проверка_на_разомкнутую_кнопку);

pred161
Offline
Зарегистрирован: 11.02.2019

sadman41 пишет:

Можно вывалиться из loop() через if(проверка_на_разомкнутую_кнопку) return; или же сделать бесконечный цикл while(проверка_на_разомкнутую_кнопку);

Как реализовать while ? не могли бы Вы черкануть эту строку кода и куда её вставить?

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

Изучите цифровой автомат. А потом уже решайте свою задачу.
ПС: #258

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

Я не могу указать куда её вставить, потому как в Вашем коде нет номеров строк. Это следствие того, что Вы не удосужились, как новичок, посетить "Песочницу" и ознакомиться с правилами форума, в которых рассказано, как вставить программный код в пост правильно.

pred161
Offline
Зарегистрирован: 11.02.2019

извиняюсь...

const int buttonPin = 2;     // номер входа, подключенный к кнопке
int buttonState = 0;         // переменная для хранения состояния кнопки

int in1 = 5;              // Реле подачи воздуха (цифровой 5 пин)
int in2 = 6;              // Реле работы двигателя шнека (цифровой 6 пин)

void setup()
{
 pinMode(buttonPin, INPUT); 
 pinMode(in1, OUTPUT);    // Установим вывод 5 как выход
 pinMode(in2, OUTPUT);    // Установим вывод 6 как выход
}
void loop()
{
 buttonState = digitalRead(buttonPin);
 if (buttonState == HIGH)
 delay(2000);              // Задержка перед началом работы
 digitalWrite(in1, HIGH);  // Включаем реле подачи воздуха пресс формы
 delay(3000);              // Пауза 3 сек
 digitalWrite(in2, HIGH);  // Включаем реле
 delay(5000);              // Задержка работы двигателя шнека
 digitalWrite(in2, LOW);   // Выключаем двигатель шнека
 delay(5000);              // Пауза 5 сек
 digitalWrite(in1, LOW);   // Выключаем реле подачи воздуха пресс формы
 delay(3000);              // Пауза перед повторным циклом  
}

 

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

Вместо строк 15 и 16: 

while (digitalRead(buttonPin) == ???);

На месте вопросительных знаков то состояние (HIGH или LOW), которое соответствует разомкнутой кнопке.

pred161
Offline
Зарегистрирован: 11.02.2019

Залил скетч - отрабатывает как надо ! за что Вам Огромное спасибо ! Да и всем спсасибо кто откликнулся в теме ! Приятно когда на форуме присутствуют люди - которые *реально* помогают новичкам , а то многие - *Иди изучай* !! канечно согласен что изучать нужно, но такая помощь необходима некоторым ! я вот сейчас доделаю всё в железе - и сяду плотно изучать ардуино ! Еще раз Спасибо !!

vosara
vosara аватар
Offline
Зарегистрирован: 08.02.2014

pred161 пишет:

кнопку - нажал - программа запустилась циклично, нажал повторно - программа дошла до конца и цикл завершился. Может кто поможет?  Вот программка:

 delay(4000);              // Задержка перед началом работы
 digitalWrite(in1, HIGH);  // Включаем реле подачи воздуха пресс формы
 delay(3000);              // Пауза 3 сек
 digitalWrite(in2, HIGH);  // Включаем реле
 delay(5000);              // Задержка работы двигателя шнека
 digitalWrite(in2, LOW);   // Выключаем двигатель шнека
 delay(5000);              // Пауза 5 сек
 digitalWrite(in1, LOW);   // Выключаем реле подачи воздуха пресс формы
 delay(3000);              // Пауза перед повторным циклом  
}

ДА поймать повторное нажатие кнопки с таким количеством ДЕЛАЙ, это надо постараться. Попробуйте так может будет удобней

#define buttonPin  2     // номер входа, подключенный к кнопке
uint8_t buttonState = 0;         // переменная для хранения состояния кнопки

int in1 = 5;              // Реле подачи воздуха (цифровой 5 пин)
int in2 = 6;              // Реле работы двигателя шнека (цифровой 6 пин)

uint32_t pausa;
bool f_button = 0;
uint8_t step = 0;
uint16_t time = 2000;

void setup()
{
  pinMode(buttonPin, INPUT); 
  pinMode(in1, OUTPUT);    // Установим вывод 5 как выход
  pinMode(in2, OUTPUT);    // Установим вывод 6 как выход
}

void loop(){

  if(digitalRead(buttonPin) == HIGH && f_button == 0){
    delay(20);

    if(digitalRead(buttonPin) == HIGH){
      buttonState++;
      f_button = 1;
      pausa = millis();
    }
  }
  if(digitalRead(buttonPin) == LOW)f_button = 0; 

  if(buttonState)
  {
    if(millis() - pausa >= time)
    {
      pausa = millis();
      switch(step)
      {
      case 0:
        digitalWrite(in1, HIGH);  // Включаем реле подачи воздуха пресс формы 
        time = 3000;     
        step++;
        break;
      case 1:
        digitalWrite(in2, HIGH);  // Включаем реле
        time = 5000;
        step++;
        break;
      case 2:
        digitalWrite(in2, LOW);   // Выключаем двигатель шнека 
        step++;  
        break;
      case 3:
        digitalWrite(in1, LOW);  // Включаем реле подачи воздуха пресс формы 
        time = 3000;     
        step = 0;
        if(buttonState > 1)buttonState = 0;
        break;
      }
    }
  }
}