И опять сложные кнопки

Здесь обсуждаем Arduino
Аватара пользователя
GhostX
Сообщения: 1112
Зарегистрирован: 07 дек 2015, 14:40
Откуда: Рязань

Re: И опять сложные кнопки

Сообщение GhostX » 02 фев 2016, 15:02

код какой то не красивый выходит...
Но как то так выходит. Изначально то было один диод горел, а теперь 2 катушки и третья....
Ты бы сразу написал что мастеришь, так сильно проще было бы.

Код: Выделить всё

int reley = 10;
int rele1 = 13;// пин со светодиодом
int rele2 = 6; // нога на бум
long OnTime = 500; // время свечения светодиода, мс
int ledState = LOW;
int ledState2 = LOW;
int pinButton = 7; // пин, к которому подключена кнопка
int pinButton2 = 9; // пин, к которому подключена кнопка2
int pinButton3 = 8;
unsigned long previousMillis = 0UL;
bool key = true;
bool keyLOW = true;
bool key3 = true;

void setup()
{
	pinMode(rele2, OUTPUT);
	pinMode(rele1, OUTPUT);
	pinMode(reley, OUTPUT);
	pinMode(pinButton, INPUT);
	pinMode(pinButton3, INPUT);
	pinMode(pinButton2, INPUT);
}
 
