Помогите с кодом короткого мырга диода

Филин
Offline
Зарегистрирован: 25.03.2012

 Не получается толком написать код короткого мигания светодиода при каждом нажатии на кнопку.

Вот это не работает

  if (buttonState == HIGH && trigerState == LOW) {
    digitalWrite(ledPin, HIGH);
    delay(10);
    while (buttonState == HIGH) {
    digitalWrite(ledPin, LOW);
    }

 

MarioM
Offline
Зарегистрирован: 18.04.2011

 ну 10 милисекунд маловато конечно, попробуй побольше, и во вторых  внутри цикла while никак не меняется ButonState... если случится так что программа пройдется по этому циклу, то дальше она уже не пойдет... да и вообще не понятен смысл всех этих манипуляций с кодом, почему просто не включить диод, подождать, и выключить его?

Филин
Offline
Зарегистрирован: 25.03.2012

Задержка в 10 миллисекунд должна быть по заданию.

А смысл такой, при нажатии на кнопку светодиод должен мигнуть один раз независимо от длительности нажатия на кнопку. При отпускании кнопки цикл должен прерваться для дальнейшего опроса состояния кнопки.

step962
Offline
Зарегистрирован: 23.05.2011

 Попробуйте ориентироваться не на СОСТОЯНИЕ "кнопка нажата", а на СОБЫТИЕ  "кнопка нажата".

В чем разница?

СОСТОЯНИЕ длится все то время, пока кнопка нажата.

СОБЫТИЕ - лишь один-единственный миг при переходе кнопки из ненажатого состояния в нажатое.

Т.е. в терминах обработки сигналов - ловите не уровни, а фронты.

maksim
Offline
Зарегистрирован: 12.02.2012

Правильно пишит step962 нужно ловить событие, к примеру если использовать прерывания, то там это реализованно параметрами RISING и FALLING, но в прерывании не будет работать задержка. Поэтому для начала выложите весь код и опишите как подключаете кнопку.

maksim
Offline
Зарегистрирован: 12.02.2012

 В общем случае (при нажатии кнопки пин замыкается на минус) будет так:

#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;
  }
}

 

 

svizist1
Offline
Зарегистрирован: 28.01.2012

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);  // гасим светодиод

  }
}

 

maksim
Offline
Зарегистрирован: 12.02.2012
#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);
}

 

И вам не нужно менять кнопку, "фиксацию" можно сделать програмно.

 

maksim
Offline
Зарегистрирован: 12.02.2012

 Или так:

 if(digitalRead(btnPin1))
  { 
    if(!buttonState)
    {
      digitalWrite(ledPin1, HIGH);
      Serial.println("D01KP");
      state1 = 1;
    }
  }
  else
  {
    digitalWrite(ledPin1, LOW);
    state1 = 0;
  }

 

svizist1
Offline
Зарегистрирован: 28.01.2012

 Максим, огромное спасибо. Много нового увидал, незнаю как, но работает. Я пытался, разобраться  и продолжаю. Спасибо за время.