Demo Source Code

The Python source code of this demo is provided for reference purpose only.

I2C_Sense_Hat.py:

#!/usr/bin/python
'''
Please make sure the sense HAT(B) is connected to the correct pins.
The following table describes how to connect the Sense HAT(B) to the 40-pin header.
--------------------------------------------
__Sense HAT (B)___Pin Number_____Pin Name
    3V3             1            3.3 V Power
    GND             9              GND
    SDA             3            I2C SDA
    SCL             5            I2C SCL
--------------------------------------------
'''

import sys
import struct
import fcntl
import os
import math
import time
import VisionFive.i2c as I2C
import VisionFive.boardtype as board_t

SHTC3_I2C_ADDRESS = 0x70
I2C_SLAVE = 0x0703
#I2C_DEVICE = "/dev/i2c-1"
#I2C_DEVICE = "/dev/i2c-0"

##Commands
cmd_dict = {
"SHTC3_WakeUp": 		0x3517,
"SHTC3_Sleep": 			0xB098,
"SHTC3_NM_CE_ReadTH": 	0x7CA2,
"SHTC3_NM_CE_ReadRH": 	0x5C24,
"SHTC3_NM_CD_ReadTH": 	0x7866,
"SHTC3_NM_CD_ReadRH": 	0x58E0,
"SHTC3_LM_CE_ReadTH": 	0x6458,
"SHTC3_LM_CE_ReadRH": 	0x44DE,
"SHTC3_LM_CD_ReadTH": 	0x609C,
"SHTC3_LM_CD_ReadRH": 	0x401A,
"SHTC3_Software_RES": 	0x401A,
"SHTC3_ID": 			0xEFC8,
"CRC_POLYNOMIAL":       0x131,
}


def SHTC3_CheckCrc(data, len, checksum):
    crc = 0xff
    for byteCtr in range(0, len):
        crc ^= data[byteCtr]
        for bit in range(8, 0, -1):
            if(crc & 0x80):
                crc = (crc << 1) ^ cmd_dict["CRC_POLYNOMIAL"]
            else:
                crc = crc << 1
    if (crc != checksum):
        return 1
    else:
        return 0

def SHTC3_WriteCommand(cmd):
    buf0 =  (cmd >> 8)& 0xff
    buf1 = cmd & 0xff
    buf = [buf0, buf1]
    I2C.write(buf)

def SHTC3_WAKEUP():
    SHTC3_WriteCommand(cmd_dict["SHTC3_WakeUp"])
    time.sleep(0.03)

def SHTC3_SLEEP():
    SHTC3_WriteCommand(cmd_dict["SHTC3_Sleep"])

def SHTC_SOFT_RESET():
    SHTC3_WriteCommand(cmd_dict["SHTC3_Software_RES"])
    time.sleep(0.03)

def getdata():
    time.sleep(0.02)
    buf_list = I2C.read(3)
    checksum = buf_list[2]
    DATA = 0
    if (not SHTC3_CheckCrc(buf_list, 2, checksum)):
        DATA = (buf_list[0] << 8 | buf_list[1])
    return DATA

def SHTC3_Read_DATA():
    SHTC3_WriteCommand(cmd_dict["SHTC3_NM_CD_ReadTH"])
    TH_DATA = getdata()
    SHTC3_WriteCommand(cmd_dict["SHTC3_NM_CD_ReadRH"])
    RH_DATA = getdata()
    TH_DATA = 175 * TH_DATA /65536.0 -45.0   #Calculate the temperature value.
    RH_DATA = 100 * RH_DATA / 65536.0        #Calculate the humidity value.
    DATA = [TH_DATA,RH_DATA]
    return DATA

def getTem():
    SHTC3_WriteCommand(cmd_dict["SHTC3_NM_CD_ReadTH"])
    TH_DATA = getdata()
    TH_DATA = 175 * TH_DATA /65536.0 -45.0   #Calculate the temperature value.
    return TH_DATA

def getHum():
    SHTC3_WriteCommand(cmd_dict["SHTC3_NM_CD_ReadRH"])
    RH_DATA = getdata()
    RH_DATA = 100 * RH_DATA / 65536.0        #Calculate the humidity value.
    return RH_DATA

def main():
    #Determining cpu Type: 1 means visionfive1; 2 means visionfive 2 
    vf_t = board_t.boardtype()
    if vf_t == 1:
        I2C_DEVICE = "/dev/i2c-1"
    elif vf_t == 2:
        I2C_DEVICE = "/dev/i2c-0"
    else:
        print('This module can only be run on a VisionFive board!')
        return 0

    #Open the Sense HAT by I2C.
    ret = I2C.open(I2C_DEVICE, SHTC3_I2C_ADDRESS)
    if (ret < 0):
        return 0


    SHTC_SOFT_RESET()
    i = 0
    while i < 7:
        Temp = getTem()
        Hum = getHum()
        SHTC3_SLEEP()
        SHTC3_WAKEUP()
        print("Temperature = {:.2f}°C , Humidity = {:.2f} %\n".format(Temp, Hum))
        i = i + 1

    I2C.close()
    return 0

if __name__ == "__main__":
    sys.exit(main())