- 簡介:將一塊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);
}