Помогите с программированием формулы!

Использование системы в различных ситуациях, вопросы программирования сценариев.

Модератор: immortal

Satgate_M
Сообщения: 79
Зарегистрирован: Ср дек 26, 2012 8:20 pm
Благодарил (а): 6 раз
Поблагодарили: 0

Помогите с программированием формулы!

Сообщение Satgate_M » Ср фев 12, 2014 5:52 pm

Добрый день,
Через 1-wire АЦП прицепил датчик атмосферного давления, но девайс выдает давление в виде напряжения на выходе.

Transfer Function (MPX4115-микросхема)
Nominal Transfer Value: Vout = VS (P x 0.009 - 0.095)
± (Pressure Error x Temp. Factor x 0.009 x VS)
VS =5.1V±0.25Vdc
Pressure Error b Tempfactor это будут константы.

Помогите, пожалуйста, реализовать программный код который бы брал выходное напряжение и превращал его в мм.рт.ст (формула првращает в кПа).

Спасибо.
layet
Сообщения: 78
Зарегистрирован: Чт янв 16, 2014 2:47 pm
Благодарил (а): 4 раза
Поблагодарили: 31 раз

Re: Помогите с рограммирование формулы!

Сообщение layet » Ср фев 12, 2014 5:57 pm

Не совсем понял. Вам нужен php код для этой формулы? Или нужно выделить из этого уравнения Р и перевести из кПа в мм.рт. ст.?
Satgate_M
Сообщения: 79
Зарегистрирован: Ср дек 26, 2012 8:20 pm
Благодарил (а): 6 раз
Поблагодарили: 0

Re: Помогите с программированием формулы!

Сообщение Satgate_M » Ср фев 12, 2014 6:03 pm

Вывести из уравнения р и перевести могу)) Благо образование как раз в тему, а вот в программировании не силен, к сожалению.

Нужен php код!
layet
Сообщения: 78
Зарегистрирован: Чт янв 16, 2014 2:47 pm
Благодарил (а): 4 раза
Поблагодарили: 31 раз

Re: Помогите с программированием формулы!

Сообщение layet » Чт фев 13, 2014 3:27 am

Ну, например, так:

Создаем класс PressureSensors.
Создаем ему 2 свойства:
  • vout - значение напряжение с датчика, в поле Запускать метод при изменении пишем voutChanged
  • pressure - значение давления
Создаем метод:
  • voutChanged
В коде метода пишем:

Код: Выделить всё

// получаем значение свойства vout
$vout=$this->getProperty("vout");
// устанавливаем значения констант
$PressureError = 0;
$TempFactor = 0;
$VS = 5.1;
// вычисляем давление
$pressure = ($vout + ($PressureError * $TempFactor * 0.009 * $VS)) / ($VS * 0.009);
// переводим давление из кПа в мм.рт.ст.
$pressure = 7.5 * $pressure;
// записываем значение давления в свойство pressure
$this->setProperty("pressure", $pressure);
Теперь у нас есть класс-шаблон, который при изменении значения vout вызывает метод voutChanged, который пересчитывает значение давления по формуле из В в мм.рт.ст.

Теперь создаем объект, например, pressureSensor1 и привязываем его свойство pressureSensor1.vout к значению 1Wire АЦП, как подробно расписано тут -> http://smartliving.ru/Main/ModuleOnewire.

В общем все. При обновлении значения напряжения с датчика будет обновляться и значение давления в объекте pressureSensor1.
Satgate_M
Сообщения: 79
Зарегистрирован: Ср дек 26, 2012 8:20 pm
Благодарил (а): 6 раз
Поблагодарили: 0

Re: Помогите с программированием формулы!

Сообщение Satgate_M » Чт фев 13, 2014 7:11 pm

layet писал(а):Ну, например, так:

Создаем класс PressureSensors.
Создаем ему 2 свойства:
  • vout - значение напряжение с датчика, в поле Запускать метод при изменении пишем voutChanged
  • pressure - значение давления
Создаем метод:
  • voutChanged
В коде метода пишем:

Код: Выделить всё

// получаем значение свойства vout
$vout=$this->getProperty("vout");
// устанавливаем значения констант
$PressureError = 0;
$TempFactor = 0;
$VS = 5.1;
// вычисляем давление
$pressure = ($vout + ($PressureError * $TempFactor * 0.009 * $VS)) / ($VS * 0.009);
// переводим давление из кПа в мм.рт.ст.
$pressure = 7.5 * $pressure;
// записываем значение давления в свойство pressure
$this->setProperty("pressure", $pressure);
Теперь у нас есть класс-шаблон, который при изменении значения vout вызывает метод voutChanged, который пересчитывает значение давления по формуле из В в мм.рт.ст.

Теперь создаем объект, например, pressureSensor1 и привязываем его свойство pressureSensor1.vout к значению 1Wire АЦП, как подробно расписано тут -> http://smartliving.ru/Main/ModuleOnewire.

