#include <Wire.h> //スレーブアドレス #define ADDRESS 0x00 int i; //マスタからデータのリクエストが来た(送信) void wire_onRequest() { Wire.write(i); } //マスタからデータが送られてきた(受信) void wire_onReceive(int c) { if (Wire.available()) {//読み取る事ができるバイト数が0以上なら i = Wire.read(); //値を一つ読む i = i + 2; } } void setup() { Wire.begin(ADDRESS); Wire.onRequest(wire_onRequest); Wire.onReceive(wire_onReceive); } void loop() {}
#include <Wire.h> //接続先のアドレス #define ADDRESS 0x00 int i; void setup() { Serial.begin(9800); Wire.begin(); Wire.endTransmission(); } void loop() { //アドレス0x00のスレーブに接続 Wire.beginTransmission(ADDRESS); Wire.write(i); Wire.endTransmission(); Wire.requestFrom(ADDRESS, 1);//アドレス0x00のスレーブに接続し1byte取得する if (Wire.available()) { Serial.print(i); Serial.print(" : "); Serial.println(Wire.read()); } i++; delay(1000); }シリアルモニタを開くと、送信した値に+2されて受信しているのが確認できます。
Wire.beginTransmission(ADDRESS); Wire.write(1); Wire.write(2); Wire.write(3); Wire.write(4); Wire.endTransmission();
//マスタからデータが送られてきた(受信) void wire_onReceive(int c) { while(Wire.available()) {//読み取る事ができるバイト数が0以上なら i = Wire.read(); //値を一つ読む Serial.print(i); Serial.print(" "); } Serial.print("\n"); }上の"一度に複数の値を送信する"と組み合わせると、このような出力結果になります。
#include <Wire.h> //接続先のアドレス #define ADDRESS 0x00 int i; void setup() { Serial.begin(9800); Wire.begin(); Wire.endTransmission(); Wire.setWireTimeout(1000);//タイムアウトする時間を設定 } void loop() { //タイムアウトした場合には初期化する if (Wire.getWireTimeoutFlag()) { Wire.clearWireTimeoutFlag(); Wire.end(); setup(); } //アドレス0x00のスレーブに接続 Serial.print("1"); Wire.beginTransmission(ADDRESS); Serial.print("2"); Wire.write(i); Serial.print("3"); Wire.endTransmission(); Serial.print("4"); Wire.requestFrom(ADDRESS, 1);//アドレス0x00のスレーブに接続し1byte取得する Serial.print("5"); if (Wire.available()) { Serial.print("6"); /*Serial.println(*/Wire.read()/*)*/; } Serial.print("\n"); delay(1000); }