- 简介:将一块ESP8266设备作为从机设备,获取各种传感器信息并反馈到主机设备,这样可以节省主机IO口,值得研究;
- 后面可以将ESP8266作为主机,用UNO或者STM32系列单片机作为从机设备,来拓展ESP8266的IO口,何乐而不为呢~
- 实验代码:(在ESP8266上测试IIC从机代码未成功,请勿参考!)
- IIC从机代码只可在Arduino UNO上使用,在ESP8266上未成功!
IIC主机代码在UNO和ESP8266上均可使用!
注释:此代码包含 主机从机 两套代码,通过切换IIC_MODE来进行切换!
#include <Arduino.h>
#include <Wire.h>
#define LED D4
/*
**IIC_MODE 0:主机 1:从机
*/
#define IIC_MODE 0
#if IIC_MODE
bool LED_STA = 0;
void receiveEvent(int a);
void requestEvent();
//*****从机模式*****
void setup(void) {
Wire.begin(4);
Serial.begin(115200);
Serial.println("从机准备好了~");
Wire.onReceive(receiveEvent);
Wire.onRequest(requestEvent);
pinMode(LED,OUTPUT);
}
void loop(void) {
delay(300);
}
//当从机接收到主机字符,执行该事件
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);Serial.println("收到开灯ON指令~");}
if(c=="OFF") {LED_STA = 0;digitalWrite(LED,LOW);Serial.println("收到关灯OFF指令~");}
}
//当主机通知从机上传数据,知行该事件
void requestEvent(){
if(LED_STA == 1){Wire.write("OK");}
else {Wire.write("NO");}
}
#else
void request(void);
//*****主机模式*****
void setup(void) {
Wire.begin();
Serial.begin(115200);
Serial.println("主机准备好了~");
pinMode(LED,OUTPUT);
}
void loop(void) {
Wire.beginTransmission(4); //发送数据到设备号为4的从机
Wire.write("OFF"); // 发送字符串
Serial.println("发送关灯OFF~");
Wire.endTransmission(); // 停止发送
request(); //回复状态
delay(1000);
Wire.beginTransmission(4);
Wire.write("ON");
Serial.println("发送开灯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);}
}
#endif
- 从机代码(适用于UNO):
#include <Wire.h>
#include <Arduino.h>
// function that executes whenever data is received from master
void receiveEvent(int howMany) {
while (0 <Wire.available()) {
char c = Wire.read(); /* receive byte as a character */
Serial.print(c); /* print the character */
}
Serial.println(); /* to newline */
}
// function that executes whenever data is requested from master
void requestEvent() {
Wire.write("Hello NodeMCU"); /*send string on request */
}
void setup() {
Wire.begin(8);
Wire.onReceive(receiveEvent);
Wire.onRequest(requestEvent);
Serial.begin(115200);
}
void loop() {
delay(100);
}
- 主机代码(适用于ESP8266):
#include <Arduino.h>
#include <Wire.h>
void setup() {
Serial.begin(115200); /* begin serial for debug */
Wire.begin(); /* join i2c bus with SDA=D1 and SCL=D2 of NodeMCU */
}
void loop() {
Wire.beginTransmission(8); /* begin with device address 8 */
Wire.write("Hello Arduino"); /* sends hello string */
Wire.endTransmission(); /* stop transmitting */
Wire.requestFrom(8, 13); /* request & read data of size 13 from slave */
while(Wire.available()){
char c = Wire.read();
Serial.println(c);
}
delay(1000);
}