Hulp om sketch naar tabbladen in te delen

Hallo,

Ik zou graag onderstaande sketch willen indelen in verschillende tabbladen. Dus een hoofdtab en dan aparte onderdelen zodat ik een beter overzicht krijg van wat wat is. Kan/wil er mij op weg helpen? Hartelijk bedankt.

#include <Wire.h>               // Library for I2C communication
#include <LiquidCrystal_I2C.h>  // Library for LCD

// Wiring: SDA pin is connected to A4 and SCL pin to A5.
// Connect to LCD via I2C, default address 0x27 (A0-A2 not jumpered)
LiquidCrystal_I2C lcd = LiquidCrystal_I2C(0x27, 16, 2);  // for 16x2 LCD.

const int motor1pin1 = 11;
const int motor1pin2 = 12;
const int startStopButtonPin = 4;
const int modeButtonPin = 5;
const int selectButtonPin = 6;
const int upButtonPin = 7;
const int downButtonPin = 8;
const int enaPin = 9;
const byte interruptPin = 2;

const int SPEC_SUMMARY = 0;
const int WINDINGS_EDIT = 1;
const int DIRECTION_EDIT = 2;
const int AUTO_STOP_EDIT = 3;

const int RUN_MODE = 42;
const int SPEC_MODE = 84;
const int CLOCKWISE = 1;
const int ANTI_CLOCKWISE = 2;

boolean runMode = true;
boolean shouldBeRunning = false;
boolean shouldRedraw = true;

boolean clockwise = true;
boolean autoStop = true;
unsigned long desiredWindingCount = 4500;
volatile unsigned long totalRevolutions = 0;

int currentSpecSelection = 0;

struct ButtonModeStruct {
  int pin;
  int buttonState;
  int lastButtonState = LOW;

  // the following variables are unsigned longs because the time, measured in
  // milliseconds, will quickly become a bigger number than can be stored in an int.
  unsigned long lastDebounceTime = 0;  // the last time the output pin was toggled
  unsigned long debounceDelay = 75;    // the debounce time; increase if the output flickers
};

typedef struct ButtonModeStruct ButtonMode;

ButtonMode startStopButton;
ButtonMode modeButton;
ButtonMode selectButton;
ButtonMode upButton;
ButtonMode downButton;

void setup() {

  lcd.init();
  lcd.backlight();

  Serial.begin(9600);

  // These two govern direction
  pinMode(motor1pin1, OUTPUT);
  pinMode(motor1pin2, OUTPUT);

  pinMode(enaPin, OUTPUT);  //PWM for averaged voltage, therefore motor speed

  pinMode(startStopButtonPin, INPUT);

  startStopButton.pin = startStopButtonPin;
  modeButton.pin = modeButtonPin;
  selectButton.pin = selectButtonPin;
  upButton.pin = upButtonPin;
  downButton.pin = downButtonPin;

  attachInterrupt(digitalPinToInterrupt(interruptPin), count, RISING);
}

void loop() {

  checkModeButton(&modeButton);

  if (runMode) {
    currentSpecSelection = 0;
    checkStartStopButton();

    renderRevCount();

    if (shouldBeRunning) {
      startMotor();
    } else {
      stopMotor();
    }

    if (shouldRedraw) {
      renderRunModeDisplay();
      shouldRedraw = false;
    }

    // Use this for reset when in run mode
    checkDownButton(&downButton);

  } else {

    stopMotor();

    totalRevolutions = 0;

    checkSelectButton(&selectButton);

    checkUpButton(&upButton);
    checkDownButton(&downButton);

    if (shouldRedraw) {
      renderSpecModeDisplay();
      shouldRedraw = false;
    }
  }

  delay(1);
}

void renderRevCount() {
  lcd.setCursor(9, 1);
  lcd.print("#:");
  lcd.print(totalRevolutions);
  lcd.print("        ");
}

void count() {
  totalRevolutions++;
  if (autoStop) {
    if (totalRevolutions > desiredWindingCount) {
      shouldBeRunning = false;
      totalRevolutions = 0;
    }
  }
}

void renderAutoStop() {
  //autostop
  lcd.setCursor(10, 0);
  lcd.print("Auto:");
  if (autoStop) {
    lcd.print("Y");
  } else {
    lcd.print("N");
  }
}

