Moosetar (Zoltar) Fortune Teller (4 / 9 steg)
Steg 4: Seriell skrivare
Jag använde Serial1 på Mega för att prata med skrivaren, relevanta delar av koden är:
Serial1.BEGIN(19200);
Jag har flera hjälpare metoder att köra skrivaren och skriva ut bilder, etc:
Jag skriver för det mesta bara till den seriella porten så här:
Serial1.Print ("Moosetar säger: se upp!");
Jag gör detta för trycka bilder:
printBitmap (moose_outline_width, moose_outline_height, moose_outline_data, true);
och inkludera uppgifterna som en .h fil. Mer information om hur du gör detta finns här http://learn.adafruit.com/mini-thermal-receipt-printer/bitmap-printing
Vilka sedan få är tryckt av skrivaren. Jag hittade några hjälpare metoder i Lady Ada bibliotek. Eftersom jag var med hårdvara följetong jag hade vissa problem med sin kod, men jag ändrade dem och med dem i skissen. Här är de relevanta metoderna.
void writePrintMode()
{
Serial.println(printMode);
Serial1.write(27);
Serial1.write(33);
Serial1.write(printMode);
}
void setPrintMode (uint8_t mask) {
printMode | = mask;
writePrintMode();
charHeight = (printMode & DOUBLE_HEIGHT_MASK)? 24:48.
maxColumn = (printMode & DOUBLE_WIDTH_MASK)? 16:32.
}
void setNormalMode()
{
printMode = 0;
writePrintMode();
Serial1.write(27);
Serial1.write(45);
Serial1.write(Zero);
Serial1.write(27);
Serial1.write(32);
Serial1.write(Zero);
Serial1.write(29);
Serial1.write(33);
Serial1.write(Zero);
}
void unsetPrintMode(uint8_t mask)
{
printMode & = ~ mask;
writePrintMode();
}
void printerLineFeed(int lines)
{
för (int jag = 0; jag < linjer; i ++)
{
Serial1.write(10);
}
}
void writeBytes(uint8_t a) {
Serial1.write(a);
}
void writeBytes (uint8_t, uint8_t b) {
Serial1.write(a);
Serial1.write(b);
Delay(300);
}
void writeBytes (uint8_t, uint8_t b, uint8_t c) {
Serial1.write(a);
Serial1.write(b);
Serial1.write(c);
Delay(300);
}
void writeBytes (uint8_t a, uint8_t b, uint8_t c, uint8_t d) {
Serial1.write(a);
Serial1.write(b);
Serial1.write(c);
Serial1.write(d);
Delay(300);
}
void printBitmap(Stream *stream) {
uint8_t tmp;
uint16_t bredd, höjd;
tmp = stream -> read();
bredd = (ström -> read() << 8) + tmp;
tmp = stream -> read();
höjd = (ström -> read() << 8) + tmp;
printBitmap (bredd, höjd, ström);
}
void printBitmap (int w, int h, ström * stream) {
int rowBytes, rowBytesClipped, rowStart, chunkHeight, x, y, i, c;
rowBytes = (w + 7) / 8; Runda upp till nästa byte gräns
rowBytesClipped = (rowBytes > = 48)? 48: rowBytes; 384 pixlar max bredd
för (rowStart = 0; rowStart < h; rowStart += 255) {
Lämna upp till 255 rader i taget:
chunkHeight = h - rowStart;
om (chunkHeight > 255) chunkHeight = 255;
writeBytes (18, 42, chunkHeight, rowBytesClipped);
för (y = 0; y < chunkHeight; y ++) {
för (x = 0; x < rowBytesClipped; x ++) {
medan ((c = stream -> read()) < 0);
Serial1.write((uint8_t)c);
}
för (jag = rowBytes - rowBytesClipped; jag > 0; i--) {
medan ((c = stream -> read()) < 0);
}
}
timeoutSet(chunkHeight * dotPrintTime);
}
prevByte = "\n";
}
void printBitmap)
int w, int h, const uint8_t * bitmapp, bool fromProgMem) {
int rowBytes, rowBytesClipped, rowStart, chunkHeight, x, y, i.
rowBytes = (w + 7) / 8; Runda upp till nästa byte gräns
rowBytesClipped = (rowBytes > = 48)? 48: rowBytes; 384 pixlar max bredd
för (jag = rowStart = 0; rowStart < h; rowStart += 255) {
Lämna upp till 255 rader i taget:
chunkHeight = h - rowStart;
om (chunkHeight > 255) chunkHeight = 255;
writeBytes (18, 42, chunkHeight, rowBytesClipped);
för (y = 0; y < chunkHeight; y ++) {
för (x = 0; x < rowBytesClipped; x ++, i ++) {
Serial1.write (fromProgMem? pgm_read_byte (bitmapp + i): *(bitmap+i));
}
Jag += rowBytes - rowBytesClipped;
}
timeoutSet(chunkHeight * dotPrintTime);
}
prevByte = "\n";
}