ATtiny13 Передатчик 433МГц

7am
7am аватар
Offline
Зарегистрирован: 09.09.2015

wdrakula пишет:

Вот код, как и обещал.

Он проверенно работает на тиньке. Ядро для тиньки взято из ветки про нее. Там есть ссылка, я пользую то ядро, где нормально переключаются частоты.

Переданный код ловится на Леонардо, программой из примера библиотеки RCswitch. Библиотека была взята утром, с гитхаба, самая свежая.

пин передатчика - 3, кнопки - 0, светодиод мне нужен был для наглядности - на 4ом пине (нумерация PB0,1,2,3,4...)

Что еще? Антидребезг возможно неочевиден, он без миллис, просто на колисестве повторов. Осцилографом смотришь и определяешь к-во повторов на своей частоте.

----

Еще - это китайское говно (FS1000a) вымотало мне всю душу!!!! загоняешь в передатчик просто меандр 100+100 мкс, а приемник его нихрена не видит, пока не попляшешь с передатчиком вокруг - просто поворачивая его во все стороны.

Короче Вам понадобятся антенны - смотрите в поиске - там много вариантов есть.

Все, код - ниже, комменты - завтра, если что непонятно. Код, по нажатию кнопки (на землю) 10 раз передает число в эфир.

=======================

#define _NOP() asm volatile("nop")

#define _LED()      (DDRB  |= 0B00010000)  
#define _LED_ON()   (PORTB |= 0B00010000)
#define _LED_OFF()  (PORTB &= 0B11101111)
  
//#define F_CPU 4800000UL
#define LOOP_CYCLES 8
#define us(num) (1.33*num/(LOOP_CYCLES*(1/(F_CPU/1000000.0))))

inline __attribute__((gnu_inline)) void asm_delay(uint16_t delay){
  uint16_t u=us(delay);
do _NOP(); while(delay--);
}


#define wdelay_us(x)  asm_delay(us(x))
//#define wdelay_us(x)  delayMicroseconds(x)
#define wdelay(x) delay(x)
//========================================================

#define txpin 3
#define buttonpin 0
#define TX_HI()   (PORTB |= 0B00001000)
#define TX_LO()   (PORTB &= 0B11110111)
//#define TX_HI()   digitalWrite(txpin, HIGH)
//#define TX_LO()   digitalWrite(txpin, LOW)



void setup() {
_LED();
 pinMode (buttonpin, INPUT);
 digitalWrite(buttonpin,HIGH);
 pinMode (txpin,OUTPUT);
 digitalWrite(txpin,LOW);

}

void loop() {

unsigned long code = 123456; //ваш код
boolean button_is_pressed=false; //тут проверьте свою кнопку
static char ob = digitalRead(buttonpin);
char nb = digitalRead(buttonpin);
static uint16_t debnc = 0;
static char isfirst=false;

if (nb==ob && debnc < 2000) debnc++; 
if (nb!=ob) {ob=nb;debnc = 0;}
if (debnc == 1000 && nb == LOW)   {button_is_pressed=true;}

if (button_is_pressed){
button_is_pressed=false;
  
for (int ii=0;ii<10; ii++){ 
  _LED_ON();
  noInterrupts();
  for (int i = 23; i >=0; i--)
  {
   if (code & (1L<<i))
     {
      TX_HI();
      wdelay_us(1050);
      TX_LO();
      wdelay_us(350);
     }
   else
     {
      TX_HI();
      wdelay_us(350);
      TX_LO();
      wdelay_us(1050);
     }
  }

TX_HI();
wdelay_us(350);
TX_LO();
wdelay_us(350*31);
interrupts();
}
}
_LED_OFF();

}

 

 

