前回前々回のまとめとして、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]))
    
おすすめの記事