お盆休みの電子工作(その2)
お盆休みを利用して電子工作のその2として、以前に購入していたRasbperry pi Picoを利用してみた。
Raspberry pi Pico
LCD 1602A
BMP-280
LED
フォトレジスタ(光センサー)
ネットの記事をみながら、“MicroPython”をマイコンにインストール
“Thonny”をインストール
手持ちの部品のセンサーで温度・気圧を測定し、LCD1602(I2C)に表示する。
測定温度により、点灯するLEDを変える
フォトレジスタ(光センサー)で明るさを調べる
温度・気圧をpicoの中にcsvで保存する。
色々ネットで、やりたいことの記事を検索していたら、上記記事がヒットして、この記事を参考にthonnyでプログラミング。
そうそう、ピコのハンダ付は老眼で大変だった。ハンダ付は修行が必要です。
# 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との違いなどを実感したいです。
低価格なんですが、電子部品も上がっているみたいですね。
この記事が気に入ったらサポートをしてみませんか?