Страница 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 - значение давления
Создаем метод:
В коде метода пишем:
Код: Выделить всё
// получаем значение свойства 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 - значение давления
Создаем метод:
В коде метода пишем:
Код: Выделить всё
// получаем значение свойства 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 знаков:
Округление до целого:
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
А вообще я привел пример постом выше, в котором есть округление до нужного знака.
И готовое решение по переводу из гектопаскалей в мм. ртутного столба и обратно.
Ради такого простого решения библиотеку использовать грешно
Лишняя трата ресурсов.
Re: Помогите с программированием формулы!
Добавлено: Пт фев 14, 2014 5:27 pm
Satgate_M
Спасибо огромное! Все работает!!