Проверил, залил, кнопка на землю тишина... (( что ж такое то блин

PB3 TX

PB0 кнопка 

ЕвгенийП
ЕвгенийП аватар
Онлайн
Зарегистрирован: 25.05.2015

wdrakula пишет:

но выкрест

Как говаривал А.А. Галич: "Ох, не надо бы вслух, ох, не надо бы" :)

7am
7am аватар
Offline
Зарегистрирован: 09.09.2015

 

 

Да блин не хочет пахать
уже ругается avrdude: stk500_getsync(): not in sync: resp=0x00 
кнопку 0 на землю, tx на 3
монитор молчит
приемники передатчик рядом
другие сигналы ловит

wdrakula
wdrakula аватар
Offline
Зарегистрирован: 15.03.2016

Я же написал ро капризность модуля.

Есть осцил - генерим меандр и ловим.

Нет осцила - подключаем, вместо тиньки, нормальный контроллер и запускаем передачу из типового примера.

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

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

==================

без припаянных антенн расстояние приема меньше метра и только при правильном расположении.

wdrakula
wdrakula аватар
Offline
Зарегистрирован: 15.03.2016

ЕвгенийП пишет:

wdrakula пишет:

но выкрест

Как говаривал А.А. Галич: "Ох, не надо бы вслух, ох, не надо бы" :)

Где ж я так попалился? ;)

wdrakula
wdrakula аватар
Offline
Зарегистрирован: 15.03.2016

на переднем плане матетка. на ней тинька в формате "девелопмент боард" - кстати удобно! + нанка в качестве Arduini ISP, + передатчик FS1000 с припаянной антенкой (кусок витой пары длиной 17 см)

В таком формате рабатает из другой комнаты. К приемнику припаяна такая же антенка.

Гы! Собственно приемник виден на заднем плане и леонардик висит... с лампочкой.

 

 

 

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

wdrakula пишет:

Вот код, как и обещал.

Он проверенно работает на тиньке. Ядро для тиньки взято из ветки про нее. Там есть ссылка, я пользую то ядро, где нормально переключаются частоты.

Переданный код ловится на Леонардо, программой из примера библиотеки RCswitch. Библиотека была взята утром, с гитхаба, самая свежая.

пин передатчика - 3, кнопки - 0, светодиод мне нужен был для наглядности - на 4ом пине (нумерация PB0,1,2,3,4...)

Что еще? Антидребезг возможно неочевиден, он без миллис, просто на колисестве повторов. Осцилографом смотришь и определяешь к-во повторов на своей частоте.

----

Еще - это китайское говно (FS1000a) вымотало мне всю душу!!!! загоняешь в передатчик просто меандр 100+100 мкс, а приемник его нихрена не видит, пока не попляшешь с передатчиком вокруг - просто поворачивая его во все стороны.

Короче Вам понадобятся антенны - смотрите в поиске - там много вариантов есть.

Все, код - ниже, комменты - завтра, если что непонятно. Код, по нажатию кнопки (на землю) 10 раз передает число в эфир.

=======================

#define _NOP() asm volatile("nop")

#define _LED()      (DDRB  |= 0B00010000)  
#define _LED_ON()   (PORTB |= 0B00010000)
#define _LED_OFF()  (PORTB &= 0B11101111)
  
//#define F_CPU 4800000UL
#define LOOP_CYCLES 8
#define us(num) (1.33*num/(LOOP_CYCLES*(1/(F_CPU/1000000.0))))

inline __attribute__((gnu_inline)) void asm_delay(uint16_t delay){
  uint16_t u=us(delay);
do _NOP(); while(delay--);
}


#define wdelay_us(x)  asm_delay(us(x))
//#define wdelay_us(x)  delayMicroseconds(x)
#define wdelay(x) delay(x)
//========================================================

#define txpin 3
#define buttonpin 0
#define TX_HI()   (PORTB |= 0B00001000)
#define TX_LO()   (PORTB &= 0B11110111)
//#define TX_HI()   digitalWrite(txpin, HIGH)
//#define TX_LO()   digitalWrite(txpin, LOW)



void setup() {
_LED();
 pinMode (buttonpin, INPUT);
 digitalWrite(buttonpin,HIGH);
 pinMode (txpin,OUTPUT);
 digitalWrite(txpin,LOW);

}

