使用两个 ATTiny85 从主 I2C 通信与 TinyWire 库

问题描述

我正在尝试使用 TinyWire library 进行主 ATTiny85 和从 ATTiny85 之间的 I2C 通信。作为发送方的主站或从站都可以,但是我无法进行基本的传输。我正在使用 Arduino IDE 对 ATTinys 进行编程。如果通信成功,我正在测试的代码应该打开 LED。请给我提意见。谢谢!

//Master Receiver
#include <TinyWire.h>
const int ledPin = 3;

void setup() {
  
  pinMode(ledPin,OUTPUT);
  digitalWrite(ledPin,HIGH);
  TinyWire.begin();
  
}

void loop() {
  
  TinyWire.requestFrom(10,1);
  bool receive = TinyWire.read();
  if (receive == 1) {
    digitalWrite(ledPin,LOW);
  }
  
}
//Slave Sender
#include <TinyWire.h>

void setup() {
  
  TinyWire.begin(10);
  TinyWire.onRequest(onRequestI2C);

}

void loop() {

}

void onRequestI2C() {
  
  TinyWire.send(1);
  
}

另外,这里是接线:

enter image description here

还发布了here

解决方法

这并不是问题的真正答案,但我找到了另一个可以实现我想要实现的目标的库。它叫做曼彻斯特,你可以下载它here

这是我用于基本测试的代码。发送器 ATTiny85 收集按钮信息并将其发送到接收器 ATTiny85,接收器根据按钮是否被按下来打开 LED。

//Transmitter
#include <Manchester.h>
#define TX_PIN 0
const int buttonPin = 3;

void setup() {
  man.setupTransmit(TX_PIN,MAN_1200);
  pinMode(buttonPin,INPUT);
}

void loop() {
  bool button = digitalRead(buttonPin);
  man.transmit(button);
  delay(200);
}
//Receiver
#include <Manchester.h>
#define RX_PIN 1
const int ledPin = 3;

void setup() {
  man.setupReceive(RX_PIN,MAN_1200);
  man.beginReceive();
  pinMode(ledPin,OUTPUT);
  digitalWrite(ledPin,HIGH);
}

void loop() {
  if (man.receiveComplete()) {
    bool button = man.getMessage();
    man.beginReceive();
    if (button == 1) {
      digitalWrite(ledPin,LOW);
    } else {
      digitalWrite(ledPin,HIGH);
    }
  }
}

我做的接线看起来像这样: enter image description here

,

出于某种原因,我可以通过这种接线使用主发送和从接收,但仍然不能使用从发送和主接收。通过一些额外的编程,您应该能够让主机发送“请求”,而从接收器切换到主机模式以发回请求的数据。效率不高,但有效。 (左主,右从)

我的代码:

//Master Send
#include <TinyWire.h>
const int buttonPin = 3;

void setup() {
  TinyWire.begin();
  pinMode(buttonPin,INPUT);
}

void loop() {
  bool button = digitalRead(buttonPin);
  TinyWire.beginTransmission(10);
  TinyWire.send(button);
  TinyWire.endTransmission();
  delay(200);
}
//Slave Receive
#include <TinyWire.h>
const int ledPin = 3;

void setup() {
  TinyWire.begin(10);
  TinyWire.onReceive(receiveEvent);
  pinMode(ledPin,HIGH);
}

void loop() {
  delay(100);
}

void receiveEvent(int howMany) {
  while (TinyWire.available()) {
    int receive = TinyWire.read();
    if (receive == 1) {
      digitalWrite(ledPin,LOW);
    }else{
      digitalWrite(ledPin,HIGH);
    }
  }
}

enter image description here