Оставить только передачу кода
- Войдите на сайт для отправки комментариев
Пт, 14/07/2017 - 11:24
Привет, я совсем начинающий, хотелось бы попросить помощи у опытных людей, ребят, не могли бы вы убрать часть скетча, и оставить только передачу кода, что бы только можно было вписать код, и отправлять в эфир. Буду очень при очень благодарен!
#define txPin 8 //пин передатчика
#define rxPin 2 //пин приемника
void setup()
{
pinMode(rxPin, INPUT);
pinMode(txPin, OUTPUT);
Serial.begin(115200); // тут поставьте свою скорость
Serial.println("Came started");
// следующие 2 строчки включают перехватчик. если планируется только отправка их можно закоментить
attachInterrupt(0, grab, CHANGE); // обратите внимание на первый параметр - если у вас другая ардуина, он может быть не 1, а 0!
interrupts();
}
volatile static long lastCode = 0;
void loop() {
// это раскомментить и вместо 3693 вписать свой код для шлагбаума
//SendCame4(3693);
//delay(5000);
//return;
// при получении кода выводим его в терминал
if (lastCode > 0)
{
Serial.println(lastCode & 0xfff);
lastCode = 0;
}
}
// функция отправляет код в эфир
void SendCame4(long Code) {
for (int j = 0; j < 7; j++) { // посылку посылаем 4 раза подряд.
// время стартового импульса
digitalWrite(txPin, HIGH);
delayMicroseconds(320);
digitalWrite(txPin, LOW);
for (int i = 12; i > 0; i--) {
byte b = bitRead(Code, i - 1); // побитово перебираем и посылаем код
if (b) {
digitalWrite(txPin, LOW); // 1
delayMicroseconds(640);
digitalWrite(txPin, HIGH);
delayMicroseconds(320);
}
else {
digitalWrite(txPin, LOW); // 0
delayMicroseconds(320);
digitalWrite(txPin, HIGH);
delayMicroseconds(640);
}
}
digitalWrite(txPin, LOW);
delayMicroseconds(11520);
}
}
// ВЕСЬ КОД НИЖЕ - ПРИЕМ
#define MAX_DELTA 200
// длительность импульсов может плавать в зависимости от заряда батареии - макс допуск 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 == 12 || cameCounter == 13) &&
((cameCode & 0xfff) != 0xfff))
{
lastCode = cameCode & 0xfff;
cameCounter = 0;
cameCode = 0;
}
}
Функция отправки кода - с 35 по 60 строку исходного кода. Как сделать только отправку - написано в строке 21. Но чтобы получился код для брелка, нужно еще вставить управление посылкой, например кнопку, этого в исходном коде нет. Пока оставил как в исходном - код отсылается каждые 5 сек, пока не выключишь программу.
Убрал лишнее, не проверял
#define txPin 8 //пин передатчика #define rxPin 2 //пин приемника void setup() { pinMode(rxPin, INPUT); pinMode(txPin, OUTPUT); Serial.begin(115200); // тут поставьте свою скорость Serial.println("Came started"); void loop() { // это раскомментить и вместо 3693 вписать свой код для шлагбаума SendCame4(3693); delay(5000); //return; } // функция отправляет код в эфир void SendCame4(long Code) { for (int j = 0; j < 7; j++) { // посылку посылаем 4 раза подряд. // время стартового импульса digitalWrite(txPin, HIGH); delayMicroseconds(320); digitalWrite(txPin, LOW); for (int i = 12; i > 0; i--) { byte b = bitRead(Code, i - 1); // побитово перебираем и посылаем код if (b) { digitalWrite(txPin, LOW); // 1 delayMicroseconds(640); digitalWrite(txPin, HIGH); delayMicroseconds(320); } else { digitalWrite(txPin, LOW); // 0 delayMicroseconds(320); digitalWrite(txPin, HIGH); delayMicroseconds(640); } } digitalWrite(txPin, LOW); delayMicroseconds(11520); } } // ВЕСЬ КОД НИЖЕ - ПРИЕМВот, спасибо тебе человек, побольше бы таких людей! Сейчас приеду домой, буду пробовать! Спасибо огромное!)
Ошбика вот такая вылетает:
Ну я ж написал, что не проверял код .
Попробуйте переставить loop() (строки с 15 по 22) в конец скетча.
Попробовал, все тоже(
В setup скобку закрывающую поставь для начала
Поставил, теперь ошибка такая
Ну значить не находит стандартную биб-ку, где сериал описан
Выкладывай скетч, что у тебя получилось.
Держи братишка)
#define txPin 8 //пин передатчика void setup() { pinMode(txPin, OUTPUT); } Serial.begin(115200); // тут поставьте свою скорость Serial.println("Came started"); void loop() { // это раскомментить и вместо 3693 вписать свой код для шлагбаума SendCame4(3693); delay(5000); //return; } // функция отправляет код в эфир void SendCame4(long Code) { for (int j = 0; j < 7; j++) { // посылку посылаем 4 раза подряд. // время стартового импульса digitalWrite(txPin, HIGH); delayMicroseconds(320); digitalWrite(txPin, LOW); for (int i = 12; i > 0; i--) { byte b = bitRead(Code, i - 1); // побитово перебираем и посылаем код if (b) { digitalWrite(txPin, LOW); // 1 delayMicroseconds(640); digitalWrite(txPin, HIGH); delayMicroseconds(320); } else { digitalWrite(txPin, LOW); // 0 delayMicroseconds(320); digitalWrite(txPin, HIGH); delayMicroseconds(640); } } digitalWrite(txPin, LOW); delayMicroseconds(11520); } }Закрывающую скобку в сетапе нитуда поставили, переместите ее на строку 10
Все заработало! Приеник видит, отслась одна проблема, нужно передавать код 31b, как это сделать? Из шестнадцетеричной в двоичную пробовал, не получается, да и в обще всяко эксперементировал!
Дык ответили же в другой теме - http://arduino.ru/forum/obshchii/otkrytie-shlagbaumov-firmy-came-433-mhz#comment-295656
Дык код там статичный, стоял возле шлагбаума, перехватывал код, когда он открывался все время (раз 5) был один и тот же 31b0, на закрытие тоже все время один и тот же, мне только на открытие нужно, а как сделать это ,знаний нема(
Дык код там статичный, стоял возле шлагбаума, перехватывал код, когда он открывался все время (раз 5) был один и тот же 31b0, на закрытие тоже все время один и тот же, мне только на открытие нужно, а как сделать это ,знаний нема(
ну раз уж я вызвался тебе в няньки - смотри. Тебе надо шестнадцитиричное число 31b0 перевести в десятичное и вставить в вызов функции SendCame4 в строке 15
Только 31b0 может быть закодировано в порядке от старшего байта к младшему или наоборот, поэтому попробуй еще и код b031
0xb031 = 45105
А 31b0 попробуй сам перевести
О. что-то я забыл - ты же в вызове функции SendCame4 сразу можешь вставить число в шестнадцитиричной записи, просто добавив к числу 0x вначале - например SendCame4(0x31b0)
Попробовал, для начала вставил твой код "45105" приемник не видит.
Перевел 31b0, получил "12720" приеник тоже не видит. Хотя число которое стоит по дефолту в скетче "3693" приеиник видит как 67b0, а если в калькуляторе перевести 3693, то получаем E6D. почему так?
О каком 0x31b0 или 0xb031 вы тут рассуждаете, если передается 12 бит ?
Вставил в шестнадцетеричной, приемник тоже не видит(
Уже все перепробовали, в душе не чаю что не так.
Там не только байты, но все биты в каждом байте перевернуты от старших к младшим.
попробуй код 2253 (десятичный)
Нет, все так же тихо(
Ой, прошу прошения, моя ошибка, все работает, выражаю огромную благодраность, и жму вам руку! Спасибо что возились с таким неучем как я!
Ой, прошу прошения, моя ошибка, все работает, выражаю огромную благодраность, и жму вам руку! Спасибо что возились с таким неучем как я!
код 2253 подошел?
А теперь, в качестве благодарности :) - расскажи. чем вы коды считывали со шлагбаума, а то у меня тоже такая задача в планах
Если можно, поподробнее, как вы получили?
Ну что продолжаем :)))
мой код - 3468 !
Правильный код 2253, помого человек выше!)
Код для приемника:
Использовался передатчик и приемник с Aliexpress: https://ru.aliexpress.com/item/433Mhz-RF-Transmitter-With-Receiver-Kit-For-Arduino-ARM-MCU-Wireless/32583663732.html?spm=2114.13010608.0.0.5TkTLS
#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; } }Так как всетаки вы получили 2253?
Если можно, поподробнее, как вы получили?
Я ж говорю. там не только байты стоят в другом порядке, но и биты в каждом байте идут слева направо, а не справа налево, как принято в Си
1. Берем код, записываем двоично 0b31 => 101100110001
2. Переписываем все биты в обратном порядке 101100110001 => 100011001101
3. Переводим полученное в десятичный вид 100011001101 => 2253
ЗЫ наверняка это как-то можно проще сделать, но что-то сейчас не соображу, мож старшие товарищи подскажут
ЗЫ2 - чтоб не заниматься такой трахомудией, надо код в строчках 30 и 31 (сообщение #10) переписать, чтоб он биты в правильном порядке отправлял
все верно, передатчик передает биты от старшего к младшему
for (int i = 12; i > 0; i--) { byte b = bitRead(Code, i - 1); // побитово перебираем и посылаем кода приемник кладет с младшего к старшему
всегото надо заменить
for (int i = 0; i <12; i++) { byte b = bitRead(Code, i ); // побитово перебираем и посылаем кодСпасибо братишка, всех благ тебе!)
И тебе спасибо, удачи во всех начинания!)
0xb031 = 45105
А 31b0
В помощь автору темы:
void setup() {Serial.begin(9600);Serial.print("DECIMAL= ");Serial.println(0x31b0);} void loop() {}Доброго времени суток товарищи , я тоже чайник в этом деле, но хочется научиться.
У меня при сканировании сиглала came выдает в десятичном виде, т.е. came:1247 и came: 3173, перевожу в двоичную , вставляю в скетч запускаю, сканируя второй ардуиной выдает те же цифры, а шлагбаум не поднимает, не работает, я не знаю как с этим быть.
Получается мне надо 1247 перести в двоичную, потом перернуть и вставлять в скетч? Скетч на отправку отсюда.
http://psenyukov.ru/?p=213
Моя почта. registratoff@gmail.com
Приветствую, прошу прощения, не знаю, как личку написать.
Дружище поделись опытом, у меня есть пойманные коды в десятичном, при обратном посыле не работает.
Скинь пожалуйста скетчи рабочие, во что переводить и куда вставлять, заранее благодарю . Моя почта.
registratoff@gmail.com
сканировал вот этим, этот скетч Поддерживает: CAME, NICE, AM MOTORS
Ребята понимающие может поможете его разделить на два отдельных скетча - прием CAME, NICE, AM MOTORS и передача отдельно, а то в таком виде как то не работает полностью.
//Палкаподнималка //Поддерживает: CAME, NICE, AM MOTORS //Версия 2.0 #define wt 150000 //Задержка между посылками #define Pe 413 //AN MOTORS #define Pe2 Pe*2 //AN MOTORS #define rxPin 2 //Приемник #define rxOn 5 //Включение приёмника #define txPin 3 //Передатчик #define btsendPin 7 //кнопка, ОТПРАВКА #define btglushPin 8 //кнопка, ГЛУШИЛКА #define ledglPin 10 //индикатор режима глушилка #define ledcashPin 11 //индикатор сигнала в cashcame #define ledpwrPin 12 //индикатор режима power //Прием #define MAX_DELTA 200 //Максимальное отклонение от длительности при приеме volatile unsigned long prevtime; volatile unsigned int lolen, hilen, state; //AN Motors volatile static byte bcounter = 0; // количество принятых битов volatile static long code1 = 0; // зашифрованная часть volatile static long code2 = 0; // фиксированная часть volatile long c1 = 0; // переменная для отправки volatile long c2 = 0; // переменная для отправки volatile long Cash1 = 0; // кеш переменная для отправки volatile long Cash2 = 0; // кеш переменная для отправки //Came volatile static byte cameCounter = 0; // хранит количество бит volatile static long cameCode = 0; // сам код кнопки volatile long cashcame = 0; // кеш переменная для отправки //NICE volatile static byte niceCounter = 0; // count of bits stored volatile static long niceCode = 0; // code itself volatile long cashnice = 0; // кеш переменная для отправки int flag = 0; // флаг для обработки кнопки void setup() { pinMode(rxPin, INPUT); pinMode(rxOn, OUTPUT); pinMode(txPin, OUTPUT); pinMode(ledcashPin, OUTPUT); pinMode(ledglPin, OUTPUT); pinMode(ledpwrPin, OUTPUT); pinMode(btsendPin, INPUT); pinMode(btglushPin, INPUT); digitalWrite(ledpwrPin, HIGH); Serial.begin(9600); Serial.println("Scaner RUN"); randomSeed(analogRead(0)); //Генерация рандомного числа для AN Motors attachInterrupt(0, grab, CHANGE); //перехват пакетов digitalWrite(rxOn, HIGH); } void loop() { //обработка кнопки отправки кодов if (digitalRead(btsendPin) == HIGH) { noInterrupts(); //Выкл перехват digitalWrite(rxOn, LOW); digitalWrite(ledglPin, LOW); //Выкл индикатор глушилки flag = 1; } //обработка кнопки глушилки if (digitalRead(btglushPin) == HIGH) { noInterrupts(); //Выкл перехват digitalWrite(rxOn, LOW); digitalWrite(ledglPin, HIGH); //Вкл индикатор глушилки flag = 2; } switch (flag) { case 1: anmcode(); //AN MOTORS ccode(); //CAME ncode(); //NICE interrupts(); //Вкл перехват digitalWrite(rxOn, HIGH); flag = 0; break; case 2: //Глушилка digitalWrite(txPin, HIGH); delayMicroseconds(500); digitalWrite(txPin, LOW); delayMicroseconds(499); break; } } // ****************************************************** //Коды AN MOTORS void anmcode() { //КОД последий принятый от AN MOTORS if (Cash1 > 0 && Cash2 > 0) { c1 = Cash1 + random(0xff); c2 = Cash2; SendANMotors(c1, c2); } //Пример //c1 = 0x20220000 + random(0xff); //c2 = 0x2A3B4CE52; //SendANMotors(c1, c2); } //Коды CAME void ccode() { //Отправка последнего принятого кода со сканера if (cashcame > 0) { SendCame(cashcame); } //Пример //SendCame(2345); } //Коды NICE void ncode() { //Отправка последнего принятого кода со сканера if (cashnice > 0) { SendNice(cashnice); } //Пример //SendNice(1234); } // ****************************************************** //Отправка ANMotors void SendANMotors(long c1, long c2) { for (int j = 0; j < 4; j++) { digitalWrite(ledcashPin, !digitalRead(ledcashPin)); //отправляем 12 начальных импульсов 0-1 for (int i = 0; i < 12; i++) { delayMicroseconds(Pe); digitalWrite(txPin, HIGH); delayMicroseconds(Pe); digitalWrite(txPin, LOW); } delayMicroseconds(Pe * 10); //отправляем первую половину for (int i = 4 * 8; i > 0; i--) { SendBit(bitRead(c1, i - 1)); } //вторую половину for (int i = 4 * 8; i > 0; i--) { SendBit(bitRead(c2, i - 1)); } //и еще пару ненужных бит, которые означают батарейку и флаг повтора SendBit(1); SendBit(1); delayMicroseconds(Pe * 39); } delay(wt); } //Отправка ANMotors void SendBit(byte b) { if (b == 0) { digitalWrite(txPin, HIGH); // 0 delayMicroseconds(Pe2); digitalWrite(txPin, LOW); delayMicroseconds(Pe); } else { digitalWrite(txPin, HIGH); // 1 delayMicroseconds(Pe); digitalWrite(txPin, LOW); delayMicroseconds(Pe2); } } //Отправка CAME void SendCame(long Code) { for (int j = 0; j < 4; j++) { // посылку посылаем несколько раз подряд. digitalWrite(ledcashPin, !digitalRead(ledcashPin)); // время стартового импульса digitalWrite(txPin, HIGH); delayMicroseconds(320); digitalWrite(txPin, LOW); for (int i = 12; i > 0; i--) { byte b = bitRead(Code, i - 1); // побитово перебираем и посылаем код if (b) { digitalWrite(txPin, LOW); // 1 delayMicroseconds(640); digitalWrite(txPin, HIGH); delayMicroseconds(320); } else { digitalWrite(txPin, LOW); // 0 delayMicroseconds(320); digitalWrite(txPin, HIGH); delayMicroseconds(640); } } digitalWrite(txPin, LOW); delayMicroseconds(11520); } delay(wt); } //Отправка NICE void SendNice(long Code) { for (int j = 0; j < 4; j++) { // посылку посылаем 4 раза подряд. digitalWrite(ledcashPin, !digitalRead(ledcashPin)); // время стартового импульса digitalWrite(txPin, HIGH); delayMicroseconds(700); digitalWrite(txPin, LOW); for (int i = 12; i > 0; i--) { byte b = bitRead(Code, i - 1); // побитово перебираем и посылаем код if (b) { digitalWrite(txPin, LOW); // 1 delayMicroseconds(1400); digitalWrite(txPin, HIGH); delayMicroseconds(700); } else { digitalWrite(txPin, LOW); // 0 delayMicroseconds(700); digitalWrite(txPin, HIGH); delayMicroseconds(1400); } } digitalWrite(txPin, LOW); delayMicroseconds(25200); } delay(wt); } // ****************************************************** //ПРИЁМ boolean CheckValue(unsigned int base, unsigned int value) { return ((value == base) || ((value > base) && ((value - base) < MAX_DELTA)) || ((value < base) && ((base - value) < MAX_DELTA))); } void grab() { state = digitalRead(rxPin); if (state == HIGH) lolen = micros() - prevtime; else hilen = micros() - prevtime; prevtime = micros(); //AN MOTORS if (state == HIGH) { // последовательность закончилась if (CheckValue(Pe, hilen) && CheckValue(Pe2, lolen)) { // valid 1 if (bcounter < 32) code1 = (code1 << 1) | 1; else if (bcounter < 64) code2 = (code2 << 1) | 1; bcounter++; } else if (CheckValue(Pe2, hilen) && CheckValue(Pe, lolen)) { // valid 0 if (bcounter < 32) code1 = (code1 << 1) | 0; else if (bcounter < 64) code2 = (code2 << 1) | 0; bcounter++; } else bcounter = 0; //Вывод в терминал if (bcounter >= 65) { Serial.print("AN MOTORS: "); Serial.print(code1, HEX); Serial.print(" "); Serial.println(code2, HEX); digitalWrite(ledcashPin, HIGH); Cash1 = code1; Cash2 = code2; bcounter = 0; code1 = 0; code2 = 0; } } //CAME 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 == 12 || cameCounter == 13) && ((cameCode & 0xfff) != 0xfff)) { Serial.print("CAME: "); Serial.println(cameCode & 0xfff); cashcame = cameCode & 0xfff; cameCounter = 0; cameCode = 0; digitalWrite(ledcashPin, HIGH); } //NICE if (state == LOW) { // последовательность закончилась if (CheckValue(700, hilen) && CheckValue(1400, lolen)) // valid 1 { niceCode = (niceCode << 1) | 1; niceCounter++; } else if (CheckValue(1400, hilen) && CheckValue(700, lolen)) // valid 0 { niceCode = (niceCode << 1) | 0; niceCounter++; } else niceCounter = 0; } else if (lolen > 2200 && (niceCounter == 12 || niceCounter == 13) && ((niceCode & 0xfff) != 0xfff)) { Serial.print("NICE: "); Serial.println(niceCode & 0xfff); cashnice = niceCode & 0xfff; niceCounter = 0; niceCode = 0; digitalWrite(ledcashPin, HIGH); } }А отправлял вот этим:
#define txPin 8 #define Te 320 void setup(){ pinMode(txPin, OUTPUT); } void loop() { SendCame(0b10000000100); } 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(3000); // сделать паузу после посылки на 3 с }