Показания датчика давления ESP32 (RFP602 )

Я использую два датчика RFP602. Один подключен к GPIO2, другой к GPIO4, каждый подключен к сопротивлению 1 МОм. Датчик, подключенный к GPIO2, считывает данные так, как мне нужно. Мне приходится немного нажимать, чтобы что-то прочитать, но когда я касаюсь GPIO4, значения подскакивают до огромных значений (1200, 3400 и т. д.). Интересно то, что я переместил датчик с GPIO4 на GPIO2 и начал правильно считывать значения. Я подключил другой датчик к каждому выводу АЦП, но это не сработало. Почему на GPIO2 всё работает так, как мне нужно?

Вот код из Main

#include "SensorDHT11.h"
#include "SensorRFP602.h"
#include "SensorMPU6050.h"
#include "SensorGPS.h"
#include "BluetoothSerial.h"

BluetoothSerial serialBT;

#pragma region Sensors
SensorRFP602 sensorRFP602(4); //Аналоговый вывод D4
SensorRFP602 sensorRFP602No2(2);
SensorGPS sensorGPS(16, 17);
SensorMPU6050 sensorMPU6050;
#pragma endregion Sensors

#pragma region MillisInterval
unsigned long previousMillisDHT11 = 0UL;
unsigned long previousMillisRFP602 = 0UL;
unsigned long previousMillisRFP602_2 = 0UL;
unsigned long previousMillisMPU6050 = 0UL;
unsigned long previousMillisNEO6M = 0UL;

unsigned long DHT11_interval = 5000UL;
unsigned long RFP602_interval = 1000UL;
unsigned long RFP602_interval_2 = 1000UL;
unsigned long MPU6050_interval = 100UL;
unsigned long NEO6M_interval = 5000UL;
#pragma endregion MillisInterval

//Esantionare!!

void setup() {
  
  serialBT.begin("ESP32");
  delay(2000);
  sensorRFP602.readData();
  sensorRFP602No2.readData();
  sensorMPU6050.readData();
  sensorGPS.readData();
}

void loop() {
  unsigned long currentMillis = millis();


  if(currentMillis - previousMillisRFP602 > RFP602_interval)
  {
    sensorRFP602.readData();

    previousMillisRFP602 = currentMillis;
  }

  if(currentMillis - previousMillisRFP602_2 > RFP602_interval_2)
  {
    sensorRFP602No2.readData();

    previousMillisRFP602_2 = currentMillis;
  }

  if(currentMillis - previousMillisMPU6050 > MPU6050_interval)
  {
    sensorMPU6050.readData(); 
    previousMillisMPU6050 = currentMillis;
  }

  if(currentMillis - previousMillisNEO6M > NEO6M_interval)
  {
    sensorGPS.readData();

    previousMillisNEO6M = currentMillis;
  }
}

А вот метод readDAta().

#include <Arduino.h>
#include <ArduinoJson.h>
#include "BluetoothSerial.h"
#include "SensorRFP602.h"

BluetoothSerial serialBT_RFP602;

SensorRFP602::SensorRFP602(int pin) : pin(pin) 
{
    this -> pin = pin;
}

void SensorRFP602::readData()
{
    StaticJsonDocument<200> docRFP602;
    
    serialBT_RFP602.begin();
    int analogPressure = analogRead(pin); 

    if(isnan(analogPressure))
    {
        docRFP602["dataRFP602"]["noData"] = "Failed to read data from RFP602 sensor!";
        return;
    }

    docRFP602["sensorType"] = "RFP602";
    docRFP602["timeStamp"] = millis();
    docRFP602["dataRFP602"]["analogPressureValue"] = analogPressure;

    String outputRFP602;
    serializeJson(docRFP602, outputRFP602);
    
    //Serial.println(outputRFP602);
    serialBT_RFP602.println(outputRFP602);
}

, 👍0

Обсуждение

сократите вашу программу до простейшего кода, который считывает аналоговое напряжение и выводит его на последовательный монитор, @jsotola

Явно настройте контакты GPIO как аналоговые входы в setup()., @liaifat85


1 ответ


Лучший ответ:

0

Вы не указали, какую плату ESP32 вы используете, но, как правило, GPIO2 — один из контактов Strapping для загрузки, к которому подключен подтягивающий резистор. На многих платах также установлен светодиод, последовательно подключенный к подтягивающему резистору, для мигания. Если вы считаете, что GPIO2 работает как надо, то, вероятно, это связано с тем, что внешний подтягивающий резистор вместе с RFP602 и упомянутым вами резистором 1 МОм образуют делитель напряжения на входе АЦП.

Выводы GPIO2 и GPIO4 принадлежат АЦП2, который не может использоваться в качестве АЦП при включённом Wi-Fi. Рекомендуется использовать выводы АЦП1 (выводы 32–35).

каждый подключен к сопротивлению 1 МОм

Я подключил другой датчик к каждому выводу АЦП, но это не сработало.

Оба варианта указывают на неправильное подключение датчика. Датчик силы давления (FPS), такой как RFP602, по сути, представляет собой резистор, поэтому для измерения значения с помощью АЦП ему необходим делитель напряжения, настроенный таким образом, чтобы выходное напряжение делителя напряжения, используемого в качестве входа АЦП, находилось в диапазоне АЦП, с которым это напряжение может быть измерено. В руководстве FSR Arduino Tutorial подробно описано, как использовать FPS с Arduino, поэтому я не буду повторяться.

,

Привет! Спасибо за ответ. Мне удалось решить проблему, подключив резистор 10 кОм между GPIO4 и GND. Измерив сопротивление между GPIO2 и GND, я получил 9,9 кОм, но между GPIO4 и GND оно составило 70 кОм. Поэтому я решил уменьшить его до 9,9 кОм, и это сработало :D, @Toderita Teodor