Работа с импульсами
- Войдите на сайт для отправки комментариев
Всем доброго времени суток)))Как и многие начинающие здесь - прошу подсказку.Собрал себе 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 . если байт полон, то стоп код не ставится. Да что я придумываю . протокол и кодировку вы должны придумать сами, а не я предлогать вам.