Code mit analogref(external) in Code ohne umschreiben möglich?

Servus ich nutze den code unter

https://lastminuteengineers.com/adxl335-accelerometer-arduino-tutorial/

mit dem selben aufbau um werte aus meinem GY-61 zukriegen.... funktioniert soweit auch so gut nun habe ich allerdings das problem das wenn ich versuche eine messung in verbindung mit einem touchscreen durchzuführen das durch das analog ref die interpetation des touchscreens verschoben wird und meine dort programmierten buttons quasi verschiebt (ich nutze das elegoo tft touchshield was eben analoge pins nutzt um mit dem touchscreen und dem bildschirm kommuniziert) und mit 5V rechnet

ist es möglich die obere messung auch ohne analogRef() zu nutzen ? (geht nicht da er ja dann mit 5V die adcs betreibt)

Also die eingänge quasi so um rechnen das sie auf 3.3V bleiben der rest aber nicht? Das GY-61 board ist laut datenblatt ja radiometrisch d.h. 300mV pro G

Der oben genannte code mappt ja quasi alles auf 3.3V maximum also 0-1023 müsste man dann nicht in der lage sein mit einem gewissen umrechnungsfaktor den selben code zu verwenden?Bzw. den code umzuschreiben das er das anders umrechnet?

Und irgendwie hängt mein hirn hier gerade... eigentlich dürfte das doch nicht so schwer sein den input des sensor trotzdem in normale werte zu wandeln.... bloß irgendwie verechne ich mich andauernd...

Was hindert dich, je nach Situation, die Referenz umzuschalten?

combie:
Was hindert dich, je nach Situation, die Referenz umzuschalten?

kann ich das direkt im code machen? hatte eig gedacht die funktion wäre für void setup gedacht?

D.h. ich könnte vor dem mapping und vor dem auslesen analogref(external) und danach wieder analogref internal machen?
Quasi im genannten beispiel
int ReadAxis(int axisPin)
{
long reading = 0;
analogRead(axisPin);
delay(1);
for (int i = 0; i < sampleSize; i++)
{
analogReference(EXTERNAL);
reading += analogRead(axisPin);
analogReference(INTERNAL);
}
return reading/sampleSize;
}

Hi,

das Umschalten ist kein Problem, wenn Du aber von einer höheren externen Spannung auf eine niedrigere Interne Referenz umschaltest, brauchst Du eine Wartezeit (delay), damit die interne Referenz sich einpegeln kann, 10ms reichen bei mir (5V → 1,1V). Umgekehrt reicht 1ms.

Gruß André

Wäre genau anders rum... schalte dann quasi von den eigenen, da ich den 3.3v pin auf den ref pin habe, auf interne 5V um (arduino mega)

Aber eigentlich müsste es doch auch funktionieren wenn ich anstatt raw max = 1023 quasi auf 675 umschalte (tut es aber nicht) da 5/1023 x 3.3 = 675 was ja dann quasi das maximum wäre was mir der sensor ausgibt...

SpaghettiCode: Hi,

das Umschalten ist kein Problem, wenn Du aber von einer höheren externen Spannung auf eine niedrigere Interne Referenz umschaltest, brauchst Du eine Wartezeit (delay), damit die interne Referenz sich einpegeln kann, 10ms reichen bei mir (5V --> 1,1V). Umgekehrt reicht 1ms.

Gruß André

Habs mal getestet ... das komische ist das es nur so halb funktioniert.... Der Sensor gibt richtig alle Minus werte an, allerdings berechnet er jetzt alle positiven werte anscheinend nicht mehr un kommt wenn er im positiven g bereich sein soll nurnoch auf 0g

poste mal den geänderten Sketch.

const int xInput = A8;
const int yInput = A9;
const int zInput = A10;
float xAccel;
float yAccel;
float zAccel;
// initialize minimum and maximum Raw Ranges for each axis
int RawMin = 0;
int RawMax = 1023;

// Take multiple samples to reduce noise
const int sampleSize = 10;

void setup() 
{
  //analogReference(EXTERNAL);
  Serial.begin(9600);
}

void loop() 
{
  //Read raw values
  int xRaw = ReadAxis(xInput);
  int yRaw = ReadAxis(yInput);
  int zRaw = ReadAxis(zInput);

  // Convert raw values to 'milli-Gs"
  long xScaled = map(xRaw, RawMin, RawMax, -3000, 3000);
  long yScaled = map(yRaw, RawMin, RawMax, -3000, 3000);
  long zScaled = map(zRaw, RawMin, RawMax, -3000, 3000);
   analogReference(DEFAULT);
  // re-scale to fractional Gs
  xAccel = (float)xScaled/1000.0,2;
  yAccel = (float)yScaled/1000.0,2;
  zAccel = (float)zScaled/1000.0,2;
  
  Serial.print("X, Y, Z  :: ");
  Serial.print(xRaw);
  Serial.print(", ");
  Serial.print(yRaw);
  Serial.print(", ");
  Serial.print(zRaw);
  Serial.print(" :: ");
  Serial.print(xAccel,2);
  Serial.print("G, ");
  Serial.print(yAccel,2);
  Serial.print("G, ");
  Serial.print(zAccel,2);
  Serial.println("G");

  delay(200);
}

// Take samples and return the average
int ReadAxis(int axisPin)
{
  long reading = 0;
 analogReference(EXTERNAL);
  analogRead(axisPin);

  for (int i = 0; i < sampleSize; i++)
  {

  reading += analogRead(axisPin);

  }
  
  return reading/sampleSize;
    delay(10);
   //hatte analogref(default) auch schon hier und an anderen stellenhalf auch nichts
}

habe mehrere sachen probiert …irgendwie funktionierts nicht richtig ohne analogref im setup

Soulfly: Wäre genau anders rum... schalte dann quasi von den eigenen, da ich den 3.3v pin auf den ref pin habe, auf interne 5V um (arduino mega)

Aber eigentlich müsste es doch auch funktionieren wenn ich anstatt raw max = 1023 quasi auf 675 umschalte (tut es aber nicht) da 5/1023 x 3.3 = 675 was ja dann quasi das maximum wäre was mir der sensor ausgibt...

Sind die 3,3V direkt an den VREF Pin gelegt oder über einen Widerstand? Direkt geht nicht! Gibt im ATmega einen Kurzschluss!

Aus dem Datenblatt des ATmega 2560 (Seite 275): "If the user has a fixed voltage source connected to the AREF pin, the user may not use the other reference voltage options in the application, as they will be shorted to the external voltage. If no external voltage is applied to the AREF pin, the user may switch between AVCC, 1.1V and 2.56V as reference selection. The first ADC conversion result after switching reference voltage source may be inaccurate, and the user is advised to discard this result."

Gruß, Jürgen

direkt...

aber warum funktioniert es dann im setup modus?

Gibt es dann überhaupt eine workaround lösung? oder anderer sensor?