I have obtained a awesome sketch that runs a 2 lane slot car timer. The problem is I have a Tinkerkit LCD that enables a 4 wire serial port hook up as the illustrations I have attached shows.
I am also using two NTE3037NPN-Si Phototransistors, and there matching counter parts NTE3029b IR diodes, as the switches that sense when the cars pass through the light gantry. The Phototransistor has a Collector, emitter, and a base electrode. I am not sure what the base prong is for and I am uncertain if the coding will sense the signal the way it is written.
I am in way to deep for the knowledge I have with coding and IR sensors so I am reaching out for help from the exsperts. I will be very thankful for anyones help or suggestions..
Code I have is as follows
[quote]
#include <[color=#CC6600]LiquidCrystal[/color].h>
[color=#7E7E7E]/*[/color]
[color=#7E7E7E]VERSION 0.3 [/color]
[color=#7E7E7E]-Added Green LED For Best Round[/color]
[color=#7E7E7E]*/[/color]
[color=#7E7E7E]// PIN CONFIGURATION[/color]
[color=#CC6600]LiquidCrystal[/color] lcd(12, 11, 5, 4, 3, 2);
[color=#CC6600]int[/color] laserPin = 13;
[color=#CC6600]int[/color] buttonPin1 = 7;
[color=#CC6600]int[/color] buttonPin2 = 8;
[color=#CC6600]int[/color] speakerPin = 9;
[color=#CC6600]int[/color] ledPin1 = 0; [color=#7E7E7E]// red [/color]
[color=#CC6600]int[/color] ledPin2 = 1; [color=#7E7E7E]// red[/color]
[color=#CC6600]int[/color] ledPin3 = 10; [color=#7E7E7E]// green[/color]
[color=#7E7E7E]/*[/color]
[color=#7E7E7E] States // The central state the timer is in[/color]
[color=#7E7E7E] [/color]
[color=#7E7E7E] 0 = pause;[/color]
[color=#7E7E7E] 1 = countdown;[/color]
[color=#7E7E7E] 2 = running;[/color]
[color=#7E7E7E] [/color]
[color=#7E7E7E]*/[/color]
[color=#CC6600]int[/color] state = 0;
[color=#CC6600]boolean[/color] displayLastRound = [color=#CC6600]true[/color];
[color=#CC6600]boolean[/color] running = [color=#CC6600]false[/color];
[color=#CC6600]int[/color] lightLevel = 0;
[color=#CC6600]long[/color] lastHit = 0; [color=#7E7E7E]//time of the last hit in the barrier (absolut)[/color]
[color=#CC6600]boolean[/color] lock; [color=#7E7E7E]// locks the light barrier while a car is passing. The look is removed as soon the car left the lightbeam and the roundTreshold time has passed[/color]
[color=#CC6600]long[/color] lastRound = 0; [color=#7E7E7E]// time of the lastround (absolut)[/color]
[color=#CC6600]long[/color] bestRound = 0; [color=#7E7E7E]// time of the bestround (relative)[/color]
[color=#CC6600]int[/color] roundNr = 0;
[color=#CC6600]int[/color] laserTreshold = 10;
[color=#CC6600]int[/color] roundTreshold = 300; [color=#7E7E7E]// minimum time that has to pass before a new round is counted[/color]
[color=#7E7E7E]// Absolut time for pressing buttons[/color]
[color=#CC6600]long[/color] lastPress1 = 0;
[color=#CC6600]long[/color] lastPress2 = 0;
[color=#7E7E7E]// LED Timer[/color]
[color=#CC6600]long[/color] timeLEDGreen = 0;
[color=#CC6600]void[/color] [color=#CC6600][b]setup[/b][/color]() {
[color=#CC6600]pinMode[/color](laserPin, [color=#006699]OUTPUT[/color]);
[color=#CC6600]pinMode[/color](buttonPin1, [color=#006699]INPUT[/color]);
[color=#CC6600]pinMode[/color](buttonPin2, [color=#006699]INPUT[/color]);
[color=#CC6600]pinMode[/color](speakerPin, [color=#006699]OUTPUT[/color]);
[color=#CC6600]pinMode[/color](ledPin1, [color=#006699]OUTPUT[/color]);
[color=#CC6600]pinMode[/color](ledPin2, [color=#006699]OUTPUT[/color]);
[color=#CC6600]pinMode[/color](ledPin3, [color=#006699]OUTPUT[/color]);
[color=#7E7E7E]// set up the LCD's number of columns and rows: [/color]
lcd.[color=#CC6600]begin[/color](16, 2);
lcd.[color=#CC6600]setCursor[/color](0, 0);
lcd.[color=#CC6600]print[/color]([color=#006699]"Arduino"[/color]);
lcd.[color=#CC6600]setCursor[/color](0, 1);
lcd.[color=#CC6600]print[/color]([color=#006699]"Laser Lap Timer "[/color]);
[color=#CC6600]delay[/color](1500);
lcd.[color=#CC6600]setCursor[/color](0, 0);
lcd.[color=#CC6600]print[/color]([color=#006699]"Christoph &"[/color]);
lcd.[color=#CC6600]setCursor[/color](0, 1);
lcd.[color=#CC6600]print[/color]([color=#006699]"Peter Halang "[/color]);
[color=#7E7E7E]//Serial.begin(9600);[/color]
[color=#CC6600]delay[/color](1500);
}
[color=#CC6600]void[/color] [color=#CC6600][b]loop[/b][/color]() {
[color=#CC6600]if[/color](![color=#CC6600]digitalRead[/color](buttonPin1)){
button1Pressed();
};
[color=#CC6600]if[/color](![color=#CC6600]digitalRead[/color](buttonPin2)){
button2Pressed();
};
[color=#CC6600]switch[/color] (state){
[color=#CC6600]case[/color] 0:
statePaused();
[color=#CC6600]break[/color];
[color=#CC6600]case[/color] 1:
stateCountdown();
[color=#CC6600]break[/color];
[color=#CC6600]case[/color] 2:
stateRunning();
[color=#CC6600]break[/color];
}
}
[color=#CC6600]void[/color] didFinishRound(){
[color=#CC6600]if[/color](roundNr > 0)lastRound = [color=#CC6600]millis[/color]()-lastHit;
[color=#CC6600]if[/color] (bestRound == 0){
bestRound = lastRound;
}
[color=#CC6600]if[/color] (lastRound < bestRound){
bestRound = lastRound;
timeLEDGreen = [color=#CC6600]millis[/color]()+1000;
}
lastHit = [color=#CC6600]millis[/color]();
lock = [color=#CC6600]true[/color];
++roundNr;
displayLastRound = [color=#CC6600]true[/color];
}
[color=#CC6600]void[/color] statePaused(){
[color=#CC6600]digitalWrite[/color](ledPin1, [color=#006699]LOW[/color]);
[color=#CC6600]digitalWrite[/color](ledPin2, [color=#006699]LOW[/color]);
[color=#CC6600]digitalWrite[/color](ledPin3, [color=#006699]LOW[/color]);
[color=#CC6600]digitalWrite[/color](laserPin,[color=#006699]LOW[/color]);
lcd.[color=#CC6600]setCursor[/color](0, 0);
lcd.[color=#CC6600]print[/color]([color=#006699]"Press right "[/color]);
lcd.[color=#CC6600]setCursor[/color](0, 1);
lcd.[color=#CC6600]print[/color]([color=#006699]"button to start"[/color]);
}
[color=#CC6600]void[/color] stateRunning(){
[color=#7E7E7E]//switch laser on[/color]
[color=#CC6600]digitalWrite[/color](laserPin,[color=#006699]HIGH[/color]);
[color=#7E7E7E]//mesasure light[/color]
lightLevel = [color=#CC6600]analogRead[/color](0);
lightLevel = [color=#CC6600]map[/color](lightLevel, 0, 900, 0, 255);
lightLevel = [color=#CC6600]constrain[/color](lightLevel, 0, 255);
[color=#7E7E7E]//Serial.println(lightLevel);[/color]
[color=#7E7E7E]// react to light[/color]
[color=#CC6600]if[/color](lightLevel < laserTreshold){
[color=#7E7E7E]//digitalWrite(ledPin,LOW);[/color]
lock = [color=#CC6600]false[/color];
}
[color=#CC6600]else[/color]{
[color=#7E7E7E]// digitalWrite(ledPin,HIGH);[/color]
[color=#CC6600]if[/color] ([color=#CC6600]millis[/color]()-lastHit > roundTreshold && lock == [color=#CC6600]false[/color]){
didFinishRound();
}
}
[color=#7E7E7E]// We have'nt finished the first round[/color]
[color=#CC6600]if[/color](roundNr == 0){
lcd.[color=#CC6600]setCursor[/color](0,0);
lcd.[color=#CC6600]print[/color]([color=#006699]"Standby... "[/color]);
lcd.[color=#CC6600]setCursor[/color](0,1);
lcd.[color=#CC6600]print[/color]([color=#006699]" "[/color]);
}
[color=#7E7E7E]// Display the time and best / last round[/color]
[color=#CC6600]else[/color]{
displaySecondLine();
displayFirstLine();
}
[color=#7E7E7E]// turn off all LED[/color]
[color=#CC6600]digitalWrite[/color](ledPin1, [color=#006699]LOW[/color]);
[color=#CC6600]digitalWrite[/color](ledPin2, [color=#006699]LOW[/color]);
[color=#CC6600]if[/color] (timeLEDGreen > [color=#CC6600]millis[/color]()){
[color=#CC6600]digitalWrite[/color](ledPin3, [color=#006699]HIGH[/color]);
}
[color=#CC6600]else[/color]{
[color=#CC6600]digitalWrite[/color](ledPin3, [color=#006699]LOW[/color]);
}
[/quote]