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

Hinweis: der ursprüngliche Beitrag ist mehr als 6 Monate alt. Bitte hier nur auf die ursprüngliche Frage antworten, für neue Fragen einen neuen Beitrag erstellen.

Formatierung
  • [c]C-Code[/c]
  • [code]Code in anderen Sprachen, ASCII-Zeichnungen[/code]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] – Link zu einem Artikel
  • Verweis auf einen anderen Beitrag: Rechtsklick auf dessen Beitrags-ID (#8078628), „Adresse kopieren“, in den Text einfügen

Mehr zur Formatierung

Längeren Sourcecode als Anhang, nicht in den Text. JPG nur für Fotos und Scans; Zeichnungen und Screenshots als PNG oder GIF. Siehe Bildformate.

Schon registriert? Anmelden

Wird nicht angezeigt. Wir schicken dir einen Link; sobald du damit bestätigst, erscheint dein Beitrag.

Mit dem Abschicken legst du einen kostenlosen Account an und erkennst die Nutzungsbedingungen und die Datenschutzerklärung an.