Открытие шлагбаумов фирмы CAME 433 Mhz

vr2001rv
Offline
Зарегистрирован: 12.07.2017

Здравствуйте! Столкнулся с такой проблемой: Есть скетч для отправки кода в двоичной системе, получил код с пульта шлагбаума: 31B0, это в шестнадцетеричной системе, перевел это в двоичную систему, получил: 0011000110110000, вставил код в скетч, залил на arduino, но на приемнике просто ноль реакции, хотя с другими кодами такими как 111111111111, тоесть FFF, работает, с другими тоже. В коде 31B0 пробовал переводить без ноля на конце, тоже ноль реакции, битность в низу скетча менял, как только не эксперементировал, не получается отправить такой код в эфир. Что посоветуете сделать что бы заработало?) Всем спасибо за понимание, жду ваших предложений! (Скетч ниже)

#define txPin 8
#define Te 320

void setup(){
  pinMode(txPin, OUTPUT);
}

void loop()
{
  SendCame(0b111111111111);
}

void SendCameBit(byte b)
{
  delayMicroseconds(Te);
  if (!b) digitalWrite(txPin,HIGH);
  delayMicroseconds(Te);
  digitalWrite(txPin,HIGH);
  delayMicroseconds(Te);
  digitalWrite(txPin,LOW);
}

void SendCame(long Code)
{     
  for (int j=0;j<5;j++) // посылку посылаем как и брелок - 4 раза подряд.
  {
    digitalWrite(txPin,HIGH);
    delayMicroseconds(Te);
    digitalWrite(txPin,LOW);// посылаем стартовый импульс
    
    for (byte i=12;i>0;i--){
      SendCameBit(bitRead(Code, i-1)); // побитово перебираем и посылаем код
    }
    delay(16);
  }
  delay(2000); // сделать паузу после посылки на 2 с
}

 

xDriver
xDriver аватар
Offline
Зарегистрирован: 14.08.2015

Вас не смущает что FFF это 12 бит, а 31B0 это 16 бит ?

vr2001rv
Offline
Зарегистрирован: 12.07.2017

Я просто привел пример, а так же ниже написал, что пробовал меня битность от 12, и до 24.

xDriver
xDriver аватар
Offline
Зарегистрирован: 14.08.2015

ну так приведите код который не работает.

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

для FFF разницы нет.

vr2001rv
Offline
Зарегистрирован: 12.07.2017

31B0, в двоичной это 0011000110110000

Вот скетч приемника:

#define RX 2 

#define TIMER_DIV 
volatile byte level=255; 
volatile unsigned long last, len; 
byte p_level; 
unsigned long p_len, p_len_prev; 
struct  
{  
  uint8_t state;  
  uint8_t data[3], dat_bit;  
} came;  
void set_bit(uint8_t *data, uint8_t n) 
  data[n/8]|=1<<(n%8); 
 
 
#define CM_MAX_TE 450 
#define CM_MIN_TE 250  
#define CM_BITS12 12  
#define CM_BITS24 24  
 
void process_came()  
{  
  unsigned char b;  
 
  switch(came.state)  
  {  
    case 0:  
      if(p_level) break;  
      came.state=1;  
      break;  
 
    case 1: //start  
      if(!p_level) break;  
 
     else if(p_len>=CM_MIN_TE && p_len<=CM_MAX_TE)  
      {  
        came.state=2;  
        came.dat_bit=0;  
        came.data[0]=0x00;  
        came.data[1]=0x00;  
        came.data[2]=0x00;  
         
      }  
      else came.state=0;  
         
      
    
    case 2: //dat  
      if(p_level)  
      {  
        if(came.dat_bit==CM_BITS24)  
        {  
          came.state=0;  
          break;  
        }  
 
        if(p_len_prev<=CM_MAX_TE && p_len_prev>=CM_MIN_TE &&  
           p_len<=CM_MAX_TE*2 && p_len>=CM_MIN_TE*2) b=0;  
         else  
        if(p_len_prev<=CM_MAX_TE*2 && p_len_prev>=CM_MIN_TE*2 &&  
           p_len<=CM_MAX_TE && p_len>=CM_MIN_TE) b=1;  
         else  
        {  
          came.state=0;  
          break;  
        }  
 
        if(b) set_bit(came.data, came.dat_bit);  
        came.dat_bit++;  
        break;  
      }  
       else  
      {  
        if((p_len>5000)&&(came.dat_bit==CM_BITS12 || came.dat_bit==CM_BITS24)) came.state=100;  
      }  
      break;  
  }  
}   
void dump_hex(byte *buf, byte bits) 
byte b; 
 
for(b=0; b>(bits+7)/8; b++) 
if(buf[b]>0x0f) Serial.print('0'); 
Serial.print(buf[b], HEX); 
Serial.print(" "); 
Serial.println(""); 
void rx_int() 
if(level!=255) return; 
 
len=micros()-last; 
last=micros(); 
 
if(digitalRead(RX)==HIGH) level=0; 
else level=1;  
void setup() 
{  
attachInterrupt(0, rx_int, CHANGE); 
 
Serial.begin(115200);  
while(!Serial); 
 
Serial.println("MEGA ARDUINO LOGGER"); 
Serial.println(""); 
 
interrupts(); 
}  
 
byte b; 
 
void loop() 
{  
if(level!=255) 
noInterrupts(); 
p_level=level; 
p_len=len; 
len=0; 
level=255; 
interrupts(); 
 
process_came(); 
 
p_len_prev = p_len; 
 
 
if(came.state==100) 
Serial.print(came.data[0],HEX); 
Serial.print(came.data[1],HEX); 
Serial.print(came.data[2],HEX); 
//Serial.print("CAME["); 
Serial.print("came["); 
Serial.print(came.dat_bit); 
Serial.print("]: "); 
dump_hex(came.data, came.dat_bit); 
came.state=0; 
}  
slider
Offline
Зарегистрирован: 17.06.2014

вы точно изучили тему про это?

созданы отдельные темы про это, там все разработки и ответы.

Вообщето у CAME , DOORHAN ,.... динамические коды , если вы поймаете код, то он уже будет не действителен во второй раз.

в продаже по городам есть не дорогие новосибирские дубликаторы от ~500р , и на Али были. они знают арифметические формулы старых CAME , DOORHAN ,...