Help with Timer function

I want to use Timer to call a function that actuates my servo. However, I do not want to create a new class and complicate the setup with .h and .cpp files. The compiler does not like the use of “this” for the class instance, but since I am working with just setup(), loop(), and member functions, I don’t know how to properly construct the timer objects. I have attached my full program below.

int motor(){
    myservo.write(125);
    return 1;
}
int motorReset(){
    myservo.write(0);
    return 1;
}


int cycleP(String command){
    if(command=="Y"||command=="y"){
        
        Timer t(5, motor(), *this, true);
        Timer t2(30, motorReset(), *this, true);
        t.start();
        t2.start();
      
        myservo.write(0);
        
        return 1;    
    }
    else return -1;
}



full program

#include "Particle.h"
//following 2 lines from Particle support regarding problem with functions publishing
SYSTEM_MODE(SEMI_AUTOMATIC);
SYSTEM_THREAD(ENABLED);

Servo myservo; //unlike arduino, servo is in Particle.h so no need for #include <Servo.h>

int pos = 0;
int led1 = A5; //pin headers are treates as ints - this is why you have to read the OS API documentation! 

int cycleP(String command);
int testFunction(String arg);

unsigned long old_time = 0; //can also use uint32_t from C standard - unsigned 32 bit int
unsigned long old_time2 = 0;
//we need this in order to implement "soft delay" with millis() rather than "hard" delay()

//functions in setup are only run once - via OS API it is recommended to declare "cloud functions" as soon as possible 
//setup is also where you want to declare hardware "attaches" such assigning pins to LEDs, pumps, switches, relays, etc.
void setup(){
    
Particle.function("onOff", cycleP);
Particle.function("inputTest", testFunction);

myservo.attach(D2);
myservo.write(0);

pinMode(led1, OUTPUT);
Particle.connect();
}

void loop(){
    //following 2 if statements make the LED turn on for 1 sec then off for 5 - this allows me to know when updated firmware has flashed and device is online
    if(millis()-old_time>=1000){
        digitalWrite(led1, LOW);
        old_time = millis();
    } 
    if(millis()-old_time2>=5000){
        digitalWrite(led1, HIGH);
        old_time2 = millis();
    }
}

int testFunction(String arg){
    if(arg=="test"){
    return 1;
    }
    else return -1;
}
int motor(){
    myservo.write(125);
    return 1;
}
int motorReset(){
    myservo.write(0);
    return 1;
}


int cycleP(String command){
    if(command=="Y"||command=="y"){
        
        Timer t(5, motor(), *this, true);
        Timer t2(30, motorReset(), *this, true);
        t.start();
        t2.start();
      
        myservo.write(0);
        
        return 1;    
    }
    else return -1;
}


I was just trying *this, usually I would use just this

@ScruffR Maybe you’ve seen this before. Thanks again with your help on my first post.

That very much depends on where you are using it.

this is a pointer to an object itself but whether you need to use this or *this or this->... depends on the context in which you use it.

1 Like

Sorry, I meant to tag you on the post not the comment

BTW, you are instantiating the timers inside a function so they will vanish once you fall out of that function.

You’d also only use this overload for timer instantiation from within an class member - this is not the case here.

Ah yes “function scope”. I will try a different constructor and initialize earlier.

You can have global timers and set their period later on inside your function.

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