arduino-uno - Attiny85 与 ArduinoUno 用于 I2c 通信
问题描述
我正在研究用于 I2C 通信的 attiny85。我已经浏览了不同的库,例如Wire.h
, TinyWire.h
, tinyWireM.h
, tinyWireS.h
.
一开始,我想通过 I2C 通信发送一些数据字节,并尝试用示波器对引脚进行范围,但它没有给我适当的结果。在互联网上寻找使 attiny85 与 I2c 一起工作的不同方法真的很无情,我无法完成任务。最后,我试着让 attiny85 做主人,把 arduino Uno 做奴隶,因为它在我的盒子里是备用的。
我试图将 attiny85 设为 master 并将数据发送到 arduino 并在串行监视器上查看输出,但它显示为零。
作为参考,附上主代码和从代码,我的任务很简单,检查串行。
Attiny85 作为 Master
#include <TinyWireM.h>
void setup()
{
TinyWireM.begin();
}
void loop()
{
TinyWireM.begin();
TinyWireM.beginTransmission(0x08);
TinyWireM.send(0x99);
int Byte1 = TinyWireM.endTransmission();
delay(1000);
}
Arduino作为奴隶
#include <Wire.h>
const byte add = 0x08;
int byte1;
void setup()
{
Wire.begin(add);
Wire.onReceive(receiveEvent);
Serial.begin(9600);
}
void loop()
{
Serial.println ("Data receiving");
Serial.println(byte1);
delay(1000);
}
void receiveEvent(int bytes)
{
byte1 = Wire.read();
}
但我无法在 arduino 的串行监视器上获得输出。我在这里做错了什么?
解决方案
一段时间前,我使用 TinyWireS 库(https://github.com/nadavmatalon/TinyWireS)将 Atiny85 用作从站,它运行良好。以下是引脚配置
带有 Arduino Uno A4 的 ATtiny85 引脚 5 和带有 Arduino Uno A5 的 ATtiny85 引脚 7
以下是我的代码
一丁点。
#include "TinyWireS.h"
const byte SLAVE_ADDR = 100;
const byte NUM_BYTES = 4;
volatile byte data = { 0, 1, 2, 3 };
void setup() {
TinyWireS.begin(SLAVE_ADDR);
TinyWireS.onRequest(requestISR);
}
void loop() {}
void requestISR() {
for (byte i=0; i<NUM_BYTES; i++) {
TinyWireS.write(data[i]);
data[i] += 1;
}
}
一诺。
#include <Wire.h>
const byte SLAVE_ADDR = 100;
const byte NUM_BYTES = 4;
byte data[NUM_BYTES] = { 0 };
byte bytesReceived = 0;
unsigned long timeNow = millis();
void setup() {
Serial.begin(9600);
Wire.begin();
Serial.print(F("\n\nSerial is Open\n\n"));
}
void loop() {
if (millis() - timeNow >= 750) { // trigger every 750mS
Wire.requestFrom(SLAVE_ADDR, NUM_BYTES); // request bytes from slave
bytesReceived = Wire.available(); // count how many bytes received
if (bytesReceived == NUM_BYTES) { // if received correct number of bytes...
for (byte i=0; i<NUM_BYTES; i++) data[i] = Wire.read(); // read and store each byte
printData(); // print the received data
} else { // if received wrong number of bytes...
Serial.print(F("\nRequested ")); // print message with how many bytes received
Serial.print(NUM_BYTES);
Serial.print(F(" bytes, but got "));
Serial.print(bytesReceived);
Serial.print(F(" bytes\n"));
}
timeNow = millis(); // mark preset time for next trigger
}
}
void printData() {
Serial.print(F("\n"));
for (byte i=0; i<NUM_BYTES; i++) {
Serial.print(F("Byte["));
Serial.print(i);
Serial.print(F("]: "));
Serial.print(data[i]);
Serial.print(F("\t"));
}
Serial.print(F("\n"));
}
推荐阅读
- nginx - Nginx 反向代理 - 拒绝访问特定的后端 IP 地址
- jdeveloper - 在 JDeveloper 中使用 lombok
- rcpp - Rcpp 是否启用 C++ 数据类型(例如 int、std::string 等)作为输入或输出参数?
- android - Is it possible to add rectangular corners to layout?
- java - FeignClient: if the response of an API has two different format, how to elegantly deal with such a case?
- powershell - AD 用户不会被 powershell 添加到组中
- python - 如何在 Visual Studio Code 上使用 python 海龟图形绘制递归 Sierpiński 箭头曲线
- javascript - Javascript数组搜索过滤器
- json - 从 JSON 制作模型类
- c# - C#:从字符串版本号中过滤诸如 `-beta1` 和 `hotfix` 之类的内容