Прошу помощи в декодирование протокола

я честно говоря, минуту назад прочитал про манчестерское кодирование, впервые в жизни. То что на розовых плашках цифры 240, 0, 252 - это как раз биты закодированные, верно?

кажется дошло… сейчас покумекаю, как реализовать

#define BTNPIN 2

// максимально возможное кол-во смен состояния входа за прием одного пакета (включая следом идущую копию)
const uint16_t maxc = 255;  // представить себе, что там будет 1010101010101010101010... короче количество бит + 1
int16_t ind = -1;
uint32_t microsArr[maxc];
const uint32_t bitc = 200;              // количество микросекунд, соотв. длительности импульса одного бита в пакете
const uint32_t cycle_half = 40000 / 2;  // половина цикла (периода) отправки пакетов

//void ISR (void* para) { // повесить на GPIO_INTR_ANYEDGE
void chng() {

  ind++;
  if (ind == maxc) ind = 0;
  microsArr[ind] = micros();
}

void setup() {
  pinMode(BTNPIN, INPUT_PULLUP);
  Serial.begin(115200);

  attachInterrupt(0, chng, CHANGE);  
}


void loop() {

  if (ind > 0) if (micros() - microsArr[ind] > cycle_half) {

      // в массиве шото есть, и последнее шото добавилось достаточно давно

      uint32_t res1 = 0, res2 = 0;
      uint16_t n = 0;
      bool val = true;

      for (uint16_t i = 0; i < ind; i++) {

        uint32_t dt = microsArr[i + 1] - microsArr[i];  // сколько времени между соседними сменами состояний
        uint16_t cnt = dt / bitc;  // сколько бит вмещается в это время
        if (dt % bitc > bitc / 2) cnt++; // если dt получилось чуть меньше числа, кратного bitc, то мы не должны потерять этот бит, который чуть короче, чем надо
        
        if (cnt == 2) val = !val;

        if (cnt < 3) {
          if (n < 25) res1 |= val << n;
          else res2 |= val << (n -25);
          n++;
        }


      }
      
      Serial.print(res1, BIN); // выводим
      Serial.print(' ');
      Serial.println(res2, BIN); // выводим
      ind = -1; // сбрасываем индекс
      
    }
    
   // 
    
}

покажите, что выведет

#define BTNPIN 2

// максимально возможное кол-во смен состояния входа за прием одного пакета (включая следом идущую копию)
const uint16_t maxc = 255;  // представить себе, что там будет 1010101010101010101010... короче количество бит + 1
int16_t ind = -1;
uint32_t microsArr[maxc];
const uint32_t bitc = 200;              // количество микросекунд, соотв. длительности импульса одного бита в пакете
const uint32_t cycle_half = 40000 / 2;  // половина цикла (периода) отправки пакетов

//void ISR (void* para) { // повесить на GPIO_INTR_ANYEDGE
void chng() {

  ind++;
  if (ind == maxc) ind = 0;
  microsArr[ind] = micros();
}

void setup() {
  pinMode(BTNPIN, INPUT_PULLUP);
  Serial.begin(115200);

  attachInterrupt(0, chng, CHANGE);  
}


void loop() {

  if (ind > 0) if (micros() - microsArr[ind] > cycle_half) {

      // в массиве шото есть, и последнее шото добавилось достаточно давно

      uint32_t res1 = 0, res2 = 0;
      int16_t n = -1;
      bool first = true;
      bool val = true;

      for (uint16_t i = 0; i < ind; i++) {

        uint32_t dt = microsArr[i + 1] - microsArr[i];  // сколько времени между соседними сменами состояний
        uint16_t cnt = dt / bitc;  // сколько бит вмещается в это время
        if (dt % bitc > bitc / 2) cnt++; // если dt получилось чуть меньше числа, кратного bitc, то мы не должны потерять этот бит, который чуть короче, чем надо
        
        if (cnt == 2) val = !val;
        if (cnt < 3) {

          if (n > -1) {

            if (first) res1 |= (uint16_t)val << n;
            else res2 |= (uint16_t)val << n;

          }

          n++;

          if (n == 23) {
            first = false;
            n = -1;
          }

        }


      }
      
      Serial.print(res1, BIN); // выводим
      Serial.print(' ');
      Serial.println(res2, BIN); // выводим
      ind = -1; // сбрасываем индекс
      
    }
    
   // 
    
}

