использование кода от брелка сигнализации
- Войдите на сайт для отправки комментариев
Вс, 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.
прошу прощения а как? не могу понять мысль
сделал конечно в лоб! но это ужас какой-то)))) не пинайте а подскажите пожалуйста
#define rxd 2 //задаем пин приемника #define delta 200 //задаем время для расброса времени посылаемого сигнала int metka2 = 0; // метка для подсчета чистого сигнала(что бы мусор не принимал) boolean metka = 0; // вторая метка для подсчета чистого сигнала boolean a1 =0; boolean a2 =0; boolean a3 =0; boolean a4 =0; boolean a5 =0; boolean a6 =0; boolean a7 =0; boolean a8 =0; boolean a9 =0; boolean a10 =0; boolean a11 =0; boolean a12 =0; boolean a13 =0; boolean a14 =0; boolean a15 =0; boolean a16 =0; boolean a17 =0; boolean a18 =0; boolean a19 =0; boolean a20 =0; boolean a21 =0; boolean a22 =0; boolean a23 =0; boolean a24 =0; int time, oldtime; //переменные для времени void setup() { pinMode(rxd, INPUT); //сделаем входом attachInterrupt(0, pinint, CHANGE); //настроим прерывание Serial.begin(115200); //скорость порта interrupts(); pinMode(13,OUTPUT);// активираем прерывания } 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 запишем ее в функцию, там она напечатается в монитор { // Serial.println(metka2); funkciya(1); } else if (constrain(time, 300, 500) == time) //если пришел 0 запишем его в функцию, там он напечатается в монитор { // Serial.println(metka2); funkciya(0); } else if (constrain(time, 0, 300) == time) // если поймапли какой то мусор, сразу обрубаем чтение порта { metka = 0; metka2 = 25; } if ( metka2 == 25) //ну это для образовательных целей что бы видеть разрыв между посылками { if(a21==0&&a22==0&&a23==0&&a24==0) { return; } else{ Serial.println(a1); Serial.println(a2); Serial.println(a3); Serial.println(a4); Serial.println(a5); Serial.println(a6); Serial.println(a7); Serial.println(a8); Serial.println(a9); Serial.println(a10); Serial.println(a11); Serial.println(a12); Serial.println(a13); Serial.println(a14); Serial.println(a15); Serial.println(a16); Serial.println(a17); Serial.println(a18); Serial.println(a19); Serial.println(a20); Serial.println(a21); Serial.println(a22); Serial.println(a23); Serial.println(a24); Serial.println(""); Serial.println("OK"); Serial.println(""); } } } } } void funkciya(int chislo) // сама функция выыода посылки но высылается по одному символу { if (metka2==2) { a1=chislo; } else if (metka2==3) { a2=chislo; } else if (metka2==4) { a3=chislo; } else if (metka2==5) { a4=chislo; } else if (metka2==6) { a5=chislo; } else if (metka2==7) { a6=chislo; } else if (metka2==8) { a7=chislo; } else if (metka2==9) { a8=chislo; } else if (metka2==10) { a9=chislo; } else if (metka2==11) { a10=chislo; } else if (metka2==12) { a11=chislo; } else if (metka2==13) { a12=chislo; } else if (metka2==14) { a13=chislo; } else if (metka2==15) { a14=chislo; } else if (metka2==16) { a15=chislo; } else if (metka2==17) { a16=chislo; } else if (metka2==18) { a17=chislo; } else if (metka2==19) { a18=chislo; } else if (metka2==20) { a19=chislo; } else if (metka2==21) { a20=chislo; } else if (metka2==22) { a21=chislo; } else if (metka2==23) { a22=chislo; } else if (metka2==24) { a23=chislo; } else if (metka2==25) { a24=chislo; } //Serial.println(chislo); } void loop() { if (a1==1&&a2==1&&a3==1&&a4==0&&a5==0&&a6==1&&a7==1&&a8==0&&a9==1&&a10==0&&a11==0&&a12==1&&a13==0&&a21==1&&a22==1&&a23==1&&a24==0) // и тут компилятор ругается если я все 24 символа пытаюсь засунуть, так что пришлось первые 13 и последние 4 { digitalWrite(13,HIGH); } else if (a1==1&&a2==1&&a3==1&&a4==0&&a5==0&&a6==1&&a7==1&&a8==0&&a9==1&&a10==0&&a11==0&&a12==1&&a13==0&&a21==1&&a22==1&&a23==0&&a24==1){ digitalWrite(13,LOW); } }Пишите полученную ноль или единицу в старший или младший разряд uint32_t и сдвигайте в право или в лево на единицу после каждой записи. В конце получится требуемое число.
d13lider,
Serial.print(var,BIN);выведет переменную var в нужном тебе виде, просто себери в неё все твои биты.вот с этим вообще не могу разобраться? можете ссылку дать про сдвиги? не могу понять как это все роисходит. видел примеры, но что к чему непонятно..
d13lider,
Serial.print(var,BIN);выведет переменную var в нужном тебе виде, просто себери в неё все твои биты.вот именно сброку делать не могу научится, я так понял как раз в uint32 собирать сдвигом в право, но как это... очень хочу научится, много данных надо еще будет в жизни собирать в строку!прошу помогите бедолаге)
и еще вопрос, не пойму как вот это "111001101001001101101110" засунуть в 24 бита. почему брелок называется 24битный
как-то так:
или так:
Вот сбор влево и в право вашего числа. Заметьте, что массив d имеет размерность 8 бит.
byte d[24]={1,1,1,0,0,1,1,0,1,0,0,1,0,0,1,1,0,1,1,0,1,1,1,0}; void setup() { } void loop() { uint32_t x,y; x=y=0; for (byte i=0; i < 24; i++) { x+=d[i]; x = x << 1; y+=((uint32_t)d[i] << 24); y = y >> 1; } }Вам в вашей подпрограмме 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 не объяснить.
за ссылки огромное спасибо! все искал что означает << и мысль теперь улавливаю!