I2C

i2c.start(sda, scl, clock)

I2Cをマスターモードで開始します。

  • sda: SDAに利用するIO数値
  • scl: SCLに利用するIO数値
  • clock: クロック周波数(Hz) (e.g., 100 * 1000, 400 * 1000)。最大1MHzです。

SDAとSCLの内部プルアップ抵抗が有効になります。安定した通信のため、外部プルアップ抵抗もあわせて使用してください。

Luaから開始されたI2CはLua用に確保され、obniz.jsなど外部からの利用は不可となります。

戻り値

値 意味
0 成功
1 引数が不足しています
2 クロックまたはIO番号が不正です
3 すでに開始されているか、初期化できませんでした
local err = i2c.start(1, 2, 400 * 1000);
if err ~= 0 then
  os.log("I2C Error: " .. err);
end

i2c.write(address, data)

スレーブデバイスへデータを書き込みます。

  • address: 7bitのスレーブアドレス
  • data: 書き込むデータ(文字列)

戻り値は、成功時に 0、失敗時(スレーブが応答しないなど)に0以外の数値です。3 はI2Cが開始されていないことを示します。

i2c.write(0x50, string.char(0x00, 0x10));

i2c.read(address, length)

スレーブデバイスからデータを読み出します。

  • address: 7bitのスレーブアドレス
  • length: 読み出すバイト数(1〜10)

成功時は受信したデータを文字列で返します。失敗時は数値を返します。1 は引数の不足、2 はバイト数が範囲外、3 はI2Cが開始されていないか読み出しに失敗したことを示します。

local data = i2c.read(0x50, 2);
if type(data) == "string" then
  os.log("received: " .. data:byte(1) .. ", " .. data:byte(2));
end

i2c.stop()

I2Cを終了し、SDA / SCLに使っていたIOを初期状態(入力)に戻します。

OS7.1.0以降

i2c.stop() のあとは、再起動せずに別の設定で i2c.start() を呼び直せます。

戻り値は、成功時に 0、I2Cが開始されていない場合に 1 です。

i2c.stop();

Example

以下の例は、オンライン中に1秒ごとに、I2C EEPROM(スレーブアドレス 0x50)のアドレス 0x00 から2バイトを読み出してクラウドへ送信します。

local err = i2c.start(1, 2, 100 * 1000); -- SDA: IO1, SCL: IO2, 100kHz
os.log("i2c start ret=" .. tostring(err));

local last = 0;

function on_online_loop()
  local now = os.getTick();
  if now - last < 1000 then
    return;
  end
  last = now;

  -- メモリアドレスを指定してから読み出す
  if i2c.write(0x50, string.char(0x00, 0x00)) == 0 then
    local data = i2c.read(0x50, 2);
    if type(data) == "string" then
      cloud.pluginSend(data);
    end
  end
end