использование кода от брелка сигнализации
- Войдите на сайт для отправки комментариев
Вс, 20/11/2016 - 13:31
здраствуйте! имею такой код, которы может читать и выводить данные в сериал с брелка сигнализации
#define rxd 2 //задаем пин приемника #define delta 200 //задаем время для расброса времени посылаемого сигнала int metka2 = 0; // метка для подсчета чистого сигнала(что бы мусор не принимал) boolean metka = 0; // вторая метка для подсчета чистого сигнала unsigned int time, oldtime; //переменные для времени void setup() { pinMode(rxd, INPUT); //сделаем входом attachInterrupt(0, pinint, CHANGE); //настроим прерывание Serial.begin(115200); //скорость порта interrupts(); // активираем прерывания } void pinint() { if (digitalRead(rxd) == LOW) //значит приняли ноль { oldtime = micros(); //записали время } else { time = micros() - oldtime; //нходим время в котором был 0 или 1 if (constrain(time, 13400 - delta, 13400 + delta) == time)// если попадает 0 или еденица в интервал от 13200 до 13600 значит пришел стартовы бит и начнем считать саму посылку { metka = 1; //выставилм метки что бы понять что посылка кода пошла metka2 = 0; //выставилм метки что бы понять что посылка кода пошла } if (metka == 1 && metka2 <= 24 ) //значит метки совпадают начинаем читать сигналы { metka2++; //выставим что бы метка отсчитала 24 посылки "1" и "0", после 24 приходит мусор if (constrain(time, 1300 - delta, 1300 + delta) == time) //если пришла 1 запишем ее в функцию, там она напечатается в монитор { funkciya(1); } else if (constrain(time, 300, 500) == time) //если пришел 0 запишем его в функцию, там он напечатается в монитор { funkciya(0); } else if (constrain(time, 0, 300) == time) // если поймапли какой то мусор, сразу обрубаем чтение порта { metka = 0; metka2 = 25; } if ( metka2 == 25) //ну это для образовательных целей что бы видеть разрыв между посылками { Serial.println(""); Serial.println("OK"); Serial.println(""); } } } } void funkciya(int chislo) // сама функция выыода посылки но высылается по одному символу { Serial.println(chislo); } void loop() {}
но посылки приходят по одной цифре- все 24 бита, как мне их можно использовать что бы зажеч светодиод, причем если хоть одна цифра не совпадала - ничего не происходило, было направление записывать все в одно число т.е. посылка допустим 1,0,1. умнажал на 1 потом на 10 потом на 100 и все складывал получилось 101 целое число но число 111001101001001101101101 не запишется т.к. дуино не может хранить такие большие числа. так вот какие мысли есть? помогите пожалуйста!!!
сообщение в терминал приходит такое
d13lider, а зачем тебе десятичное представление числа? Используй двоичное, 24 бита укладываются в переменную типа long.
d13lider, а зачем тебе десятичное представление числа? Используй двоичное, 24 бита укладываются в переменную типа long.
прошу прощения а как? не могу понять мысль
сделал конечно в лоб! но это ужас какой-то)))) не пинайте а подскажите пожалуйста
Пишите полученную ноль или единицу в старший или младший разряд uint32_t и сдвигайте в право или в лево на единицу после каждой записи. В конце получится требуемое число.
d13lider,
Serial
.print(var,BIN);
выведет переменную var в нужном тебе виде, просто себери в неё все твои биты.вот с этим вообще не могу разобраться? можете ссылку дать про сдвиги? не могу понять как это все роисходит. видел примеры, но что к чему непонятно..
d13lider,
Serial
.print(var,BIN);
выведет переменную var в нужном тебе виде, просто себери в неё все твои биты.вот именно сброку делать не могу научится, я так понял как раз в uint32 собирать сдвигом в право, но как это... очень хочу научится, много данных надо еще будет в жизни собирать в строку!прошу помогите бедолаге)
и еще вопрос, не пойму как вот это "111001101001001101101110" засунуть в 24 бита. почему брелок называется 24битный
как-то так:
или так:
Вот сбор влево и в право вашего числа. Заметьте, что массив d имеет размерность 8 бит.
Вам в вашей подпрограмме funkciya надо только одну из этих строк
и следить за вызовами. После 24 вызовов возвращать число.
Я так понял это два разных способа, но к сожалению ни один не понял andy спасибо что возитесь,но как это поместить в мою программу?
nik182 спасибо большое и вам но если не сложно комментарии поставьте пожалуйста.
Лучше чем здесь https://www.arduino.cc/en/Reference/Bitshift , http://playground.arduino.cc/Code/BitMath не объяснить.
Лучше чем здесь https://www.arduino.cc/en/Reference/Bitshift , http://playground.arduino.cc/Code/BitMath не объяснить.
за ссылки огромное спасибо! все искал что означает << и мысль теперь улавливаю!