86 lines
1.7 KiB
C++
86 lines
1.7 KiB
C++
// yellow
|
|
#define CLOCK_PIN 6
|
|
|
|
// orange
|
|
#define DATA_PIN 7
|
|
|
|
// green
|
|
#define READ_PIN 5
|
|
|
|
uint8_t shiftInFixed(uint8_t dataPin, uint8_t clockPin, uint8_t bitOrder) {
|
|
|
|
digitalWrite(clockPin, LOW);
|
|
uint8_t value = 0;
|
|
uint8_t i;
|
|
for (i = 0; i < 8; ++i) {
|
|
if (bitOrder == LSBFIRST)
|
|
value |= digitalRead(dataPin) << i;
|
|
else
|
|
value |= digitalRead(dataPin) << (7 - i);
|
|
digitalWrite(clockPin, HIGH);
|
|
delay(1);
|
|
digitalWrite(clockPin, LOW);
|
|
}
|
|
return value;
|
|
}
|
|
|
|
void printBits(byte myByte){
|
|
for(byte mask = 0x80; mask; mask >>= 1){
|
|
if(mask & myByte)
|
|
Serial.print('1');
|
|
else
|
|
Serial.print('0');
|
|
}
|
|
}
|
|
|
|
void setup()
|
|
{
|
|
pinMode(CLOCK_PIN, OUTPUT);
|
|
pinMode(DATA_PIN, INPUT);
|
|
pinMode(READ_PIN, OUTPUT);
|
|
// Open serial communications and wait for port to open:
|
|
Serial.begin(115200);
|
|
while (!Serial) {
|
|
; // wait for serial port to connect. Needed for Native USB only
|
|
}
|
|
Serial.println("Goodnight moon!");
|
|
}
|
|
|
|
void loop() // run over and over
|
|
{
|
|
// read data in
|
|
digitalWrite(READ_PIN, HIGH);
|
|
delay(200);
|
|
digitalWrite(READ_PIN, LOW);
|
|
|
|
// shift data bit by bit
|
|
uint8_t data[4];
|
|
|
|
for (int i = 0; i < 4; i++) {
|
|
data[i] = shiftInFixed(DATA_PIN, CLOCK_PIN, LSBFIRST);
|
|
}
|
|
digitalWrite(CLOCK_PIN, LOW);
|
|
|
|
|
|
// First byte is select button:
|
|
// 00000001 STOP
|
|
// 00000010 1S
|
|
// 00000100 10S
|
|
// ...
|
|
// 10000000 REAL OUT
|
|
// 00000000 NORM OUT
|
|
|
|
// second, third and fourth byte are rotating digits
|
|
// every dial is a nibble, but the nibbles switched place
|
|
// so 0010 1001 (2 9) is in real life 92
|
|
|
|
printBits(data[0]);
|
|
for (int i = 1; i < 4; i++) {
|
|
Serial.print(" ");
|
|
Serial.print(data[i] & 0b1111, DEC);
|
|
Serial.print(data[i] >> 4, DEC);
|
|
}
|
|
Serial.println("");
|
|
delay(500);
|
|
|
|
}
|