Search code examples
c++arduinonested-loops

function that set pin high for defined number of times and time


I have this problem where I try to set an output pin high for a set time and times.

I do the call with hapticFeedback(1000, 2, 1);

the variables are defined as

unsigned long hapticPreviousMillis = 0;
int hapticState = LOW;
int oneshotHaptic = 0;

here is the function. For some reason I only get the pin set HIGH and not the blinks and LOW


void hapticFeedback(int activeLength, int repeats, int oneshotHaptic) {  

    if (oneshotHaptic == 1) {

        for (int x = 0; x <= repeats; x++) {

           unsigned long currentMillis = millis();

           if (currentMillis - hapticPreviousMillis >= (unsigned long)activeLength) {

                hapticPreviousMillis = currentMillis;


                if (hapticState == LOW) {
                    hapticState = HIGH;
                }
                else {
                    hapticState = LOW;
                }

                digitalWrite(haptic, hapticState);
            }
        }

    }

    oneshotHaptic = 0;

}


Solution

  • So I figured it out and if anyone else is looking for this here is what I came up with. It might not be the smoothest of code but it does what I intended it to do

    in the loop I have

        if (setOneshotHaptic == 1) {
    
        hapticFeedback(activeLength);
    }
    

    and the haptic function look like this

    void hapticFeedback(int activeLength) {  
    
        unsigned long currentMillis = millis();
    
         if (currentMillis - hapticPreviousMillis >= (unsigned long)activeLength) {
    
             hapticPreviousMillis = currentMillis;
    
             if (x == repeats) {
                             setOneshotHaptic = false;
                             hapticState = HIGH;
                             x = 0;
             }
    
             if (hapticState == LOW) {
                 hapticState = HIGH;
                 x++;
             }
             else {
                 hapticState = LOW;
    
             }
    
             digitalWrite(haptic, hapticState);
    
         }
    

    }

    whenever i like to have haptic feedback i can define the following vars

        setOneshotHaptic = true;
        repeats = 3;
        activeLength = 1000;
    

    When the number of repeats has been reached I lay down the oneshot, force the output to high for it to be low by the routine and finally reset my repeat counter.

    There might be nicer ways to do this. However I couldn't find them and this works for me....