void loop(){
	
	if (digitalRead(pinButton3) == HIGH){
		previousMillis = millis(); // запоминаем время когда она нажалать
		digitalWrite(reley, HIGH);
		ledState = HIGH; // взводим ключ на включение.
		key3 = true;
	}
	else{
		digitalWrite(reley, LOW);
	}
 
	if (millis()- previousMillis >= OnTime){ // таймер пяти секунд
		ledState = LOW; //потушить по истечении времени
	}

	if ((digitalRead(pinButton2) == LOW) && (keyLOW == false)){
		keyLOW = true;// триггер на отжатие кнопки, пока не отожмешь не пустит в если где проверяет нажатие.
		ledState2 = LOW;
    }
	if ((digitalRead(pinButton2) == HIGH) && (keyLOW == true)){ // если нажата кнопка и ключ true то
		previousMillis = millis(); // запоминаем время когда она нажалать
		ledState2 = HIGH; // взводим ключ на включение.
		keyLOW = false;
    }
    if ((digitalRead(pinButton) == LOW) && (key == false) key = true;
    if ((digitalRead(pinButton) == HIGH) && (key == true) && key3){ // если нажата кнопка и ключ true то
		previousMillis = millis(); // запоминаем время когда она нажалать
		ledState = HIGH; // взводим ключ на включение.
		key = false;
		key3 = false;
		
    }
	digitalWrite(rele1,ledState); // включаем или гасим диод в зависимости от переменной ledState
	digitalWrite(rele2,ledState2); // включаем или гасим диод в зависимости от переменной ledState
}
код подправил...

Аватара пользователя
gurvinok
Сообщения: 1480
Зарегистрирован: 02 мар 2013, 09:18
Откуда: Москва

Re: И опять сложные кнопки

Сообщение gurvinok » 02 фев 2016, 15:45

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

Аватара пользователя
GhostX
Сообщения: 1112
Зарегистрирован: 07 дек 2015, 14:40
Откуда: Рязань

Re: И опять сложные кнопки

Сообщение GhostX » 02 фев 2016, 15:56

Да там нет ни какова поиска.
Взяли бревно и сделали Буратину, а потом подумали и переделали на Мальвину.
Вот и получилась Мальвина страшноватой...

Аватара пользователя
gurvinok
Сообщения: 1480
Зарегистрирован: 02 мар 2013, 09:18
Откуда: Москва

Re: И опять сложные кнопки

Сообщение gurvinok » 02 фев 2016, 16:01

Поэтому и пишу на бумажке, дабы носатая Мальвина не получилась. А то так и до Артемона до страгать можно.
Если долго мучиться, может быть получится.

Аватара пользователя
GhostX
Сообщения: 1112
Зарегистрирован: 07 дек 2015, 14:40
Откуда: Рязань

Re: И опять сложные кнопки

Сообщение GhostX » 02 фев 2016, 16:17

Я это к тому, что под каждую новую задачу, лучше свой скетч писать с нуля. А не с переделок.
А с бумажкой, это вообще отдельная тема.
Я тут сидел думал.
Есть куллер, у него тахометр. Он сидит на 2 ноге и постоянно дергает ардуину. И та считает сколько оборотов в минуту тот выдает. А такой задачи то и нет. Есть задача поглядывать не остановился ли он. Ну раз в минут 10.
Пока рисовать не начал, даже не мог сформулировать как это организовать.

Аватара пользователя
gurvinok
Сообщения: 1480
Зарегистрирован: 02 мар 2013, 09:18
Откуда: Москва

Re: И опять сложные кнопки

Сообщение gurvinok » 02 фев 2016, 16:19

Повесить на таймер/счетчик через внешнюю ногу и в обработчике прерывания считать количество импульсов за секунду и писать в какой-нибудь переменной. Основной программе не мешает лишь поглядывать, не ноль ли там, если нет, то крутится.
Если долго мучиться, может быть получится.

Аватара пользователя
GhostX
Сообщения: 1112
Зарегистрирован: 07 дек 2015, 14:40
Откуда: Рязань

Re: И опять сложные кнопки

Сообщение GhostX » 02 фев 2016, 16:33

покинем эту тему, она о кнопках.

ilay
Сообщения: 31
Зарегистрирован: 28 янв 2016, 21:15

Re: И опять сложные кнопки

Сообщение ilay » 03 фев 2016, 08:39

GhostX писал(а):код какой то не красивый выходит...
Но как то так выходит. Изначально то было один диод горел, а теперь 2 катушки и третья....
Ты бы сразу написал что мастеришь, так сильно проще было бы.

Код: Выделить всё

int reley = 10;
int rele1 = 13;// пин со светодиодом
int rele2 = 6; // нога на бум
long OnTime = 500; // время свечения светодиода, мс
int ledState = LOW;
int ledState2 = LOW;
int pinButton = 7; // пин, к которому подключена кнопка
int pinButton2 = 9; // пин, к которому подключена кнопка2
int pinButton3 = 8;
unsigned long previousMillis = 0UL;
bool key = true;
bool keyLOW = true;
bool key3 = true;

void setup()
{
	pinMode(rele2, OUTPUT);
	pinMode(rele1, OUTPUT);
	pinMode(reley, OUTPUT);
	pinMode(pinButton, INPUT);
	pinMode(pinButton3, INPUT);
	pinMode(pinButton2, INPUT);
}
 
void loop(){
	
	if (digitalRead(pinButton3) == HIGH){
		previousMillis = millis(); // запоминаем время когда она нажалать
		digitalWrite(reley, HIGH);
		ledState = HIGH; // взводим ключ на включение.
		key3 = true;
	}
	else{
		digitalWrite(reley, LOW);
	}
 
	if (millis()- previousMillis >= OnTime){ // таймер пяти секунд
		ledState = LOW; //потушить по истечении времени
	}

	if ((digitalRead(pinButton2) == LOW) && (keyLOW == false)){
		keyLOW = true;// триггер на отжатие кнопки, пока не отожмешь не пустит в если где проверяет нажатие.
		ledState2 = LOW;
    }
	if ((digitalRead(pinButton2) == HIGH) && (keyLOW == true)){ // если нажата кнопка и ключ true то
		previousMillis = millis(); // запоминаем время когда она нажалать
		ledState2 = HIGH; // взводим ключ на включение.
		keyLOW = false;
    }
    if ((digitalRead(pinButton) == LOW) && (key == false) key = true;
    if ((digitalRead(pinButton) == HIGH) && (key == true) && key3){ // если нажата кнопка и ключ true то
		previousMillis = millis(); // запоминаем время когда она нажалать
		ledState = HIGH; // взводим ключ на включение.
		key = false;
		key3 = false;
		
    }
	digitalWrite(rele1,ledState); // включаем или гасим диод в зависимости от переменной ledState
	digitalWrite(rele2,ledState2); // включаем или гасим диод в зависимости от переменной ledState
}
код подправил...
Когда pinButton3 кликнешь, гаснет через 500мс, а при удержании не гаснет. Пытался сам поправить, не получается.

Аватара пользователя
GhostX
Сообщения: 1112
Зарегистрирован: 07 дек 2015, 14:40
Откуда: Рязань

Re: И опять сложные кнопки

Сообщение GhostX » 03 фев 2016, 09:16

Для начала, где написано, что он не должен на последующих кругах цикла, на нажатую кнопку, реагировать? Это нормально. Ну а для продолжения. Он погаснет, как только палец отпустит кнопку. Таково условие
Вот тебе нужные строчки, сам добавь туда, где их не хватает. Должно будет заработать, через обязательное отпускание кнопки.

Код: Выделить всё

bool keyStop = true; // ключ отпускания кнопки
if ((digitalRead(pinButton3) == LOW) && (keyStop == false) keyStop = true;// отпускаем кнопку взводится ключ
 && (keyStop == true)   
keyStop = false; // сброс ключа

Ответить