Hey guys!
As a class project, I'm trying to run through a for loop that changes all the lights on a model train track.
Now, when I run through a loop on the 'lights' array and call my 'changeLight()' method in the 'loop()' - it all works perfectly fine.
BUT when I do the exact same thing in my 'setup()', it doesn't work at all.
When doing 'Serial.print' I get all the correct values, it's like it just doesn't call the 'changeLight()' method.
Any ideas?
I hope it all makes sense, and please be gentle - I'm very new to all of this!
Code:
#include "int.h"
#define controllerPin 7
#define triggerPin12 2
#define triggerPin13 3
#define triggerPin14 4
#define triggerPin15 5
unsigned char locomotiveAddress1;
unsigned char locomotiveAddress2;
unsigned char addr, data, addr2, data2;
unsigned int lights[] = {112, 152, 142, 102, 101, 141, 122, 121, 131, 132, 151, 111, 51, 21, 22, 62, 92, 52, 12, 32, 91, 61, 11, 41, 31, 81, 82, 42};
unsigned int switches[] = {252, 222, 250, 249, 221, 251, 224, 223, 234, 233, 231, 232, 241, 242, 243, 244};
unsigned int side = 249;
struct Train {
int id;
int data;
};
struct Light {
int id;
int col;
};
struct Switch {
int id;
int dir;
};
struct Train train1, train2;
struct Light light112, light152, light142, light102, light101, light141, light122, light121, light131, light132, light151, light111, light51, light21, light22, light62, light92, light52, light12, light32, light91, light61, light11, light41, light31, light81, light82, light42;
struct Light structLights[] = {light112, light152, light142, light102, light101, light141, light122, light121, light131, light132, light151, light111, light51, light21, light22, light62, light92, light52, light12, light32, light91, light61, light11, light41, light31, light81, light82, light42};
struct Switch switch252, switch222, switch250, switch249, switch221, switch251, switch224, switch223, switch234, switch233, switch231, switch232, xSwitch241, xSwitch242, xSwitch243, xSwitch244;
struct Switch structSwitches[] = {switch252, switch222, switch250, switch249, switch221, switch251, switch224, switch223, switch234, switch233, switch231, switch232, xSwitch241, xSwitch242, xSwitch243, xSwitch244};
void setup() {
Serial.begin(9600); // monitor
struct Train *train1Ptr = &train1;
struct Train *train2Ptr = &train2;
struct Light* lightPtr = structLights;
int *lightArrPtr = lights;
struct Switch* switchPtr = structSwitches;
int *switchArrPtr = switches;
train1Ptr->id = 8;
train2Ptr->id = 40;
Serial.print("train id: ");
Serial.println(train1Ptr->id);
for(int i = 0; i < sizeof(structLights)/sizeof(structLights[0]); i++, lightPtr++, lightArrPtr++){
lightPtr->id = *lightArrPtr;
lightPtr->col = 1;
if(lightPtr->id == 121 || lightPtr->id == 132 || lightPtr->id == 141 || lightPtr->id == 152){
lightPtr->col = 0;
}
Serial.print("id: ");
Serial.println(lightPtr->id);
Serial.print("colour: ");
Serial.println(lightPtr->col);
changeLight(lightPtr->id, lightPtr->col);
};
for(int i = 0; i < sizeof(structSwitches)/sizeof(structSwitches[0]); i++, switchPtr++, switchArrPtr++){
switchPtr->id = *switchArrPtr;
switchPtr->dir = 1;
if(switchPtr->id > 240 && switchPtr->id < 245){
switchPtr->dir = 0;
}
Serial.print("id: ");
Serial.println(switchPtr->id);
Serial.print("direction: ");
Serial.println(switchPtr->dir);
changeSwitch(switchPtr->id, switchPtr->dir);
};
pinMode(controllerPin, OUTPUT);
pinMode(triggerPin12, INPUT_PULLUP);
pinMode(triggerPin13, INPUT_PULLUP);
pinMode(triggerPin14, INPUT_PULLUP);
pinMode(triggerPin15, INPUT_PULLUP);
SetupTimer2();
delay(50);
delay(50);
startTrain(train1Ptr->id, "fast"); // yderste
delay(50);
startTrain(train2Ptr->id, "fast"); // inderste
delay(50);
}
void loop() {
/*
if(side == 249){
trigger(triggerPin12, train2->id, train1->id);
}else if(side == 252){
trigger(triggerPin15, train1->id, train2->id);
}
if(side == 249){
triggerMid(triggerPin13);
}else if(side == 252){
triggerMid(triggerPin14);
}
*/
}
void triggerMid(int trigger) {
while(true){
if(digitalRead(trigger) == 0){
if(side == 249){
changeLight(light121.id, 1);
delay(10000);
changeLight(light121.id, 0);
delay(2000);
changeSwitch(side, 1);
side = 252;
}else if(side == 252){
changeLight(light152.id, 1);
delay(10000);
changeLight(light152.id, 0);
delay(2000);
changeSwitch(side, 1);
side = 249;
}
delay(3000);
break;
}
}
}
void trigger(int trigger, int train1, int train2) {
int counter = 0;
while(true){
if(digitalRead(trigger) == 0){
counter++;
if(counter == 1) {
startTrain(train1, "slow");
startTrain(train2, "slow");
if(side == 249){
changeLight(light141.id, 1);
}else if(side == 252){
changeLight(light132.id, 1);
}
} else if(counter == 2) {
counter = 0;
if(side == 249){
startTrain(train2, "fast");
changeLight(light121.id, 1);
delay(3000);
changeLight(light121.id, 0);
changeSwitch(side, 0);
changeLight(light141.id, 0);
}else if(side == 252){
startTrain(train1, "fast");
changeLight(light152.id, 1);
delay(3000);
changeLight(light152.id, 0);
changeSwitch(side, 0);
changeLight(light132.id, 0);
}
break;
}
delay(3000);
}
}
}
void changeSwitch(unsigned int addrX, unsigned char valueX){
calculateaddr(addrX, valueX);
assemble_dcc_msg(addr, data);
delay(50);
assemble_dcc_msg(addr2, data2);
delay(50);
}
void changeLight(unsigned int addrX, unsigned char valueX){
calculateaddr(addrX, valueX);
assemble_dcc_msg(addr, data);
delay(50);
assemble_dcc_msg(addr2, data2);
delay(50);
}
void startTrain(unsigned char train, char s[]) {
if(s == "fast"){
assemble_dcc_msg(train,0x6a);
}else if (s == "slow"){
assemble_dcc_msg(train,0x62);
}
}
void startTrain(unsigned char train) {
assemble_dcc_msg(train,0x6a);
}
void stopTrain(unsigned char train) {
assemble_dcc_msg(train,0x60);
}
void calculateaddr(unsigned int a, unsigned char b){
unsigned int address, x, y;
unsigned char reg, byte1, byte2;
address = ((a / 4) + 1);
reg = ((a % 4) - 1);
if(reg == 255){
address--;
reg = 3;
}
byte1 = (address & 63) + 128;
byte2 = 128;
y = (address & 448) >> 6;
x = 0;
for(int i = 1;i < 8;i = i * 2)
if((y & i) == 0)
x = x + i;
byte2 = byte2 + (x << 4);
byte2 = byte2 + (reg << 1);
if(b == 1){
byte2 += 9;
}
else{
byte2 += 8;
}
addr = byte1;
data = byte2;
addr2 = byte1;
data2 = (byte2 - 8);
}
void sendbyte(unsigned char uch) {
for(int a = 128; a > 0; a = a / 2) {
if((uch & a) == 0)
sendbit(0);
else
sendbit(1);
}
}
void sendbit(int b) {
if(b == 0) {
digitalWrite(controllerPin, HIGH);
delayMicroseconds(116);
digitalWrite(controllerPin, LOW);
delayMicroseconds(116);
} else {
digitalWrite(controllerPin, HIGH);
delayMicroseconds(58);
digitalWrite(controllerPin, LOW);
delayMicroseconds(58);
}
}