Работа с импульсами

sanek004
Offline
Зарегистрирован: 10.06.2017

Всем доброго времени суток)))Как и многие начинающие здесь - прошу подсказку.Собрал себе Arduino,светодиодом помигал и захотелось че-нить полезное сделать.Есть некое устройство,выдающее(в зависимости от режима работы) короткие импульсы(<0.7с) от одного до шести и длинные(>0.7с).Задача такая-посчитать эти импульсы и в зависимости от их количества и длительности выдать в Serial порт буковку присвоенную текущему режиму.Поиском пользовался,читал много,но поскольку нет рядом человека,который ткнул бы носом в необходимое,то в голове каша.Написал такой вот код:

unsigned long v1 = 0;        //
unsigned long v2 = 0;        //
unsigned int corotkie = 0;              //считаем число коротких нажатий(импульсов) на кнопкe
unsigned int dlinnue=0;                 //считаем число длинных нажатий(импульсов) на кнопкe
unsigned long t_nag=0;                  //время удержания кнопки нажатой(длительность импульса)
unsigned long v4=1000;                  //пауза после отпускания кнопки
unsigned long v5=0;          //
unsigned long v6=0;          //
unsigned long pause1=0;                 //переменная паузы между нажатиями кнопки
int dlinn=2;                  //нужное количество длинных импульсов(нажатий)
int led1=8;                   // пин светодиода
int led2=9;                   // пин светодиода
int led3=10;                  // пин светодиода
int led4=11;                  // пин светодиода
int led5=13;                  // пин светодиода
int but=6;                    // пин кнопки
void setup()
{
  pinMode(but, INPUT_PULLUP);        //пин кнопки(вход) с подтягивающим резистором
  // pinMode(led1, OUTPUT);             //далее пины для led
  // pinMode(led2, OUTPUT);
  // pinMode(led3, OUTPUT);
  //pinMode(led4, OUTPUT);
  //pinMode(led5, OUTPUT);
  Serial.begin(9600);
}

void loop() 
{ 
  while (digitalRead(but) == LOW);    //здесь считаем длину паузы между нажатиями(импульсами).
  v5 = millis();                      //
  while (digitalRead(but) == HIGH);   //
  v6 = millis();                      //
  pause1=(v6-v5);                     //
   Serial.print("длина паузы:");      //
   Serial.println(pause1);            //
   

   while (digitalRead(but) == HIGH);      //здесь считаем длину нажатия(импульса).
   v1 = millis();                         //
   while (digitalRead(but) == LOW);       //
   v2 = millis();                         //
   t_nag=(v2-v1);                         //
                                          //
    Serial.print("длина нажатия:");       //
    Serial.println(t_nag);                //
   
 

  
  
    if(t_nag<700&&t_nag>50)              //...если длина нажатия меньше 700 и больше 50,
    corotkie++;                    //то к коротким добавляем единицу
    Serial.print("короткие:");
    Serial.println(corotkie);
   
  
   if(t_nag>700)                     //...а если длина нажатия больше 700 и меньше 2000,
   dlinnue++;                     //то к длинным добавляем единицу
   Serial.print("длинные:");
   Serial.println(dlinnue); 
  
  
     {
       if (corotkie== 0) { move_0(); }
  else if (corotkie== 1) { move_1(); }  
  else if (corotkie== 2) { move_2(); }
  else if (corotkie== 3) { move_3(); }
  else if (corotkie== 4) { move_4(); }
  else if (corotkie== 5) { move_5(); }
     }}

      void move_0()               
  {}
    
    void move_1() 
   {Serial.print("a");} 
   
   void move_2() 
   {Serial.print("b"); }
    
    void move_3() 
   { Serial.print("c");} 

   void move_4() 
   { Serial.print("d");} 
   
   void move_5() 
   { Serial.print("e");} 

Скетч работает-определяет длинный импульс или короткий,меряет паузу между ними,выдает нужные буковки в порт,но нужен немного другой алгоритм.После запуска программа ожидает сигнал(ы)-если после первого импульса пауза больше v4=1000,то в порт отправляем буковку,обнуляем и ждем следующий имп.Если пауза меньше v4,то к счету добавляем +1 и т.д.Ну т.е. сначала считаем а потом в порт выдаем.У меня же выдает после каждого нажатия.Поясните что добавить к коду и почему именно так.Всем спасибо)))

qwone
qwone аватар
Offline
Зарегистрирован: 03.07.2016

Вы наверно решили дешифровщик кода морзе сделать. Если это так, то начали не с того места.  Прежде всего код Морзе это не точки и тире, а пакет.  Вы должны принять именно пакет . А любой пакет начинается с лидера , который определяет что это начало пакета и заканчивается стопером , показывающим что это конец пакета . Дальше идет дешифровка и выдача результата.

sanek004
Offline
Зарегистрирован: 10.06.2017

Нет,не Морзе.Хотя по смыслу похоже-согласен с Вами).Для морзянки мне дешифратор не нужен-изучал на службе).Это "пики" автосигнализации (закрываем-1пик,открываем-2пика и т.д.)Ну т.е. да-пачками.Вот только никаких маркеров там нет,поэтому и думаю определять окончание пачки импульсов по разнице пауз между импульсами в пачке и между пачками.Вот только не знаю куда дальше копать.

qwone
qwone аватар
Offline
Зарегистрирован: 03.07.2016

Лидер и стопер это просто большая пауза. между пиками короткая пауза.  Если у вас пики короткие и длиные , то пауза между пиками длительность короткого пика. если у вас в пачке различное количество пиков то приходится вводить стоп код.  пусть 00 это кототкий пик 01 длиный пик и 10 стоп . тогда   пакет из одного пика кодируется так 00-10-00-00  два коротких пика 00-00-10-00  два длинных 01-01-10-00  Ну это тратится байт на пакет  и вариантов пакетов 16 . если байт полон, то стоп код не ставится. Да что я придумываю . протокол и кодировку вы должны придумать сами, а не я предлогать вам.