void renderCount() {

  //count
  lcd.setCursor(0, 1);
  lcd.print("No.:");
  lcd.setCursor(4, 1);
  lcd.print("      ");
  lcd.setCursor(4, 1);
  lcd.print(desiredWindingCount);
}

void renderDirection() {
  //direction
  lcd.setCursor(10, 1);
  lcd.print("Dir:");
  if (clockwise) {
    lcd.print("CW");
  } else {
    lcd.print("CC");
  }
}

void renderSpecModeLabel() {
  lcd.setCursor(0, 0);
  lcd.print("Mode:SPEC   ");
}


void renderEditModeLabel() {
  lcd.setCursor(0, 0);
  lcd.print("Mode:EDIT   ");
}

void renderSpecModeDisplay() {

  if (currentSpecSelection == SPEC_SUMMARY) {
    lcd.clear();
    renderSpecModeLabel();
    renderAutoStop();
    renderCount();
    renderDirection();
  }

  if (currentSpecSelection == WINDINGS_EDIT) {
    lcd.clear();
    renderEditModeLabel();
    renderCount();
  }

  if (currentSpecSelection == DIRECTION_EDIT) {
    lcd.clear();
    renderEditModeLabel();
    renderDirection();
  }

  if (currentSpecSelection == AUTO_STOP_EDIT) {
    lcd.clear();
    renderEditModeLabel();
    renderAutoStop();
  }
}

void renderRunModeDisplay() {
  lcd.setCursor(0, 0);
  lcd.print("Mode:RUN            ");
  renderCount();
}

void checkSelectButton(ButtonMode* button) {
  // read the state of the switch into a local variable:
  int reading = digitalRead(button->pin);

  // If the switch changed, due to noise or pressing:
  if (reading != button->lastButtonState) {
    // reset the debouncing timer
    button->lastDebounceTime = millis();
  }

  if ((millis() - button->lastDebounceTime) > button->debounceDelay) {
    // whatever the reading is at, it's been there for longer than the debounce
    // delay, so take it as the actual current state:

    // if the button state has changed:
    if (reading != button->buttonState) {
      button->buttonState = reading;

      // only toggle the LED if the new button state is HIGH
      if (button->buttonState == HIGH) {

        if (currentSpecSelection == 4) {
          currentSpecSelection = 0;
        } else {
          currentSpecSelection = currentSpecSelection + 1;
        }

        shouldRedraw = true;
      }
    }
  }

  // save the reading. Next time through the loop, it'll be the lastStartStopButtonState:
  button->lastButtonState = reading;
}

void handleUpButton() {
  if (currentSpecSelection == WINDINGS_EDIT) {
    desiredWindingCount = desiredWindingCount + 100;
    if (desiredWindingCount < 100) {
      desiredWindingCount = 100;
    }
  }

  if (currentSpecSelection == DIRECTION_EDIT) {
    clockwise = true;
  }

  if (currentSpecSelection == AUTO_STOP_EDIT) {
    autoStop = true;
  }
}

void handleDownButton() {
  if (currentSpecSelection == WINDINGS_EDIT) {
    desiredWindingCount = desiredWindingCount - 100;
    if (desiredWindingCount < 100) {
      desiredWindingCount = 100;
    }
  }

  if (currentSpecSelection == DIRECTION_EDIT) {
    clockwise = false;
  }

  if (currentSpecSelection == AUTO_STOP_EDIT) {
    autoStop = false;
  }

  if (runMode) {
    totalRevolutions = 0;
  }
}

void checkDownButton(ButtonMode* button) {
  // read the state of the switch into a local variable:
  int reading = digitalRead(button->pin);

  // If the switch changed, due to noise or pressing:
  if (reading != button->lastButtonState) {
    // reset the debouncing timer
    button->lastDebounceTime = millis();
  }

  if ((millis() - button->lastDebounceTime) > button->debounceDelay) {
    // whatever the reading is at, it's been there for longer than the debounce
    // delay, so take it as the actual current state:

    // if the button state has changed:
    if (reading != button->buttonState) {
      button->buttonState = reading;

      // only toggle the LED if the new button state is HIGH
      if (button->buttonState == HIGH) {
        handleDownButton();
        shouldRedraw = true;
      }
    }
  }

  // save the reading. Next time through the loop, it'll be the lastStartStopButtonState:
  button->lastButtonState = reading;
}

