PDA

Archiv verlassen und diese Seite im Standarddesign anzeigen : [ERLEDIGT] Adafruit Thermodrucker



Kampi
21.04.2013, 15:22
Heyho Forum,

ich habe gestern meinen Thermodrucker von Adafruit bekommen:

http://www.adafruit.com/products/597#Downloads

Und ich habe direkt mal ein kleines Modul für Python entworfen (bzw. ist als Modul geplant).
Das Modul deckt schon den größten Teil der Funktionen ab.
Hier ein kleines Beispiel für einen Barcode und einem invertierten und unterstrichenen Text:

http://img515.imageshack.us/img515/6027/dscf0844f.jpg (http://imageshack.us/photo/my-images/515/dscf0844f.jpg/)


Den Code findet ihr hier:



import serial


# Serielle Schnittstelle oeffnen
UART = serial.Serial("/dev/ttyUSB0", 19200)
UART.open()


# Barcodetyp festlegen
# Fuer genauere Infos in das Datenblatt des Druckers schauen!
# EAN8
# Dieser Barcodetyp erwartet 7-8 Bytes an Daten
# Darstellbar sind Zahlen von 0-9 mittels 0x30 - 0x39
Barcodetyp = 3


# Liste fuer einen vordefinierten Barcode mit den Zahlen 0-7
Daten = {48, 49, 50, 51, 52, 53, 54, 55}


# ------------------------------------------------------------------------
# Drucker
# ------------------------------------------------------------------------


# Drucker initialisieren
# Buffer leeren
# Parameter auf Defaultwerte zuruecksetzen
# In den Standardmodus wechseln
# User-definierte Zeichen loeschen
def Init():


UART.write(chr(27))
UART.write(chr(64))
return


# Testseite drucken
def PrintTestpage():


UART.write(chr(18))
UART.write(chr(84))


return


# Standby auswaehlen
# Auswahl
# - Offline
# - Online
def Standby(Modus):

if(Modus == "Offline"):
Value = 0
elif(Modus == "Online"):
Value = 1

UART.write(chr(27))
UART.write(chr(61))
UART.write(chr(Value))


return


# Drucker in Sleepmodus setzen
# WICHTIG: Der Drucker muss erst mittels "Wake()" geweckt werden, wenn er wieder benutzt werden soll
# Auswahl
# - Zeit von 0-255
def Sleep(Zeit):


if(Zeit > 255):
print "Der Wert fuer die Zeit ist zu hoch!"
return -1

UART.write(chr(27))
UART.write(chr(56))
UART.write(chr(Zeit))

return

# Drucker aufwecken
def Wake():


UART.write(chr(255))
time.sleep(0.1)
return


# Pruefen ob der Drucker Papier hat (1 = kein Papier, 0 = Papier)
# Bit 3 -> 0 = Papier, 1 = kein Papier
def Paper():


Status = 0

UART.write(chr(27))
UART.write(chr(118))
UART.write(chr(0))

# Zeichen einlesen
Read = UART.read(UART.inWaiting())

if(Read == chr(32)):
Status = 0
elif(Read == chr(36)):
Status = 1

return Status

# ------------------------------------------------------------------------
# Character
# ------------------------------------------------------------------------

# Skipt eine bestimmte Anzahl Zeilen
def Feed(Anzahl):


if(Anzahl > 255):
print "Anzahl der Zeilen zu hoch!"
return -1


UART.write(chr(27))
UART.write(chr(100))

for Counter in range(Anzahl):
UART.write(chr(12))


return


# Druckt eine bestimmte Anzahl leerer Zeichen (max. 47)
def Blank(Anzahl):


if(Anzahl > 47):
print "Anzahl der Leerstellen zu hoch!"
return -1


UART.write(chr(27))
UART.write(chr(66))
UART.write(chr(Anzahl))

return

# Drucken einer Zeile
def Println(Text):


UART.write(Text)
UART.write(chr(10))
UART.write(chr(13))

return


# Noch in Arbeit
# Druckt ein Tab (8 leere Zeichen)
def Tab():

UART.write(chr(9))
return

# Linienstaerke einstellen:
# Auswahl
# - None
# - Middel
# - Big
def Underline(Dicke):