а так? (ссоре, правда глаза липнут, но интересно ужс)

Я вот смотрю на данные, которые мы получили.
Их же надо сначала превратить в 0 и 1

10 10 10 10 11 01 01 01 00 10 10 10 10 10 10 10 10 11 01 01 01 01 01 01 0

10 - Это же переход из высокого уровня в низкий
11 - Это широкий импульс, ( два раза высокий ) )
00 – Два раза низкий.
01 - из низкого в высокий.

Но из этого же не следует, где 1, а где 0 в этом кодировании. Я правильно всё понял ?

вроде как да, это и пытаюсь сейчас

#define BTNPIN 2

// максимально возможное кол-во смен состояния входа за прием одного пакета (включая следом идущую копию)
const uint16_t maxc = 255;  // представить себе, что там будет 1010101010101010101010... короче количество бит + 1
int16_t ind = -1;
uint32_t microsArr[maxc];
const uint32_t bitc = 200;              // количество микросекунд, соотв. длительности импульса одного бита в пакете
const uint32_t cycle_half = 40000 / 2;  // половина цикла (периода) отправки пакетов

//void ISR (void* para) { // повесить на GPIO_INTR_ANYEDGE
void chng() {

  ind++;
  if (ind == maxc) ind = 0;
  microsArr[ind] = micros();
}

void setup() {
  pinMode(BTNPIN, INPUT_PULLUP);
  Serial.begin(115200);

  attachInterrupt(0, chng, CHANGE);  
}


void loop() {

  if (ind > 0) if (micros() - microsArr[ind] > cycle_half) {

      // в массиве шото есть, и последнее шото добавилось достаточно давно

      uint32_t res1 = 0, res2 = 0;
      int16_t n = -1;
      bool first = true;
      bool val = true;

      for (uint16_t i = 0; i < ind; i++) {

        uint32_t dt = microsArr[i + 1] - microsArr[i];  // сколько времени между соседними сменами состояний
        uint16_t cnt = dt / bitc;  // сколько бит вмещается в это время
        if (dt % bitc > bitc / 2) cnt++; // если dt получилось чуть меньше числа, кратного bitc, то мы не должны потерять этот бит, который чуть короче, чем надо
        
        if (cnt == 2) val = !val;
        if (cnt < 3) {

          if (n > -1) {

            if (first) res1 |= (uint16_t)val << n;
            else res2 |= (uint16_t)val << n;

          }

          n++;

          if (n == 23) {
            first = false;
            n = -1;
          }

        }


      }

      uint8_t A =   (uint32_t)res1 & B0000000000001111;
      uint8_t B =  ((uint32_t)res1 & B0000000011110000) >> 8;
      uint8_t C =  ((uint32_t)res1 & B0000111100000000) >> 16;
      uint8_t A2 =  (uint32_t)res2 & B0000000000001111;
      uint8_t B2 = ((uint32_t)res2 & B0000000011110000) >> 8;
      uint8_t C2 = ((uint32_t)res2 & B0000111100000000) >> 16;
      
      Serial.println(String(A) + " " + String(B) + " " + String(C) + " " + String(A2) + " " + String(B2) + " " + String(C2)); // выводим
      ind = -1; // сбрасываем индекс
      
    }
    
   // 
    
}

я просто аналогию заметил: если пауза двойная - происходит смена 0 на 1 либо 1 на 0.

Да, да, после 00 будут идти 1 а после 11 нули. Но насколько это всегда точно ? ))))))

Не компелится
exit status 1

Compilation error: ‘B0000000000001111’ was not declared in this scope

