Датчик давления считывания с использованием аналога Arduino
Я использую Arduino Uno для чтения давления, и я хочу знать, правильно ли я правильно закодировал датчик. Я не уверен, что получаю правильные показания (это могут быть правильные показания - я просто хочу проверить, что я сделал все правильно). Датчик, который я использую, является датчиком давления OspSense ™ XMLP, который считывает от 0 до 100 бар и выдает заряд 0 В (нулевые бары) до 10 В (100 бар). Из-за того, что Arduino Uno способен считывать до 5 вольт, я использовал делитель напряжения для уменьшения максимального напряжения, которое Arduino получает до 5 В.
Я прикрепил рукописную диаграмму. Дайте мне знать, если вам нужна дополнительная информация. Я подключил проводку, а также код.
4 ответа
Вы можете использовать map
, ref. : https://www.arduino.cc/ru/Reference/Map
Повторно отображает число из одного диапазона в другой. То есть, значение fromLow будет отображаться в toLow, значение fromHigh to toHigh, значения между промежуточными значениями и т. д.
Если вам нужно использовать значения дробного давления, то формула
float MapBarPressure;
MapBarPressure = sensorValue2 / 10.24;
Это было получено, увидев, что максимальное значение из AnalogRead(A0)
равно 1024
, который соответствует 5V на A0 (и который также означает выход 10V от датчика.) Если вы читаете 1024
bar = (A0 / 1024) * 100
В качестве альтернативы вы можете сохранить 1 десятичное место точности в баре, если вы сохраните значения int
:
int MapDeciBarPressure;
MapDeciBarPressure = map(sensorValue2, 0, 1023, 0, 1000);
Затем ваша переменная удерживает «десятые доли бара» (deciBar), и вы конвертируете ее только в bar путем деления на 10.0 (не 10, это int, но 10.0, который является float и выполняет математику с плавающей запятой и возвращает поплавковый ответ.)
Еще одно примечание: вы пишете:
// read the input on analog pin 0:
int sensorValue1 = analogRead(A0);
delay(2); // read twice with small delay to get accurate reading.
int sensorValue2 = analogRead(A0);
Простое чтение дважды не дает точности - вам нужно усреднить значения:
int sensorValAvg = (sensorValue1 + sensorValue2) / 2;
Затем используйте sensorValAvg для вашего менее шумного значения.
Edit: Кроме того, убедитесь, что вы соединяете все линии заземления вместе как с датчиком, так и с Arduino!
О точности.
Я предполагаю, что вы прочитали @ edgar-bonet о подключении GND.
Я предполагаю, что вы понимаете другой ответ, чтобы рассчитать давление. Я бы написал это следующим образом:
// This is for the DEFAULT 5V analog reference.
// v = the voltage at the pin in Volts.
// p = the pressure in bar.
// Note that 'bar' is the pressure relative to the
// normal atmospheric pressure at that moment.
float v = (float) analogRead(A0) / 1024.0 * 5.0;
float p = v / 5.0 * 100.0;
analogRead
использует значение по умолчанию как 5V.
Это означает, что если проект питается от USB-кабеля, 5V может варьироваться от 4,5 до 5,0 В. Эта разница в 10% будет отображаться в результате рассчитанного давления. В этом случае вы не можете измерить более точную, чем 10%.
Если проект питается от источника питания к разъему питания, то полученная точность зависит от точности регулятора напряжения на плате Arduino.
Аналоговую ссылку можно установить с помощью analogReference
.
Внутренний опорный сигнал напряжения Arduino Uno составляет 1,1 В. Это достаточно стабильно, но это немного зависит от напряжения VCC и температуры. Основная проблема заключается в том, что для каждого Arduino Uno он отличается, и он может быть между 1.0 и 1.2 V. Для этого вам нужно его измерить и использовать измеренное значение в расчете в эскизе.
Диапазон ввода составляет от 0 В до аналогового задания. Поэтому вам необходимо настроить делитель напряжения, чтобы получить 0..10V до 0..1.1V. Вы можете попробовать: R1 = 100k и R2 = 10k.
const int pressureSignalPin = A0;
void setup()
{
analogReference( INTERNAL);
}
void loop()
{
// v = the voltage at the pin in Volts.
// p = the pressure in bar.
// Note that 'bar' is the pressure relative to the
// normal atmospheric pressure at that moment.
// The "(100.0 + 10.0) / 10.0" is the factor by the voltage divider
// with 100k and 10k.
// Measure the AREF pin, and fill the value in for "1.10".
float v = (float) analogRead(A0) / 1024.0 * 1.10;
float p = v * ((100.0 + 10.0) / 10.0);
}
Все просто прекрасно.
Все, что вам нужно сделать, это предоставить общую землю (потенциал 0) вашему Arduino и вашему датчику.
Проблема в том, что они могут иметь другой потенциал.
Итак, просто соедините землю ваших 5 вольт и 24 вольта вместе, и все будет работать отлично.