void checkUpButton(ButtonMode* button) {
  // read the state of the switch into a local variable:
  int reading = digitalRead(button->pin);

  // If the switch changed, due to noise or pressing:
  if (reading != button->lastButtonState) {
    // reset the debouncing timer
    button->lastDebounceTime = millis();
  }

  if ((millis() - button->lastDebounceTime) > button->debounceDelay) {
    // whatever the reading is at, it's been there for longer than the debounce
    // delay, so take it as the actual current state:

    // if the button state has changed:
    if (reading != button->buttonState) {
      button->buttonState = reading;

      // only toggle the LED if the new button state is HIGH
      if (button->buttonState == HIGH) {
        handleUpButton();
        shouldRedraw = true;
      }
    }
  }

  // save the reading. Next time through the loop, it'll be the lastStartStopButtonState:
  button->lastButtonState = reading;
}

void checkModeButton(ButtonMode* button) {
  // read the state of the switch into a local variable:
  int reading = digitalRead(button->pin);

  // If the switch changed, due to noise or pressing:
  if (reading != button->lastButtonState) {
    // reset the debouncing timer
    button->lastDebounceTime = millis();
  }

  if ((millis() - button->lastDebounceTime) > button->debounceDelay) {
    // whatever the reading is at, it's been there for longer than the debounce
    // delay, so take it as the actual current state:

    // if the button state has changed:
    if (reading != button->buttonState) {
      button->buttonState = reading;

      // only toggle the LED if the new button state is HIGH
      if (button->buttonState == HIGH) {
        runMode = !runMode;
        shouldRedraw = true;
        if (runMode) {
          Serial.println("run");
        } else {
          Serial.println("spec");
        }
      }
    }
  }

  // save the reading. Next time through the loop, it'll be the lastStartStopButtonState:
  button->lastButtonState = reading;
}

void checkStartStopButton() {
  // read the state of the switch into a local variable:
  int reading = digitalRead(startStopButton.pin);

  // If the switch changed, due to noise or pressing:
  if (reading != startStopButton.lastButtonState) {
    // reset the debouncing timer
    startStopButton.lastDebounceTime = millis();
  }

  if ((millis() - startStopButton.lastDebounceTime) > startStopButton.debounceDelay) {
    // whatever the reading is at, it's been there for longer than the debounce
    // delay, so take it as the actual current state:

    // if the button state has changed:
    if (reading != startStopButton.buttonState) {
      startStopButton.buttonState = reading;

      // only toggle the LED if the new button state is HIGH
      if (startStopButton.buttonState == HIGH) {
        shouldBeRunning = !shouldBeRunning;
      }
    }
  }

  // save the reading. Next time through the loop, it'll be the lastStartStopButtonState:
  startStopButton.lastButtonState = reading;
}

void startMotor() {
  if (clockwise) {
    digitalWrite(motor1pin1, HIGH);
    digitalWrite(motor1pin2, LOW);
  } else {
    digitalWrite(motor1pin1, LOW);
    digitalWrite(motor1pin2, HIGH);
  }
  analogWrite(enaPin, 255);
}

void stopMotor() {
  analogWrite(enaPin, 0);
}
  • Je hebt een aantal functies met namen als "checkxxxButton()" en "handlexxxButton()" e.d. die dudelijk bij de UI (user interface) horen; die zou ik in de hoofdmodule laten staan.
  • Functies als "renderxxx()" etc. zou je kunnen verplaatsen naar een nieuwe module (bv. "enneb_lcd.cpp"), omdat die allemaal met de lcd van doen hebben. Maak ook een bestand "enneb_lcd.h" waarin je de functies definieert. Je kunt nu de regel "#include <enneb_lcd.h>" aan je sketch toevoegen, het werkt net zo als een library.
  • Idem voor startMotor() en stopMotor(): motoraansturing ook naar een aparte module.

Bijkomend voordeel is dat je deze libraries ook weer gemakkelijk kunt include'n in een volgend project.

