Чтение ключа 433 мГц

autonomsystems
Offline
Зарегистрирован: 16.12.2018

ДААА. Я месяца назад решил сделать свое радио -реле. Месяц потратил на изучение програмирования в ардуино. Написал с использованием примеров взятых с кучи каких форумов свой скетч. Научился заливать Blink в Atinny13 И вот неделю как бьюсь с пршивкой в Atinny13A своего скетча. А тут ну практически готовое решение лежит. Осталось пару моментов которые не могу пока осилить:

1. Можно ли в программе приемнике не использовать вложений библиотек таких как RCwich ?

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

 

autonomsystems
Offline
Зарегистрирован: 16.12.2018

И еще один вопрос: Написал я скетч =>вырезал *.hex из темпа=>залил в программатор в  моем случае в Uniprof. А к скетчу привязана библиотека RCSwihtc и как она в тиньку попадет?

autonomsystems
Offline
Зарегистрирован: 16.12.2018

Не кидайте камнями если че я только учусь.

andycat
andycat аватар
Offline
Зарегистрирован: 07.09.2017

Обалденный магазин) со всякими разными радиореле

QIACHIP Store
https://s.click.aliexpress.com/e/b68J4ohG

autonomsystems
Offline
Зарегистрирован: 16.12.2018

Это я сделал а вот по сути вопросов можно? Вот увидел в выложеном WDrakula скетче есть вложение avr/interupt.h оно через программатор как попадает в тиньку? Или при заливки с IDE библиотеки сами припаиваются?

ua6em
ua6em аватар
Offline
Зарегистрирован: 17.08.2016

Подпишусь

andycat
andycat аватар
Offline
Зарегистрирован: 07.09.2017

А по существу - есть масса примеров в интернете приёма на attiny13 протокола rcswitch без подключения библиотек. Если не найдёте - в понедельник скину пример, на телевизоре висит приемник температуры с мини oled экраном, получающий температуру с уличного датчика.

autonomsystems
Offline
Зарегистрирован: 16.12.2018

Только мне надо получать не просто сигнал а код минмум четырехзначный. Буду очень признателен если ткнете носом. пойду спать завтра снова воевать с друиной. Спасибо пока.

asam
asam аватар
Offline
Зарегистрирован: 12.12.2018

autonomsystems пишет:

 Вот увидел в выложеном WDrakula скетче есть вложение avr/interupt.h оно через программатор как попадает в тиньку? Или при заливки с IDE библиотеки сами припаиваются?

Если коротко, то в процессе компиляции создается единый исполняемый файл в котором содержится и оттранслированный код скетча и используемы части от библиотек (тоже оттранслированные). Дальше этот исполняемый файп "через программатор" загружается в тиньку.

Если интересует подробнее, то можно посмотреть, например, здесь - http://qaru.site/questions/6283/how-does-the-compilationlinking-process-work

autonomsystems
Offline
Зарегистрирован: 16.12.2018

Спасибо за консультацию. Еще вопрос этот процесс происходит в IDE? У меня не получилось заливать прошивку через SPI  и я компилирую hex файл из темпа в uniprof и через ком порт прошиваю. Так вот в том HEX файле что куски всех приложенных библиотек? Так я RCswitch открыл а нем как минимум десяток библиотек в самом прикреплено, это что и они за моим скетчем в тиньку потащатся? Оболдеть так точно в ней места не хватит.

Logik
Offline
Зарегистрирован: 05.08.2014

Подыму ка темку.

Имею выключатели https://ru.aliexpress.com/item/TLINK-EU-1-2-3-1/32844335631.html?spm=a2g... а к нему брелок из комплекта. Задался я прослушать обмен от брелка к выключателю с перспективой в забацать и самодельное управление выключателем с ардуины. Приобрел комплект приемник и передатчик ну точно как у ТС в #1. Расковырял брелок, там EV1527 стоит. Закодил значить (про либу RCswitch в курсе, не интересно).


#define InpEV1527  A3
#define TickEV1527 128  //мксек
#define GetTickEV1527(t)  ((byte)(t>>7))
#define MaxTimeLoPreamb  12000 //мксек  
#define MaxTimeBit  1000 //мксек  
#define MinTimeBit  130 //мксек  
#define MaxTickBit       ( MaxTimeBit / TickEV1527) 
#define MinTickBit       ( MinTimeBit / TickEV1527) 
#define MaxTickLoPreamb  ( MaxTimeLoPreamb / TickEV1527)   

#define  RCV_EV1527_FLAG_HI       128  //флаг ввода сигнала высокого уровня, есть у RCV_EV1527_STATE_WAIT  и  RCV_EV1527_STATE_HI
#define  RCV_EV1527_FLAG_BIT_RCV   64  //флаг завершения приема очередного бита, есть у RCV_EV1527_STATE_0 и RCV_EV1527_STATE_1
#define  RCV_EV1527_FLAG_ERROR     32  //флаг ошибки 

#define  RCV_EV1527_STATE_OK         0                             //на нижнем уровне - завершение измерения импульса, на верхнем - завершение ввода 24 бит
#define  RCV_EV1527_STATE_WAIT     ( 1 | RCV_EV1527_FLAG_HI )
#define  RCV_EV1527_STATE_PREAMB     2
#define  RCV_EV1527_STATE_HI       ( 3 | RCV_EV1527_FLAG_HI )
#define  RCV_EV1527_STATE_LO         4
#define  RCV_EV1527_STATE_PROCESS    5                             //продолжается прием информации, требуется повторно вызвать процесс
#define  RCV_EV1527_STATE_0        ( 6 | RCV_EV1527_FLAG_BIT_RCV )
#define  RCV_EV1527_STATE_1        ( 7 | RCV_EV1527_FLAG_BIT_RCV )
#define  RCV_EV1527_ERROR_TIME_SHT ( 8 | RCV_EV1527_FLAG_ERROR   ) //продолжительность импульса короче диапазона
#define  RCV_EV1527_ERROR_TIME_LNG ( 9 | RCV_EV1527_FLAG_ERROR   ) //продолжительность импульса длинней диапазона
#define  RCV_EV1527_START          ( 10 | RCV_EV1527_FLAG_ERROR )

