《Arduino》开发 之 两块 ESP8266 使用IIC通信

  • 简介:将一块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);
}
发布了16 篇原创文章 · 获赞 18 · 访问量 4061

猜你喜欢

转载自blog.csdn.net/qq_41868901/article/details/104458757
今日推荐