#!/bin/sh log="/tmp/nicsensor_debug.log" INFO="Info" WARNING="Warning" ERROR="Error" votage_division_factor_0="1" votage_division_factor_1="1" votage_division_factor_2="1" votage_division_factor_3="0.8" votage_division_factor_4="0.6" votage_division_factor_5="0.6" votage_division_factor_6="0.2326" votage_division_factor_7="1" ADC128_Channel0_name="Channel 0" ADC128_Channel1_name="Channel 1" ADC128_Channel2_name="Channel 2" ADC128_Channel3_name="Channel 3" ADC128_Channel4_name="Channel 4" ADC128_Channel5_name="Channel 5" ADC128_Channel6_name="Channel 6" ADC128_Channel7_name="Channel 7" REG_adc128_config="0x00" REG_adc128_advance="0x0b" REG_adc128_status="0x0c" REG_adc128_ch0="0x20" REG_adc128_ch1="0x21" REG_adc128_ch2="0x22" REG_adc128_ch3="0x23" REG_adc128_ch4="0x24" REG_adc128_ch5="0x25" REG_adc128_ch6="0x26" REG_adc128_ch7="0x27" # 进行ADC128芯片的初始化 check_adc128_init(){ # Get Reg 0x00 status res_adc128_status=`i2cget -y $i2c_bus $chip_slave $REG_adc128_config` format_log_print $INFO "REG adc128 STATUS : $res_adc128_status" # if stauts is not 0x01 (Start Monitor) ,then do init if [ "$res_adc128_status" != "0x01" ];then format_log_print $INFO "Start Init ADC128 Chip" # Init ADC128 work as mode 1 (0x02) res_adc128_advance=`i2ctransfer -y $i2c_bus w2@$chip_slave $REG_adc128_advance 0x02` # Set ADC128 on start (0x01) res_adc128_setstart=`i2ctransfer -y $i2c_bus w2@$chip_slave $REG_adc128_config 0x01 r1` format_log_print $INFO "After Set status, the REG 0x00 value is $res_adc128_setstart" fi } # 处理ADC128读到的数据并输出结果 # @Param 1 ADC128读取数据高位 # @Param 2 ADC128读取数据低位 # @Param 3 channel号/定制化名称 # @Param 4 分压系数 convert_adc128_data(){ # 将读取到的两位数据拼接起来 hex_value1=$(echo "$1" | awk '{sub(/^0x/,""); print}') hex_value2=$(echo "$2" | awk '{sub(/^0x/,""); print}') merge_value="${hex_value1}${hex_value2}" # 由于 bc 计算器只能识别大写的 十六进制数据,这里将小写的十六进制数据全部转化为大写的数据 upper_hex_value=$(echo "$merge_value" | awk '{ for(i=1; i<=length($0); i++){ if(tolower(substr($0,i,1)) ~ /^[a-f]$/) printf toupper(substr($0,i,1)); else printf substr($0,i,1); } print "" }') # 利用bc计算器进行运算,并将返回值格式化后输出 dec_val=$(echo "ibase=16; $upper_hex_value" | bc) volt=$(echo "scale=4; $dec_val / 16 / 4096 * 2.65 / $4" | bc) format_volt=$(echo "$volt" | awk '{ if ($0 ~ /^\./) print "0" $0; else print $0 }') echo "$3 : $format_volt v, hex value: $upper_hex_value" } # 读取ADC128芯片每个通道的数据,随后调用数据处理函数进行数据解析并输出 read_adc128_channel_value(){ format_log_print $INFO "Start Read ADC128 channel data ..." res_ch0=`i2ctransfer -y $i2c_bus w1@$chip_slave $REG_adc128_ch0 r2` res_ch1=`i2ctransfer -y $i2c_bus w1@$chip_slave $REG_adc128_ch1 r2` res_ch2=`i2ctransfer -y $i2c_bus w1@$chip_slave $REG_adc128_ch2 r2` res_ch3=`i2ctransfer -y $i2c_bus w1@$chip_slave $REG_adc128_ch3 r2` res_ch4=`i2ctransfer -y $i2c_bus w1@$chip_slave $REG_adc128_ch4 r2` res_ch5=`i2ctransfer -y $i2c_bus w1@$chip_slave $REG_adc128_ch5 r2` res_ch6=`i2ctransfer -y $i2c_bus w1@$chip_slave $REG_adc128_ch6 r2` res_ch7=`i2ctransfer -y $i2c_bus w1@$chip_slave $REG_adc128_ch7 r2` # 将 I2C 读取的 raw 数据记录到调试日志中 format_log_print $INFO "channel0 : $res_ch0" format_log_print $INFO "channel1 : $res_ch1" format_log_print $INFO "channel2 : $res_ch2" format_log_print $INFO "channel3 : $res_ch3" format_log_print $INFO "channel4 : $res_ch4" format_log_print $INFO "channel5 : $res_ch5" format_log_print $INFO "channel6 : $res_ch6" format_log_print $INFO "channel7 : $res_ch7" # start parse raw data echo ">>> The ADC128 value is :" convert_adc128_data $res_ch0 $ADC128_Channel0_name $votage_division_factor_0 convert_adc128_data $res_ch1 $ADC128_Channel1_name $votage_division_factor_1 convert_adc128_data $res_ch2 $ADC128_Channel2_name $votage_division_factor_2 convert_adc128_data $res_ch3 $ADC128_Channel3_name $votage_division_factor_3 convert_adc128_data $res_ch4 $ADC128_Channel4_name $votage_division_factor_4 convert_adc128_data $res_ch5 $ADC128_Channel5_name $votage_division_factor_5 convert_adc128_data $res_ch6 $ADC128_Channel6_name $votage_division_factor_6 convert_adc128_data $res_ch7 $ADC128_Channel7_name $votage_division_factor_7 }