mruby/c 3.3 標準IOクラス対応
温度センサ:https://www.switch-science.com/catalog/3986/

$i2c = I2C.new()
while true
  $i2c.write(0x18, 0x08, 0x03)
  ans = $i2c.read(0x18,2,0x05)
  a = ans[1].ord | ((ans[0].ord & 0x1f)<<8)
  a = (a.to_f)* 0.0625
  puts("ans:"+a.to_s+"\r\n")
  sleep(5)
end
      

温度センサ:https://www.switch-science.com/catalog/3373/

ADRS_BME280 = 0x77
$i2c = I2C.new()
##
# 気圧計クラス(BME280, BMP280)
#
class Barometer
  attr_reader :atm
  attr_reader :temperature
  attr_reader :dig_T1
  attr_reader :dig_T2
  attr_reader :dig_T3
  attr_reader :dig_P1
  attr_reader :dig_P2
  attr_reader :dig_P3
  attr_reader :dig_P4
  attr_reader :dig_P5
  attr_reader :dig_P6
  attr_reader :dig_P7
  attr_reader :dig_P8
  attr_reader :dig_P9

  ##
  # 初期化
  #
  def init()
    $i2c.write( ADRS_BME280, 0xf5, 0xA0 )
    $i2c.write( ADRS_BME280, 0xf2, 0x00 )
    $i2c.write( ADRS_BME280, 0xf4, 0x25 )
    datas = $i2c.read( ADRS_BME280, 24, 0x88)
    if datas
      @dig_T1 = (datas[1].ord << 8) | datas[0].ord
      @dig_T2 = (datas[3].ord << 8) | datas[2].ord
      @dig_T3 = (datas[5].ord << 8) | datas[4].ord
      @dig_P1 = (datas[7].ord << 8) | datas[6].ord
      @dig_P2 = (datas[9].ord << 8) | datas[8].ord
      @dig_P2 = self.negative_num(@dig_P2)
      @dig_P3 = (datas[11].ord << 8) | datas[10].ord
      @dig_P4 = (datas[13].ord << 8) | datas[12].ord
      @dig_P5 = (datas[15].ord << 8) | datas[14].ord
      @dig_P5 = self.negative_num(@dig_P5)
      @dig_P6 = (datas[17].ord << 8) | datas[16].ord
      @dig_P6 = self.negative_num(@dig_P6)
      @dig_P7 = (datas[19].ord << 8) | datas[18].ord
      @dig_P8 = (datas[21].ord << 8) | datas[20].ord
      @dig_P8 = self.negative_num(@dig_P8)
      @dig_P9 = (datas[23].ord << 8) | datas[22].ord
    end
  end

  def negative_num(param)
    if(param >= 0x8000)
      param = ((-param ^ 0xFFFF) + 1)
    end
    return param
  end


  ##
  # 測定開始トリガー
  #
  def trigger()
    $i2c.write( ADRS_BME280, 0xf4, 0x25 )
  end


  ##
  # データ読み込み
  #
  def read()
    # read pressure and temperature.
    datas = $i2c.read( ADRS_BME280, 8, 0xF7 )
    $i2c.write( ADRS_BME280, 0xf4, 0x27 )

    a_para = ((datas[0].ord << 12) | (datas[1].ord << 4) | (datas[2].ord >> 4))
    t_para = ((datas[3].ord << 12) | (datas[4].ord << 4) | (datas[5].ord >> 4))
    p1 = (t_para / 16384.0 - @dig_T1 / 1024.0) * @dig_T2
    p2 = (t_para / 131072.0 - @dig_T1 / 8192.0)
    p2 = p2 * (t_para / 131072.0 - @dig_T1 / 8192.0) * @dig_T3
    t_fine = p1 + p2
    @temperature = t_fine / 5120.0
    pressure = 0.0
    p1 = (t_fine / 2.0) - 64000.0
    p2 = (((p1 / 4.0) * (p1 / 4.0)) / 2048) * @dig_P6
    p2 = p2 + ((p1 * @dig_P5) * 2.0)
    p2 = (p2 / 4.0) + (@dig_P4 * 65536.0)
    p1 = (((@dig_P3 * (((p1 / 4.0) * (p1 / 4.0)) / 8192)) / 8)
    p1 = p1 + ((@dig_P2 * p1) / 2.0)) / 262144
    p1 = ((32768 + p1) * @dig_P1) / 32768
    pressure = ((1048576 - a_para) - (p2 / 4096)) * 3125
    pressure = (pressure * 2.0) / p1
    p1 = (@dig_P9 * (((pressure / 8.0) * (pressure / 8.0)) / 8192.0)) / 4096
    p2 = ((pressure / 4.0) * @dig_P8) / 8192.0
    @atm = (pressure + ((p1 + p2 + @dig_P7) / 16.0))/100
    return @atm
  end
