Работа с импульсами
- Войдите на сайт для отправки комментариев
Всем доброго времени суток)))Как и многие начинающие здесь - прошу подсказку.Собрал себе 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 и т.д.Ну т.е. сначала считаем а потом в порт выдаем.У меня же выдает после каждого нажатия.Поясните что добавить к коду и почему именно так.Всем спасибо)))
Вы наверно решили дешифровщик кода морзе сделать. Если это так, то начали не с того места. Прежде всего код Морзе это не точки и тире, а пакет. Вы должны принять именно пакет . А любой пакет начинается с лидера , который определяет что это начало пакета и заканчивается стопером , показывающим что это конец пакета . Дальше идет дешифровка и выдача результата.
Нет,не Морзе.Хотя по смыслу похоже-согласен с Вами).Для морзянки мне дешифратор не нужен-изучал на службе).Это "пики" автосигнализации (закрываем-1пик,открываем-2пика и т.д.)Ну т.е. да-пачками.Вот только никаких маркеров там нет,поэтому и думаю определять окончание пачки импульсов по разнице пауз между импульсами в пачке и между пачками.Вот только не знаю куда дальше копать.
Лидер и стопер это просто большая пауза. между пиками короткая пауза. Если у вас пики короткие и длиные , то пауза между пиками длительность короткого пика. если у вас в пачке различное количество пиков то приходится вводить стоп код. пусть 00 это кототкий пик 01 длиный пик и 10 стоп . тогда пакет из одного пика кодируется так 00-10-00-00 два коротких пика 00-00-10-00 два длинных 01-01-10-00 Ну это тратится байт на пакет и вариантов пакетов 16 . если байт полон, то стоп код не ставится. Да что я придумываю . протокол и кодировку вы должны придумать сами, а не я предлогать вам.