void setup() {
  // put your setup code here, to run once:
  Serial.begin(57600);
  Serial.println("RcvEV1527");
}

inline const byte RcvEV1527Lo(const byte dt, const byte InpLvl, const byte MaxTime)
{
   return dt>MaxTime?RCV_EV1527_ERROR_TIME_LNG:InpLvl==LOW?RCV_EV1527_STATE_PROCESS:dt<=MinTickBit?RCV_EV1527_ERROR_TIME_SHT:RCV_EV1527_STATE_OK;
}

inline const byte RcvEV1527Hi(const byte dt, const byte InpLvl)
{
   return dt>MaxTimeBit?RCV_EV1527_ERROR_TIME_LNG:InpLvl==HIGH?RCV_EV1527_STATE_PROCESS:dt<=MinTickBit?RCV_EV1527_ERROR_TIME_SHT:RCV_EV1527_STATE_OK;
}

inline const byte RcvEV1527Bit(const byte T, const byte FlStartWait)
{
  static byte s = RCV_EV1527_STATE_WAIT;
  static byte t;
  static byte dt_hi;
  byte r;
  byte dt;
  byte es; 

  dt=T-t;

  if(FlStartWait)
    s=RCV_EV1527_STATE_WAIT;
 
  es=RCV_EV1527_STATE_WAIT; 
   
  r=digitalRead(InpEV1527);
  
  if(s & RCV_EV1527_FLAG_HI)
      r=RcvEV1527Hi(dt, r);
  else
    if(s==RCV_EV1527_STATE_PREAMB)
        r=RcvEV1527Lo(dt, r, MaxTickLoPreamb);
    else
    {
       r=RcvEV1527Lo(dt, r, MaxTickBit);
       if(r==RCV_EV1527_ERROR_TIME_LNG)
       {
           es=RCV_EV1527_STATE_PREAMB; 
           r=RCV_EV1527_START;          
        }
    }
 
  if(r& RCV_EV1527_FLAG_ERROR)
  {
    t=T;
    s=es; 
    return r;
  }
  
  if(r==RCV_EV1527_STATE_OK)
  {
    t=T;
    switch (s)
    {
      case RCV_EV1527_STATE_WAIT:
        s=RCV_EV1527_STATE_PREAMB;
        break;
      case RCV_EV1527_STATE_PREAMB:
        s=RCV_EV1527_STATE_HI;
        break;
      case RCV_EV1527_STATE_HI:
        s=RCV_EV1527_STATE_LO;
        dt_hi=dt;
        break;
      case RCV_EV1527_STATE_LO:
        s=RCV_EV1527_STATE_HI;
        return dt_hi>dt?RCV_EV1527_STATE_1:RCV_EV1527_STATE_0;
        break;
    }
  }

  return RCV_EV1527_STATE_PROCESS;
 }

inline const byte RcvEV1527(const byte T,  unsigned long int* d)
{
  byte r;
  static byte cnt = 24;

  if(cnt==24)
  {
    cnt = 0;
    r = RcvEV1527Bit(T, true);
  }
  else
    r = RcvEV1527Bit(T, false);
 

  if( r==RCV_EV1527_START)
    cnt = 0;
   else if( r& RCV_EV1527_FLAG_ERROR)
    cnt = 24;

  if(r & RCV_EV1527_FLAG_BIT_RCV)
  {
    (*d)<<=1;

    if(r == RCV_EV1527_STATE_1)
      (*d)|=1;

    cnt ++;

    if(cnt==24)
      return  RCV_EV1527_STATE_OK;
    else
      return RCV_EV1527_STATE_PROCESS;
  }

  return r;
}

static byte  FlgEV1527;
static unsigned long int EV1527; 
static void InterruptEV1527( void )
{
  static byte c;
 
  c++;
  if(FlgEV1527)
  {
    FlgEV1527 = RcvEV1527(c, &EV1527) == RCV_EV1527_STATE_OK;
  }
   
}

void loop() {
  // put your main code here, to run repeatedly:
  
  unsigned long int t;
  static unsigned long int d;

  
   t=micros();

   if(RcvEV1527(GetTickEV1527(t), &d) == RCV_EV1527_STATE_OK)
   {
       Serial.println(d, HEX);
        d=0;
   }
}

 

Работает, принимает коды от брелка и немного всякой хрени. Но вот какой момент. Есть такие пульты - https://ru.aliexpress.com/item/Mobu-433-1527/32891602817.html?spm=a2g0s.... (не путать с выключателями!! это просто пульт на батарейке, хотя внешне как выключатель, особенно когда на стене висят). Так  вот эти не хотят прослушыватся. Но с радиовыключателями работают абсолютно корректно. По описанию они "на 1527" но не факт что EV1527, маркировка как водится, спилена. Никто не в курсе что может быть, почему от разных пультов выключатели работают а сигнал разный? какие еще варианты кодировки могут быть "на 1527" но не EV1527? Неужели выключатель на несколько кодировок расчитан...