Датчик давления считывания с использованием аналога Arduino

Я использую Arduino Uno для чтения давления, и я хочу знать, правильно ли я правильно закодировал датчик. Я не уверен, что получаю правильные показания (это могут быть правильные показания - я просто хочу проверить, что я сделал все правильно). Датчик, который я использую, является датчиком давления OspSense ™ XMLP, который считывает от 0 до 100 бар и выдает заряд 0 В (нулевые бары) до 10 В (100 бар). Из-за того, что Arduino Uno способен считывать до 5 вольт, я использовал делитель напряжения для уменьшения максимального напряжения, которое Arduino получает до 5 В.

Я прикрепил рукописную диаграмму. Дайте мне знать, если вам нужна дополнительная информация. Я подключил проводку, а также код.

 введите описание изображения здесь>> </a> </p>

<pre class = /* ReadAnalogVoltage from a OsiSense XMLP presure sensor Reads an analog input on pin 0, converts it to voltage and then bar pressure, and prints the result to the Serial Monitor and also MQTT. Graphical representation is available using Serial Plotter (Tools > Serial Plotter menu). Todo Static ip. set it to request IP from network Work out best way to average readings */ #include <SPI.h> //Serial Peripheral Interface (SPI) #include <Ethernet.h> // These libraries are designed to work with the Arduino Ethernet Shield (Ethernet.h) #include <PubSubClient.h> // This library provides a client for doing simple publish/subscribe messaging with a server that supports MQTT // sets the MAC address and IP address for the network byte mac[] = { 0xDE, 0xED, 0xBA, 0xFE, 0xFE, 0xED }; IPAddress ip(192,34,98,221); // IP Address of the client IPAddress server(192,34,98,201); // The IP address of the MQTT server void callback(char* topic, byte* payload, unsigned int length) { // handle message arrived } EthernetClient ethClient; PubSubClient client(server, 1883, callback, ethClient); void setup() { Serial.println("Begin setup"); Ethernet.begin(mac, ip); // Note - the default maximum packet size is 128 bytes. If the // combined length of clientId, username and password exceed this, // you will need to increase the value of MQTT_MAX_PACKET_SIZE in // PubSubClient.h // connects to MQTT and says hello world. Probably change this later on to something more appropriate if (client.connect("ArdRigTest")) { client.publish("outTopic","Ard Rig Test"); client.subscribe("inTopic"); } // start serial port Serial.begin(9600); } void loop() { // Note - the default maximum packet size is 128 bytes. If the // combined length of clientId, username and password exceed this, // you will need to increase the value of MQTT_MAX_PACKET_SIZE in // PubSubClient.h // 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); Serial.println(sensorValue2); //Test code. using map function int MapBarPressure; MapBarPressure = map(sensorValue2, 0, 1023, 0, 100); if (client.connect("ArdRigTest" )) { client.publish("MapBarPressure",String(MapBarPressure).c_str()); //logs the pressure of the RigTest client.subscribe("MapBarPressure"); } delay(100); // Pauses the program for the amount of time (in miliseconds) specified as parameter. (There are 1000 milliseconds in a second.) client.loop(); }

Спасибо заранее.

2 голоса | спросил resolver101 19 thEurope/Moscowp30Europe/Moscow09bEurope/MoscowTue, 19 Sep 2017 19:09:39 +0300 2017, 19:09:39

4 ответа


1

Вы можете использовать map, ref. : https://www.arduino.cc/ru/Reference/Map

  

Повторно отображает число из одного диапазона в другой. То есть, значение   fromLow будет отображаться в toLow, значение fromHigh to toHigh,   значения между промежуточными значениями и т. д.

ответил MatsK 19 thEurope/Moscowp30Europe/Moscow09bEurope/MoscowTue, 19 Sep 2017 19:11:37 +0300 2017, 19:11:37
1

Если вам нужно использовать значения дробного давления, то формула

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!

ответил jose can u c 20 thEurope/Moscowp30Europe/Moscow09bEurope/MoscowWed, 20 Sep 2017 23:47:13 +0300 2017, 23:47:13
1

О точности.

Я предполагаю, что вы прочитали @ 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);
}
ответил Jot 21 stEurope/Moscowp30Europe/Moscow09bEurope/MoscowThu, 21 Sep 2017 01:02:47 +0300 2017, 01:02:47
0

Все просто прекрасно.

Все, что вам нужно сделать, это предоставить общую землю (потенциал 0) вашему Arduino и вашему датчику.

Проблема в том, что они могут иметь другой потенциал.

Итак, просто соедините землю ваших 5 вольт и 24 вольта вместе, и все будет работать отлично.

ответил Manav 11 +03002017-10-11T20:47:28+03:00312017bEurope/MoscowWed, 11 Oct 2017 20:47:28 +0300 2017, 20:47:28

Похожие вопросы

Популярные теги

security × 330linux × 316macos × 2827 × 268performance × 244command-line × 241sql-server × 235joomla-3.x × 222java × 189c++ × 186windows × 180cisco × 168bash × 158c# × 142gmail × 139arduino-uno × 139javascript × 134ssh × 133seo × 132mysql × 132