《ESP8266學習筆記》之 兩塊 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);
}

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章