void loop() {

unsigned long code = 123456; //ваш код
boolean button_is_pressed=false; //тут проверьте свою кнопку
static char ob = digitalRead(buttonpin);
char nb = digitalRead(buttonpin);
static uint16_t debnc = 0;
static char isfirst=false;

if (nb==ob && debnc < 2000) debnc++; 
if (nb!=ob) {ob=nb;debnc = 0;}
if (debnc == 1000 && nb == LOW)   {button_is_pressed=true;}

if (button_is_pressed){
button_is_pressed=false;
  
for (int ii=0;ii<10; ii++){ 
  _LED_ON();
  noInterrupts();
  for (int i = 23; i >=0; i--)
  {
   if (code & (1L<<i))
     {
      TX_HI();
      wdelay_us(1050);
      TX_LO();
      wdelay_us(350);
     }
   else
     {
      TX_HI();
      wdelay_us(350);
      TX_LO();
      wdelay_us(1050);
     }
  }

TX_HI();
wdelay_us(350);
TX_LO();
wdelay_us(350*31);
interrupts();
}
}
_LED_OFF();

}

 

Скажите пожалуйста этот код работает на тиньке? Вы в него вложили часть библиотеки RSCwitch?

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

Не хочу чтоб за меня делали работу хочу сам сделать все от и до (чтоб всегда можно было самому исправить и доделать) Но в деле програмирования как я понял не все так просто тут опыт нужен ну очень большой. Там где новичек неделю таптаться будет опытный програмист в считаные минуты все решит. Прошу лиш указать нужные направления в моих поисках.

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

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

1. Оказывается не все команды работают в тини

2. Размер программы имеет огроооомное значение

3. На форуме выяснил, что при компиляции моего скетча если к нему привязана библиотека, то ее часть и части тех библиотек что входят в состав этой автоматически заливаются вместе с моим файлом в микросхему.

 

 

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

Интересует вопрос если я поменяю микроконтроллер на Attiny 85-20su и мой скетч влезет в него, то мне прийдется все -равно переделывать код из ардуины под С вручную? Да Blink в Attiny13a я компилирую через ArduinoISP в HEX и загружаю через Uniprof если что и он исправно работает.

wdrakula
wdrakula аватар
Offline
Зарегистрирован: 15.03.2016

Пока не смог вникнуть - ты что-то от меня хочешь? Тогда медленно и внятно поясни - что именно.

ЕвгенийП
ЕвгенийП аватар
Онлайн
Зарегистрирован: 25.05.2015

так-так ... мы готовы ...

andriano
andriano аватар
Offline
Зарегистрирован: 20.06.2015

autonomsystems пишет:

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

1. Оказывается не все команды работают в тини

2. Размер программы имеет огроооомное значение

3. На форуме выяснил, что при компиляции моего скетча если к нему привязана библиотека, то ее часть и части тех библиотек что входят в состав этой автоматически заливаются вместе с моим файлом в микросхему.

При эксплуатации Запорожца возникла куча проблем:

1. Оказывается, не все, что помещается в Камаз, может поместиться в Запорожец.

2. Вес груза имеет огрооооомное значение.

3. На форуме выяснил, что если погрузить в Запорожец бочку с водой, то автоматически эта вода также оказывается в Запорожце.

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

Самый интересующий меня вопрос на сегнодняшний день: какая из библиотек на 433 Мгц. Успешно влезает и работает на 13, 85 тиньках? И Какие основные изменения надо совершать в коде написанном в IDE перед последующей прошивкой чтоб он точно заработал на микросхеме. Читал -"КАК уменьшить скетч" -там есть про замену setup loop millis -это обязательно? Вчера пришла 85 тинька в нее мой скетч успешно вошел, но и как ожидалось не заработал. В скетче приемника вложена RCSwicth не знаю как она там себя ведет. Ладно мой код еще можно переделать но не библиотеки перелопачивать наконец то.

ЕвгенийП
ЕвгенийП аватар
Онлайн
Зарегистрирован: 25.05.2015

autonomsystems пишет:

какая из библиотек на 433 Мгц. Успешно влезает и работает на 13, 85 тиньках? 

В 85-ую чёрт с рогами влезет. Не хочу сказать, что я фанат пробовать все библиотеки подряд, но я не видел такой, которая бы не лезла туда.

autonomsystems пишет:

но не библиотеки перелопачивать наконец то.