# Linienstaerke auswaehlen
if(Dicke == "None"):
Value = 0
elif(Dicke == "Middel"):
Value = 1
elif(Dicke == "Big"):
Value = 2
else:
return -1

UART.write(chr(27))
UART.write(chr(45))
UART.write(chr(Value))


return

# Deaktiviert das Unterstreichen vom Text
def DeleteUnderline():


UART.write(chr(27))
UART.write(chr(45))
UART.write(chr(0))

return


# Textmodus setzen
# Auswahl
# - Inverse
# - Updown
# - Bold
# - DoubleHeight
# - DoubleWidth
# - Deleteline
def PrintMode(Mode):


# Modus auswaehlen
if(Mode == "Inverse"):
Value = 2
elif(Mode == "Updown"):
Value = 4
elif(Mode == "Bold"):
Value = 8
elif(Mode == "DoubleHeight"):
Value = 16
elif(Mode == "DoubleWidth"):
Value = 32
elif(Mode == "Deleteline"):
Value = 64
else:
Value = 0


UART.write(chr(27))
UART.write(chr(33))
UART.write(chr(Value))


return


# Printmode zuruecksetzen
def DeletePrintMode():


UART.write(chr(27))
UART.write(chr(33))
UART.write(chr(0))

return


# Stellt den Abstand zwischen zwei Zeilen in Punkten ein
def SetLineSpace(Punkte):

if(Punkte > 32):
print "Anzahl der Punkte zu hoch!"
return -1

UART.write(chr(27))
UART.write(chr(51))
UART.write(chr(Punkte))

return


# Setzt den Abstand zwischen zwei Zeilen auf den Default Wert (32 Punkte)
def SetLineDefault():


UART.write(chr(27))
UART.write(chr(50))


return


# ------------------------------------------------------------------------
# Barcode
# ------------------------------------------------------------------------


# Noch in Arbeit
# Einstellen der lesbaren Zeichen fuer den Barcode
# Auswahl
# - Above -> Ueber dem Barcode
# - Below -> Unter dem Barcode
# - Both -> Ueber und unter dem Barcode
def BarcodeReadable(Position):


if(Position == "Above"):
Value = 1
elif(Position == "Below"):
Value = 2
elif(Position == "Both"):
Value = 3
else:
Value = 0

UART.write(chr(29))
UART.write(chr(72))
UART.write(chr(Value))

return

# Einstellen der Barcode Breite
# Auswahl
# - Small
# - Big
def BarcodeWidth(Breite):

if(Breite == "Small"):
Value = 2
elif(Breite == "Big"):
Value = 3
else:
print "Ungueltige Angabe"
return -1

UART.write(chr(29))
UART.write(chr(119))
UART.write(chr(Value))

return

# Hoehe des Barcodes (0 - 255)
def BarcodeHeight(Hoehe):


if(Hoehe > 255):
print "Die Hoehe ist zu hoch!"
return -1

UART.write(chr(29))
UART.write(chr(104))
UART.write(chr(Hoehe))

return

# Barcode drucken
def PrintBarcode(Daten):


UART.write(chr(29))
UART.write(chr(107))
UART.write(chr(Barcodetyp))

for Counter in Daten:
UART.write(chr(Counter))


UART.write(chr(00))
return






# Dieses Beispiel druckt ein "Hallo Welt" in invertierter Form und einen Namen der unterstrichen ist.
# Der Abstand der Zeilen wird auf 4 Punkte gesetzt und es werden 4 Zeilen geskipt.
# Es wird ein Barcode gedruckt, welcher aus den Zahlen 0-7 besteht.


print ""
print "+-------------------------------------------------+"
print "| Druckertest |"
print "+-------------------------------------------------+"
print ""


Init()
Status = Paper()


print "Der Status des Papiersensors ist: " + str(Status)


PrintMode("Inverse")
Println("Hallo Welt")
DeletePrintMode()
Underline("Big")
Println("Von Daniel Kampert")
DeleteUnderline()
SetLineSpace(4)


BarcodeWidth("Big")
BarcodeReadable("Above")
PrintBarcode(Daten)
Feed(4)


