Помогите разобраться с кодом

Det
Offline
Зарегистрирован: 08.04.2013

Здравствуйте. Имеется код в котором при нажатии на кнопку на СОМ порт ПК передается значение "H" а при повторном нажатии - "L", интересует как можно сделать еще одно событие а именно: при нажатии на кнопку на порт передается значение "H", при нажатии еже раз  - "Р", а при удержании клавиши одну секунду на СОМ порт должен передаваться значение "L". Выкладываю имеющийся код, подскажите пожалуйста. Если что то будет не ясно я объясню

int switchPin = 12;
int ledPin = 13;
boolean lastBut = LOW;
boolean curBut = LOW;
boolean ledOn = false;
int val=0;

void setup()
{
pinMode (switchPin, INPUT);
pinMode (ledPin, OUTPUT);
Serial.begin(9600);
}

boolean debounce(boolean last)
{
  boolean cur=digitalRead(switchPin);
  if (last!=cur)
  {
    delay(5);
    cur = digitalRead(switchPin);
  }
  return cur;
}

void loop()
{
  curBut=debounce (lastBut);
  if (lastBut == LOW && curBut == HIGH)
  {
   ledOn =!ledOn;
  }
   lastBut = curBut;  
   digitalWrite(ledPin,ledOn);
  if (ledOn == HIGH)
  {
   Serial.println("H");  
  }
  else
  {
  Serial.println("L");
  }
delay(100);
}

 

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

Не раскрыт вопрос - как программа должна реагировать на нажатие, следующее за односекундным (L). Т.е. должна ли она после "L"  начинать сначала, т.е. с "H" или продолжать попеременно переключаться между "H" и "P". Другими словами:

H-P-H-L-P... или

H-P-H-L-H...

fiberline
Offline
Зарегистрирован: 07.04.2012

Думаю нужно ввести как минимум еще одну проверку нажатия кнопки, а для отсчета времени использовать millis()

Det
Offline
Зарегистрирован: 08.04.2013

при нажатии на кнопку - Н-Н-Н...

при повторном нажатии - Р-Р-Р...

а при нажатии с задержкой в 1 секунду - L-L-L... и так будет пока кнопка не нажмётся еще раз, потом снова Н-Н-Н...

То есть когда нажать кнопку то Н-Н-Н если еще раз нажать кнопку то Р-Р-Р если повторно нажать кнопку то опять Н-Н-Н но у когда нажать удерживая секунду то L-L-L

надеюсь я объяснил...

 

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

С какого это перепугу у вас вдруг пошли по три одинаковых состояния подряд ("при нажатии на кнопку - Н-Н-Н... при повторном нажатии - Р-Р-Р...")?

Вот скелет для вашего случая:

curState=digitalRead(...); // ну или debounce()...
if(prevState==btnReleased && curState==btnPressed) { // кнопку только что нажали
  timeOn=millis();
}
if(prevState==btnPressed && curState==btnReleased) { // кнопку только что отпустили
  if(millis()-timeOn)>1000 { // это было длинное нажатие
    [...]
  }
  else { // это было короткое нажатие
    [...]
  }
}
prevState=curState;

мясо навесите сами

Det
Offline
Зарегистрирован: 08.04.2013

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

Det
Offline
Зарегистрирован: 08.04.2013

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

Det
Offline
Зарегистрирован: 08.04.2013

Суть вашего кода я понял но не могу переписать под свой... не силен в программировании...

Det
Offline
Зарегистрирован: 08.04.2013

Суть вашего кода я понял но не могу переписать под свой... не силен в программировании...

Det
Offline
Зарегистрирован: 08.04.2013

Помогите пожалуйста разобраться...