Skip to content

Commit 94064f0

Browse files
committed
Sketch to test tubes at full blast, no multiplexing / exercise away cathode poisoning
1 parent 73a403e commit 94064f0

File tree

1 file changed

+85
-0
lines changed

1 file changed

+85
-0
lines changed

tube_test/tube_test.ino

Lines changed: 85 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,85 @@
1+
//Light a cathode/anode combo full time, no multiplexing
2+
3+
const byte mainAdjUp = A3; //press to change cathode
4+
const byte mainAdjDn = A2; //press to change anode
5+
6+
//This clock is 2x3 multiplexed: two tubes powered at a time.
7+
//The anode channel determines which two tubes are powered,
8+
//and the two SN74141 cathode driver chips determine which digits are lit.
9+
//4 pins out to each SN74141, representing a binary number with values [1,2,4,8]
10+
byte binOutA[4] = {2,3,4,5};
11+
byte binOutB[4] = {6,7,8,9};
12+
//3 pins out to anode channel switches
13+
byte anodes[3] = {11,12,13};
14+
15+
byte btnCur = 0; //Momentary button currently in use - only one allowed at a time
16+
byte curCathode = 0;
17+
byte curAnode = 0;
18+
19+
void setup(){
20+
Serial.begin(9600);
21+
initOutputs();
22+
initInputs();
23+
updateDisplay();
24+
}
25+
26+
void loop(){
27+
checkInputs();
28+
delay(10); //in case of switch bounce?
29+
}
30+
31+
void initInputs(){
32+
pinMode(mainAdjUp, INPUT_PULLUP);
33+
pinMode(mainAdjDn, INPUT_PULLUP);
34+
}
35+
void checkInputs(){
36+
checkBtn(mainAdjUp);
37+
checkBtn(mainAdjDn);
38+
}
39+
bool readInput(byte pin){
40+
if(pin==A6 || pin==A7) return analogRead(pin)<100?0:1; //analog-only pins
41+
else return digitalRead(pin);
42+
}
43+
void checkBtn(byte btn){
44+
//Changes in momentary buttons, LOW = pressed.
45+
//When a button event has occurred, will call ctrlEvt
46+
bool bnow = readInput(btn);
47+
//If the button has just been pressed, and no other buttons are in use...
48+
if(btnCur==0 && bnow==LOW) {
49+
btnCur = btn;
50+
if(btn==mainAdjUp) { curCathode++; if(curCathode==10) curCathode = 0; updateDisplay(); }
51+
else if(btn==mainAdjDn) { curAnode++; if(curAnode==sizeof(anodes)) curAnode = 0; updateDisplay(); }
52+
}
53+
//If the button has just been released...
54+
if(btnCur==btn && bnow==HIGH) {
55+
btnCur = 0;
56+
}
57+
}
58+
59+
void initOutputs() {
60+
for(byte i=0; i<4; i++) { pinMode(binOutA[i],OUTPUT); pinMode(binOutB[i],OUTPUT); }
61+
for(byte i=0; i<3; i++) { pinMode(anodes[i],OUTPUT); }
62+
}
63+
64+
void updateDisplay() {
65+
for(byte i=0; i<sizeof(anodes); i++) { digitalWrite(anodes[i],LOW); } //all anodes off
66+
setCathodes(curCathode,curCathode);
67+
digitalWrite(anodes[curAnode],HIGH);
68+
}
69+
70+
void setCathodes(byte decValA, byte decValB){
71+
bool binVal[4]; //4-bit binary number with values [1,2,4,8]
72+
decToBin(binVal,decValA); //have binary value of decVal set into binVal
73+
for(byte i=0; i<4; i++) digitalWrite(binOutA[i],binVal[i]); //set bin inputs of SN74141
74+
decToBin(binVal,decValB);
75+
for(byte i=0; i<4; i++) digitalWrite(binOutB[i],binVal[i]); //set bin inputs of SN74141
76+
} //end setCathodes()
77+
78+
void decToBin(bool binVal[], byte i){
79+
//binVal is a reference (modify in place) of a binary number bool[4] with values [1,2,4,8]
80+
if(i<0 || i>15) i=15; //default value, turns tubes off
81+
binVal[3] = int(i/8)%2;
82+
binVal[2] = int(i/4)%2;
83+
binVal[1] = int(i/2)%2;
84+
binVal[0] = i%2;
85+
} //end decToBin()

0 commit comments

Comments
 (0)