Er zijn twee opties als je met meerdere tabbladen werkt.

  1. Je kunt meerdere ino bestanden gebruiken.
    • Als je het tabblad toevoegd geef je het een naam zonder extensie; de extensie wordt automatisch toegevoegd aan de naam.
    • De IDE combineert alle ino bestanden in één grote file voordat de eigenlijke compilatie begint.
    • Het voordeel is dat dit min of meer transparant is.
    • Het grote (!!) nadeel is dat het de IDE het niet altijd in de juiste volgorde zet in het bestand dat uiteindelijk gecompileerd wordt en je compileer fouten krijgt.
  2. Je kunt met .h en .cpp bestanden gaan werken.
    • Voor iedere 'groep' maak je een .h en een .cpp bestand. Het .h. bestand moet je includen in de bestanden waar je gebruik wilt maken van functies van die groep.
    • Het ino bestand en Ieder cpp bestand worden apart gecompileerd. Daarom weet ider bestand niets van de variabelen en andere bestanden,
    • Nadeel is dat het wat meer werk is. Je moet .h bestanden gaan maken om bv. functie prototypes te creëren.
    • Voordeel is dat je het nadeel van de (1) voorkomt.

Voorbeelden
1) Het eerste deel van het uiteindelijke bestand dat voor je originele programma gecompileerd wordt:

#include <Arduino.h>
#line 1 "C:\\Users\\Wim\\Documents\\Arduino\\Forums\\1199022_multipleTabs\\original\\original.ino"
#include <Wire.h>               // Library for I2C communication
#include <LiquidCrystal_I2C.h>  // Library for LCD

// Wiring: SDA pin is connected to A4 and SCL pin to A5.
// Connect to LCD via I2C, default address 0x27 (A0-A2 not jumpered)
LiquidCrystal_I2C lcd = LiquidCrystal_I2C(0x27, 16, 2);  // for 16x2 LCD.

const int motor1pin1 = 11;
const int motor1pin2 = 12;
const int startStopButtonPin = 4;
const int modeButtonPin = 5;
const int selectButtonPin = 6;
const int upButtonPin = 7;
const int downButtonPin = 8;
const int enaPin = 9;
const byte interruptPin = 2;

const int SPEC_SUMMARY = 0;
const int WINDINGS_EDIT = 1;
const int DIRECTION_EDIT = 2;
const int AUTO_STOP_EDIT = 3;

const int RUN_MODE = 42;
const int SPEC_MODE = 84;
const int CLOCKWISE = 1;
const int ANTI_CLOCKWISE = 2;

boolean runMode = true;
boolean shouldBeRunning = false;
boolean shouldRedraw = true;

boolean clockwise = true;
boolean autoStop = true;
unsigned long desiredWindingCount = 4500;
volatile unsigned long totalRevolutions = 0;

int currentSpecSelection = 0;

struct ButtonModeStruct
{
  int pin;
  int buttonState;
  int lastButtonState = LOW;

  // the following variables are unsigned longs because the time, measured in
  // milliseconds, will quickly become a bigger number than can be stored in an int.
  unsigned long lastDebounceTime = 0;  // the last time the output pin was toggled
  unsigned long debounceDelay = 75;    // the debounce time; increase if the output flickers
};

typedef struct ButtonModeStruct ButtonMode;

ButtonMode startStopButton;
ButtonMode modeButton;
ButtonMode selectButton;
ButtonMode upButton;
ButtonMode downButton;

