#--------------------------------------------------------------------
# 特設 ６章　MicroPython/CircuitPython互換性　ソース一式 (2021/6/13)
#--------------------------------------------------------------------

#--------------------------------------
# リスト１  LED 点滅プログラムによるソースコードの違い(a)
#           MicroPython
#--------------------------------------
from machine import Pin
import utime

# LEDはGP25に接続
led = Pin(25, Pin.OUT)
while True:
    led.value(True)
    utime.sleep(1)
    led.value(False)
    utime.sleep(1)
#--------------------------------------

#--------------------------------------
# リスト１  LED 点滅プログラムによるソースコードの違い(b)
#           CircuitPython
#--------------------------------------
import board
import digitalio
import time

# ボードのLEDはGP25に接続
led = digitalio.DigitalInOut(board.GP25)

# GP25を出力に設定
led.direction = digitalio.Direction.OUTPUT
while True:
    led.value = True
    time.sleep(1)
    led.value = False
    time.sleep(1)
#--------------------------------------



#--------------------------------------
# リスト２  PIO を使ったLED 点滅プログラムによるソースの違い(a)
#           MicroPython
#--------------------------------------
import rp2
from machine import Pin
@rp2.asm_pio(set_init = rp2.PIO.OUT_LOW)
def blink_LED():
    set(pins, 1)
    set(pins, 0) [18]

led_pin = Pin(25, Pin.OUT)
sm = rp2.StateMachine(0, blink_LED, set_base = led_pin, freq = 2000)
sm.active(1)
#--------------------------------------


#--------------------------------------
# リスト２  PIO を使ったLED 点滅プログラムによるソースの違い(b)
#           CircuitPython
#--------------------------------------
import board
import rp2pio
import adafruit_pioasm
blink_LED = adafruit_pioasm.assemble(
    """
    set pins, 1
    set pins, 0 [18]
    """
)
sm = rp2pio.StateMachine(blink_LED, first_set_pin = board.LED, frequency=2000)
#--------------------------------------


#--------------------------------------
# リスト３  BME280 を利用した測定プログラム(a)
#           MicroPython(ESP32用)
#--------------------------------------
import utime
from machine import Pin
from machine import I2C
from bme280_int import BME280

BME280_ADDR = 0x76                   # BME280のアドレス:0x76
i2c = I2C(scl=Pin(21), sda=Pin(22), freq=9600)
device_list = i2c.scan()             # I2Cバスをスキャンする

if not (BME280_ADDR in device_list): # BME280が接続されていることを確認
    print("I2C Scan Error!")
    sys.exit()
else:
    print("connected BME280(0x{:02x})".format(BME280_ADDR))
    bme280 = BME280(i2c = i2c)
while True:
    print(bme280.values)             # BME280の計測値取得
    utime.sleep(10)
#--------------------------------------


#--------------------------------------
# リスト３  BME280 を利用した測定プログラム(b)
#           CircuitPython
#--------------------------------------
import time
import board               # CircuitPythonのライブラリを追加
from busio import I2C      # CircuitPythonのライブラリに変更
from adafruit_bme280 import Adafruit_BME280_I2C
                           # Adafruitから提供されている
                           # 周辺機器用ライブラリに変更

SCL = board.GP27           # I2C SCL用にGP27を指定
SDA = board.GP26           # I2C SDA用にGP26を指定

BME280_ADDR = 0x76         # BME280のI2Cアドレスを指定
i2c = I2C(SCL, SDA)        # I2Cオブジェクト生成
bme280 = Adafruit_BME280_I2C(i2c, address=BME280_ADDR)
                           # BLE280用
                           #オブジェクト生成
bme280.sea_level_pressure = 1013.25 # 海面気圧を設定
while True:
    print("{:.2f}C, ".format(bme280.temperature), end="") # BME280オブジェクトの
    print("{:.2f}hPa, ".format(bme280.pressure), end="")  # 属性を参照して，温度，
    print("{:.2f}%".format(bme280.relative_humidity))     # 気圧，湿度を取得，表示
    time.sleep(10)
#--------------------------------------


#--------------------------------------
# リスト３  BME280 を利用した測定プログラム(c)
#           MicroPython(Pico用)
#--------------------------------------
import utime
from machine import Pin
from machine import I2C
from bme280_int import BME280

BME280_ADDR = 0x76      # BME280のアドレス:0x76
I2C_ID = 1              # I2C1を利用
SCL = 27                # SCL用にGP27を指定 (I2C1 SCL)
SDA = 26                # SDA用にGP26を指定 (I2C1 SDA)

i2c = I2C(I2C_ID, scl=Pin(SCL), sda=Pin(SDA), freq=9600) 
device_list = i2c.scan()             # I2Cバスをスキャンする

if not (BME280_ADDR in device_list): # BME280が接続されていることを確認
    print("I2C Scan Error!")
    sys.exit()
else:
    print("connected BME280(0x{:02x})".format(BME280_ADDR))
    bme280 = BME280(i2c = i2c)
while True:
    print(bme280.values)             # BME280の計測値取得
    utime.sleep(10)
#--------------------------------------