Как исправить пока не пойму

#define BTNPIN 2

// максимально возможное кол-во смен состояния входа за прием одного пакета (включая следом идущую копию)
const uint16_t maxc = 255;  // представить себе, что там будет 1010101010101010101010... короче количество бит + 1
int16_t ind = -1;
uint32_t microsArr[maxc];
const uint32_t bitc = 200;              // количество микросекунд, соотв. длительности импульса одного бита в пакете
const uint32_t cycle_half = 40000 / 2;  // половина цикла (периода) отправки пакетов

//void ISR (void* para) { // повесить на GPIO_INTR_ANYEDGE
void chng() {

  ind++;
  if (ind == maxc) ind = 0;
  microsArr[ind] = micros();
}

void setup() {
  pinMode(BTNPIN, INPUT_PULLUP);
  Serial.begin(115200);

  attachInterrupt(0, chng, CHANGE);  
}


void loop() {

  if (ind > 0) if (micros() - microsArr[ind] > cycle_half) {

      // в массиве шото есть, и последнее шото добавилось достаточно давно

      uint32_t res1 = 0, res2 = 0;
      int16_t n = -1;
      bool first = true;
      bool val = true;

      for (uint16_t i = 0; i < ind; i++) {

        uint32_t dt = microsArr[i + 1] - microsArr[i];  // сколько времени между соседними сменами состояний
        uint16_t cnt = dt / bitc;  // сколько бит вмещается в это время
        if (dt % bitc > bitc / 2) cnt++; // если dt получилось чуть меньше числа, кратного bitc, то мы не должны потерять этот бит, который чуть короче, чем надо
        
        if (cnt == 2) {
          val = !val;
        } else if (cnt < 3) {

          if (n > -1) {

            if (first) res1 |= (uint16_t)val << n;
            else res2 |= (uint16_t)val << n;

          }

          n++;

          if (n == 23) {
            first = false;
            n = -1;
            val = true;
          }

        }


      }

      uint8_t A =   (uint32_t)res1 & 0xff;
      uint8_t B =  ((uint32_t)res1 & 0xff00) >> 8;
      uint8_t C =  ((uint32_t)res1 & 0xff0000) >> 16;
      uint8_t A2 =  (uint32_t)res2 & 0xff;
      uint8_t B2 = ((uint32_t)res2 & 0xff00) >> 8;
      uint8_t C2 = ((uint32_t)res2 & 0xff0000) >> 16;
      
      Serial.println(String(A) + " " + String(B) + " " + String(C) + " " + String(A2) + " " + String(B2) + " " + String(C2)); // выводим
      ind = -1; // сбрасываем индекс
      
    }
    
   // 
    
}

тогда так

Там сейчас должно быть 15 255 0-3 в каждом куске.

#define BTNPIN 2

// максимально возможное кол-во смен состояния входа за прием одного пакета (включая следом идущую копию)
const uint16_t maxc = 255;  // представить себе, что там будет 1010101010101010101010... короче количество бит + 1
int16_t ind = -1;
uint32_t microsArr[maxc];
const uint32_t tickwidth = 200;              // количество микросекунд, соотв. длительности импульса одного бита в пакете
const uint32_t cycle_half = 40000 / 2;  // половина цикла (периода) отправки пакетов

//void ISR (void* para) { // повесить на GPIO_INTR_ANYEDGE
void chng() {

  ind++;
  if (ind == maxc) ind = 0;
  microsArr[ind] = micros();
}

void setup() {
  pinMode(BTNPIN, INPUT_PULLUP);
  Serial.begin(115200);

  attachInterrupt(0, chng, CHANGE);  
}