end

$barometer = Barometer.new
$barometer.init()
while true
  $barometer.trigger()
  $barometer.read()
  puts "ATM: #{$barometer.atm} hPa  TEMP: #{$barometer.temperature} deg"
  sleep(1)
end
      

https://www.switch-science.com/catalog/2510/

# MAX speed 0x3F(0d63)

$i2c = I2C.new()
NEUTRAL = 0
DRIVE = 1
BACK = 2
STOP = 3

class Moter
  def init()
    $i2c.write(0x62,0x01,0x80)
    $i2c.write(0x60,0x01,0x80)
  end
  
  def r(speed,r)
    $i2c.write(0x62,0x00,speed+r)
  end
  
  def l(speed,l)
    $i2c.write(0x60,0x00,speed+l)
  end

  def control(speed,r,l)
    speed &= 0x3F
    $i2c.write(0x62,0x00,(speed<<2)+r)
    $i2c.write(0x60,0x00,(speed<<2)+l)
  end
end


Moter.init()
while true
  Moter.control(0x3F,DRIVE,BACK)
end
      

インスタンスがどうこう


$i2c = I2C.new()
NEUTRAL = 0
DRIVE = 1
BACK = 2
STOP = 3

L = 0
R = 2

class Moter
  def initialize(n)
    @num = n
    $i2c.write(0x60+@num,0x01,0x80)
  end

  def control(speed,status)
    speed &= 0x3F
    $i2c.write(0x60+@num,0x00,(speed<<2)+status)
  end
end


lm = Moter.new(L)
rm = Moter.new(R)
while true
  lm.control(0x3F,DRIVE)
  rm.control(0x3F,DRIVE)
end
      

通常品:https://www.amazon.co.jp/dp/B01D1D0CX2
GROVE:https://item.rakuten.co.jp/robotshopjapan/rb-see-679/

$moters = I2C.new()
def module_init()
  $moters.write(0x40, 0xFA, 0x00)
  $moters.write(0x40, 0xFB, 0x00)
  $moters.write(0x40, 0xFC, 0x00)
  $moters.write(0x40, 0xFD, 0x00)
  $moters.write(0x40, 0x01, 0x04)
  $moters.write(0x40, 0x00, 0x01)
  sleep_ms(50)
end

def freq_set()
  $moters.write(0x40, 0x00, 0x11)
  $moters.write(0x40, 0xFE, 0x65)
  $moters.write(0x40, 0x00, 0x01)
  sleep_ms(50)
  $moters.write(0x40, 0x00, 0x81)
end

def m_all_move(angle)
  angle = (angle/180.0*500 + 150).to_i
  $moters.write(0x40, 0xFA, 0x00)
  $moters.write(0x40, 0xFB, 0x00)
  $moters.write(0x40, 0xFC, angle & 0xff)
  $moters.write(0x40, 0xFD, angle >>8)
end

def m_move(ch,angle)
  angle = (angle/180.0*500 + 150).to_i
  $moters.write(0x40, ch*4+6, 0x00)
  $moters.write(0x40, ch*4+7, 0x00)
  $moters.write(0x40, ch*4+8, angle & 0xff)
  $moters.write(0x40, ch*4+9, angle >>8)
end

module_init()
freq_set()
m_all_move(90)
while true
  m_move(6,45)
  m_move(8,135)
  m_move(10,90)
  m_move(11,90)
  sleep(2)
  m_move(6,135)
  m_move(8,45)
  m_move(10,135)
  m_move(11,45)
  sleep(2)
end
      

https://www.switch-science.com/catalog/829/
ASCIIコード
スペース(32)~Z(90)まで対応