А чё такого?

Вы хотите взять нестандартную микросхему и надеетесь, что кто-то за Вас напишет для неё библиотеки? Ну, ищите подходящую, удачи!

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

autonomsystems пишет:

Самый интересующий меня вопрос на сегнодняшний день: какая из библиотек на 433 Мгц. Успешно влезает и работает на 13, 85 тиньках? И Какие основные изменения надо совершать в коде написанном в IDE перед последующей прошивкой чтоб он точно заработал на микросхеме. Читал -"КАК уменьшить скетч" -там есть про замену setup loop millis -это обязательно? Вчера пришла 85 тинька в нее мой скетч успешно вошел, но и как ожидалось не заработал. В скетче приемника вложена RCSwicth не знаю как она там себя ведет. Ладно мой код еще можно переделать но не библиотеки перелопачивать наконец то.

вчера выше я думал что у меня приемник на Attiny85ой написан без библиотеки, был не прав, там RCSwitch.h

#include <TinyOzOLED.h>
#include <avr/io.h>
#include <avr/interrupt.h>
#include <util/delay.h>
#include <RCSwitch.h>

#ifndef cbi
#define cbi(sfr, bit) (_SFR_BYTE(sfr) &= ~_BV(bit))
#endif
#ifndef sbi
#define sbi(sfr, bit) (_SFR_BYTE(sfr) |= _BV(bit))
#endif

// PB0 pin 5 - SDA
#define PB0_OUT sbi(DDRB,PB0)
#define PB0_IN cbi(DDRB,PB0)
#define PB0_HIGH sbi(PORTB,PB0)
#define PB0_LOW cbi(PORTB,PB0)
// PB1 pin 6
#define PB1_OUT sbi(DDRB,PB1)
#define PB1_IN cbi(DDRB,PB1)
#define PB1_HIGH sbi(PORTB,PB1)
#define PB1_LOW cbi(PORTB,PB1)
// PB2 pin 7 - SCL
#define PB2_OUT sbi(DDRB,PB2)
#define PB2_IN cbi(DDRB,PB2)
#define PB2_HIGH sbi(PORTB,PB2)
#define PB2_LOW cbi(PORTB,PB2)
// PB3 pin 2 - DS18B20
#define DS_BIT PB3
#define PB3_OUT sbi(DDRB,PB3)
#define PB3_IN cbi(DDRB,PB3)
#define PB3_HIGH sbi(PORTB,PB3)
#define PB3_LOW cbi(PORTB,PB3)
// PB4 pin 3 - RC RxD
#define PB4_OUT sbi(DDRB,PB4)
#define PB4_IN cbi(DDRB,PB4)
#define PB4_HIGH sbi(PORTB,PB4)
#define PB4_LOW cbi(PORTB,PB4)
#define PB4_READ bitRead(PINB,PB4)

unsigned long showBufTime = 0;
boolean inRX = false;

byte roomTemp = 0;

boolean flTempPart1 = false;
unsigned long showTempTime = 177000;
unsigned long getTempTime;
unsigned long showStreetTemp = 0;

RCSwitch mySwitch = RCSwitch();

unsigned long lu = 0; // last time get street temp
byte streettemp = 99; // street temp 0..60
word mas_str_temp[10];
byte med_str_pos = 0;
byte med_str_cnt = 0;
boolean minus_str_temp = false;

void setup () {
  OzOled.init();
  OzOled.setNormalDisplay();
  OzOled.setPageMode();
  OzOled.sendCommand(0xA1);
  OzOled.sendCommand(0xC8);
  // -
  PB1_OUT; PB1_LOW;
  PB4_IN; PB4_HIGH;
  // -
  //mySwitch.enableReceive(0);
  // -
  sbi(GIMSK, PCIE);
  sbi(PCMSK, PCINT4);
  //-
  OzOled.setPowerOn();
  OzOled.printChar('S', 5, 5);
}

