作为主站的uno开发板向作为从站LILYGO t-diapaly s3开发板,使用IIC通信协议来通信,发送一个Hello,和一个KITTY,我想在LILYGO开发板来接收这两个字符串数据,并且在lilygo的屏幕上通过调用tft-espi库显示出来,
时间: 2024-03-21 19:41:23 浏览: 43
好的,以下是一个可能的程序示例,使用Wire库和tft-espi库来实现I2C通信和显示:
```
#include <Wire.h>
#include <SPI.h>
#include <TFT_eSPI.h>
#define SCREEN_WIDTH 240
#define SCREEN_HEIGHT 135
#define I2C_SLAVE_ADDR 0x3C
TFT_eSPI tft = TFT_eSPI(); // 初始化TFT_eSPI库
void setup() {
Wire.begin(I2C_SLAVE_ADDR); // 初始化I2C总线,设置从站地址
Serial.begin(9600);
tft.begin(); // 初始化TFT屏幕
tft.setRotation(0);
tft.fillScreen(TFT_BLACK); // 填充屏幕为黑色
}
void loop() {
receiveData();
}
void receiveData() {
int byteCount = 0;
int dataLength;
char dataBuffer[SCREEN_WIDTH];
Wire.requestFrom(I2C_SLAVE_ADDR, 2); // 读取控制字节
while (Wire.available()) {
byte b = Wire.read();
if (byteCount == 0) {
if (b == 0x00) {
byteCount++;
}
} else if (byteCount == 1) {
byteCount++;
if (b < SCREEN_WIDTH) {
dataLength = b;
} else {
byteCount = 0;
}
}
}
if (byteCount == 2) {
byteCount = 0;
Wire.requestFrom(I2C_SLAVE_ADDR, dataLength); // 读取数据
while (Wire.available()) {
char c = Wire.read();
if (byteCount < SCREEN_WIDTH) {
dataBuffer[byteCount] = c;
byteCount++;
}
}
if (byteCount == dataLength) {
dataBuffer[byteCount] = '\0'; // 添加字符串结尾符
Serial.println(dataBuffer);
tft.fillScreen(TFT_BLACK); // 填充屏幕为黑色
tft.setCursor(0, 0);
tft.print(dataBuffer); // 在屏幕上显示数据
}
}
}
```
在这个程序中,我们使用了TFT_eSPI库来控制LILYGO t-diapaly s3开发板上的TFT屏幕。在`setup()`函数中,我们初始化了I2C总线和屏幕,并在屏幕上显示了欢迎信息。在`loop()`函数中,我们调用`receiveData()`函数来接收数据。`receiveData()`函数首先调用`Wire.requestFrom()`来请求两个控制字节。如果接收到的第一个字节是0x00,那么它会解析第二个字节来确定数据的长度,并调用`Wire.requestFrom()`来读取数据。最后,它在串行监视器上输出接收到的数据,并在屏幕上显示数据。
请注意,在这个程序中,我们假设uno开发板已经通过I2C总线连接到了LILYGO t-diapaly s3开发板,而且我们使用的从站地址为0x3C。另外,我们假设发送的数据长度不超过屏幕宽度240。如果要发送更长的数据,需要修改程序来支持多行显示或者滚动显示。
阅读全文