Arduino analog channel index?

OP #7683386
Lesenswert?

Ich will die analogen Kanäle für verschiedenen Prozessoren über eine Zahl von 0-N statt über das Arduino-Naming A0-Ax ansprechen.

Der Versuch mit "#ifdef" geht schief. Warum?

Wird für den Arduino-Uno compiliert, erscheinen 3 Kanäle statt deren 5.

1
#ifdef A7 
2
uint8_t adcChannels[] = {A0, A1, A2, A3, A4, A5, A6, A7};
3
#elif defined(A5) 
4
uint8_t adcChannels[] = {A0, A1, A2, A3, A4, A5};
5
#else
6
uint8_t adcChannels[] = {A0, A1, A2};
7
#endif
8

9
void setup()
10
{
11
  Serial.begin(115200);
12
}
13

14
void loop()
15
{
16
  delay(1000);
17
  for (int n = 0; n < sizeof(adcChannels); n++)
18
  {
19
    Serial.println(adcChannels[n]);
20
  }
21
  Serial.println("========");
22

23
}
#7683429
Lesenswert?

laut: https://github.com/arduino/ArduinoCore-avr/blob/master/variants/standard/pins_arduino.h

1
static const uint8_t A0 = PIN_A0;
2
static const uint8_t A1 = PIN_A1;
3
static const uint8_t A2 = PIN_A2;
4
static const uint8_t A3 = PIN_A3;
5
static const uint8_t A4 = PIN_A4;
6
static const uint8_t A5 = PIN_A5;
7
static const uint8_t A6 = PIN_A6;
8
static const uint8_t A7 = PIN_A7;

sind es keine Defines.

(Firma: Gast) #7683442
Lesenswert?

Christoph M. schrieb:

Ich will die analogen Kanäle für verschiedenen Prozessoren über eine Zahl von 0-N statt über das Arduino-Naming A0-Ax ansprechen.

Problemlos möglich!

1
void setup()
2
{
3
  Serial.begin(115200);
4
}
5
void loop()
6
{
7
  delay(1000);
8
  for (int n = 0; n < NUM_ANALOG_INPUTS; n++)
9
  {
10
    Serial.print("adcChannel: ");
11
    Serial.print(n);
12
    Serial.print("  Value: ");
13
    Serial.println(analogRead(n));
14
  }
15
  Serial.println("========");
16
}

Christoph M. schrieb:

Der Versuch mit "#ifdef" geht schief. Warum?

Brauchst du nicht!

Das "Warum?" ist klar! Du kannst mit dem Präprozessor keine C oder C++ Konstanten prüfen!

Beitrag #7683443 wurde von einem Moderator gelöscht.
OP #7683559
Lesenswert?

Du kannst mit dem Präprozessor keine C oder C++ Konstanten prüfen!

Guter Hinweis.

Arduino F. (Firma: Gast) (arduinof)

Problemlos möglich!

Nicht ganz. So sind z.B. die Anlog-Indices beim Arduino Uno A0=14
A1=15
usw. Bei anderen Boardtypen ist die Zuordnung eine andere. Ich brauche so was wie

1
uint8_t adcChannels[] = {A0, A1, A2, A3, A4, A5, A6, A7};
2

3
und dann  
4

5
uint8_t n=0;
6
uint16_t value=analogRead(adcChannels[n]); // read A0

Ich weiß, sieht ein wenig Umständlich aus. Das Ziel ist, über den index n für alle Arduino-Boards die Analogeingänge adressieren zu können.

Anwendungsbeispiel: Über die Serielle Schnittstelle kann an ein X-beliebiges Board (ohne zu wissen, was für eines) der ADC adressiert werden.

#7683565
Lesenswert?

Christoph M. schrieb:

Nicht ganz. So sind z.B. die Anlog-Indices beim Arduino Uno A0=14 A1=15 usw.

egal, analogRead nimmt sowohl eine Analog-Pin-Nummer als auch eine Kanal-Nummer, startend bei 0, als Parameter.

Das Mapping, was du gerade von extern bauen willst, ist da also schon fix und fertig drinnen.

das "analogInputToDigitalPin"-Macro Gibt dir die zugehörige Pinnummer zu dem Kanal.

d.H. analogInputToDigitalPin(0) == 14 == A0 == PIN_A0 beim Uno, und analogRead(0) fragt denselben Pin ab wie analogRead(14)

#7683598
Lesenswert?

Christoph M. schrieb:

Oh, das klingt nach Mehrdeutigkeit. Gilt das auch für die STM32-Boards https://github.com/stm32duino/Arduino_Core_STM32

die Pipicos https://github.com/earlephilhower/arduino-pico

und die ESP32-Varianten? https://github.com/espressif/arduino-esp32

nachdem du die ganzen Github-Links schon rausgesucht hast: mach ein paar Klicks weiter und schau selber nach...

Oder probier's einfach aus, analogInputToDigitalPin sollte jeder der Cores haben.

Antwort schreiben

Bitte melde dich an, um einen Beitrag zu schreiben.

oder

Mit Google-Account einloggen

Die Registrierung ist kostenlos und dauert nur eine Minute.

Jetzt registrieren