#include "storage.h"
int letterpos = 0;
int lsindex = 0; // index of read letter in template
int pixpos = 0;
long steppos = 0;
byte letter = 0;
byte pixval = 0;
byte cmsht = 29;
byte pmsht = 59;
byte stcpx = 27;
byte stppx = 61;
byte pxln = 10;
long lnfsa = 0;
byte printmode = 0; // defaults to text
byte pxpos = 0;
byte iscommand = 0;
byte buffer[1000] = {0};
int bufpos = 0;
int rdpos = 0;
byte zdroj = 0;
void setup() {
DDRB = 255;
PORTB = 0;
pinMode(6, INPUT_PULLUP); // koncový kalibračný spínač (limit switch for homing)
pinMode(A1, INPUT_PULLUP); // posuv papiera von (move paper out of the output(blank line feed))
pinMode(A2, INPUT_PULLUP); // posuv papiera dnu (move paper into the output(blank line unfeed))
pinMode(2, OUTPUT); // stepper 1 step
pinMode(3, OUTPUT); // stepper 1 dir
pinMode(4, OUTPUT); // stepper 2 step
pinMode(5, OUTPUT); // stepper 2 dir
Serial.begin(19200);
digitalWrite(3, LOW);
while (digitalRead(6) == HIGH) {
digitalWrite(2, HIGH);
delayMicroseconds(125);
digitalWrite(2, LOW);
delayMicroseconds(125);
}
digitalWrite(3, HIGH);
for (int s = 0; s < (stcpx * 20); s = s + 1) {
digitalWrite(2, HIGH);
delayMicroseconds(125);
digitalWrite(2, LOW);
delayMicroseconds(125);
}
Serial.write(0x0A); // tento riadok môžete vynechať
dotmatrixprintln("Printer is ready!\n\nThe specs of the printer are:\nhalfstep delay for carriage: ");
dotmatrixprint(cmsht);
dotmatrixprintln(" microseconds\nhalfstep delay for paper feed: ");
dotmatrixprint(pmsht);
dotmatrixprintln(" microseconds\n\nsteps per pixel for carriage: ");
dotmatrixprint(stcpx);
dotmatrixprintln(" steps\n\nsteps per pixel for paper feed: ");
dotmatrixprint(stppx);
dotmatrixprintln(" steps\n\nmaximum amount of characters per line: 20 letters\n\nresolution of printing: 3 pixels per millimeter\n\nYou can tear this paper off because I am done informing you about myself\n\n\n\n");
}
void loop() {
if (digitalRead(A1) == LOW) {
delay(500);
bplf();
}
if (digitalRead(A2) == LOW) {
delay(500);
bpluf();
}
while (Serial.available()) {
if (Serial.available() >= 20) {
Serial.write(0x13);
zdroj = 1;
while(Serial.available() > 1) {
buffer[bufpos] = Serial.read();
bufpos = bufpos + 1;
}
rdpos = 0;
bufpos = 0;
}
if (Serial.available() <= 3) {
Serial.write(0x11);
zdroj = 0;
}
if(zdroj == 0) {letter = Serial.read();}
if(zdroj == 1 && letter != 0) {
letter = buffer[rdpos];
rdpos = rdpos + 1;
}
if (letter == 27) {
iscommand = 1;
continue;
} else if (iscommand == 1) {
if (letter == 'E') { // ESC E - eject
for (byte w = 0; w < 50; w = w + 1) {
pxln = 10;
bpluf();
}
} else if (letter == 'I') { // ESC I - test image
printtestimg();
} else {
continue;
}
iscommand = 0;
} else if (letter == 'G') { // ESC G - graphics
printmode = 1;
crlf();
} else if (letter == 'L') { // ESC L - load
pxln = 4;
for (byte u = 0; u < 9; u = u + 1) {
bplf();
}
pxln = 10;
} else if (letter == 'S') { // ESC S - test string
printtesttext();
} else if (letter == 'T') { // ESC T - text
printmode = 0;
crlf();
} else if (letter <= 31 && letter != 27) {
if (letter == 10 && printmode == 0) {
pxpos = 0;
pixpos = 0;
crlf();
} else {
return;
}
} else {
if (printmode == 1) {
dotmatrixgraphics(letter);
}
if (printmode == 0) {
dotmatrixtext(letter);
}
}
if (pixpos >= 119) {
pixpos = 0;
pxpos = 0;
crlf();
}
if (pxpos >= 119) {
pixpos = 0;
pxpos = 0;
crlf();
}
}
}
void dotmatrixprint(String text) { // string
for (int i = 0; i < text.length(); i = i + 1) {
byte znak = text[i];
if (znak == 10 || znak == 13 || letterpos > 19) {
if (letterpos > 19) { i = i - 1; }
letterpos = 0;
crlf();
} else {
dotmatrixtext(znak);
}
letterpos = letterpos + 1;
}
}
void dotmatrixprint(int hodnota) { // integer
String text = String(hodnota);
for (int i = 0; i < text.length(); i = i + 1) {
byte znak = text[i];
if (znak == 10 || znak == 13 || letterpos > 19) {
if (letterpos > 19) { i = i - 1; }
letterpos = 0;
crlf();
} else {
dotmatrixtext(znak);
}
letterpos = letterpos + 1;
}
}
void dotmatrixprint(unsigned int hodnota) { // unsigned integer
String text = String(hodnota);
for (int i = 0; i < text.length(); i = i + 1) {
byte znak = text[i];
if (znak == 10 || znak == 13 || letterpos > 19) {
if (letterpos > 19) { i = i - 1; }
letterpos = 0;
crlf();
} else {
dotmatrixtext(znak);
}
letterpos = letterpos + 1;
}
}
void dotmatrixprint(long hodnota) {
String text = String(hodnota);
for (int i = 0; i < text.length(); i = i + 1) {
byte znak = text[i];
if (znak == 10 || znak == 13 || letterpos > 19) {
if (letterpos > 19) { i = i - 1; }
letterpos = 0;
crlf();
} else {
dotmatrixtext(znak);
}
letterpos = letterpos + 1;
}
}
void dotmatrixprint(unsigned long hodnota) {
String text = String(hodnota);
for (int i = 0; i < text.length(); i = i + 1) {
byte znak = text[i];
if (znak == 10 || znak == 13 || letterpos > 19) {
if (letterpos > 19) { i = i - 1; }
letterpos = 0;
crlf();
} else {
dotmatrixtext(znak);
}
letterpos = letterpos + 1;
}
}
void dotmatrixprint(float hodnota) {
String text = String(hodnota);
for (int i = 0; i < text.length(); i = i + 1) {
byte znak = text[i];
if (znak == 10 || znak == 13 || letterpos > 19) {
if (letterpos > 19) { i = i - 1; }
letterpos = 0;
crlf();
} else {
dotmatrixtext(znak);
}
letterpos = letterpos + 1;
}
}
void dotmatrixprintln(String text) { // string
for (int i = 0; i < text.length(); i = i + 1) {
byte znak = text[i];
if (znak == 10 || znak == 13 || letterpos > 19) {
if (letterpos > 19) { i = i - 1; }
letterpos = 0;
crlf();
} else {
dotmatrixtext(znak);
}
letterpos = letterpos + 1;
}
letterpos = 0;
crlf();
}
void dotmatrixprintln(int hodnota) { // integer
String text = String(hodnota);
for (int i = 0; i < text.length(); i = i + 1) {
byte znak = text[i];
if (znak == 10 || znak == 13 || letterpos > 19) {
if (letterpos > 19) { i = i - 1; }
letterpos = 0;
crlf();
} else {
dotmatrixtext(znak);
}
letterpos = letterpos + 1;
}
letterpos = 0;
crlf();
}
void dotmatrixprintln(unsigned int hodnota) { // unsigned integer
String text = String(hodnota);
for (int i = 0; i < text.length(); i = i + 1) {
byte znak = text[i];
if (znak == 10 || znak == 13 || letterpos > 19) {
if (letterpos > 19) { i = i - 1; }
letterpos = 0;
crlf();
} else {
dotmatrixtext(znak);
}
letterpos = letterpos + 1;
}
letterpos = 0;
crlf();
}
void dotmatrixprintln(long hodnota) {
String text = String(hodnota);
for (int i = 0; i < text.length(); i = i + 1) {
byte znak = text[i];
if (znak == 10 || znak == 13 || letterpos > 19) {
if (letterpos > 19) { i = i - 1; }
letterpos = 0;
crlf();
} else {
dotmatrixtext(znak);
}
letterpos = letterpos + 1;
}
letterpos = 0;
crlf();
}
void dotmatrixprintln(unsigned long hodnota) {
String text = String(hodnota);
for (int i = 0; i < text.length(); i = i + 1) {
byte znak = text[i];
if (znak == 10 || znak == 13 || letterpos > 19) {
if (letterpos > 19) { i = i - 1; }
letterpos = 0;
crlf();
} else {
dotmatrixtext(znak);
}
letterpos = letterpos + 1;
}
letterpos = 0;
crlf();
}
void dotmatrixprintln(float hodnota) {
String text = String(hodnota);
for (int i = 0; i < text.length(); i = i + 1) {
byte znak = text[i];
if (znak == 10 || znak == 13 || letterpos > 19) {
if (letterpos > 19) { i = i - 1; }
letterpos = 0;
crlf();
} else {
dotmatrixtext(znak);
}
letterpos = letterpos + 1;
}
letterpos = 0;
crlf();
}
// ↓↓↓ Here begin the actual dot matrix printing functions (to detach the printing from the loop) (they do the heavy lifting) ↓↓↓
void dotmatrixgraphics(byte graphdat) {
pxln = 7;
digitalWrite(3, HIGH);
pxpos = pxpos + 1;
for (byte y = 0; y < stcpx; y = y + 1) {
steppos = steppos + 1;
digitalWrite(2, HIGH);
delayMicroseconds(cmsht);
digitalWrite(2, LOW);
delayMicroseconds(cmsht);
if (y > 5) {
PORTB = 0;
} else {
PORTB = graphdat;
}
}
}
void dotmatrixtext(byte character) {
pxln = 10;
digitalWrite(3, HIGH);
lsindex = (character - 32) * 6;
for (byte i = 0; i < 6; i = i + 1) {
pixval = 0;
pixval = pgm_read_byte(&(font[lsindex + i]));
pixpos = pixpos + 1;
pxpos = pxpos + 1;
for (byte y = 0; y < stcpx; y = y + 1) {
steppos = steppos + 1;
digitalWrite(2, HIGH);
delayMicroseconds(cmsht);
digitalWrite(2, LOW);
delayMicroseconds(cmsht);
if (y > 10) {
PORTB = 0;
} else {
PORTB = pixval;
}
}
}
}
void crlf() {
lnfsa = pxln * stppx;
digitalWrite(3, LOW);
digitalWrite(5, HIGH);
while (steppos > 0) {
steppos = steppos - 1;
digitalWrite(2, HIGH);
delayMicroseconds(cmsht);
digitalWrite(2, LOW);
delayMicroseconds(cmsht);
}
while (lnfsa > 0) {
lnfsa = lnfsa - 1;
digitalWrite(4, HIGH);
delayMicroseconds(pmsht);
digitalWrite(4, LOW);
delayMicroseconds(pmsht);
}
}
// ↑↑↑ These functions are more or less vital for ease of use (you can reimplement if you want to) (PS: You don't need to use the bplf and bpluf functions) ↑↑↑
// ↓↓↓ you can omit these functions provided below if you don't need them in your program ↓↓↓
void printtesttext() {
long poloha = 0;
for (int i = 0; i < 175; i = i + 1) {
poloha = poloha + 1;
unsigned char pismeno = pgm_read_byte(&(testing[i]));
if (pismeno == 10 || pismeno == 13 || poloha > 19) {
poloha = 0;
crlf();
} else {
dotmatrixtext(pismeno);
}
}
dotmatrixprintln("");
dotmatrixprintln("");
dotmatrixprintln("");
dotmatrixprintln("");
dotmatrixprintln("");
}
void printtestimg() {
for (int i = 0; i < 3120; i = i + 1) {
byte hodnota = pgm_read_byte(&(imagetest[i]));
if (pixpos >= 119) {
pixpos = 0;
pxpos = 0;
crlf();
}
if (pxpos >= 119) {
pixpos = 0;
pxpos = 0;
crlf();
} else {
dotmatrixgraphics(hodnota);
}
}
dotmatrixprintln("");
dotmatrixprintln("");
dotmatrixprintln("");
dotmatrixprintln("");
dotmatrixprintln("");
}
void bplf() {
digitalWrite(5, HIGH);
lnfsa = pxln * stppx;
while (lnfsa > 0) {
lnfsa = lnfsa - 1;
digitalWrite(4, HIGH);
delayMicroseconds(pmsht);
digitalWrite(4, LOW);
delayMicroseconds(pmsht);
}
}
void bpluf() {
digitalWrite(5, LOW);
lnfsa = pxln * stppx;
while (lnfsa > 0) {
lnfsa = lnfsa - 1;
digitalWrite(4, HIGH);
delayMicroseconds(pmsht);
digitalWrite(4, LOW);
delayMicroseconds(pmsht);
}
}
Homing switch
Line feed
Carriage move
Paper feed out of printer
Paper feed into printer