прочитать код пульта arduino

iopq
Offline
Зарегистрирован: 05.07.2016

DIVGENY пишет:

правленую библиотеку скопировали в папку с библиотками для IDE

у меня она тут c:\Program Files (x86)\arduino-1.6.8\libraries\

я скачивал по вашей ссылке выше. у меня она тут c:\Users\PC\Documents\Arduino\libraries\rc_switch-2.6.2\ и правлю там же сохраняя

DIVGENY
Offline
Зарегистрирован: 23.08.2016

скорость сериала порта в мониторе поставить 9600 согласно скетча не забудь

а другой библы rc_switch там нет ?

после правки библиотеки перезапустить IDE

iopq
Offline
Зарегистрирован: 05.07.2016

 

вот что у меня сейчас на второй ноге ардуиноэто все само собой разумеющееся. я честно говоря сам худею с этого пульта

я даже специально при редактировании делал ошибку и компилятор ардуино ругался

DIVGENY
Offline
Зарегистрирован: 23.08.2016

еще раз вычесляем

40 милисекунд 24 код и где-то 15+1 тактов синхр в нуле == 40

но скважность между 1 и 0 два к одному, то есть тактов в полтора разабольше == 60

40мс/ 60 тактов == 667 мкс -  время

но и тактов синхронизации в 0 в полтора больше значит 23+1

    { 667, {  23, 1 }, {  1,  2}, {  2,  1 }, true },    // protocol 1

плохо видно картинку и не поиграешся, лучше скинь файлформата программы  Samples [1].logicdata

DIVGENY
Offline
Зарегистрирован: 23.08.2016

  1{ 667, {  1, 23 }, {  2,  1}, {  1,  2 }, false },    // protocol 1

 сорь, выше инверсию включил, нужно без нее

исправил с 3 раза - пора спать....

iopq
Offline
Зарегистрирован: 05.07.2016

лог файл

http://my-files.ru/4ig81m

DIVGENY
Offline
Зарегистрирован: 23.08.2016

  { 330, {  49, 1 }, {  1,  2}, {  2,  1 }, false },    // protocol 1   // 48, 2 // 49, 2

DIVGENY
Offline
Зарегистрирован: 23.08.2016

  { 330, {  1, 49 }, {  2,  1}, {  1,  2 }, false },    // protocol 1  // 2, 48// 2, 49

опять 25 - тут верно, блокнот не закрыл и опять с него инверсию выдал...

iopq
Offline
Зарегистрирован: 05.07.2016

к сожалению...

использую данный скетч

#include <RCSwitch.h>

RCSwitch mySwitch = RCSwitch();

void setup() {
  Serial.begin(9600);
  mySwitch.enableReceive(0);  // Receiver on interrupt 0 => that is pin #2
}

void loop() {
  if (mySwitch.available()) {
    
    int value = mySwitch.getReceivedValue();
    
    if (value == 0) {
      Serial.print("Unknown encoding");
    } else {
      Serial.print("Received ");
      Serial.print( mySwitch.getReceivedValue() );
      Serial.print(" / ");
      Serial.print( mySwitch.getReceivedBitlength() );
      Serial.print("bit ");
      Serial.print("Protocol: ");
      Serial.println( mySwitch.getReceivedProtocol() );
    }

    mySwitch.resetAvailable();
  }
}

не выводит ничего...

