Typhon reef controller firmware

Joined
10 Aug 2012
Posts
1,131
Reaction score
16
Location
cape town
Hi all

I am wanting to upgrade / reflash the firmware on my typhon reef controller . I was messing with it and it simply stopped . The screen switches on but nothing shows and it doesn't illuminate .

PROBLEM IS ... BOOSTLED'S WEBSITE IS UNDER CONSTRUCTION AND HAS BEEN FOR A WHILE

Has anybody done this before and if yes then please could you send me the zipfile you downloaded from boostled's website

Pretty please ...
 
I found this code and flashed it to my typhon , seems to be the standard code for the typhon controller

Had serious issues with BOOSTLED as they simply don't seem interested to help
Thanks Kim for the help in sorting this controller out for me


/*
//
Typhon firmware
//
v0.2 alpha 2010-23-11
//
N. Enders, R. Ensminger
//
//
This sketch provides firmware for the Typhon LED controller.
//
It provides a structure to fade 4 independent channels of LED lighting
//
on and off each day, to simulate sunrise and sunset.
//
//
Current work in progress:
//
- store all LED variables in EEPROM so they are not reset by a loss of power
//
//
Future developments may include:
//
- moon phase simulation
//
- storm simulation
//
//
Sketch developed in Arduino-18
//
Requires LiquidCrystal, Wire, EEPROM, EEPROMVar, and Button libraries.
//
Button is available here: 301 Moved Permanently
//
EEPROMVar is available here: 301 Moved Permanently
*/

//
include the libraries:
#include <LiquidCrystal.h>
#include <Wire.h>
#include <Button.h>
#include <EEPROM.h>
#include <EEPROMVar.h>


/****
Define Variables & Constants ****/
/**************************************/

//
set the RTC's I2C address
#define
DS1307_I2C_ADDRESS 0x68
//
create the LCD
LiquidCrystal
lcd(8, 7, 5, 4, 16, 2);
//
set up backlight
int
bkl = 6; //
backlight pin
byte
bklIdle = 10; //
PWM value for backlight at idle
byte
bklOn = 70; //
PWM value for backlight when on
int
bklDelay = 10000; //
ms for the backlight to idle before turning off
unsigned long
bklTime = 0; //
counter since backlight turned on
//
create the menu counter
int
menuCount = 1;
int
menuSelect = 0;
//create
manual override variables
boolean override = false;
byte
overmenu = 0;
int
overpercent = 0;
//
create the buttons
Button
menu = Button(12,PULLDOWN);
Button select
= Button(13,PULLDOWN);
Button
plus = Button(14,PULLDOWN);
Button
minus = Button(15,PULLDOWN);

//
LED variables. These control the behavior of lighting. Change these to customize behavoir
int
minCounter = 0; //
counter that resets at midnight.
int
oldMinCounter = 0; //
counter that resets at midnight.
int
oneLed = 9; //
pin for channel 1
int
twoLed = 10; //
pin for channel 2
int
threeLed = 11; //
pin for channel 3
int
fourLed = 3; //
pin for channel 4

int
oneVal = 0; //
current value for channel 1
int
twoVal = 0; //
current value for channel 2
int
threeVal = 0; //
current value for channel 3
int
fourVal = 0; //
current value for channel 4

//
Variables making use of EEPROM memory:

EEPROMVar<int>
oneStartMins = 750; //
minute to start this channel.
EEPROMVar<int>
onePhotoPeriod = 720; //
photoperiod in minutes for this channel.
EEPROMVar<int>
oneMax = 100; //
max intensity for this channel, as a percentage
EEPROMVar<int>
oneFadeDuration = 60; //
duration of the fade on and off for sunrise and sunset for

// this channel.
EEPROMVar<int>
twoStartMins = 810;
EEPROMVar<int>
twoPhotoPeriod = 600;
EEPROMVar<int>
twoMax = 100;
EEPROMVar<int>
twoFadeDuration = 60;

EEPROMVar<int>
threeStartMins = 810;
EEPROMVar<int>
threePhotoPeriod = 600;
EEPROMVar<int>
threeMax = 100;
EEPROMVar<int>
threeFadeDuration = 60;


EEPROMVar<int>
fourStartMins = 480;
EEPROMVar<int>
fourPhotoPeriod = 510;
EEPROMVar<int>
fourMax = 100;
EEPROMVar<int>
fourFadeDuration = 60;

/*
int
oneStartMins = 1380; // minute to start this channel.
int
onePhotoPeriod = 120; // photoperiod in minutes for this channel.
int
oneMax = 100; // max intensity for this channel, as a percentage
int
oneFadeDuration = 60; // duration of the fade on and off for sunrise and sunset for

// this channel.
int
twoStartMins = 800;
int
twoPhotoPeriod = 60;
int
twoMax = 100;
int
twoFadeDuration = 15;

int
threeStartMins = 800;
int
threePhotoPeriod = 60;
int
threeMax = 100;
int
threeFadeDuration = 30;


int
fourStartMins = 800;
int
fourPhotoPeriod = 120;
int
fourMax = 100;
int
fourFadeDuration = 60;
*/

/******
RTC Functions ******/
/***************************/

//
Convert decimal numbers to binary coded decimal
byte
decToBcd(byte val)
{
return ( (val/10*16) + (val%10) );
}

//
Convert binary coded decimal to decimal numbers
byte
bcdToDec(byte val)
{
return ( (val/16*10) + (val%16) );
}

//
Sets date and time, starts the clock
void
setDate(byte second, //
0-59
byte
minute, // 0-59

byte hour, // 1-23

byte dayOfWeek, // 1-7

byte dayOfMonth, // 1-31

byte month, // 1-12

byte year) // 0-99
{

Wire.beginTransmission(DS1307_I2C_ADDRESS);

Wire.send(0);

Wire.send(decToBcd(second));

Wire.send(decToBcd(minute));

Wire.send(decToBcd(hour));

Wire.send(decToBcd(dayOfWeek));

Wire.send(decToBcd(dayOfMonth));

Wire.send(decToBcd(month));

Wire.send(decToBcd(year));

Wire.endTransmission();
}

//
Gets the date and time
void
getDate(byte *second,

byte *minute,

byte *hour,

byte *dayOfWeek,

byte *dayOfMonth,

byte *month,

byte *year)
{
Wire.beginTransmission(DS1307_I2C_ADDRESS);
Wire.send(0);
Wire.endTransmission();
Wire.requestFrom(DS1307_I2C_ADDRESS, 7);
*second
= bcdToDec(Wire.receive() & 0x7f);
*minute
= bcdToDec(Wire.receive());
*hour
= bcdToDec(Wire.receive() & 0x3f);
*dayOfWeek
= bcdToDec(Wire.receive());
*dayOfMonth =
bcdToDec(Wire.receive());
*month
= bcdToDec(Wire.receive());
*year
= bcdToDec(Wire.receive());
}

/******
LED Functions ******/
/***************************/
//function
to set LED brightness according to time of day
//function
has three equal phases - ramp up, hold, and ramp down

int
setLed(int mins, //
current time in minutes

int ledPin, // pin for this channel of
LEDs
int
start, // start time for this channel of LEDs

int period, // photoperiod for this channel
of LEDs

int fade, // fade duration for this channel
of LEDs

int ledMax // max value for this channel

) {
int
val = 0;


//fade
up
if (mins >
start || mins <= start +
fade) {

val = map(mins -
start, 0, fade, 0,
ledMax);

}

//fade down

if (mins > start +
period - fade && mins <=
start + period) {

val = map(mins - (start +
period - fade), 0,
fade, ledMax, 0);

}

//off or post-midnight run.

if (mins <= start ||
mins > start + period)
{

if((start+period)%1440 <
start && (start + period)%1440 >
mins )

{

val=map((start+period-mins)%1440,0,fade,0,ledMax);

}

else

val = 0;

}




if (val > ledMax)
{val = ledMax;}

if (val < 0) {val = 0; }


analogWrite(ledPin,
map(val, 0, 100, 0, 255));
if(override){val=overpercent;}
return
val;
}

/****
Display Functions ****/
/***************************/

//
format a number of minutes into a readable time (24 hr format)
void
printMins(int mins, //time
in minutes to print

boolean ampm //print am/pm?

) {
int
hr = (mins%1440)/60;
int
mn = mins%60;

if(hr<10){

lcd.print(" ");

}

lcd.print(hr);

lcd.print(":");

if(mn<10){

lcd.print("0");

}

lcd.print(mn);
}

//
format hours, mins, secs into a readable time (24 hr format)
void
printHMS (byte hr,

byte mn,

byte sec //time to print

)
{


if(hr<10){

lcd.print(" ");

}

lcd.print(hr,
DEC);

lcd.print(":");

if(mn<10){

lcd.print("0");

}

lcd.print(mn,
DEC);

lcd.print(":");

if(sec<10){

lcd.print("0");

}

lcd.print(sec,
DEC);
}
void
ovrSetAll(int pct){

analogWrite(oneLed,map(pct,0,100,0,255));

analogWrite(twoLed,map(pct,0,100,0,255));

analogWrite(threeLed,map(pct,0,100,0,255));

analogWrite(fourLed,map(pct,0,100,0,255));
}

/****
Setup ****/
/***************/

void
setup() {
Wire.begin();

pinMode(bkl, OUTPUT);

lcd.begin(16, 2);

digitalWrite(bkl, HIGH);

lcd.print("Typhon-Reef");

lcd.setCursor(0,1);

lcd.print("");

delay(5000);

lcd.clear();

analogWrite(bkl,bklIdle);
}

/*****
Loop *****/
/****************/

