//---importování knihoven------------------------------------------------------------------
#include <Wire.h>
#include <LiquidCrystal_I2C.h>
#include <OneButton.h>
//---deklarace proměnných------------------------------------------------------------------
LiquidCrystal_I2C lcd(0x27, 16, 2); //Nastavení adresy LCD na 0x27 pro 16znakový a 2řádkový displej
OneButton back(5, true); //Definování vstupu arduina (tlačítko zpět)
OneButton pushButton(11, true); //Definování vstupu arduina (tlačítko encoderu dopředu)
#define zeroPosition 10 //Definování vstupu arduina (spínací kontakt kalibrace)
#define feedstepPin 9 //Definování vstupu arduina (step pin H-můstku pro podavač)
#define feeddirPin 8 //Definování vstupu arduina (dir pin H-můstku pro podavač)
#define cutstepPin 7 //Definování vstupu arduina (step pin H-můstku pro střihač)
#define cutdirPin 6 //Definování vstupu arduina (dir pin H-můstku pro střihač)
const int RotaryCLK = 2; //Definování vstupu arduina (pin encoderu rotace)
const int RotaryDT = 4; //Definování vstupu arduina (pin encoderu rotace)
const int opto = 18;
int optoCitac = 0;
int PBdelay = 200; //Deklarace proměnné zpoždění
int push = 0; //Deklarace proměnné pro počet zmáčknutí zlačítka dopředu
int qty = 0; //Deklarace proměnné pro počet kusů vodičů
long len = 0; //Deklarace proměnné pro délku vodičů
long countA = 0; //Deklarace pomocné (pro rotate) proměnné pro délku vodičů
int countB = 0; //Deklarace pomocné (pro rotate) proměnné pro počet kusů vodičů
int i = 0; //Deklarace pomocné proměnné pro postupné oděčítání počtu kusů ve funkci cutting()
int position2 = 0; //Deklarace pomocné proměnné pro zjištění zda jsem byl na pozici 2
int position3 = 0; //Deklarace pomocné proměnné pro zjištění zda jsem byl na pozici 3
int pressed1 = 0; //Deklarace pomocné proměnné pro zjišťování počtu dlouhého zmáčknutí tlačítka dopředu
int pressed2 = 0; //Deklarace pomocné proměnné pro zjišťování počtu zmáčknutí tlačítka zpět
int pressed3 = 0; //Deklarace pomocné proměnné pro zjišťování počtu po dlouhém zmáčknutí tlačítka dopředu
int calibration = 0; //Deklarace pomocné proměnné pro fuknci kalibrace
long feedsteppermm = 105; //Deklarace pomocné proměnné pro kroky podavače
int cutstep = 3200; //Deklarace pomocné proměnné pro střihač
int CLKNow; //Deklarace pomocné proměnné pro zjišťování času počátku rotace encoderu
int CLKPrevious; //Deklarace pomocné proměnné pro zjišťování času dokončení rotace encoderu
//---deklarace hlavičky programu-----------------------------------------------------------
void setup(){
pinMode (feedstepPin, OUTPUT); //Definování pinu 9 na OUTPUT
pinMode (feeddirPin, OUTPUT); //Definování pinu 8 na OUTPUT
pinMode (cutstepPin, OUTPUT); //Definování pinu 7 na OUTPUT
pinMode (cutdirPin, OUTPUT); //Definování pinu 6 na OUTPUT
pinMode (RotaryCLK, INPUT_PULLUP); //Definování pinu 2 na INPUT_PULLUP
pinMode (RotaryDT, INPUT_PULLUP); //Definování pinu 4 na INPUT_PULLUP
pinMode (zeroPosition, INPUT_PULLUP); //Definování pinu 10 na INPUT_PULLUP
pinMode (opto, INPUT_PULLUP);
CLKPrevious = digitalRead(RotaryCLK);
attachInterrupt(digitalPinToInterrupt(RotaryCLK), rotate, CHANGE); //Definování přerušení pro rotaci encoderu
attachInterrupt(5, Opto, INPUT_PULLUP);
pushButton.attachClick(click1); //Definování pro jedno zmáčknutí tlačítka dopředu
pushButton.attachDuringLongPress(longPress1); //Definování pro dlouhé zmáčknutí tlačítka dopředu
pushButton.attachLongPressStop(longPressStop1); //Definování po dlouhém zmáčknutí tlačítka dopředu
back.attachClick(click2); //Definování pro jedno zmáčknutí tlačítka zpět
back.attachDoubleClick(doubleclick2); //Definování pro dvojité zmáčknutí tlačítka zpět
back.attachDuringLongPress(longPress2); //Definování pro dlouhé zmáčknutí tlačítka zpět
back.attachLongPressStop(longPressStop2); //Definování po dlouhém zmáčknutí tlačítka zpět
Serial.begin (9600); //Inicializace sériové komunikace arduina a PC
lcd.init(); //Inicializace komunikace LCD s arduinem
lcd.backlight(); //Zapnutí podsvícení displaye
lcd.clear(); //Vymazání případného textu na displayi
}
//---deklarace těla programu---------------------------------------------------------------
void loop(){
if(calibration == 0 && digitalRead(zeroPosition)){ //Zapnutí kalibrace hned po zapnutí zařízení
loading(); //Volání funkce loading() pro výpis textu na během kalibrace
delay(2000); //Zpoždění 2s mezi zapnutím a spuštěním kalibrace
Calibration(); //Volání funkce Calibration pro spuštění kalibrace
calibration = 1;
}
pushButton.tick(); //Volání jednotlivých funkcí tlačítka dopředu podle způsobu jejich stlačení
delay(3);
back.tick(); //Volání jednotlivých funkcí tlačítka zpět podle způsobu jejich stlačení
delay(3);
if(!digitalRead(opto)){
Opto();
}
switch (push){ //Použití funkce switch pro zobrazování jednotlivých screenů displaye
case 0:
homescreen(); //Volání funkce Domovská obrazovka
break;
case 1:
setlength(); //Volání screenu pro nastavení délky vodiče
break;
case 2:
setqty(); //Volání screenu pro nastavení počtů vodičů
break;
case 3:
confirm(); //Volání screenu pro rekapitulace požadovaných hodnot
break;
case 5:
finish(); //Volání screenu po dokončení stříhání
break;
}
if(position2 == 0 && push == 1){ //Funkce pro zajištění vynulování hodnot pro nastavení velikosti skoku čítání
position2 = 1;
position3 = 0;
pressed1 = 0;
pressed3 = 0;
}
if (!digitalRead(RotaryCLK)&& push == 1){ //Funkce pro nastavení délky pomocí encoderu
rotate(); //Volání funkce rorate() pro správné odečtení hodnot z encoderu
delay(PBdelay);
len = countA; //Přepsání hodnoty len pro zobrazení na display
}
if(position3 == 0 && push == 2){ //Funkce pro zajištění vynulování hodnot pro nastavení velikosti skoku čítání
position2 = 0;
position3 = 1;
pressed1 = 0;
pressed3 = 0;
}
if (!digitalRead(RotaryCLK)&& push == 2){ //Funkce pro nastavení počtu kusů vodičů pomocí encoderu
rotate(); //Volání funkce rorate() pro správné odečtení hodnot z encoderu
delay(PBdelay);
qty = countB; //Přepsání hodnoty qty pro zobrazení na display
}
if (push == 4){ //Funkce pro spuštění stříhání vodičů
lcd.clear(); //Funkce pro smazání displaye
Cutting(); //Volání funkce Cutting()
push = 5; //Nastavení proměnné push na hodnotu 5
}
if(push == 6){ //Funkce pro obnovení výchozích hodnot
lcd.clear(); //Funkce pro smazání displaye
push = 0; //Nastavení proměnné push na hodnotu 0
len = 0; //Nastavení proměnné len na hodnotu 0
qty = 0; //Nastavení proměnné qty na hodnotu 0
countA = 0; //Nastavení proměnné countA na hodnotu 0
countB = 0; //Nastavení proměnné countB na hodnotu 0
delay(PBdelay);
}
}
void Opto(){
optoCitac++;
Serial.println(optoCitac);
}
//---deklarace funkci pro jednotlivá tlačítka----------------------------------------------
void click1() { //Deklarace jedno zmáčknutí tlačítka encoderu (pushButton)
push++; //Přičtení 1 k proměnné push
delay(PBdelay);
Serial.println(push);
lcd.clear();
}
//-------------------------------
void longPress1() { //Deklaarce funkce dlouhé zmáčknutí tlačítka encoderu (pushButton)
if(pressed3 == 1 && (push == 1 || push == 2)){
pressed1 = 2;
} else if (pressed3 == 2 && push == 1) {
pressed1 = 3;
} else {
pressed1 = 1;
}
Serial.println(pressed1);
}
//-------------------------------
void longPressStop1() { //Deklarace funkce po dlouhém zmáčknutí tlačítka encoderu (pushButton)
if(pressed1 == 1 && (push == 1 || push == 2)){
pressed3 = 1;
} else if (pressed1 == 2 && push == 1) {
pressed3 = 2;
} else {
pressed1 = 0;
pressed3 = 0;
}
Serial.println(pressed1);
}
//-------------------------------
void click2() { //Deklarace funkce jedno zmáčknutí tlačítka zpět (back)
if(push == 0){
push = 0;
}
if(push < 4){
push--;
}
delay(PBdelay);
Serial.println(push);
lcd.clear();
}
//-------------------------------
void doubleclick2() { //Deklarace funkce dvojité zmáčknutí tlačítka zpět (back)
if(push == 1){
countA = 0;
len = 0;
}
if(push == 2){
countB = 0;
qty = 0;
}
lcd.clear();
}
//-------------------------------
void longPress2() { //Deklarace funkce dlouhé zmáčknutí tlačítka zpět (back)
pressed2++;
if(pressed2 == 1){
lcd.clear();
push = 0;
len = 0;
qty = 0;
countA = 0;
countB = 0;
lcd.clear();
}
}
//-------------------------------
void longPressStop2() { //Deklarace funkce po dlouhém zmáčknutí tlačítka zpět (back)
pressed2 = 0;
}
//---funkce pro nastaveni hodnot pomocí encoderu-------------------------------------------
void rotate(){
//---nastavení délky vodiče-----------------------------
if(push == 1){
CLKNow = digitalRead(RotaryCLK); //Uložení si počáteční doby kdy bylo pootočeno s encoderem
if (CLKNow != CLKPrevious && CLKNow == 1){
if (digitalRead(RotaryDT) != CLKNow) {
if(countA < 6000){ //Omezení maximální hodnoty délky vodiče na 6 metrů
if(pressed1 == 0){ //Funkce pro odečítání hodnot z enkoderu po jednotkách
countA++;
delay(10);
}
if(pressed1 == 1){ //Funkce pro odečítání hodnot z enkoderu po desítkách
countA = countA + 10;
delay(10);
}
if(pressed1 == 2){ //Funkce pro odečítání hodnot z enkoderu po stovkách
countA = countA + 100;
delay(10);
}
} else {
countA = 0; //Nastavení countA na 0 pokud je překročena hodnota 6000
}
} else {
if(countA < 1) { //Omezení hodnot pouze na kladná čísla
countA = 6000; //Nastavení countA na 6000 pokud je hodnota nižší jak 0
} else {
if(pressed1 == 0){ //Funkce pro odečítání hodnot z enkoderu po jednotkách
countA--;
delay(10);
}
if(pressed1 == 1){ //Funkce pro odečítání hodnot z enkoderu po desítkách
countA = countA - 10;
delay(10);
}
if(pressed1 == 2){ //Funkce pro odečítání hodnot z enkoderu po stovkách
countA = countA - 100;
delay(10);
}
}
}
}
CLKPrevious = CLKNow; //Uložení si poslední hodnoty času kdy bylo otáčeno s encoderem
}
//---nastavení množství---------------------------------
else if(push == 2) {
CLKNow = digitalRead(RotaryCLK); //Uložení si počáteční doby kdy bylo pootočeno s encoderem
if (CLKNow != CLKPrevious && CLKNow == 1){
if (digitalRead(RotaryDT) != CLKNow) {
if(countB < 500){ //Omezení maximálního počtu kusů na 500
if(pressed1 == 0){ //Funkce pro odečítání hodnot z enkoderu po jednotkách
countB++;
delay(10);
}
if(pressed1 == 1){ //Funkce pro odečítání hodnot z enkoderu po desítkách
countB = countB + 10;
delay(10);
}
} else {
countB = 0; //Nastavení countB na 0 pokud je překročena hodnota 500
}
} else {
if(countB < 1){ //Nastavení countB na 500 pokud je hodnota nižší jak 0
countB = 500;
} else {
if(pressed1 == 0){ //Funkce pro odečítání hodnot z enkoderu po jednotkách
countB--;
delay(10);
}
if(pressed1 == 1){ //Funkce pro odečítání hodnot z enkoderu po desítkách
countB = countB - 10;
delay(10);
}
}
}
}
CLKPrevious = CLKNow; // Store last CLK state
}
}
//---deklarace funkce stříhání-------------------------------------------------------------
void Cutting(){ //Deklarace funkce Cutting() (stříhání vodičů)
long steptotake = len * feedsteppermm; //Deklarace proměnné pro určení počtu kroků podavacího krokové motoru
for (i = 0; i<qty; i++){ //For cyklus pro opakování stříhaní dle požadovaných kusů
cutting(); //Volání funkce cutting() zodpovědné za zobrazení aktuálního počtu ustřiženách vodičů
digitalWrite(feeddirPin, HIGH); //Nastavení směru otáčení podavacího krokového motoru
for (int x = 0; x < steptotake; x++){ //For cyklus pro přesné otočení krokového motoru dle nastavené délky
digitalWrite(feedstepPin, HIGH);
delayMicroseconds(100);
digitalWrite(feedstepPin, LOW);
delayMicroseconds(100);
}
digitalWrite(cutdirPin, HIGH); //Nastavení směru otáčení stříhácího krokového motoru
for (int y = 0; y < cutstep; y++){ //For cyklus pro přesné otočení krokového motoru dle dráhy stříhací hlavy
digitalWrite(cutstepPin, HIGH);
delayMicroseconds(100);
digitalWrite(cutstepPin, LOW);
delayMicroseconds(100);
}
digitalWrite(cutdirPin, LOW); //Nastavení směru otáčení stříhácího krokového motoru
for (int y = 0; y < cutstep; y++){ //For cyklus pro přesné otočení krokového motoru dle dráhy stříhací hlavy
digitalWrite(cutstepPin, HIGH);
delayMicroseconds(100);
digitalWrite(cutstepPin, LOW);
delayMicroseconds(100);
}
}
}
void Calibration(){ //Deklarace funkce Calibration() počáteční kalibrace během zpouštění zařízení
digitalWrite(cutdirPin, LOW); //Nastavení směru otáčení stříhácího krokového motoru
while (digitalRead(zeroPosition)){ //While cyklus posouvající stříhácí hlavu do doby než je stlačen koncový spínač
digitalWrite(cutstepPin, HIGH);
delayMicroseconds(100);
digitalWrite(cutstepPin, LOW);
delayMicroseconds(100);
}
digitalWrite(cutdirPin, HIGH); //Nastavení směru otáčení stříhácího krokového motoru
for (int y = 0; y < cutstep; y++){ //For cyklus pro posunutí stříhací hlavy zpět od koncového spínače
digitalWrite(cutstepPin, HIGH);
delayMicroseconds(200);
digitalWrite(cutstepPin, LOW);
delayMicroseconds(200);
}
digitalWrite(cutdirPin, LOW); //Nastavení směru otáčení stříhácího krokového motoru
while (digitalRead(zeroPosition)){ //While cyklus pro opětovné ale přesnější posunutí stříhací hlavy do pozice u koncového spínače
digitalWrite(cutstepPin, HIGH);
delayMicroseconds(500);
digitalWrite(cutstepPin, LOW);
delayMicroseconds(500);
}
}
//---deklarace funkci pro jednotlivé screeny-----------------------------------------------
void loading(){ //fuknce pro načítání a kalibraci
lcd.setCursor(0, 0); //Nastavení cursoru na pozici 0,0 pro přesné psaní textu na display
lcd.print("NACITANI....");
}
void homescreen(){ //fuknce pro domovskou obrazovku
lcd.setCursor(0, 0);
lcd.print("LUKIHO STRIHACKA");
lcd.setCursor(13, 1);
lcd.print("-->");
pressed1 = 0;
pressed3 = 0;
}
//-------------------------------
void setlength(){ //funkce pro screen nastavení délky vodiče
lcd.setCursor(0, 0);
lcd.print("DELKA [MM]");
lcd.setCursor(0, 1);
lcd.print("<--");
lcd.setCursor(6, 1);
lcd.print(len);
lcd.print(" ");
lcd.setCursor(13, 1);
lcd.print("-->");
}
//-------------------------------
void setqty(){ //funkce pro screen nastavení počtu kusů
lcd.setCursor(0, 0);
lcd.print("MNOZSTVI [KS]");
lcd.setCursor(0, 1);
lcd.print("<--");
lcd.setCursor(6, 1);
lcd.print(qty);
lcd.print(" ");
lcd.setCursor(13, 1);
lcd.print("-->");
}
//-------------------------------
void confirm(){ //funkce pro screen rekapitulace požadovaných hodnot
lcd.setCursor(0, 0);
lcd.print("DELKA[MM] = ");
lcd.setCursor(12, 0);
lcd.print(len);
lcd.setCursor(0, 1);
lcd.print("KUSU = ");
lcd.setCursor(7, 1);
lcd.print(qty);
lcd.setCursor(11, 1);
lcd.print("READY");
pressed1 = 0;
pressed3 = 0;
}
//-------------------------------
void cutting(){ //funkce pro screen během stříhání
int k = qty - i;
int cursor1 = 0;
int cursor2 = 0;
if(qty < 10){
cursor1 = 13;
}
if(qty < 100 && qty > 9){
cursor1 = 12;
}
if(qty < 1000 && qty > 99){
cursor1 = 11;
}
if(qty < 10000 && qty > 999){
cursor1 = 10;
}
if(k < 10){
lcd.clear();
lcd.setCursor(0, 0);
lcd.print("STRIHANI");
lcd.setCursor(cursor1-2, 1);
lcd.print(k);
lcd.setCursor(cursor1, 1);
lcd.print("Z " +(String)qty);
}
if(k < 100 && k > 9){
lcd.clear();
lcd.setCursor(0, 0);
lcd.print("STRIHANI");
lcd.setCursor(cursor1-3, 1);
lcd.print(k);
lcd.setCursor(cursor1, 1);
lcd.print("Z " +(String)qty);
}
if(k < 1000 && k > 99){
lcd.clear();
lcd.setCursor(0, 0);
lcd.print("STRIHANI");
lcd.setCursor(cursor1-4, 1);
lcd.print(k);
lcd.setCursor(cursor1, 1);
lcd.print("Z " +(String)qty);
}
if(k < 10000 && k > 999){
lcd.clear();
lcd.setCursor(0, 0);
lcd.print("STRIHANI");
lcd.setCursor(cursor1-5, 1);
lcd.print(k);
lcd.setCursor(cursor1, 1);
lcd.print("Z " +(String)qty);
}
}
//-------------------------------
void finish(){ //funkce pro screen po dokončení stříhání
lcd.setCursor(0, 0);
lcd.print("KONEC.... ");
lcd.setCursor(0, 1);
lcd.print(" DOMU>");
}
//-------------------------------