見出し画像

お盆休みの電子工作(その2)

お盆休みを利用して電子工作のその2として、以前に購入していたRasbperry pi Picoを利用してみた。

  • Raspberry pi Pico

  • LCD 1602A

  • BMP-280

  • LED

  • フォトレジスタ(光センサー)

  1. ネットの記事をみながら、“MicroPython”をマイコンにインストール

  2. “Thonny”をインストール

  • 手持ちの部品のセンサーで温度・気圧を測定し、LCD1602(I2C)に表示する。

  • 測定温度により、点灯するLEDを変える

  • フォトレジスタ(光センサー)で明るさを調べる

  • 温度・気圧をpicoの中にcsvで保存する。

色々ネットで、やりたいことの記事を検索していたら、上記記事がヒットして、この記事を参考にthonnyでプログラミング。
そうそう、ピコのハンダ付は老眼で大変だった。ハンダ付は修行が必要です。

Picoで温度・気圧測定
# import the required libraries
from bmp280 import *
from machine import Pin, I2C
import utime
from time import sleep
from lcd_api import LcdApi
from pico_i2c_lcd import I2cLcd

led_red = machine.Pin(12, machine.Pin.OUT)
led_yellow = machine.Pin(15, machine.Pin.OUT)
led_blue = machine.Pin(14, machine.Pin.OUT)

cds = machine.ADC(0)

i2c = I2C(0, sda = Pin(0), scl = Pin(1), freq = 400000)
lcd = I2cLcd(i2c, 0x27, 2, 16)

lcd.move_to(0,0)
lcd.putstr("Weather Station")
lcd.move_to(0,1)
lcd.putstr("Raspberry PiPico")

# Caliberation error in pressure
# use it according to your situation
# it helps in calibrating altitude .It is optional, else put ERROR = 0 
ERROR = -3 # hPa 

# declare pins for I2C communication
sclPin = Pin(1) # serial clock pin
sdaPin = Pin(0) # serial data pin

Alt = 82

# Initiate I2C 
i2c_object = I2C(0,              # positional argument - I2C id
                 scl = sclPin,   # named argument - serial clock pin
                 sda = sdaPin,   # named argument - serial data pin
                 freq = 1000000) # named argument - i2c frequency

# scan i2c port for available devices
result = I2C.scan(i2c_object)
print("I2C scan result : ", result) # 118 in decimal is same as 0x76 in hexadecimal
if result != []:
    print("I2C connection successfull")
else:
    print("No devices found !")


# create a BMP 280 object
bmp280_object = BMP280(i2c_object,
                       addr = 0x76, # change it 
                       use_case = BMP280_CASE_WEATHER)

# configure the sensor
# These configuration settings give most accurate values in my case
# tweak them according to your own requirements

bmp280_object.power_mode = BMP280_POWER_NORMAL
bmp280_object.oversample = BMP280_OS_HIGH
bmp280_object.temp_os = BMP280_TEMP_OS_8
bmp280_object.press_os = BMP280_TEMP_OS_4
bmp280_object.standby = BMP280_STANDBY_250
bmp280_object.iir = BMP280_IIR_FILTER_2

print("BMP Object created successfully !")
utime.sleep(2) # change it as per requirement
print("\n")

# Function for calculation altitude from pressure and temperature values
# because altitude() method is not present in the Library

def altitude_HYP(hPa , temperature):
    # Hypsometric Equation (Max Altitude < 11 Km above sea level)
    temperature = temperature
    local_pressure = hPa
    sea_level_pressure = 1013.25 # hPa      
    pressure_ratio = sea_level_pressure/local_pressure # sea level pressure = 1013.25 hPa
    h = (((pressure_ratio**(1/5.257)) - 1) * temperature ) / 0.0065
    return h


