Having issues when attempting to declare constant variable in arduino

335 Views Asked by At

I am making a fairly simple script for sound on my arduino. Here's my script:

#include <digitalWriteFast.h>

struct AudioHandler {
  //Alter these as you require
  const int pin = 2;
  float frequency = 1;
  float dutyCycle = 1;
    
  //These are internal variables that you shouldn't touch
  unsigned long prevMicros = 0;
  bool onHalf = true;  //This just asks which half of the wave the sound is on
  
  //This just checks the time and asks if it should switch to the other half of the wave
  void updateSound() {
    if ((micros() - prevMicros > (1000000 / frequency) * dutyCycle) && (onHalf)) {
      prevMicros = micros();
      onHalf = false;
      
      digitalWriteFast(pin,false);
    } else if ((micros() - prevMicros > (1000000 / frequency) * (1 - dutyCycle)) && (!onHalf)) {
      prevMicros = micros();
      onHalf = true;
      
      digitalWriteFast(pin,true);
    }
  }
};

AudioHandler test_1;
AudioHandler test_2;
AudioHandler test_3;
AudioHandler test_4;

void setup() {
  pinModeFast(3,OUTPUT); test_1.frequency = 65.41; test_1.dutyCycle = 0.5;
  pinModeFast(4,OUTPUT); test_2.frequency = 82.41; test_2.dutyCycle = 0.5;
  pinModeFast(5,OUTPUT); test_3.frequency = 98.00; test_3.dutyCycle = 0.5;
  pinModeFast(6,OUTPUT); test_4.frequency = 130.81; test_4.dutyCycle = 0.5;

  //I need to set the pin, but couldn't figure out how to do it in struct declaration
  //Also, this 
  int *pinPointer_1; pinPointer_1 = &test_1.pin; *pinPointer_1 = 3;
  int *pinPointer_2; pinPointer_2 = &test_2.pin; *pinPointer_2 = 4;
  int *pinPointer_3; pinPointer_3 = &test_3.pin; *pinPointer_3 = 5;
  int *pinPointer_4; pinPointer_4 = &test_4.pin; *pinPointer_4 = 6;
}

void loop() {
  test_1.updateSound();
  test_2.updateSound();
  test_3.updateSound();
  test_4.updateSound();
}

Effectively my script SHOULD work fine, but the arduino IDE is complaining:

Warning: Board breadboard:avr:atmega328bb doesn't define a 'build.board' preference. Auto-set to: AVR_ATMEGA328BB
C:\Users\aj200\Documents\GitHub\My-Projects\My-Projects\Active Projects\Sound_PWM_Help\Sound_PWM_Help.ino: In member function 'updateSound':

Sound_PWM_Help:19:7: error: call to 'NonConstantUsed' declared with attribute error: 

       digitalWriteFast(pin,false);

       ^

Sound_PWM_Help:24:7: error: call to 'NonConstantUsed' declared with attribute error: 

       digitalWriteFast(pin,true);

       ^

lto-wrapper.exe: fatal error: C:\Program Files (x86)\Arduino\hardware\tools\avr/bin/avr-gcc returned 1 exit status

compilation terminated.

c:/program files (x86)/arduino/hardware/tools/avr/bin/../lib/gcc/avr/7.3.0/../../../../avr/bin/ld.exe: error: lto-wrapper failed

collect2.exe: error: ld returned 1 exit status

exit status 1
call to 'NonConstantUsed' declared with attribute error: 

In theory, this should be complete and functional. HOWEVER, for some reason the arduino compiler is saying that the variable "pin" is not constant (digitalWriteFast(pin,state) requires constant value annoyingly). What am I missing here?

Thanking you in advance, Andrey

1

There are 1 best solutions below

0
On BEST ANSWER

Why don't you create a struct constructor to assign the pins. Then a setup method could define them as pins using pinModeFast()

This is my take on this. Compiled successfully for Arduino Uno and Leonardo but untested for now. To me, it looks cleaner and easier to follow and grow

#include <digitalWriteFast.h>

struct AudioHandler {
  //Alter these as you require
  int _pin;
  float frequency;
  float dutyCycle;

  AudioHandler(int pin){
    
    _pin = pin;
    
    }

  //These are internal variables that you shouldn't touch
  unsigned long prevMicros = 0;
  bool onHalf = true;  //This just asks which half of the wave the sound is on

  //This just checks the time and asks if it should switch to the other half of the wave
  void updateSound() {
    if ((micros() - prevMicros > (1000000 / frequency) * dutyCycle) && (onHalf)) {
      prevMicros = micros();
      onHalf = false;

      digitalWriteFast(_pin, LOW);    // Changed from false
    } else if ((micros() - prevMicros > (1000000 / frequency) * (1 - dutyCycle)) && (!onHalf)) {
      prevMicros = micros();
      onHalf = true;

      digitalWriteFast(_pin, HIGH);  // Changed from true
    }
  }

  void setup(int freq, int duty){
    
    pinModeFast(_pin, OUTPUT);

    frequency = freq;
    dutyCycle = duty;
    
    
    }
};

// Instantiate your audio handlers passing the pin number according to the constructor

AudioHandler test_1 = AudioHandler(3);
AudioHandler test_2 = AudioHandler(4);
AudioHandler test_3 = AudioHandler(5);
AudioHandler test_4 = AudioHandler(6);

void setup() {
      
  // Set them up passing frequency and duty cycle

  test_1.setup(65.41,0.5);   
  test_2.setup(82.41, 0.5);   
  test_3.setup(98.00, 0.5);   
  test_4.setup(130.81,0.5);

}

void loop() {
  test_1.updateSound();
  test_2.updateSound();
  test_3.updateSound();
  test_4.updateSound();
}