void
loop() {
byte
second, minute, hour,
dayOfWeek, dayOfMonth, month,
year;


getDate(&second, &minute, &hour, &dayOfWeek, &dayOfMonth, &month, &year);

oldMinCounter = minCounter;

minCounter = hour * 60 +
minute;

//check
& set fade durations
if(oneFadeDuration >
onePhotoPeriod/2 && onePhotoPeriod >0){oneFadeDuration =
onePhotoPeriod/2;}
if(oneFadeDuration<1){oneFadeDuration=1;}

if(twoFadeDuration >
twoPhotoPeriod/2 && twoPhotoPeriod >0){twoFadeDuration =
twoPhotoPeriod/2;}
if(twoFadeDuration<1){twoFadeDuration=1;}

if(threeFadeDuration >
threePhotoPeriod/2 && threePhotoPeriod >0){threeFadeDuration =
threePhotoPeriod/2;}
if(threeFadeDuration<1){threeFadeDuration=1;}

if(fourFadeDuration >
fourPhotoPeriod/2 && fourPhotoPeriod > 0){fourFadeDuration =
fourPhotoPeriod/2;}
if(fourFadeDuration<1){fourFadeDuration=1;}

//check
& set any time functions


//set
outputs
if(!override){

oneVal = setLed(minCounter,
oneLed, oneStartMins, onePhotoPeriod,
oneFadeDuration, oneMax);

twoVal = setLed(minCounter,
twoLed, twoStartMins, twoPhotoPeriod,
twoFadeDuration, twoMax);

threeVal = setLed(minCounter,
threeLed, threeStartMins, threePhotoPeriod,
threeFadeDuration, threeMax);

fourVal = setLed(minCounter,
fourLed, fourStartMins, fourPhotoPeriod,
fourFadeDuration, fourMax);
}
else{

ovrSetAll(overpercent);
}


//turn
the backlight off and reset the menu if the idle time has elapsed
if(bklTime +
bklDelay < millis() &&
bklTime > 0 ){

analogWrite(bkl,bklIdle);

menuCount = 1;

lcd.clear();

bklTime = 0;
}

//iterate
through the menus
if(menu.uniquePress()){

analogWrite(bkl,bklOn);

bklTime = millis();

if(menuCount < 20){

menuCount++;

}else {

menuCount = 1;

}

lcd.clear();
}
if(menuCount == 1){

//main screen turn on!!!

if (minCounter > oldMinCounter){

lcd.clear();

}

lcd.setCursor(0,0);

printHMS(hour, minute,
second);

lcd.setCursor(0,1);

lcd.print(oneVal);

lcd.setCursor(4,1);

lcd.print(twoVal);

lcd.setCursor(8,1);

lcd.print(threeVal);

lcd.setCursor(12,1);

lcd.print(fourVal);

//debugging function to use the select button to advance the timer by 1 minute

//if(select.uniquePress()){setDate(second, minute+1, hour, dayOfWeek, dayOfMonth, month, year);}
}

if(menuCount == 2){

//Manual Override Menu

lcd.setCursor(0,0);

lcd.print("Manual Overrides");

lcd.setCursor(0,1);

lcd.print("All: ");

if(select.uniquePress()){

if(menuSelect < 3){menuSelect++;}

else{menuSelect = 0;}

bklTime = millis();

}


if(menuSelect == 0){

lcd.print("Timer");

override = false;}

if(menuSelect == 1){

lcd.print("ON ");

overpercent = 100;

override = true;}

if(menuSelect == 2){

lcd.print("OFF ");

overpercent = 0;

override = true;}

if(menuSelect == 3){

override = true;

lcd.print(overpercent,DEC);

lcd.print("% ");

if(plus.uniquePress() &&
overpercent <100){

overpercent++;

bklTime = millis();}

if(minus.uniquePress() &&
overpercent > 0){

overpercent--;

bklTime = millis();}

}
}


if(menuCount == 3){

//set start time for channel one

lcd.setCursor(0,0);

lcd.print("Channel 1 Start");

lcd.setCursor(0,1);

printMins(oneStartMins, true);


if(plus.uniquePress() &&
oneStartMins < 1440){

oneStartMins++;

if(onePhotoPeriod >0){onePhotoPeriod--;}

else{onePhotoPeriod=1439;}

bklTime = millis();

}

if(minus.uniquePress() &&
oneStartMins > 0){

oneStartMins--;

if(onePhotoPeriod<1439){onePhotoPeriod++;}

else{onePhotoPeriod=0;}

bklTime = millis();

}
}

if(menuCount == 4){

//set end time for channel one

lcd.setCursor(0,0);

lcd.print("Channel 1 End");

lcd.setCursor(0,1);

printMins(oneStartMins+onePhotoPeriod, true);

if(plus.uniquePress()){

if(onePhotoPeriod < 1439){

onePhotoPeriod++;}

else{

onePhotoPeriod=0;

}

bklTime = millis();

}

if(minus.uniquePress()){

if(onePhotoPeriod >0){

onePhotoPeriod--;}

else{

onePhotoPeriod=1439;

}

bklTime = millis();

}
}

if(menuCount == 5){

//set fade duration for channel one

lcd.setCursor(0,0);

lcd.print("Channel 1 Fade");

lcd.setCursor(0,1);

printMins(oneFadeDuration, false);

if(plus.uniquePress() && (oneFadeDuration <
onePhotoPeriod/2 || oneFadeDuration == 0)){

oneFadeDuration++;

bklTime = millis();

}

if(minus.uniquePress() &&
oneFadeDuration > 1){

oneFadeDuration--;

bklTime = millis();

}
}

if(menuCount == 6){

//set intensity for channel one

lcd.setCursor(0,0);

lcd.print("Channel 1 Max");

lcd.setCursor(1,1);

lcd.print(oneMax);

if(plus.uniquePress() &&
oneMax < 100){

lcd.clear();

oneMax++;

bklTime = millis();

}

if(minus.uniquePress() &&
oneMax > 0){

lcd.clear();

oneMax--;

bklTime = millis();

}
}

if(menuCount == 7){

//set start time for channel two

lcd.setCursor(0,0);

lcd.print("Channel 2 Start");

lcd.setCursor(0,1);

printMins(twoStartMins, true);

if(plus.uniquePress() &&
twoStartMins < 1440){

twoStartMins++;

if(twoPhotoPeriod >0){twoPhotoPeriod--;}

else{twoPhotoPeriod=1439;}

bklTime = millis();

}

if(minus.uniquePress() &&
twoStartMins > 0){

twoStartMins--;

if(twoPhotoPeriod<1439){twoPhotoPeriod++;}

else{twoPhotoPeriod=0;}

bklTime = millis();

}
}

if(menuCount == 8){

//set end time for channel two

lcd.setCursor(0,0);

lcd.print("Channel 2 End");

lcd.setCursor(0,1);

printMins(twoStartMins+twoPhotoPeriod, true);

if(plus.uniquePress()){

if(twoPhotoPeriod < 1439){

twoPhotoPeriod++;}

else{

twoPhotoPeriod=0;

}

bklTime = millis();

}

if(minus.uniquePress()){

if(twoPhotoPeriod >0){

twoPhotoPeriod--;}

else{

twoPhotoPeriod=1439;

}

bklTime = millis();

}
}

if(menuCount == 9){

//set fade duration for channel two

lcd.setCursor(0,0);

lcd.print("Channel 2 Fade");

lcd.setCursor(0,1);

printMins(twoFadeDuration, false);

if(plus.uniquePress() && (twoFadeDuration <
twoPhotoPeriod/2 || twoFadeDuration == 0)){

twoFadeDuration++;

bklTime = millis();

}

if(minus.uniquePress() &&
twoFadeDuration > 1){

twoFadeDuration--;

bklTime = millis();

}
}

if(menuCount == 10){

//set intensity for channel two

lcd.setCursor(0,0);

lcd.print("Channel 2 Max");

lcd.setCursor(1,1);

lcd.print(twoMax);

if(plus.uniquePress() &&
twoMax < 100){

lcd.clear();

twoMax++;

bklTime = millis();

}

if(minus.uniquePress() &&
twoMax > 0){

lcd.clear();

twoMax--;

bklTime = millis();

}
}

if(menuCount == 11){

//set start time for channel three

lcd.setCursor(0,0);

lcd.print("Channel 3 Start");

lcd.setCursor(0,1);

printMins(threeStartMins, true);

if(plus.uniquePress() &&
threeStartMins < 1440){

threeStartMins++;

if(threePhotoPeriod >0){threePhotoPeriod--;}

else{threePhotoPeriod=1439;}

bklTime = millis();

}

if(minus.uniquePress() &&
threeStartMins > 0){

threeStartMins--;

if(threePhotoPeriod<1439){threePhotoPeriod++;}

else{threePhotoPeriod=0;}

bklTime = millis();

}
}

if(menuCount == 12){

//set end time for channel three

lcd.setCursor(0,0);

lcd.print("Channel 3 End");

lcd.setCursor(0,1);

printMins(threeStartMins+threePhotoPeriod, true);

if(plus.uniquePress()){

if(threePhotoPeriod < 1439){

threePhotoPeriod++;}

else{

threePhotoPeriod=0;

}

bklTime = millis();

}

if(minus.uniquePress()){

if(threePhotoPeriod >0){

threePhotoPeriod--;}

else{

threePhotoPeriod=1439;

}

bklTime = millis();

}
}

if(menuCount == 13){

//set fade duration for channel three

lcd.setCursor(0,0);

lcd.print("Channel 3 Fade");

lcd.setCursor(0,1);

printMins(threeFadeDuration, false);

if(plus.uniquePress() && (threeFadeDuration <
threePhotoPeriod/2 || oneFadeDuration == 0)){

threeFadeDuration++;

bklTime = millis();

}

if(minus.uniquePress() &&
threeFadeDuration > 1){

threeFadeDuration--;

bklTime = millis();

}
}

if(menuCount == 14){

//set intensity for channel three

lcd.setCursor(0,0);

lcd.print("Channel 3 Max");

lcd.setCursor(1,1);

lcd.print(threeMax);

if(plus.uniquePress() &&
threeMax < 100){

lcd.clear();

threeMax++;

bklTime = millis();

}

if(minus.uniquePress() &&
threeMax > 0){

lcd.clear();

threeMax--;

bklTime = millis();

}
}

if(menuCount == 15){

//set start time for channel four

lcd.setCursor(0,0);

lcd.print("Channel 4 Start");

lcd.setCursor(0,1);

printMins(fourStartMins, true);

if(plus.uniquePress() &&
fourStartMins < 1440){

fourStartMins++;

if(fourPhotoPeriod >0){fourPhotoPeriod--;}

else{fourPhotoPeriod=1439;}

bklTime = millis();

}

if(minus.uniquePress() &&
fourStartMins > 0){

fourStartMins--;

if(fourPhotoPeriod<1439){fourPhotoPeriod++;}

else{fourPhotoPeriod=0;}

bklTime = millis();

}
}

if(menuCount == 16){

//set end time for channel four

lcd.setCursor(0,0);

lcd.print("Channel 4 End");

lcd.setCursor(0,1);

printMins(fourStartMins+fourPhotoPeriod, true);

if(plus.uniquePress()){

if(fourPhotoPeriod < 1439){

fourPhotoPeriod++;}

else{

fourPhotoPeriod=0;

}

bklTime = millis();

}

if(minus.uniquePress()){

if(fourPhotoPeriod >0){

fourPhotoPeriod--;}

else{

fourPhotoPeriod=1439;

}

bklTime = millis();

}
}

if(menuCount == 17){

//set fade duration for channel four

lcd.setCursor(0,0);

lcd.print("Channel 4 Fade");

lcd.setCursor(0,1);

printMins(fourFadeDuration, false);

if(plus.uniquePress() && (fourFadeDuration <
fourPhotoPeriod/2 || oneFadeDuration == 0)){

fourFadeDuration++;

bklTime = millis();

}

if(minus.uniquePress() &&
fourFadeDuration > 1){

fourFadeDuration--;

bklTime = millis();

}
}

if(menuCount == 18){

//set intensity for channel four

lcd.setCursor(0,0);

lcd.print("Channel 4 Max");

lcd.setCursor(1,1);

lcd.print(fourMax);

if(plus.uniquePress() &&
fourMax < 100){

lcd.clear();

fourMax++;

bklTime = millis();

}

if(minus.uniquePress() &&
fourMax > 0){

lcd.clear();

fourMax--;

bklTime = millis();

}
}

if(menuCount == 19){

//set hours

lcd.setCursor(0,0);

lcd.print("Set Time: Hrs");

lcd.setCursor(0,1);

printHMS(hour, minute,
second);

if(plus.uniquePress() &&
hour < 23){

hour++;

bklTime = millis();

}

if(minus.uniquePress() &&
hour > 0){

hour--;

bklTime = millis();

}

setDate(second, minute,
hour, dayOfWeek, dayOfMonth,
month, year);
}

if(menuCount == 20){

//set minutes

lcd.setCursor(0,0);

lcd.print("Set Time: Mins");

lcd.setCursor(0,1);

printHMS(hour, minute,
second);

if(plus.uniquePress() &&
minute < 59){

minute++;

bklTime = millis();

}

if(minus.uniquePress() &&
minute > 0){

minute--;

bklTime = millis();

}

setDate(second, minute,
hour, dayOfWeek, dayOfMonth,
month, year);
}
}
 
I also found a lot of great info on another forum that will help a lot of reefers on here

a link to the thread is

Reprogramming the Typhon - Lighting Forum - Nano-Reef.com Forums

go to page 1 and just skim through the posts ... the code I am using now has a bell curve instead of a linear lighting increase / decrease . take note that there was a correction made to the libraries of the code as the clock wasn't innitialised in the original code
 
so far as the flash hardware , you can pick it up off ebay for a great price

[ame="http://www.ebay.com/itm/FTDI-Basic-Breakout-Arduino-USB-to-TTL-Upload-Tool-For-MWC-MultiWii-Lite-SE-/380777495426?pt=Radio_Control_Parts_Accessories&hash=item58a81b7b82"]FTDI Basic Breakout Arduino USB to TTL UPLOAD Tool for MWC MultiWii Lite SE | eBay [/ame]
 
Back
Top Bottom