Двигатель с кнопкой!
- Войдите на сайт для отправки комментариев
Чт, 31/12/2015 - 14:43
Задача стоит такая:
Собрать схему с двигателем и кнопкой. При нажатии и удерживании кнопки 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;
}
}
}
Схему я собрал
а вот с кодом возникли проблемы.
Какие проблемы? Опишете или надо самим догадываться?
Кто может помогите пожалуйста.
В чём нужна помощь? Вы никаких проблем и вопросов не сформулировали.
Схему не смогу показать, т.к. занимаюсь в кружке и все там остается.
Когда загружаю код в ардуино, мотор ждет 3 секунды и запускается сам без нажатия кнопки, а если кнопку нажать когда мотор работает, то он выключится, но потом снова через 3 секунды включается! А мне нужно, чтобы, удерживая кнопку 3 секунды мотор включался, а при одиночном нажатии выключался.
Помощь нужна в составлении кода.
В кружке не помогают?
В кружке не помогают?
кружок - ячейка ИГИЛ
Просьба писать по делу!
С новым Годом!
и вас тоже)
Просьба писать по делу!
влом мне чужие велосипеды слепым ремонтировать.
всех с новым годом!
pressed_moment = 0; - и это по моему тоже не надо.........но не уверен) проверяй
Схему не смогу показать, т.к. занимаюсь в кружке и все там остается.
Помощь нужна в составлении кода.
Ну, без схемы, пусть Вам Бог помогает. Как можно писать код для управления неизвестной схемой? Но мы даже не знаем куда у Вас кнопка подключена: к земле или и питанию, о каком коде речь?
Так с первого взляда понятно. что. например. переменная pressed_moment может использоваться до инициализации, да и много чего.
На новый год мечты сбываются!!! Судя по Вашему коду я понял что кнопка сработает по плюсу, подтяните туда резистор к минусу и вот Вам код:
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); } }На новый год мечты сбываются!!! Судя по Вашему коду я понял что кнопка сработает по плюсу, подтяните туда резистор к минусу и вот Вам код:
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); } }а мне тек кажется что кнопка по минусу стоит
if(ButtonState == HIGH)19{20pressed_moment = millis();21}22elseесли на входе высокий ур-нь просто запоминаем состояние счетчика и всё
lex2k
Да похоже Вы правы!!!
#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; } } }Andy, и 7-я и 10-я и 11. Как по мне 1, 2 и 8, остальное только усложнило чтение кода. Вообще как по мне define нужно пользоваться осторожно. А то мало ли кто тоже захочет в какой библиотеке воспользоваться START