[Megoldva] Arduino C++ iterate objectumokon

Sziasztok

A kérdésem a következő:

#include <Adafruit_MCP23008.h>

Adafruit_MCP23008 mcp0; // Create mpc instance
Adafruit_MCP23008 mcp1; // Create mpc instance
Adafruit_MCP23008 mcp2; // Create mpc instance

#define button 0                // PushButton
#define laser 1                 // Laser Diode On
#define redLedO 2                // Red Led OUT
#define greenLedO 3              // Green Led OUT
#define photoDiode 5            // Photo Diode
#define redLedI 6                // Red Led IN
#define greenLedI 7              // Green Led IN

void setup() {

  char mcpName0 = "mcp0";
  char mcpName1 = "mcp1";
  char mcpName2 = "mcp2";
  String *Names[3] = { &mcpName0, &mcpName1, &mcpName2 };

  int i = 0;
  for (auto a : Names) {
    *a -> begin(i); // 0,1,2 = 0x20,0x21,0x22   address
    *a -> pinMode(button, INPUT);
    *a -> pullUp(button, HIGH);

    // vagy így
    
    *a.pinMode(laser, OUTPUT);
    *a.pinMode(redLedO, OUTPUT);
    *a.pinMode(greenLedO, OUTPUT);
    *a.pinMode(photoDiode, INPUT);
    *a.pinMode(redLedI, OUTPUT);
    *a.pinMode(greenLedI, OUTPUT);
    i++;
  }
}

A fenti módszer nem működik.
Így működik:
mcp0.begin(0);
mcp0.pinMode(button, INPUT);
Elég macerás volt háromszor minden szenzort led-et meg nyomógombot lekezelni.

Nem élet-halál kérdés csak érdekelne a megoldás (ha van), de semmilyen módszert nem találtam rá.

Előre is köszönöm a segítséget.

Hozzászólások

Hat, ize, az mcp0 az egy objektumpeldany es nem egy string... Amit csinalnal a fenti ciklusos megoldassal az az hogy "mcp0".begin(0); de ugye a stringnek nincs ilyen metodusa :)

Az Adafruit_MCP23008 tipusu objektumokat tedd bele egy tombbe es akkor ugy!

Szerkesztve: 2022. 10. 03., h – 13:53

Miért kéne működnie? Az a-ban stringek vannak, nem Adafruit_MCP23008 típusú elemek.

Ha esetleg így próbálnád meg:
 

Adafruit_MCP23008* Names[3] = { mcp0, mcp1, mcp2 };

akkor a ciklusod valóban Adafruit_MCP23008 típusú elemeken iterálna végig.

Tanuldd még kicsit a C++ nyelvet, ennek semmi köze Arduinohoz.

 

Eleve deklarálhattad volna a három objektumot tömbben is, nem kell külön létezzen az mcp0, mcp1, mcp2 változó.

Így működik babán. Köszi.
static Adafruit_MCP23008 mcpNames[1] = { Adafruit_MCP23008() }

void setup(){

 int i = 1;
 for (auto &a : mcpNames) {
    a.begin(i);
    a.pinMode(redLedO, OUTPUT);
    a.pinMode(greenLedO, OUTPUT);
 }

}

void loop(){
  for (auto &a : mcpNames) {
    a.digitalWrite(redLedO, HIGH);
    delay(500);
    a.digitalWrite(redLedO, LOW);
    delay(500);
 }
}
Összeraktam a régi panelt, és ég forog világít.

Egy tanács: tanuld meg alaposan a C++ nyelvet, mert látszik, hogy a kódot másoltad valahonnan, hiszen nem érted, melyik része mit csinál, és miért nem működött az eredeti elképzelésed.

Ha ilyen beágyazott eszközöket szeretnél magas szinten programozni, tényleg vesd bele magad a C++ megtanulásába.