Помогите с кодом короткого мырга диода
- Войдите на сайт для отправки комментариев
Вс, 25/03/2012 - 20:33
Не получается толком написать код короткого мигания светодиода при каждом нажатии на кнопку.
Вот это не работает
if (buttonState == HIGH && trigerState == LOW) {
digitalWrite(ledPin, HIGH);
delay(10);
while (buttonState == HIGH) {
digitalWrite(ledPin, LOW);
}
ну 10 милисекунд маловато конечно, попробуй побольше, и во вторых внутри цикла while никак не меняется ButonState... если случится так что программа пройдется по этому циклу, то дальше она уже не пойдет... да и вообще не понятен смысл всех этих манипуляций с кодом, почему просто не включить диод, подождать, и выключить его?
Задержка в 10 миллисекунд должна быть по заданию.
А смысл такой, при нажатии на кнопку светодиод должен мигнуть один раз независимо от длительности нажатия на кнопку. При отпускании кнопки цикл должен прерваться для дальнейшего опроса состояния кнопки.
Попробуйте ориентироваться не на СОСТОЯНИЕ "кнопка нажата", а на СОБЫТИЕ "кнопка нажата".
В чем разница?
СОСТОЯНИЕ длится все то время, пока кнопка нажата.
СОБЫТИЕ - лишь один-единственный миг при переходе кнопки из ненажатого состояния в нажатое.
Т.е. в терминах обработки сигналов - ловите не уровни, а фронты.
Правильно пишит step962 нужно ловить событие, к примеру если использовать прерывания, то там это реализованно параметрами RISING и FALLING, но в прерывании не будет работать задержка. Поэтому для начала выложите весь код и опишите как подключаете кнопку.
В общем случае (при нажатии кнопки пин замыкается на минус) будет так:
#define button 5 #define ledPin 13 boolean buttonState = 0; void setup() { digitalWrite(button, HIGH); //подтягиваем пин к +5В pinMode(ledPin, OUTPUT); } void loop() { if(!digitalRead(button)){ // можно и так: if(digitalRead(button) == 0){ if(!buttonState){// можно и так: if(buttonState == 0){ digitalWrite(ledPin, HIGH); delay(10); digitalWrite(ledPin, LOW); buttonState = 1; } } else{ buttonState = 0; } }И для устранения дребезга кнопки можно паралельно ей поставить конденсатор.
А если при нажатии кнопки пин замыкается на плюс (в этом случае нужен подтягивающий резистор к минусу), то вот так:
#define button 5 #define ledPin 13 boolean buttonState = 0; void setup() { pinMode(ledPin, OUTPUT); } void loop() { if(digitalRead(button)){ // можно и так: if(digitalRead(button) == 1){ if(!buttonState){// можно и так: if(buttonState == 0){ digitalWrite(ledPin, HIGH); delay(10); digitalWrite(ledPin, LOW); buttonState = 1; } } else{ buttonState = 0; } }maksim
Я немножко продублирую тему, простите.
Подскажите пожалуйста с кодом, как можно оптимизировать и главное где подсмотреть решение задачи. При нажатии кнопки( на данный момент без фиксации) послать только один раз команду в сом порт и оставить светодиод включеным. Если я сменю на кнопку с фиксацией, то данные будут идти постоянно, как этого можно избежать ? сейчас три кнопки и два светика. А, вообще нужно три и три. Но это не главное.
int ledPin = 13; // светодиод int ledPin2 = 12; // светодиод int btnPin = 2;// кнопка int btnPin2 = 4;// кнопка int btnPin7 = 7;// кнопка int val = 0; int val2 = 0; int val7 = 0; void setup() { pinMode(ledPin, OUTPUT); // это выход - светодиод pinMode(ledPin2, OUTPUT); pinMode(btnPin, INPUT); // вход - кнопка pinMode(btnPin2, INPUT); //вход - кнопка Serial.begin(9600); // будем записывать в COM-порт } void loop() { val = digitalRead(btnPin); // узнаём состояние кнопки if(val==HIGH) // кнопка нажата { digitalWrite(ledPin, HIGH); // зажигаем светодиод Serial.println("D01KS"); // команда пуск } val2 = digitalRead(btnPin2); // узнаём состояние кнопки if(val2==HIGH) // кнопка нажата { digitalWrite(ledPin, HIGH); // зажигаем светодиод Serial.println("D01KP"); // команда стоп } val7 = digitalRead(btnPin7); // узнаём состояние кнопки if(val7==HIGH) // кнопка нажата { digitalWrite(ledPin2, HIGH); // зажигаем светодиод Serial.println("D01KW"); // команда вес } delay(100); { digitalWrite(ledPin, LOW); digitalWrite(ledPin2, LOW); // гасим светодиод } }#define ledPin1 13 // светодиод #define ledPin2 12 // светодиод #define ledPin3 11 // светодиод #define btnPin1 2 // кнопка #define btnPin2 4 // кнопка #define btnPin3 7 // кнопка boolean state1 = 0; boolean state2 = 0; boolean state3 = 0; void setup() { pinMode(ledPin1, OUTPUT); // это выход - светодиод pinMode(ledPin2, OUTPUT); pinMode(ledPin3, OUTPUT); Serial.begin(9600); // будем записывать в COM-порт } void loop() { if(digitalRead(btnPin1) && !state1) // кнопка 1 нажата { state1 = 1; digitalWrite(ledPin1, HIGH); // зажигаем 1 светодиод Serial.println("D01KP"); // команда пуск } if(!digitalRead(btnPin1)) // кнопка 1 отпущена { state1 = 0; digitalWrite(ledPin1, LOW); // гасим 1 светодиод } if(digitalRead(btnPin2) && !state2) // кнопка 2 нажата { state2 = 1; digitalWrite(ledPin2, HIGH); // зажигаем 2 светодиод Serial.println("D01KS"); // команда стоп } if(!digitalRead(btnPin2)) // кнопка 2 отпущена { state2 = 0; digitalWrite(ledPin2, LOW); // гасим 2 светодиод } if(digitalRead(btnPin3) && !state3) // кнопка 3 нажата { state3 = 1; digitalWrite(ledPin3, HIGH); // зажигаем 3 светодиод Serial.println("D01KW"); // команда вес } if(!digitalRead(btnPin3)) // кнопка 3 отпущена { state3 = 0; digitalWrite(ledPin3, LOW); // гасим 3 светодиод } delay(10); }И вам не нужно менять кнопку, "фиксацию" можно сделать програмно.
Или так:
if(digitalRead(btnPin1)) { if(!buttonState) { digitalWrite(ledPin1, HIGH); Serial.println("D01KP"); state1 = 1; } } else { digitalWrite(ledPin1, LOW); state1 = 0; }Максим, огромное спасибо. Много нового увидал, незнаю как, но работает. Я пытался, разобраться и продолжаю. Спасибо за время.