void loop () {
  unsigned long currMil = millis();
  if ((currMil - showTempTime) >= 180007) {
    showTempTime = currMil;
    GetTempPart1();
    flTempPart1 = true;
    getTempTime = currMil;
  }
  if (((currMil - getTempTime) >= 1200) && (flTempPart1)) {
    getTempTime = currMil;
    flTempPart1 = false;
    roomTemp = GetTempPart2() / 100;
    roomTemp = constrain(roomTemp, 0, 99);
  }
  // receive street temp
  if (mySwitch.available()) {
    unsigned long receivedCode =  mySwitch.getReceivedValue();
    mySwitch.resetAvailable();
    if ((receivedCode >= 11500UL) && (receivedCode <= 14750UL)) {
      receivedCode -= 11500;
      if (((receivedCode >= 2000UL) && (receivedCode <= 2600UL)) || ((receivedCode >= 0UL) && (receivedCode <= 400UL))) {
        if ((receivedCode <= 400UL)) {
          receivedCode = 2000UL - receivedCode;
        }
        lu = millis();
        // correct temp
        if (receivedCode <= 1900UL) {
          receivedCode -= 12UL; // 1.2 degree
        } else {
          if (receivedCode <= 1950UL) {
            receivedCode -= 8UL; // 0.8 degree
          }
          else {
            if (receivedCode <= 1999UL) {
              receivedCode -= 5UL; // 0.5 degree
            }
          }
        }
        // --
        mas_str_temp[med_str_pos] = (word)(receivedCode);
        if ((++med_str_pos) >= 10) {
          med_str_pos = 0;
        }
        if ((++med_str_cnt) >= 10) {
          med_str_cnt = 10;
        }
        word sum_temp = 0;
        for (int i = 0; i < med_str_cnt; ++i) {
          sum_temp += mas_str_temp[i];
        }
        sum_temp /= med_str_cnt;
        if (sum_temp < 2000) {
          minus_str_temp = true;
          sum_temp = 2000 - sum_temp;
        } else {
          minus_str_temp = false;
          sum_temp -= 2000;
        }
        sum_temp /= 10;
        streettemp = (byte)(sum_temp);
      }
    }
  }
  // show street temp
  if ((currMil - showStreetTemp) >= 10000) {
    showStreetTemp = currMil;
    if ((currMil - lu) < 5940000UL) {
      if (minus_str_temp) {
        OzOled.printChar('_', 2, 2);
        OzOled.printChar('_', 3, 2);
        OzOled.printChar('_', 4, 2);
      } else {
        OzOled.printChar(' ', 2, 2);
        OzOled.printChar(' ', 3, 2);
        OzOled.printChar(' ', 4, 2);
      }
      char str[3];
      str[0] = '0' + streettemp / 10;
      str[1] = '0' + streettemp % 10;
      str[2] = 0;
      OzOled.printBigNumber(str, 5, 0);
      OzOled.printChar('`', 14, 0);
      OzOled.printChar('C', 15, 0);
      byte mm = ((currMil - lu) / 1000 / 60);
      mm = constrain(mm, 0, 99);
      OzOled.printChar('0' + mm / 10, 0, 6);
      OzOled.printChar('0' + mm % 10, 1, 6);
      OzOled.printChar('m', 2, 6);
    } else {
      OzOled.clearDisplay();
    }
    // show inttemp
    if ((roomTemp > 10) && (roomTemp < 45)) {
      OzOled.printChar('0' + roomTemp / 10, 14, 6);
      OzOled.printChar('0' + roomTemp % 10, 15, 6);
    }
  }
  //OzOled.setPowerOff();
}

ISR(PCINT0_vect) {
  mySwitch.handleInterrupt();
}

// OneWire функции:

void OneWireReset()
{
  PORTB &= ~_BV(DS_BIT);
  DDRB |= _BV(DS_BIT);
  _delay_us(500);
  DDRB &= ~_BV(DS_BIT);
  _delay_us(500);
}

void OneWireOutByte(uint8_t d)
{
  uint8_t n;
  for (n = 8; n != 0; n--)
  {
    if ((d & 0x01) == 1)
    {
      PORTB &= ~_BV(DS_BIT);
      DDRB |= _BV(DS_BIT);
      _delay_us(5);
      DDRB &= ~_BV(DS_BIT);
      _delay_us(60);
    }
    else
    {
      PORTB &= ~_BV(DS_BIT);
      DDRB |= _BV(DS_BIT);
      _delay_us(60);
      DDRB &= ~_BV(DS_BIT);
    }
    d = d >> 1;
  }
}