#line 59 "C:\\Users\\Wim\\Documents\\Arduino\\Forums\\1199022_multipleTabs\\original\\original.ino"
void setup();
#line 84 "C:\\Users\\Wim\\Documents\\Arduino\\Forums\\1199022_multipleTabs\\original\\original.ino"
void loop();
#line 136 "C:\\Users\\Wim\\Documents\\Arduino\\Forums\\1199022_multipleTabs\\original\\original.ino"
void renderRevCount();
#line 144 "C:\\Users\\Wim\\Documents\\Arduino\\Forums\\1199022_multipleTabs\\original\\original.ino"
void count();
#line 157 "C:\\Users\\Wim\\Documents\\Arduino\\Forums\\1199022_multipleTabs\\original\\original.ino"
void renderAutoStop();
#line 172 "C:\\Users\\Wim\\Documents\\Arduino\\Forums\\1199022_multipleTabs\\original\\original.ino"
void renderCount();
#line 184 "C:\\Users\\Wim\\Documents\\Arduino\\Forums\\1199022_multipleTabs\\original\\original.ino"
void renderDirection();
#line 199 "C:\\Users\\Wim\\Documents\\Arduino\\Forums\\1199022_multipleTabs\\original\\original.ino"
void renderSpecModeLabel();
#line 206 "C:\\Users\\Wim\\Documents\\Arduino\\Forums\\1199022_multipleTabs\\original\\original.ino"
void renderEditModeLabel();
#line 212 "C:\\Users\\Wim\\Documents\\Arduino\\Forums\\1199022_multipleTabs\\original\\original.ino"
void renderSpecModeDisplay();
#line 246 "C:\\Users\\Wim\\Documents\\Arduino\\Forums\\1199022_multipleTabs\\original\\original.ino"
void renderRunModeDisplay();
#line 253 "C:\\Users\\Wim\\Documents\\Arduino\\Forums\\1199022_multipleTabs\\original\\original.ino"
void checkSelectButton(ButtonMode* button);
#line 297 "C:\\Users\\Wim\\Documents\\Arduino\\Forums\\1199022_multipleTabs\\original\\original.ino"
void handleUpButton();
#line 319 "C:\\Users\\Wim\\Documents\\Arduino\\Forums\\1199022_multipleTabs\\original\\original.ino"
void handleDownButton();
#line 346 "C:\\Users\\Wim\\Documents\\Arduino\\Forums\\1199022_multipleTabs\\original\\original.ino"
void checkDownButton(ButtonMode* button);
#line 381 "C:\\Users\\Wim\\Documents\\Arduino\\Forums\\1199022_multipleTabs\\original\\original.ino"
void checkUpButton(ButtonMode* button);
#line 416 "C:\\Users\\Wim\\Documents\\Arduino\\Forums\\1199022_multipleTabs\\original\\original.ino"
void checkModeButton(ButtonMode* button);
#line 459 "C:\\Users\\Wim\\Documents\\Arduino\\Forums\\1199022_multipleTabs\\original\\original.ino"
void checkStartStopButton();
#line 493 "C:\\Users\\Wim\\Documents\\Arduino\\Forums\\1199022_multipleTabs\\original\\original.ino"
void startMotor();
#line 508 "C:\\Users\\Wim\\Documents\\Arduino\\Forums\\1199022_multipleTabs\\original\\original.ino"
void stopMotor();
#line 59 "C:\\Users\\Wim\\Documents\\Arduino\\Forums\\1199022_multipleTabs\\original\\original.ino"

Er zijn twee interessante delen; de eerste is dat 'Arduino.h' ge-include wordt op de eerste regel; dit zorgt ervoor dat zaken zoals digitaleWrite(), LOW ern HIGH bekend zijn. De tweede zijn de regels volgend op #line; bv

#line 136 "C:\\Users\\Wim\\Documents\\Arduino\\Forums\\1199022_multipleTabs\\original\\original.ino"
void renderRevCount();

Dit is een zogenaamd functie prototype. Als je een functie ergens in je programma gebruikt wil de compiler weten hoe die functie eruit ziet zodat er gecontroleerd kan worden of je de juiste argument meegeeft (en, als ik me niet vergis, het juiste type terug geeft).

2) motor.ino
Creëer een tabblad 'motor'. Copiëer de twe motor functies naar dat tabblad en verwijder ze uit het hoofd ini bestand.

Als je het bestand dat nu gecompileerd wordt bekijkt zie je dt 'motor.ino' aan het eind is toegevoegd

#line 1 "C:\\Users\\Wim\\Documents\\Arduino\\Forums\\1199022_multipleTabs\\multipleIno.0.1\\motor.ino"
void startMotor()
{
  if (clockwise)
  {
    digitalWrite(motor1pin1, HIGH);
    digitalWrite(motor1pin2, LOW);
  }
  else
  {
    digitalWrite(motor1pin1, LOW);
    digitalWrite(motor1pin2, HIGH);
  }
  analogWrite(enaPin, 255);
}

