Оставить только передачу кода

vr2001rv
Offline
Зарегистрирован: 12.07.2017

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

#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;
}
}

 

b707
Offline
Зарегистрирован: 26.05.2017

Функция отправки кода - с 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);
}
}


// ВЕСЬ КОД НИЖЕ - ПРИЕМ

 

vr2001rv
Offline
Зарегистрирован: 12.07.2017

Вот, спасибо тебе человек, побольше бы таких людей! Сейчас приеду домой, буду пробовать! Спасибо огромное!)

vr2001rv
Offline
Зарегистрирован: 12.07.2017

Ошбика вот такая вылетает:

Arduino: 1.8.3 (Windows 7), Плата:"Arduino Nano, ATmega328"
 
C:\Users\Roma\Desktop\Отправка кода\camesend2016\camesend2016.ino: In function 'void setup()':
 
camesend2016:15: error: a function-definition is not allowed here before '{' token
 
camesend2016:26: error: a function-definition is not allowed here before '{' token
 
camesend2016:50: error: expected '}' at end of input
 
exit status 1
a function-definition is not allowed here before '{' token
 
Этот отчёт будет иметь больше информации с
включенной опцией Файл -> Настройки ->
"Показать подробный вывод во время компиляции"
 
b707
Offline
Зарегистрирован: 26.05.2017

Ну я ж написал, что не проверял код .

Попробуйте переставить loop() (строки с 15 по 22) в конец скетча.

vr2001rv
Offline
Зарегистрирован: 12.07.2017

Попробовал, все тоже(

DetSimen
DetSimen аватар
Онлайн
Зарегистрирован: 25.01.2017

В setup скобку закрывающую поставь для начала

vr2001rv
Offline
Зарегистрирован: 12.07.2017

Поставил, теперь ошибка такая

Arduino: 1.8.3 (Windows 7), Плата:"Arduino Nano, ATmega328"
 
camesend2016:10: error: 'Serial' does not name a type
 
camesend2016:11: error: 'Serial' does not name a type
 
exit status 1
'Serial' does not name a type
 
Этот отчёт будет иметь больше информации с
включенной опцией Файл -> Настройки ->
"Показать подробный вывод во время компиляции"
 
DetSimen
DetSimen аватар
Онлайн
Зарегистрирован: 25.01.2017

Ну значить не находит стандартную биб-ку, где сериал описан

Jeka_M
Jeka_M аватар
Offline
Зарегистрирован: 06.07.2014

Выкладывай скетч, что у тебя получилось.

vr2001rv
Offline
Зарегистрирован: 12.07.2017

Держи братишка)

#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);
}
}

 

b707
Offline
Зарегистрирован: 26.05.2017

Закрывающую скобку в сетапе нитуда поставили, переместите ее на строку 10

vr2001rv
Offline
Зарегистрирован: 12.07.2017

Все заработало! Приеник видит, отслась одна проблема, нужно передавать код 31b, как это сделать? Из шестнадцетеричной в двоичную пробовал, не получается, да и в обще всяко эксперементировал!

Jeka_M
Jeka_M аватар
Offline
Зарегистрирован: 06.07.2014

Дык ответили же в другой теме - http://arduino.ru/forum/obshchii/otkrytie-shlagbaumov-firmy-came-433-mhz#comment-295656

vr2001rv
Offline
Зарегистрирован: 12.07.2017

Дык код там статичный, стоял возле шлагбаума, перехватывал код, когда он открывался все время (раз 5) был один и тот же 31b0, на закрытие тоже все время один и тот же, мне только на открытие нужно, а как сделать это ,знаний нема(

b707
Offline
Зарегистрирован: 26.05.2017

vr2001rv пишет:

Дык код там статичный, стоял возле шлагбаума, перехватывал код, когда он открывался все время (раз 5) был один и тот же 31b0, на закрытие тоже все время один и тот же, мне только на открытие нужно, а как сделать это ,знаний нема(

ну раз уж я вызвался тебе в няньки - смотри. Тебе надо шестнадцитиричное число 31b0 перевести в десятичное и вставить в вызов функции SendCame4 в строке 15

Только 31b0 может быть закодировано в порядке от старшего байта к младшему или наоборот, поэтому попробуй еще и код b031

0xb031 = 45105

А 31b0 попробуй сам перевести

b707
Offline
Зарегистрирован: 26.05.2017

О. что-то я забыл - ты же в вызове функции SendCame4 сразу можешь вставить число в шестнадцитиричной записи, просто добавив к числу 0x вначале - например SendCame4(0x31b0)

vr2001rv
Offline
Зарегистрирован: 12.07.2017

Попробовал, для начала вставил твой код "45105" приемник не видит.

Перевел 31b0, получил "12720" приеник тоже не видит. Хотя число которое стоит по дефолту в скетче "3693" приеиник видит как 67b0, а если в калькуляторе перевести 3693, то получаем E6D. почему так?

xDriver
xDriver аватар
Offline
Зарегистрирован: 14.08.2015

О каком 0x31b0 или 0xb031 вы тут рассуждаете, если передается 12 бит ?

vr2001rv
Offline
Зарегистрирован: 12.07.2017

Вставил в шестнадцетеричной, приемник тоже не видит(

vr2001rv
Offline
Зарегистрирован: 12.07.2017

Уже все перепробовали, в душе не чаю что не так.

b707
Offline
Зарегистрирован: 26.05.2017

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

попробуй код 2253 (десятичный)

vr2001rv
Offline
Зарегистрирован: 12.07.2017

Нет, все так же тихо(

vr2001rv
Offline
Зарегистрирован: 12.07.2017

Ой, прошу прошения, моя ошибка, все работает, выражаю огромную благодраность, и жму вам руку! Спасибо что возились с таким неучем как я!

b707
Offline
Зарегистрирован: 26.05.2017

vr2001rv пишет:

Ой, прошу прошения, моя ошибка, все работает, выражаю огромную благодраность, и жму вам руку! Спасибо что возились с таким неучем как я!

код 2253 подошел?

А теперь, в качестве благодарности :) - расскажи. чем вы коды считывали со шлагбаума, а то у меня тоже такая задача в планах

vr2001rv
Offline
Зарегистрирован: 12.07.2017

Если можно, поподробнее, как вы получили?

xDriver
xDriver аватар
Offline
Зарегистрирован: 14.08.2015

Ну что продолжаем :)))  