uint8_t OneWireInByte()
{
  uint8_t d, n, b;
  for (n = 0; n < 8; n++)
  {
    PORTB &= ~_BV(DS_BIT);
    DDRB |= _BV(DS_BIT);
    _delay_us(5);
    DDRB &= ~_BV(DS_BIT);
    _delay_us(5);
    b = ((PINB & _BV(DS_BIT)) != 0);
    _delay_us(50);
    d = (d >> 1) | (b << 7);
  }
  return (d);
}

void GetTempPart1() {
  OneWireReset();
  OneWireOutByte(0xcc);
  OneWireOutByte(0x44);
  PORTB |= _BV(DS_BIT);
  DDRB |= _BV(DS_BIT);
}

word GetTempPart2() {
  uint8_t DSdata[2];
  DDRB &= ~_BV(DS_BIT);
  PORTB &= ~_BV(DS_BIT);
  OneWireReset();
  OneWireOutByte(0xcc);
  OneWireOutByte(0xbe);
  DSdata[0] = OneWireInByte();
  DSdata[1] = OneWireInByte();
  word TReading = (word)(DSdata[1] << 8) + DSdata[0];
  if ((word)(TReading & 0x8000) == (word)(0x8000)) {
    TReading = (~TReading) + (word)1;
    TReading = (((word)6 * TReading) + TReading / (word)4) / (word)10;
  } else {
    TReading = (((word)6 * TReading) + TReading / (word)4) / (word)10 + (word)2000;
  }
  return TReading;
}

 

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

Спасибо буду газаанализировать!

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

Сегодня займусь прошивкой 85 из IDE может так мой код запашет.

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

// - 071 //mySwitch.enableReceive(0);

072 // -

073 sbi(GIMSK, PCIE);

074 sbi(PCMSK, PCINT4);

075 //- Это так назначается пин под приемник?

ЕвгенийП
ЕвгенийП аватар
Онлайн
Зарегистрирован: 25.05.2015

autonomsystems пишет:

буду газаанализировать!

Чего Вы будете делать?

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

autonomsystems пишет:

// - 071 //mySwitch.enableReceive(0);

072 // -

073 sbi(GIMSK, PCIE);

074 sbi(PCMSK, PCINT4);

075 //- Это так назначается пин под приемник?

Не помню, даташит посмотрите,
Судя по всему pcint4 прерывание включает

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

ЕвгенийП пишет:

autonomsystems пишет:

буду газаанализировать!

Чего Вы будете делать?

Изучу код и на его премере произведу в своем изменения.

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

Сегодня пробовал загрузить его в 85ю через ISP -не работает. В качестве проверки грузил и разного рода примеры те выполнялись. Пробовал менять частоту микросхемы- вдруг меняется длительность импульсов вместе с ней. Ни чего не дало. Грешу на пин 2 ведь он для аналогового входа. Повторю в IDE все работает замечательно.

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

Вот мой урезанный код приемника -ткините носом пожалуйста почему он не пашет на тиньке.

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

Информации везде море а собирать везде приходиться по крохам

autonomsystems
Offline
Зарегистрирован: 16.12.2018
--
b707
Онлайн
Зарегистрирован: 26.05.2017

autonomsystems пишет:

Вот мой урезанный код приемника -ткините носом пожалуйста почему он не пашет на тиньке.

библиотека RCSwitch на прием в Аттини не работает. Чтобы заработало - надо немного подправить библиотеку. Реально там правится всего пара строк. Поищите в гугле что-нибудь типа "RCSwitch Attiny receiver" - должно найтись легко.

Я когда-то делал приемник на тиньке с библиотекой RCSwitch, не особо разбираясь в этом - все получилось довольно просто.

 

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

b707 пишет:

autonomsystems пишет:

Вот мой урезанный код приемника -ткините носом пожалуйста почему он не пашет на тиньке.