void stopMotor()
{
  analogWrite(enaPin, 0);
}

Je kunt hetzelfde doen om andere functionaliteiten to groeperen (bv al je knoppen).

3) motor.h en motor.cpp
Creëer twe tabbladen, 'motor.h' en 'motor.cpp'. Plaats de twee motor functies in 'motor.cpp' (en verwijder ze uit het hoofd ino bestand).

Als je nu compileert krijgt je een hele lijst van founten omdat de compiler niks weet van de variabelen clockWise en de twee motor pinnen in 'motor.cpp'. Bv

C:\Users\Wim\Documents\Arduino\Forums\1199022_multipleTabs\multipleFiles\motor.cpp: In function 'void startMotor()':
C:\Users\Wim\Documents\Arduino\Forums\1199022_multipleTabs\multipleFiles\motor.cpp:3:7: error: 'clockwise' was not declared in this scope
   if (clockwise)

Eén van de manieren om daaromheen te werken is door de onbekende variabelen mee te geven als argumenten aan de functie

void startMotor(bool clockwise, int motor1pin1, int motor1pin2, int enaPin)
{
  if (clockwise)
  {
    digitalWrite(motor1pin1, HIGH);
    digitalWrite(motor1pin2, LOW);
  }
  else
  {
    digitalWrite(motor1pin1, LOW);
    digitalWrite(motor1pin2, HIGH);
  }
  analogWrite(enaPin, 255);
}

void stopMotor(int enaPin)
{
  analogWrite(enaPin, 0);
}

Dir is één mogelijkeid om het op te lossen, er zijn andere en betere mogelijkhden. Wees je ervan bewust dat, hoewel de namen van de argumenten dezelfde naam hebben als de variabelen in het hoofd bestand, het andere variabelen zijn.

Er zitten nu nog wat meer problemen in, bv

C:\Users\Wim\Documents\Arduino\Forums\1199022_multipleTabs\multipleFiles\motor.cpp: In function 'void startMotor(bool, int, int, int)':
C:\Users\Wim\Documents\Arduino\Forums\1199022_multipleTabs\multipleFiles\motor.cpp:5:30: error: 'HIGH' was not declared in this scope
     digitalWrite(motor1pin1, HIGH);
                              ^~~~
C:\Users\Wim\Documents\Arduino\Forums\1199022_multipleTabs\multipleFiles\motor.cpp:5:5: error: 'digitalWrite' was not declared in this scope
     digitalWrite(motor1pin1, HIGH);
     ^~~~~~~~~~~~
C:\Users\Wim\Documents\Arduino\Forums\1199022_multipleTabs\multipleFiles\motor.cpp:6:30: error: 'LOW' was not declared in this scope
     digitalWrite(motor1pin2, LOW);
                              ^~~

Dit los je op door 'Arduino.h' te includen in 'motor.cpp'.

#include <Arduino.h>

void startMotor(bool clockwise, int motor1pin1, int motor1pin2, int enaPin)
{
  if (clockwise)
  {
    digitalWrite(motor1pin1, HIGH);
    digitalWrite(motor1pin2, LOW);
  }
  else
  {
    digitalWrite(motor1pin1, LOW);
    digitalWrite(motor1pin2, HIGH);
  }
  analogWrite(enaPin, 255);
}

void stopMotor(int enaPin)
{
  analogWrite(enaPin, 0);
}

Al je problemen in 'motor.cpp' zijn nu opgelost maar helaas weet het hoofd bestand niets van deze functie. Dit ga je oplossen door 'motor.h' te includen in het hoofd bestand

Je kunt de volgende regel in het begin van hert hoof bestand zetten

#include "motor.h"

Let op dat, om een file in de sketch directory te includen je dubbele aanhalingstekens moet gebruiken.

En nu moet je 'motor.h' invullen. Je begint met een zogenaamde include guard

#ifndef _MOTOR_H_
#define _MOTOR_H_

// other stuff here

#endif

_MOTOR_H_ moet uniek zijn in het geheel. Waar de include guard voor zorgt is dat als de 'motor.h' meerdere malen include (direct of indirect) er geen problemen optreden.

Vervolgens kun je de functie prototypes toevoegen

