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