CircuitPython 10行プログラミング Step3 (6) Wi-Fi その3 電圧測定
前回、DMMの34461Aにソケットで通信しました。DMMの問い合わせ言語SCPIの仕様の一部を次に示します。
Truevoldシリーズ・デジタル・マルチメータ 操作/サービスガイド 電圧の測定。 CONFigure[:VOLTage]:{AC|DC}[{|AUTO|MIN|MAX|DEF}[, {|MIN|MAX|DEF}]]
【例】直流電圧 10Vレンジ 1mV分解能の設定 |
直流電圧のコマンドを使って、具体的にプログラムを作ります。
●電圧を表示するプログラム
前回のプログラムに追加したのは、40~42行です。
import board
import busio
from digitalio import DigitalInOut
import adafruit_esp32spi.adafruit_esp32spi_socket as sockets
from adafruit_esp32spi import adafruit_esp32spi
import adafruit_requests as requests
import time
# If you are using a board with pre-defined ESP32 Pins:
esp32_cs = DigitalInOut(board.ESP_CS)
esp32_ready = DigitalInOut(board.ESP_BUSY)
esp32_reset = DigitalInOut(board.ESP_RESET)
spi = busio.SPI(board.SCK, board.MOSI, board.MISO)
esp = adafruit_esp32spi.ESP_SPIcontrol(spi, esp32_cs, esp32_ready, esp32_reset)
requests.set_socket(sockets, esp)
if esp.status == adafruit_esp32spi.WL_IDLE_STATUS:
print("ESP32 found and in idle mode")
print("Connecting to AP...")
while not esp.is_connected:
try:
esp.connect_AP(b'Buffalo-G-20EA', b'xxxxxxx')
except RuntimeError as e:
print("could not connect to AP, retrying: ",e)
continue
print("Connected to", str(esp.ssid, 'utf-8'), "\tRSSI:", esp.rssi)
print("My IP address is", esp.pretty_ip(esp.ip_address))
ipAddr = "192.168.111.111"
ports = 5025
addr = sockets.getaddrinfo(ipAddr, ports)[0][-1]
skt = sockets.socket()
skt.connect(addr)
skt.send("*IDN?\n")
print(skt.recv(71).decode())
skt.send('CONF:VOLT:DC 10,0.001\n')
skt.send('READ?\n')
print('DC: ' + skt.recv(17).decode())
skt.close()
print("Done")
実行結果です。DMMの測定端子には、実験用電圧源TL431の出力をつないでいます。
●TFTディスプレイをつなぐ
グラフィック・ディスプレイを使う (2) 2インチ 320x240 TFT IPSカラー・ディスプレイ
で使ったAdafruitの「2インチ 320x240 IPSカラーディスプレイ(microSDスロット付き)」を使います。
接続は次のようになります。
TFTディスプレイ | Metro M4 Express AirLift (WiFi) |
---|---|
Vin | 3.3V |
3V3 | - |
GND | GND |
SCK | 6pin SCK |
MISO | 6pin MISO |
MOSI | 6pin MOSI |
CS | D5 |
RST | D9 |
D/C | D6 |
SDCS | - |
BL | - |
●プログラム
examplesに入っているst7789_320x240_simpletest.pyをMuエディタにコピペして保存します。
実行している様子です。
このプログラムの途中に、最初の電圧を取得するプログラムを挟み込みます。
import time
import board
import busio
from digitalio import DigitalInOut
import adafruit_esp32spi.adafruit_esp32spi_socket as sockets
from adafruit_esp32spi import adafruit_esp32spi
import adafruit_requests as requests
import displayio
import terminalio
from adafruit_display_text import label
from adafruit_st7789 import ST7789
# Release any resources currently in use for the displays
displayio.release_displays()
spi = board.SPI()
tft_cs = board.D5
tft_dc = board.D6
display_bus = displayio.FourWire(spi, command=tft_dc, chip_select=tft_cs, reset=board.D9)
display = ST7789(display_bus, width=320, height=240, rotation=90)
# Make the display context
splash = displayio.Group(max_size=10)
display.show(splash)
color_bitmap = displayio.Bitmap(320, 240, 1)
color_palette = displayio.Palette(1)
color_palette[0] = 0x00FF00 # Bright Green
bg_sprite = displayio.TileGrid(color_bitmap,
pixel_shader=color_palette,
x=0, y=0)
splash.append(bg_sprite)
# Draw a smaller inner rectangle
inner_bitmap = displayio.Bitmap(280, 200, 1)
inner_palette = displayio.Palette(1)
inner_palette[0] = 0xAA0088 # Purple
inner_sprite = displayio.TileGrid(inner_bitmap,
pixel_shader=inner_palette,
x=20, y=20)
splash.append(inner_sprite)
# If you are using a board with pre-defined ESP32 Pins:
esp32_cs = DigitalInOut(board.ESP_CS)
esp32_ready = DigitalInOut(board.ESP_BUSY)
esp32_reset = DigitalInOut(board.ESP_RESET)
#spi = busio.SPI(board.SCK, board.MOSI, board.MISO)
esp = adafruit_esp32spi.ESP_SPIcontrol(spi, esp32_cs, esp32_ready, esp32_reset)
requests.set_socket(sockets, esp)
if esp.status == adafruit_esp32spi.WL_IDLE_STATUS:
print("ESP32 found and in idle mode")
print("Connecting to AP...")
while not esp.is_connected:
try:
esp.connect_AP(b'Buffalo-G-20EA', b'abnabks7e7wfv')
except RuntimeError as e:
print("could not connect to AP, retrying: ",e)
continue
print("Connected to", str(esp.ssid, 'utf-8'), "\tRSSI:", esp.rssi)
print("My IP address is", esp.pretty_ip(esp.ip_address))
ipAddr = "192.168.111.111"
ports = 5025
addr = sockets.getaddrinfo(ipAddr, ports)[0][-1]
skt = sockets.socket()
skt.connect(addr)
skt.send("*IDN?\n")
print(skt.recv(71).decode())
skt.send('CONF:VOLT:DC 10,0.001\n')
skt.send('READ?\n')
data = skt.recv(17).decode('ascii')
print('DC: ' + data)
skt.close()
text_group = displayio.Group(max_size=10, scale=3, x=27, y=120)
text = str(data)
text_area = label.Label(terminalio.FONT, text=text, color=0xFFFF00)
text_group.append(text_area) # Subgroup for text scaling
splash.append(text_group)
while True:
pass
実行している様子です。
(※) DMMのIPアドレスは、電源を入れて、測定が始まる直前に画面に表示されます。見逃したときは、こちらの記事を参考に探してください。
(※) 本Webのプログラム中、インデントなどのスペースもしくは改行は、通常のプログラム内ではごみ文字になるので、コピペした後、エディタでスペース文字などを入れなおしてください。