class OLED
  $oled = 0
  def init()
    $oled = I2C.new
    $oled.write(0x3c,0x00,0xAE,0xA8,0x3F)
    $oled.write(0x3c,0x00,0xD3,0x00)
    $oled.write(0x3c,0x00,0x40,0xA0,0xC0,0xDA,0x12)
    $oled.write(0x3c,0x00,0x81,0xFF)
    $oled.write(0x3c,0x00,0xA4,0xA6,0xD5,0x80)
    $oled.write(0x3c,0x00,0x2E,0x20,0x10)
    $oled.write(0x3c,0x00,0x21,0,127)
    $oled.write(0x3c,0x00,0x22,0,7)
    $oled.write(0x3c,0x00,0x8D,0x14,0xAF)
    i = 0
    while i<8
      $oled.write(0x3C,0x80,0xB0 + i)
      j = 0
      while j<16
        $oled.write(0x3C,0x40,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00)
        j = j+1
      end
      i = i+1
    end
  end
  def send(i,name)
    a=[
    [0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00],
    [0x00, 0x00, 0x5F, 0x00, 0x00, 0x00, 0x00, 0x00],
    [0x00, 0x00, 0x07, 0x00, 0x07, 0x00, 0x00, 0x00],
    [0x00, 0x14, 0x7F, 0x14, 0x7F, 0x14, 0x00, 0x00],
    [0x00, 0x24, 0x2A, 0x7F, 0x2A, 0x12, 0x00, 0x00],
    [0x00, 0x23, 0x13, 0x08, 0x64, 0x62, 0x00, 0x00],
    [0x00, 0x36, 0x49, 0x55, 0x22, 0x50, 0x00, 0x00],
    [0x00, 0x00, 0x05, 0x03, 0x00, 0x00, 0x00, 0x00],
    [0x00, 0x1C, 0x22, 0x41, 0x00, 0x00, 0x00, 0x00],
    [0x00, 0x41, 0x22, 0x1C, 0x00, 0x00, 0x00, 0x00],
    [0x00, 0x08, 0x2A, 0x1C, 0x2A, 0x08, 0x00, 0x00],
    [0x00, 0x08, 0x08, 0x3E, 0x08, 0x08, 0x00, 0x00],
    [0x00, 0xA0, 0x60, 0x00, 0x00, 0x00, 0x00, 0x00],
    [0x00, 0x08, 0x08, 0x08, 0x08, 0x08, 0x00, 0x00],
    [0x00, 0x60, 0x60, 0x00, 0x00, 0x00, 0x00, 0x00],
    [0x00, 0x20, 0x10, 0x08, 0x04, 0x02, 0x00, 0x00],
    [0x00, 0x3E, 0x51, 0x49, 0x45, 0x3E, 0x00, 0x00],
    [0x00, 0x00, 0x42, 0x7F, 0x40, 0x00, 0x00, 0x00],
    [0x00, 0x62, 0x51, 0x49, 0x49, 0x46, 0x00, 0x00],
    [0x00, 0x22, 0x41, 0x49, 0x49, 0x36, 0x00, 0x00],
    [0x00, 0x18, 0x14, 0x12, 0x7F, 0x10, 0x00, 0x00],
    [0x00, 0x27, 0x45, 0x45, 0x45, 0x39, 0x00, 0x00],
    [0x00, 0x3C, 0x4A, 0x49, 0x49, 0x30, 0x00, 0x00],
    [0x00, 0x01, 0x71, 0x09, 0x05, 0x03, 0x00, 0x00],
    [0x00, 0x36, 0x49, 0x49, 0x49, 0x36, 0x00, 0x00],
    [0x00, 0x06, 0x49, 0x49, 0x29, 0x1E, 0x00, 0x00],
    [0x00, 0x00, 0x36, 0x36, 0x00, 0x00, 0x00, 0x00],
    [0x00, 0x00, 0xAC, 0x6C, 0x00, 0x00, 0x00, 0x00],
    [0x00, 0x08, 0x14, 0x22, 0x41, 0x00, 0x00, 0x00],
    [0x00, 0x14, 0x14, 0x14, 0x14, 0x14, 0x00, 0x00],
    [0x00, 0x41, 0x22, 0x14, 0x08, 0x00, 0x00, 0x00],
    [0x00, 0x02, 0x01, 0x51, 0x09, 0x06, 0x00, 0x00],
    [0x00, 0x32, 0x49, 0x79, 0x41, 0x3E, 0x00, 0x00],
    [0x00, 0x7E, 0x09, 0x09, 0x09, 0x7E, 0x00, 0x00],
    [0x00, 0x7F, 0x49, 0x49, 0x49, 0x36, 0x00, 0x00],
    [0x00, 0x3E, 0x41, 0x41, 0x41, 0x22, 0x00, 0x00],
    [0x00, 0x7F, 0x41, 0x41, 0x22, 0x1C, 0x00, 0x00],
    [0x00, 0x7F, 0x49, 0x49, 0x49, 0x41, 0x00, 0x00],
    [0x00, 0x7F, 0x09, 0x09, 0x09, 0x01, 0x00, 0x00],
    [0x00, 0x3E, 0x41, 0x41, 0x51, 0x72, 0x00, 0x00],
    [0x00, 0x7F, 0x08, 0x08, 0x08, 0x7F, 0x00, 0x00],
    [0x00, 0x41, 0x7F, 0x41, 0x00, 0x00, 0x00, 0x00],
    [0x00, 0x20, 0x40, 0x41, 0x3F, 0x01, 0x00, 0x00],
    [0x00, 0x7F, 0x08, 0x14, 0x22, 0x41, 0x00, 0x00],
    [0x00, 0x7F, 0x40, 0x40, 0x40, 0x40, 0x00, 0x00],
    [0x00, 0x7F, 0x02, 0x0C, 0x02, 0x7F, 0x00, 0x00],
    [0x00, 0x7F, 0x04, 0x08, 0x10, 0x7F, 0x00, 0x00],
    [0x00, 0x3E, 0x41, 0x41, 0x41, 0x3E, 0x00, 0x00],
    [0x00, 0x7F, 0x09, 0x09, 0x09, 0x06, 0x00, 0x00],
    [0x00, 0x3E, 0x41, 0x51, 0x21, 0x5E, 0x00, 0x00],
    [0x00, 0x7F, 0x09, 0x19, 0x29, 0x46, 0x00, 0x00],
    [0x00, 0x26, 0x49, 0x49, 0x49, 0x32, 0x00, 0x00],
    [0x00, 0x01, 0x01, 0x7F, 0x01, 0x01, 0x00, 0x00],
    [0x00, 0x3F, 0x40, 0x40, 0x40, 0x3F, 0x00, 0x00],
    [0x00, 0x1F, 0x20, 0x40, 0x20, 0x1F, 0x00, 0x00],
    [0x00, 0x3F, 0x40, 0x38, 0x40, 0x3F, 0x00, 0x00],
    [0x00, 0x63, 0x14, 0x08, 0x14, 0x63, 0x00, 0x00],
    [0x00, 0x03, 0x04, 0x78, 0x04, 0x03, 0x00, 0x00],
    [0x00, 0x61, 0x51, 0x49, 0x45, 0x43, 0x00, 0x00],
  ]

    $oled.write(0x3C,0x00,0xB0+i,0x21,0x00,0x7F)
    j = 0
    while(j<16)
      b = (name[j].ord) - 32
      $oled.write(0x3C,0x40,a[b][0],a[b][1],a[b][2],a[b][3],a[b][4],a[b][5],a[b][6],a[b][7])
      j = j+1
    end
  end
