Here it is
// Note: You can use a translator on the comments
int maxpix = 1000; // maximálna poloha v pixeloch
int stpx = 16; // lineárna závislosť medzi krokmi a bodmi
int stlf = 205; // množstvo krokov na posunutie o jeden pixelový riadok
byte naTlac[1000]; // alokovaných 1000 bajtov, kde sa budú písať hodnoty
long step = 0; // kroky motora tlačovej hlavy
long tarstep = 0; // cieľová pozícia motora tlačovej hlavy
long printpix = 0; // pixel na tlač
long pixel = 0; // horizontálna poloha v pixeloch
byte pxlnfeed = 0; // má sa posunúť riadok v úrovni pixelov?
long stplnfdamnt = 0; // relatívne množstvo krokov na posuv papiera o riadok
byte val = 0; // hodnota čítaná z array naTlac
byte toprint = 0; // má sa tlačiť? Platí len pre jeden riadok pixelov
long retstep = 0; // kroky návratu tlačovej hlavy
byte printdir = 0; // smer tlače
byte senseb1 = 0; // detekcia bitu 1
byte senseb2 = 0; // detekcia bitu 2
byte senseb3 = 0; // detekcia bitu 3
byte senseb4 = 0; // detekcia bitu 4
byte senseb5 = 0; // detekcia bitu 5
byte senseb6 = 0; // detekcia bitu 6
byte senseb7 = 0; // detekcia bitu 7
byte senseb8 = 0; // detekcia bitu 8
byte num1 = 0;
unsigned int clearing = 0;
void setup() {
pinMode(2, OUTPUT); // stepper 1 dir
pinMode(3, OUTPUT); // stepper 1 step
pinMode(4, OUTPUT); // stepper 2 step
pinMode(5, INPUT_PULLUP); // koncový kalibračný spínač
pinMode(6, OUTPUT); // tlačiaca ihlička 1
pinMode(7, OUTPUT); // tlačiaca ihlička 2
pinMode(8, OUTPUT); // tlačiaca ihlička 3
pinMode(9, OUTPUT); // tlačiaca ihlička 4
pinMode(10, OUTPUT); // tlačiaca ihlička 5
pinMode(11, OUTPUT); // tlačiaca ihlička 6
pinMode(12, OUTPUT); // tlačiaca ihlička 7
pinMode(13, OUTPUT); // tlačiaca ihlička 8
Serial.begin(9600);
Serial.println(); // tento riadok môžete vynechať
//shlulls();
for(int v = 0; v < maxpix - 1; v = v + 1) {
naTlac[v] = 0;
}
}
void loop() {
if (Serial.available()) {
naTlac[printpix] = Serial.read();
printpix = printpix + 1;
}
if (printpix > maxpix - 1) {
Serial.write(0x13);
printpix = 0;
toprint = 1;
}
if (toprint == 1 && printdir == 0) {
stepMovePrint();
}
if (toprint == 1 && printdir == 1) {
stepMovePrintReverse();
}
while (clearing <= maxpix - 1) {
naTlac[clearing] = 0;
clearing = clearing + 1;
}
}
void stepMovePrint() { // tlačenie jedného riadku
tarstep = pixel * stpx;
digitalWrite(2, LOW);
if (toprint == 1) {
while (pixel <= maxpix - 1) {
tarstep = pixel * stpx;
val = naTlac[pixel];
while (tarstep > step) {
tarstep = pixel * stpx;
digitalWrite(3, HIGH);
delayMicroseconds(40);
digitalWrite(3, LOW);
delayMicroseconds(40);
if (tarstep - step <= stpx - 10) {
digitalWrite(6, LOW);
digitalWrite(7, LOW);
digitalWrite(8, LOW);
digitalWrite(9, LOW);
digitalWrite(10, LOW);
digitalWrite(11, LOW);
digitalWrite(12, LOW);
digitalWrite(13, LOW);
}
else {
prhdwt();
}
step = step + 1;
}
if (tarstep <= step) {
pixel = pixel + 1;
}
}
}
toprint = 0;
digitalWrite(5, LOW);
printdir = 1;
stepLinefeed();
}
void stepLinefeed() {
stplnfdamnt = stlf;
while (stplnfdamnt >= 1) {
digitalWrite(4, HIGH);
delayMicroseconds(100);
digitalWrite(4, LOW);
delayMicroseconds(100);
stplnfdamnt = stplnfdamnt - 1;
}
printpix = 0;
clearing = 0;
for (int i = 0; i <= maxpix - 1; i = i + 1) {
naTlac[i] = 0;
}
Serial.write(0x11);
}
void stepMovePrintReverse() { // tlačenie jedného riadku
tarstep = pixel * stpx;
digitalWrite(2, HIGH);
if (toprint == 1) {
while (pixel >= 0) {
tarstep = pixel * stpx;
if (pixel > -1) {
val = naTlac[pixel];
}
if (pixel == -1) {
val = naTlac[0];
}
while (tarstep < step) {
tarstep = pixel * stpx;
digitalWrite(3, HIGH);
delayMicroseconds(40);
digitalWrite(3, LOW);
delayMicroseconds(40);
if (step - tarstep <= stpx - 10) {
digitalWrite(6, LOW);
digitalWrite(7, LOW);
digitalWrite(8, LOW);
digitalWrite(9, LOW);
digitalWrite(10, LOW);
digitalWrite(11, LOW);
digitalWrite(12, LOW);
digitalWrite(13, LOW);
}
else {
prhdwt();
}
step = step - 1;
}
if (tarstep >= step) {
pixel = pixel - 1;
}
}
}
digitalWrite(5, LOW);
toprint = 0;
printdir = 0;
stepLinefeed();
}
void shlulls() {
digitalWrite(2, HIGH);
while (digitalRead(6) == HIGH) {
digitalWrite(3, HIGH);
delayMicroseconds(2500);
digitalWrite(3, LOW);
delayMicroseconds(2500);
}
tarstep = 0;
step = 0;
pixel = 0;
printpix = 0;
while (step <= 400) {
digitalWrite(2, LOW);
digitalWrite(3, HIGH);
delayMicroseconds(250);
digitalWrite(3, LOW);
delayMicroseconds(250);
step = step + 1;
}
}
void prhdwt() { /* Print head write (writes a byte to the whole printhead) */
num1 = naTlac[pixel];
senseb1 = ~num1 & 0b00000001;
senseb2 = ~num1 & 0b00000010;
senseb3 = ~num1 & 0b00000100;
senseb4 = ~num1 & 0b00001000;
senseb5 = ~num1 & 0b00010000;
senseb6 = ~num1 & 0b00100000;
senseb7 = ~num1 & 0b01000000;
senseb8 = ~num1 & 0b10000000;
if(senseb1 > 1) {
senseb1 = 1;
}
if(senseb2 > 1) {
senseb2 = 1;
}
if(senseb3 > 1) {
senseb3 = 1;
}
if(senseb4 > 1) {
senseb4 = 1;
}
if(senseb5 > 1) {
senseb5 = 1;
}
if(senseb6 > 1) {
senseb6 = 1;
}
if(senseb7 > 1) {
senseb7 = 1;
}
if(senseb8 > 1) {
senseb8 = 1;
}
digitalWrite(6, senseb1);
digitalWrite(7, senseb2);
digitalWrite(8, senseb3);
digitalWrite(9, senseb4);
digitalWrite(10, senseb5);
digitalWrite(11, senseb6);
digitalWrite(12, senseb7);
digitalWrite(13, senseb8);
senseb1 = 0;
senseb2 = 0;
senseb3 = 0;
senseb4 = 0;
senseb5 = 0;
senseb6 = 0;
senseb7 = 0;
senseb8 = 0;
num1 = 0;
}