// include libraries
#include <Wire.h>
//LiquidCrystal_I2C lcd(0x27, 20, 4); // vytvoři I2C LCD objekt (Address=0x27, Cols=20, Rows=4)
const int dataPin = 2; /* Q7 = 7*/ // negovany vystup
const int clockPin = 3; /* CLK = 2*/
const int latchPin = 4; /* PL = 1*/
const int numBits = 8; // počet připojených vstupů 1 až 8
// Custom characters
byte rocketLeft[] = {
B00111,
B01000,
B10001,
B10010,
B10101,
B10011,
B01001,
B00111,
};
byte rocketRight[] = {
B11100,
B00010,
B10001,
B01001,
B10101,
B11001,
B10010,
B11100,
};
// deklarace promennych
String bitsLCD = ""; // String na ulozeni bitů a vypsání na LCD
int bits[numBits] = {0}; /*array pro hodnotyy daných bitu */
// deklarace casovych konstant
int h = 0; /*hodiny*/
int m = 0; /*minuty*/
int s = 0; /*sekundy*/
int ms = 0; /*mili sekundy*/
unsigned long stopTime[numBits] = {0}; /*array zacatek mereni */
unsigned long startTime = 0; /* konec mereni */
unsigned long differ[numBits] = {0}; /*array startTime - stopTime*/
bool measured[numBits] = {false};
// byte currentBits = 0; /*aktualni stav vsech bitu*/ /*byte je specialni datovy typ pro 8-bit cislo*/
void setup() {
Serial.begin(9600);
pinMode(dataPin, INPUT);
pinMode(clockPin, OUTPUT);
pinMode(latchPin, OUTPUT);
}
void loop() {
// menu setup
Serial.println("Choose data");
Serial.println("1. Circuit control");
Serial.println("2. Start measure");
Serial.println("3. Results");
Serial.println("4. Reset");
// ulozim do promenne menuChoice vstup uzivatele - pak switch structure
int menuChoice = getUserInput();
switch (menuChoice) {
case 1:
// ukaz logo
// zatim jen ukaze aktivovane bity
shiftReadLCD(latchPin, numBits); // volam si fci na cteni bitu z posuvneho registru
// vypsani do serial monitoru
Serial.print("Bits: ");
Serial.println(bitsLCD);
// vymaze posledni hodnotu a ceka na dalsi
bitsLCD = "";
break;
case 2:
// zacatek mereni casu
shiftRead(latchPin,numBits);
startTime = millis();
while (true) {
shiftRead(latchPin, numBits); // čte bity pořád
bool allMeasured = true; // kontrola, zda byly změřeny všechny bity
for (int i = 0; i < numBits; i++){
if (bits[i] == 0 && !measured[i]) {
stopTime[i] = millis();
differ[i] = (stopTime[i] - startTime);
measured[i] = true; // označení již mereneho bitu
Serial.print(stopTime[i]);
Serial.print(" - ");
Serial.print(startTime);
Serial.print(" = " );
Serial.println(differ[i]); // printeni casu v sekundach
Serial.print("Drat ");
Serial.print(8 - i); // označení bitu od 8 do 1
Serial.print(" -> Time: ");
Serial.print(differ[i]); // printeni casu v sekundach
Serial.println(" ms");
}
if (!measured[i]) {
allMeasured = false;
}
}
// Exit loop if all bits are measured
if (allMeasured) {
break;
}
}
break;
// Vysledky
case 3:
for(int i = 0; i < numBits; i++){
Serial.print(differ[i]);
Serial.println(" ms");
}
break;
// Reset
case 4:
Serial.println("Reset");
// reset pole pro další měření
for (int i = 0; i < numBits; i++) {
bits[i] = 0;
stopTime[i] = 0;
differ[i] = 0;
measured[i] = false;
}
startTime = 0;
break;
default:
Serial.println("Wrong input");
break;
}
// pak cekam na vstup usera kdyz jsem spatne zadal vstup
Serial.println("Mackni neco");
getUserInput();
}
// funkce pro cteni a vypis na LCD z posuvneho registru
void shiftReadLCD(int latchPin, int numBits) {
digitalWrite(latchPin, LOW);
digitalWrite(latchPin, HIGH);
for (int i = 0; i < numBits; i++) {
int bit = digitalRead(dataPin); // ten dany bit
if (bit == HIGH) {
bitsLCD += "1";
} else {
bitsLCD += "0";
}
digitalWrite(clockPin, HIGH); // hodinovy signal
digitalWrite(clockPin, LOW);
}
}
// funkce pro cteni a z posuvneho registru do ARRAY
void shiftRead(int latchPin, int numBits) {
digitalWrite(latchPin, LOW);
digitalWrite(latchPin, HIGH);
for (int i = 0; i < numBits; i++) {
int bit = digitalRead(dataPin); // ten dany bit
bits[i] = bit; // ulozeni hodntoy bitu v poli bits[]
digitalWrite(clockPin, HIGH); // hodinovy signal
digitalWrite(clockPin, LOW);
}
return bits;
}
// funkce pro vstup od usera
int getUserInput() {
while (Serial.available() == 0) {
// cekam na vstup
}
// Parse input
int input = Serial.parseInt();
// vycisti buffer
while (Serial.available() > 0) {
Serial.read();
}
return input; // vrati input usera
}