DIVGENY
Offline
Зарегистрирован: 23.08.2016

 я там ошибся (((

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

iopq
Offline
Зарегистрирован: 05.07.2016
static const RCSwitch::Protocol PROGMEM proto[] = {
#endif
  // { 350, {  1, 31 }, {  1,  3 }, {  3,  1 }, false },    // protocol 1        КОММЕНТИРУЕМ ОРИГИНАЛЬНУЮ (строка 76)  В БИБЛИОТКЕ, по ссылке выше

    // пробуем менять на такие параметры

 
{ 330, {  1, 49 }, {  2,  1}, {  1,  2 }, false },    // protocol 1  // 48, 2 // 49, 2
  { 650, {  1, 10 }, {  1,  2 }, {  2,  1 }, false },    // protocol 2
  { 100, { 30, 71 }, {  4, 11 }, {  9,  6 }, false },    // protocol 3
  { 380, {  1,  6 }, {  1,  3 }, {  3,  1 }, false },    // protocol 4
  { 500, {  6, 14 }, {  1,  2 }, {  2,  1 }, false },    // protocol 5
  { 450, { 23,  1 }, {  1,  2 }, {  2,  1 }, true }      // protocol 6 (HT6P20B)
};

 

iopq
Offline
Зарегистрирован: 05.07.2016

что бы исключить какие либо ошибки я подключил читающийся пульт таким же методом без радиоканала и вот что выдает скетч выше-

23577Received 32136217 / 25bit Protocol: 5
23577Received 32136217 / 25bit Protocol: 5
23577Received 32136217 / 25bit Protocol: 5

 

DIVGENY
Offline
Зарегистрирован: 23.08.2016

 2, 48 попробуй

дай с него файл Samples [1].logicdata

iopq
Offline
Зарегистрирован: 05.07.2016

http://my-files.ru/5xnwce читаемый пульт

 

DIVGENY пишет:

 2, 48 попробуй

 

тишина

DIVGENY
Offline
Зарегистрирован: 23.08.2016

  { 320, {  1, 16 }, {  1,  1 }, {  2,  1 }, false },          // protocol 1 //  16 ->17->18

  { 300, {  1, 17 }, {  1,  1 }, {  2,  1 }, false },          // protocol 1 //  17 -> 18

 попробуй еще это, как раньше

 

на репозитории автора библиотеки лежит такой скетч для считывания семлов

#define SAMPLESIZE 500

static unsigned int timings[SAMPLESIZE];
static unsigned int pos = 0;
static unsigned long lastTime = 0;

static int receiverPin = 2;
static int interruptPin = 0;

void setup() {
  interruptPin = digitalPinToInterrupt(receiverPin);
  Serial.begin(9600); 
  attachInterrupt(interruptPin, handleInterrupt, CHANGE);
  pinMode(13, OUTPUT);
  digitalWrite(13, LOW);
}

void loop() {
    for (int i = 5; i>0; i--) {
      Serial.print(i);
      Serial.print("... ");
      delay(900);
      digitalWrite(13, HIGH);
      delay(100);
      digitalWrite(13, LOW);
    }
    Serial.println();
      
    detachInterrupt(interruptPin);
  
    int finalstate = digitalRead(receiverPin);
    
    char s = Serial.read();
    
    for (unsigned int i = pos + finalstate; i< SAMPLESIZE; i++) {
      Serial.print( timings[i] );
      Serial.print(",");
    }
 
    for (unsigned int i = 0; i < pos; i++) {
      Serial.print( timings[i] );
      Serial.print(",");
    }

    Serial.println("");
    Serial.println("Reset your Arduino to scan again...");

    while(true) {} 
  
}

void handleInterrupt() {
  const long time = micros();
  timings[pos] = time - lastTime;
  lastTime = time;
  if (++pos > SAMPLESIZE-1) {
    pos = 0;
  }
}

только он работает по принципу - после загрузки скетча, открываем монитор порта и жмем резет на дуне , а  после того как загорится светодиод 13 пина или блинк - грузим в дуню семпл кода. смотрим че выдаст монитор порта... он нам ничего практически не даст, но теоретически можно попробовать...

iopq
Offline
Зарегистрирован: 05.07.2016

первые два ничего

5... 4... 3... 2... 1... 
16096,644,320,640,648,320,648,316,648,320,644,320,648,320,324,640,328,636,656,320,328,636,648,320,648,320,328,640,328,640,328,636,648,320,652,320,328,636,652,320,644,320,328,632,332,636,328,636,332,636,16072,640,320,636,648,320,648,320,644,320,648,320,648,320,328,636,328,636,656,320,328,640,648,320,644,320,328,636,332,636,328,640,648,316,656,316,328,640,648,316,648,320,328,640,324,640,328,636,328,640,16060,644,320,636,648,316,648,320,648,316,648,320,644,320,328,636,328,636,652,320,328,636,648,320,644,320,328,636,328,636,328,632,648,320,652,320,328,636,648,320,644,320,328,636,328,636,328,640,328,636,16088,640,320,636,648,320,648,316,648,320,648,320,644,320,328,636,328,636,656,316,328,636,652,316,648,320,324,636,328,640,328,636,648,320,652,316,328,640,648,320,644,320,328,636,332,636,328,636,328,636,16064,644,320,636,648,320,648,320,644,320,644,320,644,320,328,636,328,640,652,320,324,640,648,320,644,320,328,636,324,640,328,636,648,320,652,320,328,636,652,316,648,320,328,636,328,636,332,636,328,636,16088,644,316,640,648,320,644,320,648,320,644,320,648,320,328,636,332,636,656,320,328,636,648,320,644,320,324,636,328,640,328,636,648,320,652,320,324,640,648,316,648,320,324,640,328,636,332,636,328,636,16084,644,320,636,648,320,644,320,648,320,648,316,648,320,328,636,328,640,660,316,328,640,648,320,644,320,328,636,328,640,328,640,648,320,656,320,328,636,652,316,652,316,328,640,332,636,332,636,332,640,16096,644,320,640,652,320,648,320,648,320,648,320,648,320,328,640,328,640,656,320,328,640,648,320,652,320,328,636,332,636,332,636,648,320,652,320,328,636,652,320,648,320,328,636,328,640,328,640,328,640,16092,644,320,640,648,320,648,320,644,320,648,320,644,320,328,636,328,640,652,320,328,640,648,320,648,320,328,636,332,636,328,640,648,320,656,320,328,636,648,320,648,320,328,636,328,640,328,640,328,636,16100,644,320,640,648,320,648,316,648,320,648,320,648,320,324,640,328,640,656,320,328,636,648,320,648,320,324,640,328,640,328,636,648,320,656,320,328,636,652,320,648,320,328,640,328,636,332,636,332,636,
Reset your Arduino to scan again...
5... 4... 3... 2... 1... 
328,640,328,640,656,320,328,640,648,320,648,320,328,640,328,640,328,640,648,324,652,320,328,636,648,320,648,320,328,640,328,640,328,636,332,640,16120,648,320,640,652,320,652,320,648,320,652,320,648,320,328,640,332,640,656,320,328,644,648,320,652,320,328,640,328,640,332,636,652,320,656,320,328,640,652,320,652,320,328,640,328,640,328,640,328,640,16120,644,320,636,652,320,648,320,648,324,648,320,644,320,328,636,332,636,656,320,328,636,652,320,648,316,332,636,328,640,328,640,648,320,652,320,328,640,648,320,648,324,328,636,332,636,332,640,328,636,16104,648,320,636,648,320,648,320,652,320,648,320,648,320,332,636,332,636,660,320,328,640,648,320,652,316,328,640,328,640,328,636,648,320,656,316,328,640,652,320,648,316,328,640,328,640,328,636,328,640,16120,648,320,636,652,320,648,320,648,320,648,320,652,316,328,640,332,636,660,320,328,640,648,320,652,320,328,636,332,640,328,640,648,320,656,320,328,636,652,320,648,320,328,640,332,636,328,640,332,636,16140,648,320,640,652,320,648,324,648,320,648,324,648,320,328,640,328,640,656,320,332,636,652,320,648,320,328,640,332,636,332,636,652,320,652,320,328,640,652,320,648,320,328,636,332,636,332,640,328,640,16128,644,320,640,648,320,648,324,648,320,652,320,648,324,328,640,328,640,656,320,328,640,652,320,648,320,328,644,328,640,328,640,652,320,656,320,328,636,652,320,648,320,328,640,332,640,328,640,332,640,16132,648,320,640,648,320,648,320,648,320,652,320,648,320,328,640,328,640,656,320,332,636,652,320,652,324,328,644,332,640,332,644,652,324,656,324,328,644,652,324,652,320,328,640,332,640,328,640,332,640,16124,644,320,640,652,320,648,320,648,320,648,324,648,320,328,640,328,640,656,324,328,636,652,320,648,320,328,640,328,640,332,636,652,320,656,324,328,640,652,320,652,320,324,640,332,640,328,640,328,640,16108,644,320,636,652,320,648,320,648,316,648,320,648,320,328,640,332,640,656,320,328,640,652,320,652,320,328,640,332,640,328,640,652,320,656,320,328,640,652,320,652,320,328,640,332,640,328,640,332,640,16140,648,320,636,652,320,648,320,648,320,648,324,648,320,
Reset your Arduino to scan again...
5... 4... 3... 2... 1... 
16128,644,320,640,648,320,652,320,648,320,648,320,648,320,328,640,332,640,656,320,328,640,652,320,648,320,328,640,332,636,332,640,652,320,652,320,332,640,648,320,648,324,328,640,328,640,328,640,332,636,16128,644,320,636,652,320,648,320,652,320,652,320,648,320,328,640,332,640,656,320,328,640,652,320,648,320,328,640,332,640,328,640,648,320,656,320,328,640,648,324,648,320,328,640,328,636,332,640,328,640,16136,644,320,636,652,320,652,320,648,320,652,320,648,320,332,640,328,640,656,324,324,644,648,320,648,324,328,636,332,640,328,640,648,320,656,320,328,640,648,316,648,324,328,636,332,640,328,640,328,640,16132,644,324,640,648,320,652,320,648,324,648,320,652,320,328,640,332,640,656,324,328,640,652,320,648,320,328,640,332,640,328,640,652,320,656,320,328,640,648,320,648,320,328,640,328,640,328,640,328,640,16132,644,324,636,652,320,648,320,648,320,648,320,648,320,328,640,332,640,656,320,328,640,652,320,648,320,332,640,328,640,332,640,652,320,656,324,328,640,652,320,652,320,328,644,328,640,328,640,332,644,16132,644,320,640,648,320,648,324,648,320,648,324,648,320,328,640,332,640,656,320,332,636,652,320,652,320,328,640,328,640,332,640,648,324,656,320,328,640,648,320,648,324,328,640,328,640,332,636,332,640,16132,648,320,640,652,320,648,320,652,320,652,320,648,320,328,640,328,636,656,320,328,640,648,320,644,320,328,640,332,640,328,640,648,320,656,320,328,640,648,320,648,320,328,640,328,640,328,640,332,636,16108,648,320,640,648,320,648,320,648,320,648,316,648,320,328,640,332,640,656,320,328,640,652,320,652,320,328,640,332,640,328,644,648,320,660,320,328,640,652,320,648,320,328,640,328,640,332,636,332,636,16112,644,320,640,648,324,644,320,648,320,652,320,648,320,328,640,332,640,656,324,328,636,652,320,652,320,328,640,332,640,328,640,652,320,656,324,328,640,652,320,652,320,328,640,332,640,332,640,332,640,16128,648,320,640,648,320,648,320,648,320,648,320,648,320,328,640,328,640,656,320,328,640,652,320,648,320,328,636,328,636,332,636,648,320,652,320,328,636,648,320,648,320,328,636,328,640,328,640,328,636,
Reset your Arduino to scan again...

 

DIVGENY
Offline
Зарегистрирован: 23.08.2016

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

пока правда занят по дому. подожди до завтра.

ок..?

int send_code_pin = 10;
int send_code = 12691303;   // этот код пока не правельный
 
void setup()
{
  pinMode(send_code_pin, OUTPUT);
}

void loop ()
{
      // for (int send_code = 0; send_code < 4096; send_code++) // этот цикл после того как код определен необходимо убрать
  {
    for (int j = 0; j <4; j++) // достаточно 4-х
    {
      digitalWrite(send_code_pin, HIGH); // стартовый импульс
      delayMicroseconds(310);
      digitalWrite(send_code_pin, LOW);
      for (int i = 24; i > 0; i--)
      {
        boolean bit_code = bitRead(send_code, i - 1);
        if (bit_code)
        {
          digitalWrite(send_code_pin, LOW); // единица
          delayMicroseconds(620);
          digitalWrite(send_code_pin, HIGH);
          delayMicroseconds(310);
        }
        else
        {
          digitalWrite(send_code_pin, LOW); // ноль
          delayMicroseconds(310);
          digitalWrite(send_code_pin, HIGH);
          delayMicroseconds(620);
        }
      }
      digitalWrite(send_code_pin, LOW); // пилотный период
      delayMicroseconds(16000);
    }
  }
  //delay(10000); после определения кода поставить задержку
}

 

iopq
Offline
Зарегистрирован: 05.07.2016

DIVGENY пишет:

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

пока правда занят по дому. подожди до завтра.

ок..?

 

#define txPin 2
#define Te 320

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

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

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 (byte i=25;i>0;i--){
  SendCameBit(bitRead(Code, i-1)); 
}
  delay(16);
}

вот скетч имитирующий работу моего пульта. я его давно проверял. могу сегодня еще проверить вечером

DIVGENY
Offline
Зарегистрирован: 23.08.2016

  delay(16);  -  не корректно, нужно менять на формат

delayMicroseconds(Te* xx); где xx количество тактов


#define txPin 10
#define Te 313  // takt

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

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

void SendCameBit(byte b)
{
  
  if (b) {digitalWrite(txPin,1); delayMicroseconds(2*Te);}   //если 1, выставляем высокий уровень
                                                             // и ждем 2 takt
                                                                 
  if (!b) {digitalWrite(txPin,0); delayMicroseconds(Te);     // если 0 устанавливаем низкий уровень на 1 takt
            digitalWrite(txPin,1);delayMicroseconds(Te);}    // устанавливаем высокий уровень на takt
            
  digitalWrite(txPin,0);                                     // такт между битами в нуле
  delayMicroseconds(Te);                                     // равен 1 takt

}

void SendCame(long Code)
{     
  for (byte i=25;i>0;i--){
  SendCameBit(bitRead(Code, i-1)); 
}
  //delayMicroseconds(Te);   
  //digitalWrite(txPin,0);                     // пилотный период
  delayMicroseconds(50*Te);
}

 

iopq
Offline
Зарегистрирован: 05.07.2016
#define txPin 2
#define Te 320

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

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

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 (byte i=25;i>0;i--){
  SendCameBit(bitRead(Code, i-1)); 
}
  delay(16);
}

с этим кодом и выехал и заехал. все как с пульта. 

iopq
Offline
Зарегистрирован: 05.07.2016

не оставляю надежды считать долбаный пульт. 

нашел вот такой код приемника -

#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],BIN);
Serial.print(":");  
Serial.print(came.data[1],BIN); 
Serial.print(":");  
Serial.print(came.data[2],BIN);
Serial.print(":");   
//Serial.print("CAME["); 
Serial.print("_came["); 
Serial.print(came.dat_bit); 
Serial.print("]: "); 
dump_hex(came.data, came.dat_bit); 
came.state=0; 
} 
}  