end
oled = OLED.new
# 初期化
oled.init()
# oled.send(行,表示文字列16文字)
oled.send(0,"LETS!GO!MRUBY/C!")
oled.send(1,"================")
oled.send(2,"ALL HAPPY       ")
      

2値画像表示


XSIZE = 16
YSIZE = 8

class OLED
  $oled = 0
  def init()
    $oled = I2C.new
    $oled.write(0x3c,0x00,0xAE,0xA8,0x3F)
    $oled.write(0x3c,0x00,0xD3,0x00)
    $oled.write(0x3c,0x00,0x40,0xA0,0xC0,0xDA,0x12)
    $oled.write(0x3c,0x00,0x81,0xFF)
    $oled.write(0x3c,0x00,0xA4,0xA6,0xD5,0x80)
    $oled.write(0x3c,0x00,0x2E,0x20,0x10)
    $oled.write(0x3c,0x00,0x21,0,127)
    $oled.write(0x3c,0x00,0x22,0,7)
    $oled.write(0x3c,0x00,0x8D,0x14,0xAF)
    YSIZE.times do |i|
      $oled.write(0x3C,0x80,0xB0 + i)
      XSIZE.times do |j|
        $oled.write(0x3C,0x40,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00)
      end
    end
  end

  def send(a)
    YSIZE.times do |i|
      next if a[i] == nil
      $oled.write(0x3C,0x00,0xB0+i,0x21,0x00,0x7F)
      XSIZE.times do |j|
        next if a[i][j] == nil 
        $oled.write(0x3C,0x40,a[i][j][0],a[i][j][1],a[i][j][2],a[i][j][3],a[i][j][4],a[i][j][5],a[i][j][6],a[i][j][7])
      end
    end
  end