void loop() {

  if (ind > 0) if (micros() - microsArr[ind] > cycle_half) {

      // в массиве шото есть, и последнее шото добавилось достаточно давно

      String res = "";

      for (uint16_t i = 0; i < ind; i++) {

        uint32_t dt = microsArr[i + 1] - microsArr[i];  // сколько времени между соседними сменами состояний
        uint16_t cnt = dt / tickwidth + (dt % tickwidth > tickwidth / 2 ? 1 : 0); // кол-во "тиков" (с учетом погрешности)

        res += String(cnt) + " ";
        
      }

      Serial.println(res);

      ind = -1; // сбрасываем индекс
      
    }
    
   // 
    
}

так надо слегка отступить назад)

1 1 1 1 1 1 1 1 2 1 1 1 1 1 1 2 1 1 1 1 1 1 1 1 1 1 1 1 1 1 2 2 2 1 1 1 1 1 1 1 1 1 1 1
4 1 1 1 1 1 1 1 1 2 1 1 1 1 1 1 2 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 2 1 1 1 1 1 1 1 1 1 1 1 5 4 1 1 1 1 1 1 1 1 2 1 1 1 1 1 1 2 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 2 1 1 1 1 1 1 1 1 1 1 1 195
4 1 1 1 1 1 1 1 1 2 1 1 1 1 1 1 2 1 1 1 1 1 1 1 1 1 1 1 1 1 1 2 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1
4 1 1 1 1 1 1 1 1 2 1 1 1 1 1 1 2 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 2 1 1 1 1 1 1 1 1 1 1 1 1 1 5 4 1 1 1 1 1 1 1 1 2 1 1 1 1 1 1 2 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 2 1 1 1 1 1 1 1 1 1 1 1 1 1 195
4 1 1 1 1 1 1 1 1 2 1 1 1 1 1 1 2 1 1 1 1 1 1 1 1 1 1 1 1 1 1 2 2 2 1 1 1 1 1 1 1 1 1 1 1

1 1 1 1 1 1 1 1 2 1 1 1 1 1 1 2 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 2 1 1 1 1 1 1 1 1 1 1 1 5 4 1 1 1 1 1 1 1 1 2 1 1 1 1 1 1 2 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 2 1 1 1 1 1 1 1 1 1 1 1 195

1 1 1 1 1 1 1 1 2 1 1 1 1 1 1 2 1 1 1 1 1 1 1 1 1 1 1 1 1 1 2 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1
4 1 1 1 1 1 1 1 1 2 1 1 1 1 1 1 2 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 2 1 1 1 1 1 1 1 1 1 1 1 1 1 5 4 1 1 1 1 1 1 1 1 2 1 1 1 1 1 1 2 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 2 1 1 1 1 1 1 1 1 1 1 1 1 1 194
4 1 1 1 1 1 1 1 1 2 1 1 1 1 1 1 2 1 1 1 1 1 1 1 1 1 1 1 1 1 1 2 2 2 1 1 1 1 1 1 1 1 1 1 1
4 1 1 1 1 1 1 1 1 2 1 1 1 1 1 1 2 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 2 1 1 1 1 1 1 1 1 1 1 1 5 4 1 1 1 1 1 1 1 1 2 1 1 1 1 1 1 2 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 2 1 1 1 1 1 1 1 1 1 1 1 194
4 1 1 1 1 1 1 1 1 2 1 1 1 1 1 1 2 1 1 1 1 1 1 1 1 1 1 1 1 1 1 2 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1
4 1 1 1 1 1 1 1 1 2 1 1 1 1 1 1 2 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 2 1 1 1 1 1 1 1 1 1 1 1 1 1 5 4 1 1 1 1 1 1 1 1 2 1 1 1 1 1 1 2 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 2 1 1 1 1 1 1 1 1 1 1 1 1 1 194
4 1 1 1 1 1 1 1 1 2 1 1 1 1 1 1 2 1 1 1 1 1 1 1 1 1 1 1 1 1 1 2 2 2 1 1 1 1 1 1 1 1 1 1 1
4 1 1 1 1 1 1 1 1 2 1 1 1 1 1 1 2 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 2 1 1 1 1 1 1 1 1 1 1 1 5 4 1 1 1 1 1 1 1 1 2 1 1 1 1 1 1 2 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 2 1 1 1 1 1 1 1 1 1 1 1 194
4 1 1 1 1 1 1 1 1 2 1 1 1 1 1 1 2 1 1 1 1 1 1 1 1 1 1 1 1 1 1 2 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1

 4 1 1 1 1 1 1 1 1 2 1 1 1 1 1 1 2 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 2 1 1 1 1 1 1 1 1 1 1 1 1 1