мой код - 3468 !

vr2001rv
Offline
Зарегистрирован: 12.07.2017

Правильный код 2253, помого человек выше!)

vr2001rv
Offline
Зарегистрирован: 12.07.2017

Код для приемника: 

Использовался передатчик и приемник с 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; 
} 
}

 

vr2001rv
Offline
Зарегистрирован: 12.07.2017

Так как всетаки вы получили 2253?

b707
Offline
Зарегистрирован: 26.05.2017

vr2001rv пишет:

Если можно, поподробнее, как вы получили?

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

1. Берем код, записываем двоично 0b31 => 101100110001

2. Переписываем все биты в обратном порядке 101100110001 => 100011001101

3. Переводим полученное в десятичный вид 100011001101 => 2253

 

ЗЫ наверняка это как-то можно проще сделать, но что-то сейчас не соображу, мож старшие товарищи подскажут

ЗЫ2 - чтоб не заниматься такой трахомудией, надо код в строчках 30 и 31 (сообщение #10) переписать, чтоб он биты в правильном порядке отправлял

 

xDriver
xDriver аватар
Offline
Зарегистрирован: 14.08.2015

все верно, передатчик передает биты от старшего к младшему

for (int i = 12; i > 0; i--) {
byte b = bitRead(Code, i - 1); // побитово перебираем и посылаем код

а приемник кладет с младшего к старшему

 if(b) set_bit(came.data, came.dat_bit); 
 came.dat_bit++; 

всегото надо заменить 

for (int i = 0; i <12; i++) {
byte b = bitRead(Code, i ); // побитово перебираем и посылаем код

 

vr2001rv
Offline
Зарегистрирован: 12.07.2017

Спасибо братишка, всех благ тебе!)

vr2001rv
Offline
Зарегистрирован: 12.07.2017

И тебе спасибо, удачи во всех начинания!)

BGarten
Offline
Зарегистрирован: 14.07.2017

b707 пишет:
Только 31b0 может быть закодировано в порядке от старшего байта к младшему или наоборот, поэтому попробуй еще и код b031

0xb031 = 45105

А 31b0

 

В помощь автору темы:

void setup() {Serial.begin(9600);Serial.print("DECIMAL= ");Serial.println(0x31b0);}
void loop() {}

 

Pavel.Inn
Offline
Зарегистрирован: 04.09.2017

Доброго времени суток товарищи , я тоже чайник в этом деле, но хочется научиться.
У меня при сканировании сиглала came выдает в десятичном виде, т.е. came:1247 и came: 3173, перевожу в двоичную , вставляю в скетч запускаю, сканируя второй ардуиной выдает те же цифры, а шлагбаум не поднимает, не работает, я не знаю как с этим быть.
Получается мне надо 1247 перести в двоичную, потом перернуть и вставлять в скетч? Скетч на отправку отсюда.
http://psenyukov.ru/?p=213
Моя почта. registratoff@gmail.com

Pavel.Inn
Offline
Зарегистрирован: 04.09.2017

Приветствую, прошу прощения, не знаю, как личку написать.
Дружище поделись опытом, у меня есть пойманные коды в десятичном, при обратном посыле не работает.
Скинь пожалуйста скетчи рабочие, во что переводить и куда вставлять, заранее благодарю . Моя почта.
registratoff@gmail.com

Pavel.Inn
Offline
Зарегистрирован: 04.09.2017

Pavel.Inn пишет:
Доброго времени суток товарищи , я тоже чайник в этом деле, но хочется научиться. У меня при сканировании сиглала came выдает в десятичном виде, т.е. came:1247 и came: 3173, перевожу в двоичную , вставляю в скетч запускаю, сканируя второй ардуиной выдает те же цифры, а шлагбаум не поднимает, не работает, я не знаю как с этим быть. Получается мне надо 1247 перести в двоичную, потом перернуть и вставлять в скетч? Скетч на отправку отсюда. http://psenyukov.ru/?p=213 Моя почта. 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);
  }

}

 

Pavel.Inn
Offline
Зарегистрирован: 04.09.2017

Pavel.Inn пишет:
Доброго времени суток товарищи , я тоже чайник в этом деле, но хочется научиться. У меня при сканировании сиглала came выдает в десятичном виде, т.е. came:1247 и came: 3173, перевожу в двоичную , вставляю в скетч запускаю, сканируя второй ардуиной выдает те же цифры, а шлагбаум не поднимает, не работает, я не знаю как с этим быть. Получается мне надо 1247 перести в двоичную, потом перернуть и вставлять в скетч? Скетч на отправку отсюда. http://psenyukov.ru/?p=213 Моя почта. registratoff@gmail.com

А отправлял вот этим:

#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 с
}