Помогите с программированием формулы!
Модератор: immortal
-
- Сообщения: 79
- Зарегистрирован: Ср дек 26, 2012 8:20 pm
- Благодарил (а): 6 раз
- Поблагодарили: 0
Помогите с программированием формулы!
Добрый день,
Через 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 это будут константы.
Помогите, пожалуйста, реализовать программный код который бы брал выходное напряжение и превращал его в мм.рт.ст (формула првращает в кПа).
Спасибо.
Через 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 это будут константы.
Помогите, пожалуйста, реализовать программный код который бы брал выходное напряжение и превращал его в мм.рт.ст (формула првращает в кПа).
Спасибо.
-
- Сообщения: 78
- Зарегистрирован: Чт янв 16, 2014 2:47 pm
- Благодарил (а): 4 раза
- Поблагодарили: 31 раз
Re: Помогите с рограммирование формулы!
Не совсем понял. Вам нужен php код для этой формулы? Или нужно выделить из этого уравнения Р и перевести из кПа в мм.рт. ст.?
-
- Сообщения: 79
- Зарегистрирован: Ср дек 26, 2012 8:20 pm
- Благодарил (а): 6 раз
- Поблагодарили: 0
Re: Помогите с программированием формулы!
Вывести из уравнения р и перевести могу)) Благо образование как раз в тему, а вот в программировании не силен, к сожалению.
Нужен php код!
Нужен php код!
-
- Сообщения: 78
- Зарегистрирован: Чт янв 16, 2014 2:47 pm
- Благодарил (а): 4 раза
- Поблагодарили: 31 раз
Re: Помогите с программированием формулы!
Ну, например, так:
Создаем класс PressureSensors.
Создаем ему 2 свойства:
Теперь у нас есть класс-шаблон, который при изменении значения vout вызывает метод voutChanged, который пересчитывает значение давления по формуле из В в мм.рт.ст.
Теперь создаем объект, например, pressureSensor1 и привязываем его свойство pressureSensor1.vout к значению 1Wire АЦП, как подробно расписано тут -> http://smartliving.ru/Main/ModuleOnewire.
В общем все. При обновлении значения напряжения с датчика будет обновляться и значение давления в объекте pressureSensor1.
Создаем класс 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);
Теперь создаем объект, например, pressureSensor1 и привязываем его свойство pressureSensor1.vout к значению 1Wire АЦП, как подробно расписано тут -> http://smartliving.ru/Main/ModuleOnewire.
В общем все. При обновлении значения напряжения с датчика будет обновляться и значение давления в объекте pressureSensor1.
-
- Сообщения: 79
- Зарегистрирован: Ср дек 26, 2012 8:20 pm
- Благодарил (а): 6 раз
- Поблагодарили: 0
Re: Помогите с программированием формулы!
Почему-то никак не хотело считать!layet писал(а):Ну, например, так:
Создаем класс PressureSensors.
Создаем ему 2 свойства:Создаем метод:
- vout - значение напряжение с датчика, в поле Запускать метод при изменении пишем voutChanged
- pressure - значение давления
В коде метода пишем:
- voutChanged
Теперь у нас есть класс-шаблон, который при изменении значения vout вызывает метод 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);
Теперь создаем объект, например, 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;
Теперь все считает! Спасибо огромное!!!!
Может в курсе как знаки после запятой округлять, а то уж там много знаков слишком!
-
- Сообщения: 521
- Зарегистрирован: Вс апр 07, 2013 9:30 pm
- Откуда: Moscow
- Благодарил (а): 2 раза
- Поблагодарили: 58 раз
- Контактная информация:
Re: Помогите с программированием формулы!
Можно подключить библиотеку OpenWeather(/lib/OpenWeather/OpenWeather.php) и использовать её метод ConvertPressure.
Вот код этого метода..ну на всякий случай Использовать просто(см пример выше): $pressure - давление которое нужно сконвертить, $vFrom и $vTo - соответственно из какой величины в какую переводить. Поддерживаются соответственно мм. ртутного столба и паскали. $vPrecision - кол-во знаков после запятой. По умолчанию равны 2(двум). Если не указывать $vPrecision, как сделано в примере то по умолчанию округляет до двух знаков.
Код: Выделить всё
$pressure = OpenWeather::ConvertPressure($pressure, "hpa", "mmhg");
Код: Выделить всё
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
Majordomo (GitHub) на HP Microserver Gen8. OS Debian Stretch
-
- Сообщения: 78
- Зарегистрирован: Чт янв 16, 2014 2:47 pm
- Благодарил (а): 4 раза
- Поблагодарили: 31 раз
Re: Помогите с программированием формулы!
Конечно вкурсеSatgate_M писал(а):Может в курсе как знаки после запятой округлять, а то уж там много знаков слишком!
Округление до 2 знаков:
Код: Выделить всё
$pressure = round($pressure, 2);
Код: Выделить всё
$pressure = round($pressure, 0);
-
- Сообщения: 521
- Зарегистрирован: Вс апр 07, 2013 9:30 pm
- Откуда: Moscow
- Благодарил (а): 2 раза
- Поблагодарили: 58 раз
- Контактная информация:
Re: Помогите с программированием формулы!
Про округление: http://www.php.net/manual/ru/function.round.php
А вообще я привел пример постом выше, в котором есть округление до нужного знака.
И готовое решение по переводу из гектопаскалей в мм. ртутного столба и обратно.
А вообще я привел пример постом выше, в котором есть округление до нужного знака.
И готовое решение по переводу из гектопаскалей в мм. ртутного столба и обратно.
________________________________________________________
Majordomo (GitHub) на HP Microserver Gen8. OS Debian Stretch
Majordomo (GitHub) на HP Microserver Gen8. OS Debian Stretch
-
- Сообщения: 78
- Зарегистрирован: Чт янв 16, 2014 2:47 pm
- Благодарил (а): 4 раза
- Поблагодарили: 31 раз
Re: Помогите с программированием формулы!
Ради такого простого решения библиотеку использовать грешно Лишняя трата ресурсов.LutsenkoDenis писал(а):Про округление: http://www.php.net/manual/ru/function.round.php
А вообще я привел пример постом выше, в котором есть округление до нужного знака.
И готовое решение по переводу из гектопаскалей в мм. ртутного столба и обратно.