В общем все. При обновлении значения напряжения с датчика будет обновляться и значение давления в объекте pressureSensor1.
Почему-то никак не хотело считать!
Переделал формулу по аналогии в такой вид:
// получаем значение свойства vout
$vout=$this->getProperty("vout");
// устанавливаем значения констант
$PressureError = 1.5;
$TempFactor = 1;
$VS = 5.11;
// вычисляем давление

$pressure = (1000 * $vout) / (9 * $VS) + 95/9 + $PressureError;

// переводим давление из кПа в мм.рт.ст.
$pressure = 7.501 * $pressure;

Теперь все считает! Спасибо огромное!!!!

Может в курсе как знаки после запятой округлять, а то уж там много знаков слишком!
LutsenkoDenis
Сообщения: 521
Зарегистрирован: Вс апр 07, 2013 9:30 pm
Откуда: Moscow
Благодарил (а): 2 раза
Поблагодарили: 58 раз
Контактная информация:

Re: Помогите с программированием формулы!

Сообщение LutsenkoDenis » Чт фев 13, 2014 11:00 pm

Можно подключить библиотеку OpenWeather(/lib/OpenWeather/OpenWeather.php) и использовать её метод ConvertPressure.

Код: Выделить всё

$pressure = OpenWeather::ConvertPressure($pressure, "hpa", "mmhg");
Вот код этого метода..ну на всякий случай :) Использовать просто(см пример выше): $pressure - давление которое нужно сконвертить, $vFrom и $vTo - соответственно из какой величины в какую переводить. Поддерживаются соответственно мм. ртутного столба и паскали. $vPrecision - кол-во знаков после запятой. По умолчанию равны 2(двум). Если не указывать $vPrecision, как сделано в примере то по умолчанию округляет до двух знаков.

Код: Выделить всё

public static function ConvertPressure($vPressure, $vFrom, $vTo, $vPrecision = 2)
   {
      if (empty($vFrom) || empty($vTo) || empty($vPressure))
         return $vPressure;
      
      if (!is_numeric($vPressure))
         return $vPressure;
      
      $vPressure = (float) $vPressure;
      $vFrom     = strtolower($vFrom);
      $vTo       = strtolower($vTo);
      
      if ($vFrom == "hpa" && $vTo == "mmhg")
         return round($vPressure * 0.75006375541921, $vPrecision);
      
      if ($vFrom == "mmhg" && $vTo == "hpa")
         return round($vPressure * 1.33322, $vPrecision);
      
      return $vPressure;
   }
________________________________________________________
Majordomo (GitHub) на HP Microserver Gen8. OS Debian Stretch
layet
Сообщения: 78
Зарегистрирован: Чт янв 16, 2014 2:47 pm
Благодарил (а): 4 раза
Поблагодарили: 31 раз

Re: Помогите с программированием формулы!

Сообщение layet » Пт фев 14, 2014 2:47 am

Satgate_M писал(а):Может в курсе как знаки после запятой округлять, а то уж там много знаков слишком!
Конечно вкурсе :)

Округление до 2 знаков:

Код: Выделить всё

$pressure = round($pressure, 2);
Округление до целого:

Код: Выделить всё

$pressure = round($pressure, 0);
LutsenkoDenis
Сообщения: 521
Зарегистрирован: Вс апр 07, 2013 9:30 pm
Откуда: Moscow
Благодарил (а): 2 раза
Поблагодарили: 58 раз
Контактная информация:

Re: Помогите с программированием формулы!

Сообщение LutsenkoDenis » Пт фев 14, 2014 8:30 am

Про округление: http://www.php.net/manual/ru/function.round.php
А вообще я привел пример постом выше, в котором есть округление до нужного знака.
И готовое решение по переводу из гектопаскалей в мм. ртутного столба и обратно.
________________________________________________________
Majordomo (GitHub) на HP Microserver Gen8. OS Debian Stretch
layet
Сообщения: 78
Зарегистрирован: Чт янв 16, 2014 2:47 pm
Благодарил (а): 4 раза
Поблагодарили: 31 раз

Re: Помогите с программированием формулы!

Сообщение layet » Пт фев 14, 2014 10:41 am

LutsenkoDenis писал(а):Про округление: http://www.php.net/manual/ru/function.round.php
А вообще я привел пример постом выше, в котором есть округление до нужного знака.
И готовое решение по переводу из гектопаскалей в мм. ртутного столба и обратно.
Ради такого простого решения библиотеку использовать грешно :D Лишняя трата ресурсов.
Satgate_M
Сообщения: 79
Зарегистрирован: Ср дек 26, 2012 8:20 pm
Благодарил (а): 6 раз
Поблагодарили: 0

Re: Помогите с программированием формулы!

Сообщение Satgate_M » Пт фев 14, 2014 5:27 pm

Спасибо огромное! Все работает!!
Ответить