Forum: Mikrocontroller und Digitale Elektronik Arduino analog channel index?


von Christoph M. (mchris)


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
}

von Simon G. (sigro)


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.

von Arduino F. (Firma: Gast) (arduinof)


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 vom Autor gelöscht.
von Christoph M. (mchris)


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.

von Εrnst B. (ernst)


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)

: Bearbeitet durch User
von Christoph M. (mchris)


Lesenswert?

>analogRead(0) fragt denselben Pin ab wie analogRead(14)

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

von Arduino F. (Firma: Gast) (arduinof)


Lesenswert?

Das sind keine Arduino Boards.
Das kannst du sicherlich in der zugehörigen variants Datei selber 
überprüfen.

Ich wünsche dir, dass sich der jeweilige Ersteller der Boarddefinition 
an die Arduino Vorlage gehalten hat.

: Bearbeitet durch User
von Εrnst B. (ernst)


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.

Bitte melde dich an um einen Beitrag zu schreiben. Anmeldung ist kostenlos und dauert nur eine Minute.
Bestehender Account
Schon ein Account bei Google/GoogleMail? Keine Anmeldung erforderlich!
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.