я честно говоря, минуту назад прочитал про манчестерское кодирование, впервые в жизни. То что на розовых плашках цифры 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