Fehler und Anregungen sind willkommen :)

Eine Anleitung dazu gibt es die Tage noch auf meiner HP.

tucow
27.04.2013, 23:44
Hey,

das ist ne Nette Sache, Kampi.
Aber wozu braucht man einen Thermodrucker, ersetzt Du nun an Deinem TankPi das LCD gegen den Drucker? *G*

Kampi
28.04.2013, 07:23
Haha ne :)
Wobei die Idee an für sich nicht schlecht ist.....durch die UART-Schnittstelle kann man den eigtl problemlos mit einem Bluetoothmodul / XBee verbinden :-k


Aber ich hab mal gedacht, dass ich mein Pi mit einem Drucker ausstatten könnte.
Hab jetzt auch z.B. ein Skript von Adafruit gefunden womit die Wetterdaten von Yahoo ausdrucken.....ich hab mir das mal als Idee aufgegriffen und ein eigenes Programm dazu geschrieben (u.a. habe ich mich dadurch erst richtig mit XML Files beschäftigt ;)
)


Edit: WTF was sind das für Formatierungsprobleme?!

Kampi
28.04.2013, 21:44
So ich habe das Druckerprogramm mal mit meinem Wetterprogramm verknüpft :)

http://img811.imageshack.us/img811/8257/wetterh.jpg (http://imageshack.us/photo/my-images/811/wetterh.jpg/)

tucow
28.04.2013, 22:23
Ich finds ja schon ziemlich gut, was Du mit dem Drucker bisher gemacht hast.. aber hast Du mal ein Video davon? Mich würde mal die Geräuschkulisse und die Geschwindigkeit von dem Ding interessieren.

Kampi
28.04.2013, 22:30
Ich kann dir morgen mal eins machen :)
Jetzt ist es leider zu dunkel dafür :(

Kampi
29.04.2013, 08:51
Passend zu der Druckerausgabe gibt es hier eine Anleitung für die Wetterdaten (aber ohne Drucker):

http://kampis-elektroecke.de/?page_id=3894

Das Druckerprogramm wird dann einfach im selben Ordner gespeichert und mittels

import Drucker as Drucker

eingefügt.
Anschließend muss nur noch jedes "print" durch "Println()" ersetzt werden, z.B. so:

print "Hallo" <- Original Konsolenausgabe
Println("Hallo") <- Drucker Ausgabe

PS:
Den fertigen Code poste ich heute Abend nach der FH.
Muss auch mal bei Zeiten an der Bitmap Ausgabe arbeiten....dann kann man (passend zum Wetter) noch ne Wolke oder sowas rein machen ^.^

Kampi
29.04.2013, 21:53
So hier ist einmal der komplette Code für den Wetterbericht :):



from xml.dom.minidom import *
import urllib
import Drucker as Drucker


# Drucker initialisieren
Drucker.Init()


# Linespace auf 1 Punkt setzen
Drucker.SetLineSpace(8)


# Liste fuer den Wetterbericht
# 1. Dimension = heute, 2. Dimension = naechster Tag
# 1. Element = Tag, 2. Element = Datum, 3. = Niedrigste Temperatur, 4. Element = Hoechste Temperatur, 5. Element = Wettersituation
Wetter = [["", "", "", "", ""] , ["", "", "", "", ""]]


# URL oeffnen und XML Daten einlesen
Baum = urllib.urlopen('http://weather.yahooapis.com/forecastrss?w=675964').read()


# XML Daten parsen und in Baumstruktur anordnen
Baum = parseString(Baum)


# Ort einlesen
Ort = Baum.getElementsByTagName('yweather:location')[0]
Stadt = Ort.attributes["city"].value
Land = Ort.attributes["country"].value


# Datum einlesen
Datum = Baum.getElementsByTagName('lastBuildDate')[0].firstChild.data


# Koordinaten auslesen
Geo_Lat = Baum.getElementsByTagName('geo:lat')[0].firstChild.data
Geo_Long = Baum.getElementsByTagName('geo:long')[0].firstChild.data

# Wetterdaten von heute einlesen
Today = Baum.getElementsByTagName('yweather:condition')[0]


# Wettertext einlesen
Wetterlage = Today.attributes["text"].value