и код передатчика-

#define txPin 2
#define Te 320

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

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

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=24;i>0;i--){
      SendCameBit(bitRead(Code, i-1)); // побитово перебираем и посылаем код
    }
    delay(16);
  }
  delay(2000); // сделать паузу после посылки на 2 с
}

 

вот так приемник видит мой код без последнего бита (код came 24 бита а мой 25). изменение переменной #define CM_BITS24 24 на 25 результата естественно не дает. что же ему надо
DIVGENY
Offline
Зарегистрирован: 23.08.2016

Да не парся . Так и нужно. 1 высокий импульс для синхронизации. Код 24 битовый. Я застрял на даче .тут инет тупой.

 

iopq
Offline
Зарегистрирован: 05.07.2016

наконец то. нашел вот такой код-

#define rxPin 2 //пин приемника

void setup()
{
pinMode(rxPin, INPUT);
Serial.begin(115200); 
Serial.println("Came started");
attachInterrupt(0, grab, CHANGE); 
interrupts();
}

volatile static long lastCode = 0;

void loop() {
if (lastCode > 0)
{
Serial.println(lastCode);
lastCode = 0;
}
}

#define MAX_DELTA 200
boolean CheckValue(unsigned int base, unsigned int value)
{
return ((value == base) || ((value > base) && ((value - base) < MAX_DELTA)) || ((value < base) && ((base - value) < MAX_DELTA)));
}
volatile unsigned long prevtime;
volatile unsigned int lolen, hilen, state;
volatile static byte cameCounter = 0; // count of bits stored
volatile static long cameCode = 0; // code itself

