Страница 1 из 5

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

Добавлено: Ср фев 12, 2014 5:52 pm
Satgate_M
Добрый день,
Через 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 это будут константы.

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

Спасибо.

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

Добавлено: Ср фев 12, 2014 5:57 pm
layet
Не совсем понял. Вам нужен php код для этой формулы? Или нужно выделить из этого уравнения Р и перевести из кПа в мм.рт. ст.?

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

Добавлено: Ср фев 12, 2014 6:03 pm
Satgate_M
Вывести из уравнения р и перевести могу)) Благо образование как раз в тему, а вот в программировании не силен, к сожалению.

Нужен php код!

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

Добавлено: Чт фев 13, 2014 3:27 am
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.

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

Добавлено: Чт фев 13, 2014 7:11 pm
Satgate_M
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;

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

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

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

Добавлено: Чт фев 13, 2014 11:00 pm
LutsenkoDenis
Можно подключить библиотеку 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;
   }

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

Добавлено: Пт фев 14, 2014 2:47 am
layet
Satgate_M писал(а):Может в курсе как знаки после запятой округлять, а то уж там много знаков слишком!
Конечно вкурсе :)

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

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

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

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

$pressure = round($pressure, 0);

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

Добавлено: Пт фев 14, 2014 8:30 am
LutsenkoDenis
Про округление: http://www.php.net/manual/ru/function.round.php
А вообще я привел пример постом выше, в котором есть округление до нужного знака.
И готовое решение по переводу из гектопаскалей в мм. ртутного столба и обратно.

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

Добавлено: Пт фев 14, 2014 10:41 am
layet
LutsenkoDenis писал(а):Про округление: http://www.php.net/manual/ru/function.round.php
А вообще я привел пример постом выше, в котором есть округление до нужного знака.
И готовое решение по переводу из гектопаскалей в мм. ртутного столба и обратно.
Ради такого простого решения библиотеку использовать грешно :D Лишняя трата ресурсов.

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

Добавлено: Пт фев 14, 2014 5:27 pm
Satgate_M
Спасибо огромное! Все работает!!