Двигатель с кнопкой!

omglife
Offline
Зарегистрирован: 31.12.2015

Задача стоит такая:

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

Схему я собрал, а вот с кодом возникли проблемы. Кто может помогите пожалуйста.

int ButtonPin = 2;
int motorPin = 11;
boolean ButtonState = LOW;
boolean motorState = LOW;
unsigned long pressed_moment;
#define pressed_long 3000

void setup()
{
	pinMode(ButtonPin, INPUT);
	pinMode(motorPin, OUTPUT);

}

void loop()
{
	ButtonState = digitalRead(ButtonPin);
	if (ButtonState == HIGH)
	{
	pressed_moment = millis();
	}
	else
	{
	if ((millis() - pressed_moment) < pressed_long)
	{
	digitalWrite(motorPin, LOW);
	}
	else
	{
	digitalWrite(motorPin, HIGH);
	pressed_moment = 0;
	}
	}
}

 

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

omglife пишет:

Схему я собрал

Секретная? Не покажете?

omglife пишет:

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

Какие проблемы? Опишете или надо самим догадываться?

omglife пишет:

Кто может помогите пожалуйста.

В чём нужна помощь? Вы никаких проблем и вопросов не сформулировали.

 

omglife
Offline
Зарегистрирован: 31.12.2015

Схему не смогу показать, т.к. занимаюсь в кружке и все там остается.

Когда загружаю код в ардуино, мотор ждет 3 секунды и запускается сам без нажатия кнопки, а если кнопку нажать когда мотор работает, то он выключится, но потом снова через 3 секунды включается! А мне нужно, чтобы, удерживая кнопку 3 секунды мотор включался, а при одиночном нажатии выключался.

Помощь нужна в составлении кода.

ESV
Offline
Зарегистрирован: 16.12.2015

В кружке не помогают?

Клапауций 322
Offline
Зарегистрирован: 31.12.2015

ESV пишет:

В кружке не помогают?

кружок - ячейка ИГИЛ

omglife
Offline
Зарегистрирован: 31.12.2015

Просьба писать по делу!

ESV
Offline
Зарегистрирован: 16.12.2015

С новым Годом!

Yarik.Yar
Offline
Зарегистрирован: 07.09.2014

и вас тоже)

Клапауций 322
Offline
Зарегистрирован: 31.12.2015

omglife пишет:

Просьба писать по делу!

влом мне чужие велосипеды слепым ремонтировать.

lex2k
Offline
Зарегистрирован: 17.12.2015
void setup()
{
    pinMode(ButtonPin, INPUT);
    digitalWrite(ButtonPin, HIGH); // включаем подтягивающий резистор
    pinMode(motorPin, OUTPUT);
 }
 так попробуй
lex2k
Offline
Зарегистрирован: 17.12.2015

всех с новым годом!

 

lex2k
Offline
Зарегистрирован: 17.12.2015

pressed_moment = 0; - и это по моему тоже не надо.........но не уверен) проверяй

 

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

omglife пишет:

Схему не смогу показать, т.к. занимаюсь в кружке и все там остается.

Помощь нужна в составлении кода.

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

Так с первого взляда понятно. что. например. переменная pressed_moment может использоваться до инициализации, да и много чего.

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

На новый год мечты сбываются!!! Судя по Вашему коду я понял что кнопка сработает по плюсу, подтяните туда резистор к минусу и вот Вам код:

int ButtonPin = 2;
int motorPin = 11;
boolean ButtonState = LOW;
boolean motorState = LOW;
unsigned long pressed_moment;
bool f_time = LOW;

#define pressed_long 3000

void setup()
{
	pinMode(ButtonPin, INPUT);
	pinMode(motorPin, OUTPUT);

}