void grab() {
state = digitalRead(rxPin);
if (state == HIGH)
lolen = micros() - prevtime;
else
hilen = micros() - prevtime;
prevtime = micros();

if (state == LOW)
{
// последовательность закончилась
if (CheckValue(320, hilen) && CheckValue(640, lolen)) // valid 1
{
cameCode = (cameCode << 1) | 1;
cameCounter++;
}
else if (CheckValue(640, hilen) && CheckValue(320, lolen)) // valid 0
{
cameCode = (cameCode << 1) | 0;
cameCounter++;
}
else cameCounter = 0;
} else 
if (lolen > 1000 && (cameCounter == 24) && ((cameCode & 0xffffff) != 0xffffff))
{
lastCode = cameCode & 0xffffff;
cameCounter = 0;
cameCode = 0;
}
}

и вот результат

Came started
8171824
8171824
8171824
8171824
8171824
8171824
8171952
8171952
8171952
8171952
8171952
8171952
8171952

обе кнопки пульта

iopq
Offline
Зарегистрирован: 05.07.2016

правильно все же вот так-

#define rxPin 2 //пин приемника

void setup()
{
pinMode(rxPin, INPUT);
Serial.begin(115200); 
Serial.println("Came started");
attachInterrupt(0, grab, CHANGE); 
interrupts();
}