54 1 1 1 1 1 1 1 1 2 1 1 1 1 1 1 2 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 2 1 1 1 1 1 1 1 1 1 1 1 1 1 195
  1   1   1   1   1 0   0   0   0 1   1   1   1   1   1   1   1   1 0   0   0   0   0   0   0

надо короче зависимость словить и закодить)) и очень интересно, а если самый первый значащий бит будет “0” как пакет выглядел бы тогда?

А пожалуйста )))))

так…

#define BTNPIN 2

// максимально возможное кол-во смен состояния входа за прием одного пакета (включая следом идущую копию)
const uint16_t maxc = 255;  // представить себе, что там будет 1010101010101010101010... короче количество бит + 1
int16_t ind = -1;
uint32_t microsArr[maxc];
const uint32_t tickwidth = 200;              // количество микросекунд, соотв. длительности импульса одного бита в пакете
const uint32_t cycle_half = 40000 / 2;  // половина цикла (периода) отправки пакетов

//void ISR (void* para) { // повесить на GPIO_INTR_ANYEDGE
void chng() {

  ind++;
  if (ind == maxc) ind = 0;
  microsArr[ind] = micros();
}

void setup() {
  pinMode(BTNPIN, INPUT_PULLUP);
  Serial.begin(115200);

  attachInterrupt(0, chng, CHANGE);  
}


void loop() {

  if (ind > 0) if (micros() - microsArr[ind] > cycle_half) {

      // в массиве шото есть, и последнее шото добавилось достаточно давно

      String res = "";

      bool val = true;
      uint16_t n = 0;

      for (uint16_t i = 0; i < ind; i++) {

        uint32_t dt = microsArr[i + 1] - microsArr[i];  // сколько времени между соседними сменами состояний
        uint16_t cnt = dt / tickwidth + (((dt % tickwidth) > (tickwidth / 2)) ? 1 : 0); // кол-во "тиков" (с учетом погрешности)

        if (cnt < 3) {

          if (cnt == 2) val = !val;
          n += cnt;

          if (cnt % 2) res += val ? "1" : 0;

        }

      }

      Serial.println(res);

      ind = -1; // сбрасываем индекс
      
    }
    
   // 
    
}

111111111111111111111111111111111111111

1111111111111111111111111111111111111111111111111111111111111111111111111111

1111111111111111111111111111111111111111111

1111111111111111111111111111111111111111111

111111111111111111111111111111111111111

1111111111111111111111111111111111111111111

1111111111111111111111111111111111111111111

1111111111111111111111111111111111111111111

111111111111111111111111111111111111111

1111111111111111111111111111111111111111111

1111111111111111111111111111111111111111111

тьфу не тот индекс в условии

#define BTNPIN 2

// максимально возможное кол-во смен состояния входа за прием одного пакета (включая следом идущую копию)
const uint16_t maxc = 255;  // представить себе, что там будет 1010101010101010101010... короче количество бит + 1
int16_t ind = -1;
uint32_t microsArr[maxc];
const uint32_t tickwidth = 200;              // количество микросекунд, соотв. длительности импульса одного бита в пакете
const uint32_t cycle_half = 40000 / 2;  // половина цикла (периода) отправки пакетов

//void ISR (void* para) { // повесить на GPIO_INTR_ANYEDGE
void chng() {

  ind++;
  if (ind == maxc) ind = 0;
  microsArr[ind] = micros();
}

void setup() {
  pinMode(BTNPIN, INPUT_PULLUP);
  Serial.begin(115200);

  attachInterrupt(0, chng, CHANGE);  
}


