簡體   English   中英

使用兩個 ATTiny85 從主 I2C 通信與 TinyWire 庫

[英]Using two ATTiny85 slave master I2C communication with TinyWire Library

我正在嘗試使用TinyWire 庫在主 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);
  
}

另外,這里是接線: 在此處輸入圖片說明

也貼在這里

這並不是問題的真正答案,但我找到了另一個可以實現我想要實現的目標的庫。 它叫做曼徹斯特,你可以在這里下載。

這是我用於基本測試的代碼。 發送器 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, OUTPUT);
  digitalWrite(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);
    }
  }
}

在此處輸入圖片說明

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM