Think you have an overflow issue here as intermediate results do not fit in an int.
Nope works just fine in normal code.
Here is my header file
#ifndef SunSet_h
#define SunSet_h
#include "Arduino.h"
#include "SimpleTimer.h"
class SunSet
{
public:
SunSet(int Rpin,int Gpin,int Bpin, boolean Defaults);
void SetDefault();
void SetTarget(int Target, int Red, int Green, int Blue, float Dur);
void Begin();
void Update();
void Tick();
float current[4];
int Target_1[4];
int Target_2[4];
int Target_3[4];
private:
void SetTimer(int targ);
int _tick;
int pin[4];
double _Duration;
float Target_Dur[4];
float Target_1_tick[4];float Target_2_tick[4];float Target_3_tick[4];
SimpleTimer _t;
};
#endif
And my cpp
#include "SunSet.h"
SunSet::SunSet(int Rpin,int Gpin,int Bpin, boolean Defaults){
pinMode(Rpin, OUTPUT);pinMode(Gpin, OUTPUT);pinMode(Bpin, OUTPUT);
current[1] = 255;current[2] = 255;current[3] = 255;
pin[1] = Rpin;pin[2] = Gpin;pin[3] = Bpin;
_tick = 0;
if(Defaults){
analogWrite(pin[1], current[1]);analogWrite(pin[2], current[2]);analogWrite(pin[3], current[3]);
SetDefault();
}
}
void SunSet::SetDefault(){
SetTarget(1, 255,150,170,.2); // Target #, Red, Green, Blue, Time minutes
SetTarget(2, 150,0,150,.2);
SetTarget(3, 0,0,50,.2);
}
void SunSet::SetTarget(int Target, int Red, int Green, int Blue, float Dur){
int* _Target;
if(Target == 1){_Target = Target_1;}
else if (Target == 2){_Target = Target_2;}
else if (Target == 3){_Target = Target_3;}
Target_Dur[Target] = Dur;
_Target[1] = Red;_Target[2] = Green;_Target[3] = Blue;
}
void SunSet::Begin(){
//calculate Target ticks
for(int x=1;x<4;x++){
Target_1_tick[x] = (current[x] - Target_1[x])/255;
Serial.print("Target 1 ");Serial.print(x);Serial.print(" : ");Serial.println(Target_1_tick[x]);
}
SetTimer(1);
}
void SunSet::Update(){
_t.run();
}
void SunSet::SetTimer(int targ){
_t.setTimer((int)(Target_Dur[targ]*60000)/255, Tick, 255);
}
void SunSet::Tick(){
_tick ++;
//Serial.println(_tick);
if(_tick <255){//target 1
for(int x=1;x<4;x++){//calculate new current
current[x] -= Target_1_tick[x];
}
}else if(_tick <510){//target 2
if( _tick == 255){
SetTimer(2);
for(int x=1;x<4;x++){
Target_2_tick[x] = (current[x] - Target_2[x])/255;
//Serial.print("Target 2 ");Serial.print(x);Serial.print(" : ");Serial.println(Target_2_tick[x]);
}
}
for(int x=1;x<4;x++){//calculate new current
current[x] -= Target_2_tick[x];
}
}else if(_tick <765){//target 3
if( _tick == 510){
SetTimer(3);
for(int x=1;x<4;x++){
Target_3_tick[x] = (current[x] - Target_3[x])/255;
//Serial.print("Target 3 ");Serial.print(x);Serial.print(" : ");Serial.println(Target_3_tick[x]);
}
}
for(int x=1;x<4;x++){//calculate new current
current[x] -= Target_3_tick[x];
}
}
for(int x=1;x<4;x++){//write each new current to pins
//Serial.print(" Current ");Serial.print(x);Serial.print(" : ");Serial.print(current[x]);
analogWrite(pin[x], (int) current[x]);
}
}