volatile static long lastCode = 0;

void loop() {
if (lastCode > 0)
{
Serial.println(lastCode);
lastCode = 0;
}
}

#define MAX_DELTA 200
boolean CheckValue(unsigned int base, unsigned int value)
{
return ((value == base) || ((value > base) && ((value - base) < MAX_DELTA)) || ((value < base) && ((base - value) < MAX_DELTA)));
}
volatile unsigned long prevtime;
volatile unsigned int lolen, hilen, state;
volatile static byte cameCounter = 0; // count of bits stored
volatile static long cameCode = 0; // code itself

void grab() {
state = digitalRead(rxPin);
if (state == HIGH)
lolen = micros() - prevtime;
else
hilen = micros() - prevtime;
prevtime = micros();

if (state == LOW)
{
// последовательность закончилась
if (CheckValue(320, hilen) && CheckValue(640, lolen)) // valid 1
{
cameCode = (cameCode << 1) | 1;
cameCounter++;
}
else if (CheckValue(640, hilen) && CheckValue(320, lolen)) // valid 0
{
cameCode = (cameCode << 1) | 0;
cameCounter++;
}
else cameCounter = 0;
} else 
if (lolen > 1000 && (cameCounter == 24) 
{
lastCode = cameCode & 0xfff;
cameCounter = 0;
cameCode = 0;
}
if (lastCode == 432) 
{
 time1=millis()-time;
 if(time1>200) digitalWrite(13, !digitalRead(13));
 time = millis();  
}
}
получается десятичный трехзначный код но и прилетают чужие даже четырехзначные. вот теперь когда я могу управлять с пульта светодиодом встала задача запихнуть этот код в attiny13. насколько это реально? (Serial не нужен)
DIVGENY
Offline
Зарегистрирован: 23.08.2016

В папке C:\Users\ВАШЕ_ИМЯ_ПОЛЬЗОВАТЕЛЯ\AppData\Local\Temp\ после компиляции скетча создается hex файл для прошивки контроллера .

Только я не знаю. Подойдет ли по архитектуре...?

iopq
Offline
Зарегистрирован: 05.07.2016

DIVGENY пишет:

В папке C:\Users\ВАШЕ_ИМЯ_ПОЛЬЗОВАТЕЛЯ\AppData\Local\Temp\ после компиляции скетча создается hex файл для прошивки контроллера .

Только я не знаю. Подойдет ли по архитектуре...?

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

DIVGENY
Offline
Зарегистрирован: 23.08.2016

По поводу библиотеки в вопросах и ответах нужно читать на репозитарии, где находится сама библиотека. Только там все на буржуйском. У меня сейчас инет мобильный тупит ужасно.

https://github.com/sui77/rc-switch/wiki

DIVGENY
Offline
Зарегистрирован: 23.08.2016

приехал домой. если так важно - рабочий протокол для библиотеки  RCSwitch

static const RCSwitch::Protocol PROGMEM proto[] = {
#endif
  { 350, {  1, 31 }, {  1,  3 }, {  3,  1 }, false },    // protocol 1
  { 650, {  1, 10 }, {  1,  2 }, {  2,  1 }, false },    // protocol 2
  { 100, { 30, 71 }, {  4, 11 }, {  9,  6 }, false },    // protocol 3
  { 380, {  1,  6 }, {  1,  3 }, {  3,  1 }, false },    // protocol 4
  { 500, {  6, 14 }, {  1,  2 }, {  2,  1 }, false },    // protocol 5

  { 320, {  50, 2 }, {  2,  1 }, {  1,  2 }, true },     // ----- tvoy protocol-------

  { 450, { 23,  1 }, {  1,  2 }, {  2,  1 }, true }      // protocol 6 (HT6P20B)
 

результат другие даные, потому что включена инверсия в приемнике дешифраторе

Received 8605263 / 24bit Protocol: 6
Received 8605263 / 24bit Protocol: 6
Received 8605263 / 24bit Protocol: 6
Received 8605263 / 24bit Protocol: 6
Received 8605263 / 24bit Protocol: 6
Received 8605263 / 24bit Protocol: 6
Received 8605263 / 24bit Protocol: 6
Received 8605263 / 24bit Protocol: 6
Received 8605263 / 24bit Protocol: 6
Received 8605263 / 24bit Protocol: 6
Received 8605263 / 24bit Protocol: 6
Received 8605263 / 24bit Protocol: 6

DEC  8605263 = BIN 100000110100111001001111,

то есть импулс синхр. = 50 low +2 high дальше 24 битный код

 

 

iopq
Offline
Зарегистрирован: 05.07.2016

да. работает код.