end
picture=[
[[0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00],[0x00,0x80,0xE0,0xF0,0xFC,0x00,0x00,0xFC],[0xFC,0xFC,0xFC,0xFC,0xFC,0xFC,0xFC,0xFC],[0xFC,0x7C,0x3C,0x1C,0x9C,0xCC,0xE4,0xF0],[0xF8,0xFC,0xF8,0xF0,0xE4,0xCC,0x9C,0x3C],[0x7C,0xFC,0xFC,0xFC,0xFC,0xFC,0xFC,0xFC],[0xFC,0xFC,0xFC,0xFC,0x00,0x00,0xF8,0xE0],[0xC0,0x00,0x00,0x00,0x00,0x00,0x00,0x00]],
[[0x00,0x00,0x00,0x80,0xC0,0xE0,0xF8,0xFC],[0xFF,0xFF,0xFF,0xFF,0xFF,0x00,0x00,0xFF],[0xFF,0x7F,0x3F,0x1F,0x8F,0xC7,0xE3,0xF1],[0xF8,0xFC,0xFE,0xFF,0xFF,0xFF,0xFF,0xFF],[0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF],[0xFE,0xFC,0xF9,0xF3,0xE7,0xCF,0x9F,0x3F],[0x7F,0xFF,0xFF,0xFF,0x00,0x00,0xFF,0xFF],[0xFF,0xFF,0xFE,0xF8,0xF0,0xC0,0x80,0x00]],
[[0x00,0x00,0x02,0x23,0xE3,0xE3,0xE3,0xE3],[0xE3,0xE3,0xE3,0xE3,0xE3,0x80,0x00,0x21],[0xE0,0xE0,0xE2,0xE3,0xE3,0xE3,0xE3,0xE3],[0xE3,0xE3,0xE3,0xE3,0xE3,0xE3,0xE3,0xE3],[0xE3,0xE3,0xE3,0xE3,0xE3,0xE3,0xE3,0xE3],[0xE3,0xE3,0xE3,0xE3,0xE3,0xE3,0xE3,0xE3],[0xE2,0xE0,0x61,0x01,0x80,0xE0,0xE3,0xE3],[0xE3,0xE3,0xE3,0xE3,0xE3,0xE3,0x63,0x23]],
[[0x00,0x00,0x00,0x00,0x00,0x01,0x03,0x07],[0x0F,0x3F,0x7F,0xFF,0xFF,0xFF,0xFE,0xF8],[0xE0,0x83,0x0F,0x3F,0xFF,0xFF,0xFF,0xFF],[0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF],[0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF],[0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0x7F,0x1F],[0x87,0xE1,0xF8,0xFE,0xFF,0xFF,0xFF,0x7F],[0x3F,0x1F,0x0F,0x07,0x03,0x00,0x00,0x00],[0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00],[0x00, 0x7C, 0x04, 0x18, 0x04, 0x78, 0x00, 0x00],[0x00, 0x00, 0x7C, 0x08, 0x04, 0x00, 0x00, 0x00],[0x00, 0x3C, 0x40, 0x40, 0x7C, 0x00, 0x00, 0x00],[0x00, 0x7F, 0x48, 0x44, 0x44, 0x38, 0x00, 0x00],[0x00, 0x1C, 0xA0, 0xA0, 0x7C, 0x00, 0x00, 0x00],[0x00, 0x20, 0x10, 0x08, 0x04, 0x02, 0x00, 0x00],[0x00, 0x38, 0x44, 0x44, 0x28, 0x00, 0x00, 0x00],],
[[0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00],[0x00,0x00,0x00,0x00,0x01,0x03,0x0F,0x1F],[0x3F,0x7F,0xFE,0xF8,0xE0,0x83,0x0F,0x3F],[0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF],[0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF],[0xFF,0xFF,0x7F,0x1F,0x07,0xC1,0xF0,0xFE],[0xFF,0x7F,0x1F,0x0F,0x07,0x03,0x01,0x00],[0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00]],
[[0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00],[0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00],[0x00,0x00,0x00,0x03,0x07,0x0F,0x1E,0x38],[0x60,0x83,0x0F,0x3F,0xFF,0xFF,0xFF,0xFF],[0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0x7F,0x1F],[0x07,0xC1,0x70,0x3C,0x1F,0x07,0x03,0x01],[0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00],[0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00]],
[[0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00],
[0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00],
[0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00],
[0x00,0x01,0x02,0x00,0x00,0x07,0x1F,0xFF],
[0xFF,0xFF,0xFF,0x1F,0x07,0x01,0x00,0x00],
[0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00],
[0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00],
[0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00]]
]
oled = OLED.new
# 初期化
oled.init()
# oled.send(画像配列8×16×8)
oled.send(picture)
      

