材料:两个arduino开发板,一个OLED 屏幕显示屏( SSD1306_128X64 ),LED灯两个
主机代码:
//I2C主机
#include <Wire.h>
#define LED 13 //13号数字接口
#include "U8glib.h" //导入U8glib库文件
U8GLIB_SSD1306_128X64 u8g(9, 8, 11, 10, 12); //创建对象 SCL(D0) = 9, SDA(D1) = 8, CS = 11, DC = 10,RES=12
//初始化
void setup()
{
Wire.begin(); //主机
pinMode(LED,OUTPUT);
Serial.begin(115200); //波特率
}
//主程序
void loop()
{
Wire.beginTransmission(4); //发送数据到设备号为4的从机
Wire.write("OFF"); // 发送字符串
Wire.endTransmission(); // 停止发送
request(); //接收存储判断状态
delay(500);
Wire.beginTransmission(4);
Wire.write("ON");
Wire.endTransmission();
request();
delay(1000);
}
void request()
{
delay(10);
Wire.requestFrom(4, 2); //命令4号从机上传2个字节
String c;
while(Wire.available()>0) // 当主机接收到从机发送的数据时
{
c += char(Wire.read()); //储存数据
}
Serial.print(c);
if(c=="OK"){digitalWrite(LED,HIGH);}
else {digitalWrite(LED,LOW);}
u8g.firstPage(); //表示图像循环的开始
do {
u8g.setFont(u8g_font_fub20);//设置字体和字号
u8g.setPrintPos(70, 50); //显示的起始位置x:70,y50
u8g.print(c);//显示变量c的值
u8g.setFont(u8g_font_fub20);//设置字体和字号
u8g.setPrintPos(0, 20); //显示的起始位置x:0,y:20
u8g.print("message:");
}while( u8g.nextPage() );//u8g.nextPage() 表示图像循环的结束
}
从机代码:
//I2C从机
#include <Wire.h>
#define LED 12
bool LED_STA;//记录LED状态
//初始化
void setup()
{
Wire.begin(4); // 加入 i2c 总线,设置从机地址为 #4
Wire.onReceive(receiveEvent); //注册接收到主机字符的事件
Wire.onRequest(requestEvent); // 注册主机通知从机上传数据的事件
pinMode(LED,OUTPUT);//设置数字端口13为输出
Serial.begin(115200); //设置串口波特率
}
//主程序
void loop()
{
delay(100);//延时
}
// 接收到主机发来的数据,执行该事件
void receiveEvent(int a)
{
String c;
while( Wire.available()>0)//判断是否有数据
{
c += char(Wire.read()); // 作为字符存储数据
}
Serial.print(c); // 把字符打印到串口监视器中
if(c=="ON"){LED_STA = 1; digitalWrite(LED,HIGH);}//记录LED状态
if(c=="OFF"){LED_STA = 0;digitalWrite(LED,LOW);}
}
//当主机要求回传数据时,执行该事件
void requestEvent()
{
if(LED_STA == 1){Wire.write("OK"); }//如果灯已经亮,向主机回复OK
else {Wire.write("NO");}
}