# altitude from international barometric formula, given in BMP 180 datasheet
def altitude_IBF(pressure):
    local_pressure = pressure    # Unit : hPa
    sea_level_pressure = 1013.25 # Unit : hPa
    pressure_ratio = local_pressure / sea_level_pressure
    altitude = 44330*(1-(pressure_ratio**(1/5.255)))
    return altitude

    #sleep(2)
    lcd.clear()
while True:
    # accquire temperature value in celcius
    temperature_c = bmp280_object.temperature # degree celcius
    
    # convert celcius to kelvin
    temperature_k = temperature_c + 273.15
    
    # accquire pressure value
    pressure = bmp280_object.pressure  # pascal
    pressure_0 = pressure/(pow((1-((0.0065*Alt)/(bmp280_object.temperature+0.0065*Alt+273.15))),5.257))
    
    # convert pascal to hectopascal (hPa)
    # 1 hPa = 100 Pa
    # Therefore 1 Pa = 0.01 hPa
    pressure_hPa = ( pressure * 0.01 ) + ERROR # hPa
    
    # accquire altitude values from HYPSOMETRIC formula
    h = altitude_HYP(pressure_hPa, temperature_k)
    
    # accquire altitude values from International Barometric Formula
    altitude = altitude_IBF(pressure_hPa)
    press = "{:.2f}".format(pressure_hPa)
    h_alti = "{:.2f}".format(h)
    i_alti = "{:.2f}".format(altitude)
    print("Temperature : ",temperature_c," Degree Celcius")
    print("Pressure : ",pressure," Pascal (Pa)")
    print("Pressure : ",press," hectopascal (hPa) or millibar (mb)")
    print("Pressure2: ",pressure_0*0.01," hectopascal (hPa) or millibar (mb)")
    
    print("Altitude (Hypsometric Formula) : ", h_alti ," meter")
    print("Altitude (International Barometric Formula) : ", i_alti ," meter")
    print("\n")
    
    f = open('data.csv', 'a')
    f.write(str(temperature_c)+","+str(pressure)+"\n")
    f.close()
    
    #utime.sleep(1.5)
    led_red.value(0)
    led_yellow.value(0)
    led_blue.value(0)
    
    if temperature_c > 30 :
        led_red.value(1)
    elif  temperature_c > 28:
        led_yellow.value(1)
    else:
        led_blue.value(1)    
    
    lcd.move_to(0,0)
    lcd.putstr("Pico Weather Stn")
    lcd.move_to(0,1)
    lcd.putstr("                ")
    lcd.move_to(0,1)
    lcd.putstr("Temp: ")
    lcd.putstr(str(temperature_c))
    lcd.putstr(" C")
    sleep(1.5)
    lcd.move_to(0,1)
    lcd.putstr("                ")
    lcd.move_to(0,1)
    lcd.putstr("Press:")
    lcd.putstr(str (press))
    lcd.putstr(" hPa")
    sleep(1.5)
    lcd.move_to(0,1)
    lcd.putstr("                ")
    lcd.move_to(0,1)
    lcd.putstr("Alt: ")
    lcd.putstr(str (i_alti))
    lcd.putstr(" mtr")
    sleep(1.5)
    lcd.clear()
    
    
    time = utime.localtime()
    lcd.putstr("{year:>04d}/{month:>02d}/{day:>02d} {HH:>02d}:{MM:>02d}:{SS:>02d}".format(
        year=time[0], month=time[1], day=time[2],
        HH=time[3], MM=time[4], SS=time[5]))
    sleep(1.5)
    print(cds.read_u16())
    lcd.clear()
    lcd.putstr("cd:"+str(cds.read_u16()))
    sleep(2.0) 

感想

 Raspberry Picoは低価格でもいろいろな事ができそうです。Pythonでコードが書けるのは楽です。コンパイルをしないですぐ動作を確認できるのはいいです。いろいろと試してみながらArudinoとの違いなどを実感したいです。
低価格なんですが、電子部品も上がっているみたいですね。

この記事が気に入ったらサポートをしてみませんか?