#ifndef _MOTOR_H_
#define _MOTOR_H_

// function prototypes
void startMotor(bool clockwise, int motor1pin1, int motor1pin2, int enaPin);
void stopMotor(int enaPin);

#endif

Het laatste dat je nu moet oplossen is de aanroepen van de functies in het hoofd bestand; het hoofd bestand gebruikt nog aanroepen naar de oude functies die geen argumenten hebben. Bv je moet

    if (shouldBeRunning)
    {
      startMotor();
    }
    else
    {
      stopMotor();
    }

veranderen naar

    if (shouldBeRunning)
    {
      startMotor(clockwise, motor1pin1, motor1pin2, enaPin);
    }
    else
    {
      stopMotor(enaPin);
    }

En dat is het min-of-meer complete verhaal.Je knoppen gebeuren wordt gecompliceerder met .h en .cpp files; je struct moet dan verhuizen naar de .h file en de .h file moet ook ge-include worden in de .cpp file (anders kent de compiler de struct niet als de .cpp gecompileerd wordt)..

Of je meerdere ino bestaanden gaat gebruiken of gebruik gaat maken van .h en .cpp files is aan jou. Voor mijn eigen projecten gebruik ik .h en .cpp bestanden om het genoemde nadeel van meerdere ino bestanden absolute te voorkomen; er is een kans dat je dat probleem nooit tegenkomt en er is een kans dat je dat probleem ooit tegen komt.

PS
Sorry voor het lange verhaal.

Geen probleem hoor, alvast bedankt voor het antwoord.

Ik lees het straks nog eens een paar keer op mijn gemakje door.
Ik zit nog maar in de startblokken van arduino en ik zou graag een pickupwinder maken.
zo'n sketch kan ik nog niet helemaal zelf schrijven. Ik heb ook een versie van de sketch waar uitlegzinnen bij staan in het nederlands, maar ik vermoed dat dit hier te onoverzichtelijk word.

Ik vermoed door het in te delen in tabbladen dat ik sketch beter zal begrijpen.

Wat bedoel je juist met bv

#line1
"C:\Users\Wim\Documents\Arduino\Forums\1199022_multipleTabs\multipleIno.0.1\motor.ino"


Ik begrijp dit niet zo goed.
Dank

Dat is in het programma dat daadwerkelijk gcompileerd wordt, niet in de sketch die je schrijft; je zult dat zelf eigenlijk niet zien tenzij je ernaar gaat zoeken :wink: Het geeft aan waar de regel / regels die daarop volgt / volgen vandaan komen.

De IDE doet een aantal dingen als je compileert. De eerste stap is wat bekend staat als de "builder"; deze combineert all ino bestanden in één groot bestand. Pas daarna wordt er gecompileerd. Je kunt dat bestand vinden als je verbose output during compilation inschakelt in file → preferences.

In de output kun je dan een regel vinden die er bv ongeveer zo uit ziet

"C:\\Users\\Wim\\AppData\\Local\\Arduino15\\packages\\arduino\\tools\\avr-gcc\\7.3.0-atmel3.6.1-arduino7/bin/avr-size" -A "C:\\Users\\Wim\\AppData\\Local\\Temp\\arduino\\sketches\\79753009C027A8FE3E85BC78C40B144B/futabaSbusClass.0.3.channelInit.ino.elf"

De directory waar het uiteindelijke bestand (yourSketch.ino.cpp) is opgeslagen is een de sketch subdirectory in de directory 79753009C027A8FE3E85BC78C40B144B. Het nummer is uniek (in jouw geval zal het bijna gegarandeerd anders zijn. In het onderstaande voorbeeld (op een Windows PC) ben ik aan het werken aan een sketch die futabaSbus.0.4.channelInit heet.

Als je er niet in geinteresseerd bent kun je dit verhaal verder vergeten; het is alleen belangrijk als je problemen krijgt tengevolge van het splitsen in meerdere ino bestanden; dan kun je zien (als je weet waar je naar moet kijken) waarom het fout gaat.

PS

  1. Deze sketch heeft één .ino bestand, één .h en één .cpp bestand.
  2. Mijn gebruikersnaam op deze PC is Wim.

This topic was automatically closed 180 days after the last reply. New replies are no longer allowed.