问题描述
我正在尝试使用 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);
}
还发布了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);
}
}
}
,
出于某种原因,我可以通过这种接线使用主发送和从接收,但仍然不能使用从发送和主接收。通过一些额外的编程,您应该能够让主机发送“请求”,而从接收器切换到主机模式以发回请求的数据。效率不高,但有效。 (左主,右从)
我的代码:
//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);
}
}
}