I understand what you are saying but my coding knowledge is limited and these millis functions take some grasping for me.
I have had a go at incorporating what I believe is a standard millis 'blibk' sketch into my sketch without success.
I cannot pretend I understand the logic of it but I have tried to stick to what seems logical.
Suffice to say don't appear to be getting past go.
//////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
//DCC Function Decoder
//JHB
//Attiny 85 Development Board
//Four Functions
//Type of Function in separate routine
//Note - PWM/analogWrite only available on Pins 0 (F0),1 (F1) and 4 (F3)
//Do no forget to make sure binary code consistant with output pin!!!!!
//////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
//////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
// IMPORTANT: GOTO lines 15 - 19 to configure some data!
//////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
int decoderAddress = 77; // This is the decoder address, change into the number you want.
#define F0_pin 0 // Define the output pin for every Function number in use
#define F1_pin 1 // Available pin numbers: 0,1,3,4,(5 is normally reset)
#define F2_pin 3 // Pins 0, 1 and 4 are PWM and can be used for analogWrite
#define F3_pin 4
#include <DCC_Decoder.h>
#define kDCC_INTERRUPT 0
byte Func[4]; //0=L4321, 1=8765, 2=CBA9, 3=F20-F13, 4=F28-F21
byte instrByte1;
int Address;
byte forw_rev=1; //0=reverse, 1=forward
boolean RawPacket_Handler(byte pktByteCount, byte* dccPacket) {
Address=0;
if (!bitRead(dccPacket[0],7)) { //bit7=0 -> Loc Decoder Short Address
Address = dccPacket[0];
instrByte1 = dccPacket[1];
}
else if (bitRead(dccPacket[0],6)) { //bit7=1 AND bit6=1 -> Loc Decoder Long Address
Address = 256 * (dccPacket[0] & B00000111) + dccPacket[1];
instrByte1 = dccPacket[2];
}
if (Address==decoderAddress) {
byte instructionType = instrByte1>>5;
switch (instructionType) {
case 2: // Reverse speed
forw_rev=0;
break;
case 3: // Forward speed
forw_rev=1;
break;
case 4: // Loc Function L-4-3-2-1
Func[0]=instrByte1&B00011111;
break;
case 5: // Loc Function 8-7-6-5
if (bitRead(instrByte1,4)) {
Func[1]=instrByte1&B00001111;
}
else { // Loc Function 12-11-10-9
Func[2]=instrByte1&B00001111;
}
break;
}
//if (Func[0]&B00010000) digitalWrite(F0_pin,HIGH); else digitalWrite(F0_pin,LOW);
//if (Func[0]&B00000001) digitalWrite(F1_pin,HIGH); else digitalWrite(F1_pin,LOW);
//if (Func[0]&B00000010) digitalWrite(F2_pin,HIGH); else digitalWrite(F2_pin,LOW);
if (Func[0]&B00000100) analogWrite(F3_pin, 100); else analogWrite(F3_pin, 0);
}
}
void fadeF0() {
static unsigned long lastFadeTimeF0 = 0;
static int fadeLevelF0 = 0;
if (millis() - lastFadeTimeF0 > 10) {
lastFadeTimeF0 = millis();
if (Func[0]&B00010000) {
if (fadeLevelF0 < 255) analogWrite(F0_pin, ++fadeLevelF0);
}
else {
if (fadeLevelF0 > 0) analogWrite(F0_pin, --fadeLevelF0);
}
}
}
void flickerF1() {
static unsigned long startTimeF1 = 0;
static unsigned long lastFlickerF1 = 0;
static int stateF1 = HIGH;
if (Func[0]&B00000001) {
if (stateF1 == LOW) {
startTimeF1 = millis();
stateF1 = HIGH;
}
else {
if (millis() - startTimeF1 > 3000) {
digitalWrite(F1_pin, HIGH);
}
else {
if (millis() - lastFlickerF1 > 25) {
lastFlickerF1 = millis();
if (random(2) == 0) digitalWrite(F1_pin, HIGH); else digitalWrite(F1_pin, LOW);
}
}
}
}
else {
digitalWrite(F1_pin, LOW);
stateF1 = LOW;
}
}
void blinkF2() {
static int stateF2 = LOW;
unsigned long previousMillis = 0;
const long interval = 1000;
unsigned long currentMillis = millis();
if (Func[0]&B00000010) {
if (currentMillis - previousMillis >= interval) {
previousMillis = currentMillis;
if (stateF2 == LOW) {
stateF2 = HIGH;
} else {
stateF2 = LOW;
}
digitalWrite(F2_pin,LOW);
}
void setup() {
DCC.SetRawPacketHandler(RawPacket_Handler);
DCC.SetupMonitor( kDCC_INTERRUPT );
pinMode(0, OUTPUT);
pinMode(1, OUTPUT);
pinMode(3, OUTPUT);
pinMode(4, OUTPUT);
}
void loop() {
DCC.loop();
fadeF0();
flickerF1();
blinkF2();
}
Thank you