ФЭНДОМ


apt-get install bc

Симулятор мигания счетчика

#!/bin/bash
# Параметр счетчика, указанный на счетчике (импульсов на киловат*час)
A=12800
# Номер порта gpio (задается первым аргументом)
[ $1 -ge 0 ] || exit 1
gpioN=$1
 
# Имитируемая мощность нагрузки (в Ваттах) задаётся вторым аргументом, 
# если не задано то 500 Ватт 
P=$2
[ $2 -ge 0 ] 2>/dev/null || P=500
# Число импульсов задаётся 3-м аргументом, если не задано, то 1000
impX=$3
[ $3 -ge 0 ] 2>/dev/null || impX=1000
 
# Расчет времени интервала мигания светодиодом
t=`echo "3600000/$A/$P/2"|bc -l`
echo "Имметируем нагрузку $P Ватт. Отправляем на GPIO$gpioN $impX импульсов длинной $t сек"
# Инициализация gpio
[ `cat /sys/class/gpio/gpio$gpioN/direction` == "out" ] || \
 ( echo $gpioN > /sys/class/gpio/export; \
   echo "out" > /sys/class/gpio/gpio$gpioN/direction  )
 
step=1
while [ "$step" -le $impX ]
do
 echo "1" > /sys/class/gpio/gpio$gpioN/value ; sleep $t
 echo "0" > /sys/class/gpio/gpio$gpioN/value ; sleep $t
 step=$(( $step + 1 ))
done

Подсчет импульсов

#!/bin/bash
# Параметр, указанный на счетчике (импульсов на киловат*час)
A=12800
 
# Номер порта gpio (задается первым аргументом). Выходить, если пропущен
[ $1 -ge 0 ] || exit 0
gpioN=$1
 
# Число импульсов после для расчета средней мощности, задаётся 3-м аргументом, если не задано, то 4
impX=$2
[ $2 -ge 0 ] 2>/dev/null || impX=4
 
# Инициализация gpio
[ `cat /sys/class/gpio/gpio$gpioN/direction` == "in" ] || \
 ( echo $gpioN > /sys/class/gpio/export; \
   echo "in" > /sys/class/gpio/gpio$gpioN/direction  )
# Запуск бесконечного цикла опроса датчика
while : 
do 
 a=0
 step=1
 # расчет средней мощности за заданное число импульсов
 while [ $step -le $impX ]
 do
  # Отлавливаем момент смены состояния датчика
  val=`cat /sys/class/gpio/gpio$gpioN/value`
  # Если произошла первая смена состояния датчика запоминаем этот момент,
  # а так-же выводим все остальные моменты. 
  if [ $a != $val ]
  then
   a=$val
   timestamp=`date +"%s.%N"`
   [ "$step" != "1" ] || timestamp0=$timestamp
   dt=`echo "$timestamp-$tm_prv"|bc -l`
   echo "$timestamp;$val;$dt"
   step=$(( $step + 1 ))
   tm_prv=$timestamp
 
  fi
 done
# Очищаем консоль
 clear
# Считаем среднюю мощность за период
# Зная время первого и последнего импульса,
# а так-же общее число импульсов, вычисляем среднюю мощность.
 
echo `echo "3600000/(($timestamp-$timestamp0)/($step-2)*$A*2)"|bc -l` Ватт
echo
done