# Temperatur in Fahrenheit einlesen, umrechnen und runden
Temperatur = float(Today.attributes["temp"].value)
Temperatur = round((Temperatur - 32.0) * (5.0 / 9.0) , 2)


# Daten in einer Liste speichern
for Counter in range(2):


# Wetterdaten fuer die beiden Tage einlesen
# Daten einlesen
Future = Baum.getElementsByTagName('yweather:forecast')[Counter]

# Daten verarbeiten
Wetter[Counter][0] = Future.attributes["day"].value
Wetter[Counter][1] = Future.attributes["date"].value
Wetter[Counter][2] = float(Future.attributes["low"].value)
Wetter[Counter][3] = float(Future.attributes["high"].value)
Wetter[Counter][4] = Future.attributes["text"].value

# Umrechnen der Temperatur in Grad Celsius
Wetter[Counter][2] = round((Wetter[Counter][2] - 32.0) * (5.0 / 9.0) , 2)
Wetter[Counter][3] = round((Wetter[Counter][3] - 32.0) * (5.0 / 9.0) , 2)


# Ausgabe
Drucker.Println("Wetterbericht fuer " + Stadt + " in ")
Drucker.Println(Land)
Drucker.Println("Letztes Update: ")
Drucker.Println(Datum)
Drucker.Println(" ")


Drucker.Println("Koordinaten")
Drucker.Println("Laengengrad: " + Geo_Lat)
Drucker.Println("Hoehengrad: " + Geo_Long)
Drucker.Println(" ")


Drucker.Println("Wetter heute")
Drucker.Println("Temperatur: " + str(Temperatur) + " C Celsius")
Drucker.Println("Max. Temperatur: " + str(Wetter[0][2]) + " C Celsius")
Drucker.Println("Min. Temperatur: " + str(Wetter[0][3]) + " C Celsius")
Drucker.Println("Wettersituation: " + Wetterlage)
Drucker.Println(" ")


Drucker.Println("Wetter am naechsten Tag")
Drucker.Println("Tag: " + Wetter[1][0])
Drucker.Println("Datum: " + Wetter[1][1])
Drucker.Println("Max. Temperatur: " + str(Wetter[1][2]) + " C Celsius")
Drucker.Println("Min. Temperatur: " + str(Wetter[1][3]) + " C Celsius")
Drucker.Println("Wetter: " + Wetter[1][4])
Drucker.Println(" ")

# Quelle angeben
Quelle = Baum.getElementsByTagName('link')[1].firstChild.data
Drucker.Println("Alle Daten stammen von ")
Drucker.Println(Quelle)


# Leerzeilen drucken
Drucker.Feed(4)


Und @ Tucow:
Hier ein Video (leider nicht so tolle Quali, da die Kamera im Videomodus nicht so lichtempfindlich ist):
https://www.dropbox.com/s/hmfsjrak28wi8ql/DSCF0874.MOV

tucow
11.05.2013, 13:27
Hab gerade erst gesehen Das Du geantwortet hast, sry :D
Hmm sehen kann man ja leider nicht viel, aber laut schent er mir nicht gerade zu sein. Interesse habe ich schon an so einem Ding aber irgendwie fehlt mir das Einsatzgebiet ;)

Kampi
11.05.2013, 17:01
Also wir wollen den Drucker wahrscheinlich in das Labormesssystem, welches wir gerade entwickeln, integrieren :)
Müssen aber noch schauen wie...

Asko
11.05.2013, 17:11
Hallo Kampi

Guck ich bloss falsch oder hast Du da irgendwie Min. und Max. bei der
Ausgabe verdreht ? ;-)

Gruss Asko.

Kampi
11.05.2013, 17:28
Hey Asko,

ja habe ich. Ist aber in der aktuellen Version behoben (habs erst später gesehen).

Rashiy
14.06.2019, 08:13
TVS Thermal Printer (https://www.techjockey.com/detail/tvs-rp3150-star) RP3150 is ideal for your large and widespread business needs while being cost effective as well. It also has a widespread support network with call center service facilities. Now increase business without increasing costs thanks to this efficient yet economical model printer. So get the most out of least with direct thermal line printing.