LCD

LCD:https://www.switch-science.com/catalog/1629/

$lcd = I2C.new
sleep(1)
def rgb(r,g,b)
  $lcd.write(0x62,0x00,0x00)
  $lcd.write(0x62,0x08,0xFF)
  $lcd.write(0x62,0x01,0x20)
  $lcd.write(0x62,0x04,r)
  $lcd.write(0x62,0x03,g)
  $lcd.write(0x62,0x02,b)
end
def send_txt(txt)
  $lcd.write(0x3E,0x80,0x02)
  sleep_ms(5)
  $lcd.write(0x3E,0x80,0x0C)
  sleep_ms(5)
  cnt = txt.size
  i = 0
  while(i < cnt)
  if(i == 15)
    $lcd.write(0x3E,0x80,0xC0)
  end
  $lcd.write(0x3E,0x40,(txt[i]).ord)
  i = i+1
  end
end
rgb(255,255,255)
send_txt("YoshihiroOgura")
      

LIS3DHTRを搭載した三軸加速度センサ
https://akizukidenshi.com/catalog/g/gM-16771/

$i2c = I2C.new()

# ====================================================
# @brief  符号付2バイトの数値の絶対値を出力
#
# @param param 数値(2バイト)
#
# @return  絶対値(整数値)
# ====================================================
def absolute(param)
  if(param >= 0x8000)
    param = ((-param ^ 0xFFFF) + 1)
  end
  return param
end

class Lis3dhtr

  attr_reader :addr

  # ====================================================
  # @brief  LIS3DHTRの初期設定
  #
  # @param slave_addr 使用しているLIS3DHTRのアドレス
  # ====================================================
  def init(slave_addr)
    @addr = slave_addr
    # データレート:400Hz(0xF0-0x00)
    # x,y,zのデータを取得(0x07-0x00)
    $i2c.write(@addr,0x20,0x77)

    # 継続的に値を更新(0x80-0x00)
    # フルスケール±2g(0x06-0x00)
    $i2c.write(@addr,0x23,0x00)
  end

  # ====================================================
  # @brief  LIS3DHTRからX,Y,Zの加速度データを取得
  #
  # @return  x,y,zの加速度データ(配列[x,y,z])
  # ====================================================
  def read_data()
    # x data read
    data = $i2c.read(@addr, 1, 0x28)
    x = data[0].ord
    data = $i2c.read(@addr, 1, 0x29)
    x += data[0].ord * 256
    x = (absolute(x)).to_f
    x /= 16000
    x = (x*100).to_i
    
    # y data read
    data = $i2c.read(@addr, 1, 0x2A)
    y = data[0].ord
    data = $i2c.read(@addr, 1, 0x2B)
    y += data[0].ord * 256
    y = (absolute(y)).to_f
    y /= 16000
    y = (y*100).to_i
    
    # z data read
    data = $i2c.read(@addr, 1, 0x2C)
    z = data[0].ord
    data = $i2c.read(@addr, 1, 0x2D)
    z += data[0].ord * 256
    z = (absolute(z)).to_f
    z /= 16000
    z = (z*100).to_i
    return [x,y,z]
  end
