RCSwitch на Attiny85

attiny virtualwire

Я хотел бы использовать свой Attiny85 в качестве релейного переключателя с дистанционным управлением. Я уже протестировал скетч на своем Atmega328, и он сработал. Теперь я хотел записать скетч на свой Attiny85 с помощью ArduinoISP, но получаю следующую ошибку в ArduinoIDE:

sketch_dec25a.ino: In function ‘void setup()’:
sketch_dec25a:13: error: ‘class RCSwitch’ has no member named ‘enableReceive’
sketch_dec25a.ino: In function ‘void loop()’:
sketch_dec25a:20: error: ‘class RCSwitch’ has no member named ‘available’
sketch_dec25a:21: error: ‘class RCSwitch’ has no member named ‘getReceivedValue’
sketch_dec25a:22: error: ‘class RCSwitch’ has no member named ‘getReceivedValue’
sketch_dec25a:25: error: ‘class RCSwitch’ has no member named ‘resetAvailable’

Это мой код:

#include <SoftwareSerial.h>
#include <RCSwitch.h>

int RELAY_PIN = 2;

RCSwitch mySwitch = RCSwitch();
SoftwareSerial mySerial(1, 3); // прием, передача

void setup()  
{
  pinMode(RELAY_PIN, OUTPUT);
  mySwitch.enableReceive(0);  // Получатель при ошибке 0 => это контакт №2
  mySerial.begin(9600);
  mySerial.println("Hello, world?");
}

void loop() // запускаем снова и снова
{
  if (mySwitch.available()) {
    Serial.println(mySwitch.getReceivedValue());
    if(mySwitch.getReceivedValue() == 1234567){
      digitalWrite(RELAY_PIN, HIGH);
    }
    mySwitch.resetAvailable();
  }
}

Я использую следующие ядра: https://code.google.com/p/arduino-tiny/

Я использую SoftwareSerial только для отладки. Извините за мой плохой английский и спасибо за вашу помощь!

, 👍2


2 ответа


Лучший ответ:

4

Проблема, с которой вы столкнулись, заключается в том, что RCSwitch не поддерживает режим приема для ATtiny.

Вот что вы можете найти в RCSwitch.h:

// По крайней мере, для ATTiny X4/X5 прием должен быть отключен из-за
// отсутствуют зависимости libm (udivmodhi4)
#if defined( __AVR_ATtinyX5__ ) or defined ( __AVR_ATtinyX4__ )
#define RCSwitchDisableReceiving
#endif

Тогда все методы, связанные с приемом, не определены в классе RCSwitch для микроконтроллеров ATtiny:

#if not defined( RCSwitchDisableReceiving )
void enableReceive(int interrupt);
void enableReceive();
void disableReceive();
bool available();
void resetAvailable();

unsigned long getReceivedValue();
unsigned int getReceivedBitlength();
unsigned int getReceivedDelay();
unsigned int getReceivedProtocol();
unsigned int* getReceivedRawdata();
#endif

Я действительно не уверен, есть ли способ обойти это, я не смотрел код в RCSwitch.cpp.

Возможно, вам лучше всего будет найти другую библиотеку RC.

Например, если вы можете использовать Infra-Red RC, то существуют библиотеки, которые могут работать с ATtiny:

https://github.com/shirriff/Arduino-IRremote

,

Arduino-IRremote также несовместим с ATTiny., @Omer

Судя по этой проблеме https://github.com/shirriff/Arduino-IRremote/issues/97, похоже, для ATtiny есть несколько вариантов., @jfpoilpret


1

Я протестировал Digispark ATtiny85, и https://github.com/sui77/rc-switch работает отлично

просто прокомментируйте #define RCSwitchDisableReceive чем использовать в коде настройки enableReceive(0); и внешний контакт 7 PB2(int0) в качестве источника RF

Или вы можете использовать другое программное прерывание контакта

в настройках: PCMSK |= (1<<PCINT0);//здесь номер контакта GIMSK |= (1<<PCIE);

функция прерывания ISR(PCINT0_vect) { rd.handleInterrupt(); // вам также нужно поместить handleInterrupt() в общедоступную секцию в RCSwitch.h

,

Да, как дополнение работает отлично! Я перемещаю handleInterrupt() do public в RCSwitch.h, комментирую #define RCSwitchDisableReception и добавляю функцию прерывания, например akaJes. Спасибо! :-), @user3680370