前回と前々回のまとめとして、ADS1115のデータをLCDに表示したいと思います。
用意するものは、
KKHMF ADS1115(amazon 他)ーーーADS1115は、基板に実装されたものを使用しました。
ESP-WROOM-02技適所得済みのもの (秋月電子、amazonなど)
(ESP-WROOM-02+ESP-WROOM-02用2.54mmピッチ変換基板)を使用(秋月電子)
USBシリアルコンバータ
今回はKKHMF 3.3V 5.5V FT232RL USB-TTL シリアル コンバーター アダプター モジュール
(amazon)を使用しました、(3.3V対応のものが必要です)
I2Cレベル変換モジュールPCA9306(AE-PCA9306)(秋月電子)
他、電源5V用、3.3V用、ブレッドボードなど
回路図は下記のとおりです。
thonnyとシリアル通信するためには、回路図には図示していませんが、IO15(6pin)を10KΩでGnd(プルダウン)に接続する必要があります。
および、IO2(7pin)、IO0(8pin)は内部でプルアップされていますが、必要であれば10KΩでVCC(3.3V)に接続してください。
前回と前々回のMicroPythonのプログラムを使用しています。特に表示関連の必要部分を書き出してみました。
表示位置を指定する関数を作成しました。
X=1行目または2行目
Y=1カラム~16カラム
1行目 表示用のアドレスは 00~0F(1カラムから16カラム)
2行目 表示用のアドレスは 40~4F(1カラムから16カラム)
#x=1or2 ,y=1 >> 16
def lcd_cursol(x,y):
xy = (((x-1)*0x40)+(y-1))
xy = xy | 0x80
lcd8bitwrite(xy)
1行目と2行目の最初の表示はそれぞれ
str_messge0="A0-A1="
str_messge1="A2-A3="
を、表示します。
str_messge0="A0-A1="
str_messge1="A2-A3="
messge0=list(str_messge0)
messge1=list(str_messge1)
lcd_cursol(1,1)
for i in range(0, 6):
data_lcd8bitwrite(ord(messge0[i]))
lcd_cursol(2,1)
for i in range(0, 6):
data_lcd8bitwrite(ord(messge1[i]))
今回は、
差動入力のA0-A1およびA2-A3を入力して、ゲインを6144に、レートを128に設定しました。
合わせて、シリアルでの出力を行っています。
polarity_data0,data0= ads1115_read(ain0_ain1,v6144,sps128)
print("ain0_ain1=",polarity[polarity_data0],data0 /1000,"mV")
polarity_data1,data1= ads1115_read(ain2_ain3,v4064,sps128)
print("ain2_ain3=",polarity[polarity_data1],data1 /1000,"mV")
表示データは、極性表示の後、小数点以下2桁、全体で7文字固定で表示します。
今回はフォーマット文を使用してみました。
data_str0="{:7.2f}".format(data0/1000)
データ表示部分は次のようになりました。
data_str0="{:7.2f}".format(data0/1000)
data_list0=list(data_str0)
lcd_cursol(1,7)
data_lcd8bitwrite(ord(polarity[polarity_data0]))
lcd_cursol(1,8)
for i in range(0, 7):
data_lcd8bitwrite(ord(data_list0[i]))
data_str1="{:7.2f}".format(data1/1000)
data_list1=list(data_str1)
lcd_cursol(2,7)
data_lcd8bitwrite(ord(polarity[polarity_data1]))
lcd_cursol(2,8)
for i in range(0, 7):
data_lcd8bitwrite(ord(data_list1[i]))
最後にmVを表示します。
str_messge0="mV"
messge0=list(str_messge0)
lcd_cursol(1,15)
for i in range(0, 2):
data_lcd8bitwrite(ord(messge0[i]))
lcd_cursol(2,15)
for i in range(0, 2):
data_lcd8bitwrite(ord(messge0[i]))
全体のプログラムは下記のようになりました。
# MicroPython(ESP8266) ADS1115 readding ,LCD display(KKHMF 1602 LCD +EasyWordMall 1602 LCD i2c i/F)
#
# SCL = IO14 (3pin)
# SDA = IO12 (4pin)
# I2C address =0x48 (addr open)
from machine import Pin, I2C
import utime
i2c=I2C(scl=Pin(14),sda=Pin(12),freq=400000)
ads1115_i2c_addr= 0x48
LCD_i2c_addr= 0x27
# LCD buff
lcd_command_buff=bytearray(1)
messge1=bytearray(16)
messge2=bytearray(16)
#ADS1115 buff
polarity=['+','-']
polarity_data = 0
config_buff=bytearray(3)
conversion_addr_buff=bytearray(1)
conversion_buff=bytearray(2)
data_list0=bytearray(16)
data_list1=bytearray(16)
#Address Pointer Register
conversion_reg = 0x00
config_reg = 0x01
#config Register
# input(Differential)
ain0_ain1 = 0b0000_0000
ain0_ain3 = 0b0001_0000
ain1_ain3 = 0b0010_0000
ain2_ain3 = 0b0011_0000
# input(Single-ended)
ain0_gnd = 0b0100_0000
ain1_gnd = 0b0101_0000
ain2_gnd = 0b0110_0000
ain3_gnd = 0b0111_0000
# gain amplifier
v6144 = 0b0000_0000
v4064 = 0b0000_0010
v2048 = 0b0000_0100
v1024 = 0b0000_0110
v0512 = 0b0000_1000
v0256 = 0b0000_1010
v0256 = 0b0000_1100
v0256 = 0b0000_1110
# data rate
sps8 = 0b0000_0000
sps16 = 0b0010_0000
sps32 = 0b0100_0000
sps64 = 0b0110_0000
sps128 = 0b1000_0000
sps250 = 0b1010_0000
sps475 = 0b1100_0000
sps860 = 0b1110_0000
lsb_size=[187.5,125.0,62.5,31.25,15.625,7.8125,7.8125,7.8125]
# LCD Function
def lcd_init():
data_set = 0x03
lcd4bitwrite(data_set)
utime.sleep_ms(5)
lcd4bitwrite(data_set)
lcd4bitwrite(data_set)
data_set = 0x02
lcd4bitwrite(data_set)
data_set = 0x28
lcd8bitwrite(data_set)
data_set = 0x0c
lcd8bitwrite(data_set)
data_set = 0x01
lcd8bitwrite(data_set)
utime.sleep_ms(2)
data_set = 0x06
lcd8bitwrite(data_set)
data_set = 0x02
lcd8bitwrite(data_set)
utime.sleep_ms(2)
def lcd4bitwrite(command):
command = command << 4
command = command | 0b00001000
command = command & 0b11111000
lcd_command_buff[0]= command
i2c.writeto(LCD_i2c_addr,lcd_command_buff)
command = command | 0b00001100
command = command & 0b11111100
lcd_command_buff[0]= command
i2c.writeto(LCD_i2c_addr,lcd_command_buff)
command = command | 0b00001000
command = command & 0b11111000
lcd_command_buff[0]= command
i2c.writeto(LCD_i2c_addr,lcd_command_buff)
def data_lcd4bitwrite(command):
command = command << 4
command = command | 0b00001001
command = command & 0b11111001
lcd_command_buff[0]= command
i2c.writeto(LCD_i2c_addr,lcd_command_buff)
command = command | 0b00001101
command = command & 0b11111101
lcd_command_buff[0]= command
i2c.writeto(LCD_i2c_addr,lcd_command_buff)
command = command | 0b00001001
command = command & 0b11111001
lcd_command_buff[0]= command
i2c.writeto(LCD_i2c_addr,lcd_command_buff)
def lcd8bitwrite(command):
command2 = command
command = command >> 4
lcd4bitwrite(command)
lcd4bitwrite(command2)
def data_lcd8bitwrite(command):
command2 = command
command= command >> 4
data_lcd4bitwrite(command)
data_lcd4bitwrite(command2)
#x=1or2 ,y=1 >> 16
def lcd_cursol(x,y):
xy = (((x-1)*0x40)+(y-1))
xy = xy | 0x80
lcd8bitwrite(xy)
#ADS1115 function
def ads1115_read(input_ads,gain,rate):
config_buff[0] = config_reg
config_buff[1] = 0x81 | input_ads | gain
config_buff[2] = 0x03 | rate
conversion_addr_buff[0] = conversion_reg
i2c.writeto(ads1115_i2c_addr,config_buff)
utime.sleep_ms(20)
i2c.writeto(ads1115_i2c_addr,conversion_addr_buff)
i2c.readfrom_into(ads1115_i2c_addr,conversion_buff)
if (conversion_buff[0] & 0x80):
polarity_data=1
data16bit = ~(((conversion_buff[0] << 8) | conversion_buff[1])) & 0xffff
else:
polarity_data=0
data16bit=(((conversion_buff[0] << 8) | conversion_buff[1])) & 0x7fff
data = data16bit * (lsb_size[gain >> 1])
return polarity_data,data
# main routine
lcd_init()
str_messge0="A0-A1="
str_messge1="A2-A3="
messge0=list(str_messge0)
messge1=list(str_messge1)
lcd_cursol(1,1)
for i in range(0, 6):
data_lcd8bitwrite(ord(messge0[i]))
lcd_cursol(2,1)
for i in range(0, 6):
data_lcd8bitwrite(ord(messge1[i]))
polarity_data0,data0= ads1115_read(ain0_ain1,v6144,sps128)
print("ain0_ain1=",polarity[polarity_data0],data0 /1000,"mV")
polarity_data1,data1= ads1115_read(ain2_ain3,v4064,sps128)
print("ain2_ain3=",polarity[polarity_data1],data1 /1000,"mV")
data_str0="{:7.2f}".format(data0/1000)
data_list0=list(data_str0)
lcd_cursol(1,7)
data_lcd8bitwrite(ord(polarity[polarity_data0]))
lcd_cursol(1,8)
for i in range(0, 7):
data_lcd8bitwrite(ord(data_list0[i]))
data_str1="{:7.2f}".format(data1/1000)
data_list1=list(data_str1)
lcd_cursol(2,7)
data_lcd8bitwrite(ord(polarity[polarity_data1]))
lcd_cursol(2,8)
for i in range(0, 7):
data_lcd8bitwrite(ord(data_list1[i]))
str_messge0="mV"
messge0=list(str_messge0)
lcd_cursol(1,15)
for i in range(0, 2):
data_lcd8bitwrite(ord(messge0[i]))
lcd_cursol(2,15)
for i in range(0, 2):
data_lcd8bitwrite(ord(messge0[i]))