end


# メインプログラム

sensor = Lis3dhtr.new
sensor.init(0x19)
sleep(2)


while true
  data_raw = sensor.read_data()
  puts("x:#{data_raw[0]},y:#{data_raw[1]}z:#{data_raw[2]}")
  sleep_ms(50)
end
      

RTC

PCF85063TP
https://www.switch-science.com/products/3134

$i2c = I2C.new()

RTC_ADDR = 0x51

WEEK = [
  "Sunday",
  "Monday",
  "Tuesday",
  "Wednesday",
  "Thursday",
  "Friday",
  "Saturday"
]

def bcd(v)
  return((v / 10) << 4) + (v % 10)
end

def bcdec(v)
  mv = (v >> 4) * 10
  lv = v & 0x0F
  return(mv + lv)
end

def init()
  datas = $i2c.read(RTC_ADDR,1,0x00)
  $i2c.write(RTC_ADDR,0x00,(datas[0].ord | 0x01))
end

def set_time(sec,min,hour,day,week,mon,year)
  sec_bit  = bcd(sec)
  min_bit  = bcd(min)
  hour_bit = bcd(hour)
  day_bit  = bcd(day)
  mon_bit  = bcd(mon)
  year_bit = bcd(year)
  $i2c.write(RTC_ADDR,0x04,sec_bit,min_bit,hour_bit,day_bit,mon_bit,week,year_bit)
end

def get_time()
  datas = $i2c.read(RTC_ADDR,7,0x04)
  sec  = bcdec(datas[0].ord)
  min  = bcdec(datas[1].ord)
  hour = bcdec(datas[2].ord)
  day  = bcdec(datas[3].ord)
  mon  = bcdec(datas[4].ord)
  year = bcdec(datas[6].ord)
  return([sec,min,hour,day,mon,year])
end


init()
while true
  days = get_time()
  puts("20#{days[5]}/#{days[4]}/#{days[3]} #{days[2]}:#{days[1]}:#{days[0]}")
  sleep(10)
end
      

Qwiic

Qwiicとは
SparkFunから販売されているI2Cにて制御するモジュール。
https://www.sparkfun.com/qwiic

赤色LEDボタン

ボタンを押したときにLEDを点灯する。

led = I2C.new
while true
  l = led.read(0x6F,1,0x03)
  s = (l[0].ord&0x04)>>2
  led.write(0x6F,0x19,s * 0xFF)
end
      

VL53L0Xを搭載したレーザーの距離センサー
https://www.switch-science.com/catalog/5219/

# M5STACK-TOF-UNIT
# SEEED-101020532
# VL53L0X

$i2c = I2C.new()

def u_read()
  # start trigger
  $i2c.write(0x29,0x00,0x01)
  status = 0
  while(status == 0)
    sleep_ms(10)
    # finish measure status check
    status_txt = $i2c.read(0x29,0x14,1)
    status= status_txt[0].ord & 0x01
  end
  # distance data
  datas = $i2c.read(0x29,0x14,12)
  dis = datas[11].ord + (datas[10].ord << 8)
  return dis
end

while true
  sleep_ms(300)
  puts u_read()
end				
      

RCWL-9620を搭載した超音波の距離センサー
https://www.switch-science.com/products/7632

# M5STACK-U098
# M5STACK-U098-B2

$i2c = I2C.new()

def u_read()
  $i2c.send_start
  # sonic shot
  $i2c.raw_write(0x57<<1, 0x01)
  # sonic return wait
  sleep_ms(160)
  $i2c.send_restart
  # [return time -> distance] chenge output
  $i2c.raw_write((0x57<<1)+1)
  str = $i2c.raw_read( 3 )
  $i2c.send_stop
  data = str[0].ord << 16
  data += str[1].ord << 8
  data += str[2].ord
  data /= 1000.0
  return data
end

while true
  sleep_ms(300)
  puts u_read()
end