void loop()
{
	ButtonState = digitalRead(ButtonPin);
	
	if (ButtonState == HIGH && motorState == LOW)
	{
	  if (f_time == LOW)
	   {
	    pressed_moment = millis();
        f_time = HIGH;
	   }
	  if ((millis() - pressed_moment) > pressed_long)
	   {
	    digitalWrite(motorPin, HIGH);
	    motorState = HIGH;
		
	   }
	}

	if (ButtonState == LOW)
	{
	  f_time = LOW;
	  if (!digitalRead(motorPin)) motorState = LOW;
	  
	}

	if (ButtonState == HIGH && motorState == HIGH)
	{
	  if (f_time == LOW)
	  {
	    digitalWrite(motorPin, LOW);
	  }
	 	
}

 

lex2k
Offline
Зарегистрирован: 17.12.2015

vosara пишет:

На новый год мечты сбываются!!! Судя по Вашему коду я понял что кнопка сработает по плюсу, подтяните туда резистор к минусу и вот Вам код:

int ButtonPin = 2;
int motorPin = 11;
boolean ButtonState = LOW;
boolean motorState = LOW;
unsigned long pressed_moment;
bool f_time = LOW;

#define pressed_long 3000

void setup()
{
	pinMode(ButtonPin, INPUT);
	pinMode(motorPin, OUTPUT);

}

void loop()
{
	ButtonState = digitalRead(ButtonPin);
	
	if (ButtonState == HIGH && motorState == LOW)
	{
	  if (f_time == LOW)
	   {
	    pressed_moment = millis();
        f_time = HIGH;
	   }
	  if ((millis() - pressed_moment) > pressed_long)
	   {
	    digitalWrite(motorPin, HIGH);
	    motorState = HIGH;
		
	   }
	}

	if (ButtonState == LOW)
	{
	  f_time = LOW;
	  if (!digitalRead(motorPin)) motorState = LOW;
	  
	}

	if (ButtonState == HIGH && motorState == HIGH)
	{
	  if (f_time == LOW)
	  {
	    digitalWrite(motorPin, LOW);
	  }
	 	
}

 

а мне тек кажется что кнопка по минусу стоит

lex2k
Offline
Зарегистрирован: 17.12.2015
 if (ButtonState == HIGH)
19     {
20     pressed_moment = millis();
21     }
22     else

 

если на входе высокий ур-нь просто запоминаем состояние счетчика и всё

 

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

lex2k

Да похоже Вы правы!!! 

Andy
Andy аватар
Offline
Зарегистрирован: 01.01.2016

ЕвгенийП пишет:
Как можно писать код для управления неизвестной схемой? Но мы даже не знаем куда у Вас кнопка подключена: к земле или и питанию, о каком коде речь?
Говнокод по другому не написать. Нормальный код можно написать например так. Первые 5 строк на усмотрение автора темы.

#define BUTTON_PIN 2
#define MOTOR_PIN  3
#define IS_BUTTON_PRESSED digitalRead(BUTTON_PIN)?0:1
#define START LOW
#define STOP HIGH

#define MOTOR(b) digitalWrite(MOTOR_PIN, b)
#define INTERVAL 50
unsigned long time=0, timer=0;
#define IS_TIMER_EXPIRED ((time-timer) > INTERVAL)
#define CLR_TIMER timer=time
boolean last_state=false;
int cntr=0;

void setup() 
{
  pinMode(BUTTON_PIN, INPUT);
  pinMode(MOTOR_PIN, OUTPUT);
}

void loop() 
{
  time=millis();
  if (IS_TIMER_EXPIRED)
  {
    CLR_TIMER;
    if (IS_BUTTON_PRESSED)
    {
      if (last_state) cntr++;
      else last_state=true;
    }
    else
    {
      if (last_state)
      {
        if (cntr<20) MOTOR(STOP);
        if (cntr>60) MOTOR(START);
      }
      last_state=false;
      cntr=0;
    }
  }
}
sirota
Offline
Зарегистрирован: 18.08.2015

Andy, и 7-я и 10-я и 11. Как по мне 1, 2 и 8, остальное только усложнило чтение кода. Вообще как по мне define нужно пользоваться осторожно. А то мало ли кто тоже захочет в какой библиотеке воспользоваться START