использование кода от брелка сигнализации

d13lider
d13lider аватар
Offline
Зарегистрирован: 19.10.2015

здраствуйте! имею такой код, которы может читать и выводить данные в сериал с брелка сигнализации 

#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
d13lider аватар
Offline
Зарегистрирован: 19.10.2015

сообщение в терминал приходит такое 

1
1
1
0
0
1
1
0
1
0
0
1
0
0
1
1
0
1
1
0
1
1
1
0
 
OK
 
PS за орфографию прошу прощения((
 
Andy
Andy аватар
Offline
Зарегистрирован: 01.01.2016

d13lider пишет:
допустим 1,0,1. умнажал на 1 потом на 10 потом на 100 и  все складывал получилось 101 целое число но число 111001101001001101101101 не запишется т.к. дуино не может хранить такие большие числа.

d13lider, а зачем тебе десятичное представление числа? Используй двоичное, 24 бита укладываются в переменную типа long.

d13lider
d13lider аватар
Offline
Зарегистрирован: 19.10.2015

Andy пишет:

 

d13lider, а зачем тебе десятичное представление числа? Используй двоичное, 24 бита укладываются в переменную типа long.

прошу прощения а как? не могу понять мысль

 

d13lider
d13lider аватар
Offline
Зарегистрирован: 19.10.2015

сделал конечно в лоб! но это ужас какой-то)))) не пинайте а подскажите  пожалуйста

#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);
  }
  
  }

 

nik182
Offline
Зарегистрирован: 04.05.2015

Пишите полученную ноль или единицу в старший или младший разряд uint32_t и сдвигайте в право или в лево на единицу после каждой записи. В конце получится требуемое число.

Andy
Andy аватар
Offline
Зарегистрирован: 01.01.2016

d13lider, Serial.print(var,BIN); выведет переменную var в нужном тебе виде, просто себери в неё все твои биты.

d13lider
d13lider аватар
Offline
Зарегистрирован: 19.10.2015

nik182 пишет:
Пишите полученную ноль или единицу в старший или младший разряд uint32_t и сдвигайте в право или в лево на единицу после каждой записи. В конце получится требуемое число.
 

вот с этим вообще не могу разобраться? можете ссылку дать про сдвиги? не могу понять как это все роисходит. видел примеры, но что к чему непонятно..

d13lider
d13lider аватар
Offline
Зарегистрирован: 19.10.2015

Andy пишет:

d13lider, Serial.print(var,BIN); выведет переменную var в нужном тебе виде, просто себери в неё все твои биты.

 

вот именно сброку делать не могу научится, я так понял как раз в uint32 собирать сдвигом в право, но как это... очень хочу научится, много данных надо еще будет в жизни собирать в строку!прошу помогите бедолаге)

d13lider
d13lider аватар
Offline
Зарегистрирован: 19.10.2015

и еще вопрос, не пойму как вот это "111001101001001101101110" засунуть в 24 бита. почему брелок называется 24битный

Andy
Andy аватар
Offline
Зарегистрирован: 01.01.2016

как-то так:

if (bit) var |= 1;//устанавливаешь младший бит
var <<= 1;//сдвигаешь влево на 1 бит

или так:

var |= (1<<n);//устанавливаешь бит номер n

 

nik182
Offline
Зарегистрирован: 04.05.2015

Вот сбор влево и в право вашего числа. Заметьте, что массив 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 надо только одну из этих строк

  x+=chislo; x = x << 1; // влево
  y+=((unit_32)chislo << 24); y = y >> 1; // вправо

и следить за вызовами. После 24 вызовов возвращать число. 

d13lider
d13lider аватар
Offline
Зарегистрирован: 19.10.2015

Я так понял это два разных способа, но к сожалению ни один не понял andy спасибо что возитесь,но как это поместить в мою программу?
nik182 спасибо большое и вам но если не сложно комментарии поставьте пожалуйста.

nik182
Offline
Зарегистрирован: 04.05.2015

Лучше чем здесь https://www.arduino.cc/en/Reference/Bitshift , http://playground.arduino.cc/Code/BitMath не объяснить.

 
 x=0;y = 1; x=x+y; // binary: 0000000000000001
 x =x<< 1;      // binary: 0000000000000010
 x=x+y;         // binary: 0000000000000011
 x =x<< 1;       // binary: 0000000000000110
 x =x<< 1;       // binary: 0000000000001100
x=x+y;         // binary: 0000000000001101
.....
и.т.д.
d13lider
d13lider аватар
Offline
Зарегистрирован: 19.10.2015

nik182 пишет:

Лучше чем здесь https://www.arduino.cc/en/Reference/Bitshift , http://playground.arduino.cc/Code/BitMath не объяснить.

 
 x=0;y = 1; x=x+y; // binary: 0000000000000001
 x =x<< 1;      // binary: 0000000000000010
 x=x+y;         // binary: 0000000000000011
 x =x<< 1;       // binary: 0000000000000110
 x =x<< 1;       // binary: 0000000000001100
x=x+y;         // binary: 0000000000001101
.....
и.т.д.

за ссылки огромное спасибо! все искал что означает << и мысль теперь улавливаю!