void loop() {

  if (ind > 0) if (micros() - microsArr[ind] > cycle_half) {

      // в массиве шото есть, и последнее шото добавилось достаточно давно

      String res = "";

      bool val = true;
      uint16_t n = 0;

      for (uint16_t i = 0; i < ind; i++) {

        uint32_t dt = microsArr[i + 1] - microsArr[i];  // сколько времени между соседними сменами состояний
        uint16_t cnt = dt / tickwidth + (((dt % tickwidth) > (tickwidth / 2)) ? 1 : 0); // кол-во "тиков" (с учетом погрешности)

        if (cnt < 3) {

          if (cnt == 2) val = !val;
          n += cnt;

          if (n % 2) res += val ? "1" : 0;

        }

      }

      Serial.println(res);

      ind = -1; // сбрасываем индекс
      
    }
    
   // 
    
}

чтото мало что изменилось

111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111

11111111111111111111111

11111111111111111111111

11111111111111111111111

1111111111111111111111

11111111111111111111111

11111111111111111111111

11111111111111111111111

111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111

11111111111111111111111

11111111111111111111111

11111111111111111111111

1111111111111111111111

11111111111111111111111

11111111111111111111111

11111111111111111111111

1111111111111111111111

ну да… ноль-то зачем в кавычки брать…

#define BTNPIN 2

// максимально возможное кол-во смен состояния входа за прием одного пакета (включая следом идущую копию)
const uint16_t maxc = 255;  // представить себе, что там будет 1010101010101010101010... короче количество бит + 1
int16_t ind = -1;
uint32_t microsArr[maxc];
const uint32_t tickwidth = 200;              // количество микросекунд, соотв. длительности импульса одного бита в пакете
const uint32_t cycle_half = 40000 / 2;  // половина цикла (периода) отправки пакетов

//void ISR (void* para) { // повесить на GPIO_INTR_ANYEDGE
void chng() {

  ind++;
  if (ind == maxc) ind = 0;
  microsArr[ind] = micros();
}

void setup() {
  pinMode(BTNPIN, INPUT_PULLUP);
  Serial.begin(115200);

  attachInterrupt(0, chng, CHANGE);  
}


void loop() {

  if (ind > 0) if (micros() - microsArr[ind] > cycle_half) {

      // в массиве шото есть, и последнее шото добавилось достаточно давно

      String res = "";

      bool val = true;
      uint16_t n = 0;

      for (uint16_t i = 0; i < ind; i++) {

        uint32_t dt = microsArr[i + 1] - microsArr[i];  // сколько времени между соседними сменами состояний
        uint16_t cnt = dt / tickwidth + (((dt % tickwidth) > (tickwidth / 2)) ? 1 : 0); // кол-во "тиков" (с учетом погрешности)

        if (cnt < 3) {

          if (cnt == 2) val = !val;
          n += cnt;

          if (n % 2 == 0) res += val ? "1" : "0";

        }

      }

      Serial.println(res);

      ind = -1; // сбрасываем индекс
      
    }
    
   // 
    
}

1111000011111111100000000000111000000001111111

11110000111111110100000000001110000000111111

1111000011111111110000000000111000000000111111

1111000011111111000000000000111000000011111111

1111000011111111100000000000111000000001111111

111100001111111110000000000011100000000111111111011110000000000100001100000111110111111

1111000011111111110000000000111000000000111111

1111000011111111000000000000111000000011111111

111100001111111100000000000011100000001111111111011110000000000100001100000111110111111

11110000111111110100000000001110000000111111

1111000011111111110000000000111000000000111111

1111000011111111000000000000111000000011111111

1111000011111111100000000000111000000001111111

11110000111111110100000000001110000000111111

1111000011111111110000000000111000000000111111

111100001111111111000000000011100000000011111111011110000000000100001100000111110111111

1111000011111111100000000000111000000001111111

11110000111111110100000000001110000000111111

1111000011111111110000000000111000000000111111

1111000011111111000000000000111000000011111111