библиотека RCSwitch на прием в Аттини не работает. Чтобы заработало - надо немного подправить библиотеку. Реально там правится всего пара строк. Поищите в гугле что-нибудь типа "RCSwitch Attiny receiver" - должно найтись легко.

Я когда-то делал приемник на тиньке с библиотекой RCSwitch, не особо разбираясь в этом - все получилось довольно просто.

 

.del

Upd: библиотека работает, но с костылями, сообщение #66

ЕвгенийП
ЕвгенийП аватар
Онлайн
Зарегистрирован: 25.05.2015

autonomsystems пишет:

Информации везде море а собирать везде приходиться по крохам

Так, ото ж!

ua6em
ua6em аватар
Онлайн
Зарегистрирован: 17.08.2016

ЕвгенийП пишет:

autonomsystems пишет:

Информации везде море а собирать везде приходиться по крохам

Так, ото ж!

А хочется в одном месте, энциклопедически, я б даже на битриксе такое замутил (в плане поддержки энциклопедии, есть ресурс)

ilya89vet
Offline
Зарегистрирован: 27.03.2018

Всем привет!
Ниже мой код кнопки беспроводного звонка (нажимаешь кнопку - отправляется код, отпускаешь МК засыпает). Я использовал библеотеку RCLSwit и код прекрасно поместился в 13 тиньку!

//  Кнопка беспроводного звонка
у
#include <avr/io.h>
#include <util/delay.h>
#include <avr/sleep.h>
#include "RCLSwitch.h"

const uint8_t RCLpin = PB0;       // пин передатчика
CRCLSwitch<RCLpin> RCLSwitch;     // инициализация

#define button (PB1)     // вывод кнопки Вкл/Выкл
#define LED (PB2)        // вывод индик. светодиод

//uint16_t code = 0B0000011000010;
bool state = true;

volatile  uint8_t int0Flag=false;

void goToSleep() {
  ADCSRA &= ~(1<<ADEN);  // отключаем АЦП
  sei();                 // разрешить глобальные прерывания
  sleep_enable();        // разреш. спящий режим
  sleep_mode();          // спим
  sleep_disable();       // запрет. спящий режим
  cli();                 // запретить глобальные прерывания
}


void transmitt() {
  
    PORTB |= (1 << LED); // HIGH
    while(!(PINB&(1<<button))) {
    RCLSwitch.write(RCL_CHANNEL_1, RCL_BUTTON_A, state);   // отправляем код
    _delay_ms(100);
    }
    PORTB &= ~(1 << LED); // LOW
   
}

// функция обработки прерываний по INT0
ISR(INT0_vect) {
  int0Flag=true;
}

int main( void ) {                
  
  DDRB |= (1 << RCLpin); // ВЫХОД
  DDRB |= (1 << LED); // ВЫХОД
  
  //инициализация внешних прерываний на ножке INT0(PB1)
  //MCUCR |= (0<<ISC00) | (1<<ISC01);
  GIMSK |= (1<<INT0);
  PORTB |= (1 << button); // HIGH

  set_sleep_mode(SLEEP_MODE_PWR_DOWN);  // режим сна

  while(1)
  {
  if(int0Flag==true) {
    transmitt();            // выполняем если было прерывание на пине PB1
    int0Flag=false;
  }
  goToSleep();              // спим
  }
}

Библиотеку можно скачать в менеджере библиотек

ilya89vet
Offline
Зарегистрирован: 27.03.2018

Вот еще более простой код который при включении в цикле отправляет код

// Простая программа отправки кода через RF трасмиттер

#include <util/delay.h>
#include "RCLSwitch.h"

const uint8_t RCLpin = PB0;
CRCLSwitch<RCLpin> RCLSwitch;

#define LED (PB2)      // вывод индик. светодиод


int main( void ) {                
  
  DDRB |= (1 << RCLpin); // ВЫХОД
  DDRB |= (1 << LED); // ВЫХОД
  PORTB |= (1 << LED); // HIGH
  
  while(1)
  {
    RCLSwitch.write(RCL_CHANNEL_1, RCL_BUTTON_A, 1);
    _delay_ms(100);
  }
}