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*
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:
Bild hier
Den Code findet ihr hier:
Fehler und Anregungen sind willkommenCode: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)
Eine Anleitung dazu gibt es die Tage noch auf meiner HP.
Geändert von Kampi (29.04.2013 um 09:38 Uhr)
Schaut ruhig mal auf meiner Homepage vorbei :
http://kampis-elektroecke.de
Oder folge mir auf Google+:
Daniel Kampert
Es gibt 10 Arten von Menschen. Die einen können Binär, die anderen nicht.
Gruß
Daniel
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*
Gruß
Andreas
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
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?!
Geändert von Kampi (28.04.2013 um 22:42 Uhr)
Schaut ruhig mal auf meiner Homepage vorbei :
http://kampis-elektroecke.de
Oder folge mir auf Google+:
Daniel Kampert
Es gibt 10 Arten von Menschen. Die einen können Binär, die anderen nicht.
Gruß
Daniel
So ich habe das Druckerprogramm mal mit meinem Wetterprogramm verknüpft
Bild hier
Schaut ruhig mal auf meiner Homepage vorbei :
http://kampis-elektroecke.de
Oder folge mir auf Google+:
Daniel Kampert
Es gibt 10 Arten von Menschen. Die einen können Binär, die anderen nicht.
Gruß
Daniel
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.
Gruß
Andreas
Ich kann dir morgen mal eins machen
Jetzt ist es leider zu dunkel dafür
Geändert von Kampi (28.04.2013 um 23:40 Uhr)
Schaut ruhig mal auf meiner Homepage vorbei :
http://kampis-elektroecke.de
Oder folge mir auf Google+:
Daniel Kampert
Es gibt 10 Arten von Menschen. Die einen können Binär, die anderen nicht.
Gruß
Daniel
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 ^.^
Schaut ruhig mal auf meiner Homepage vorbei :
http://kampis-elektroecke.de
Oder folge mir auf Google+:
Daniel Kampert
Es gibt 10 Arten von Menschen. Die einen können Binär, die anderen nicht.
Gruß
Daniel
So hier ist einmal der komplette Code für den Wetterbericht :
Und @ Tucow:Code: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)
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
Schaut ruhig mal auf meiner Homepage vorbei :
http://kampis-elektroecke.de
Oder folge mir auf Google+:
Daniel Kampert
Es gibt 10 Arten von Menschen. Die einen können Binär, die anderen nicht.
Gruß
Daniel
Hab gerade erst gesehen Das Du geantwortet hast, sry
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
Gruß
Andreas
Also wir wollen den Drucker wahrscheinlich in das Labormesssystem, welches wir gerade entwickeln, integrieren
Müssen aber noch schauen wie...
Schaut ruhig mal auf meiner Homepage vorbei :
http://kampis-elektroecke.de
Oder folge mir auf Google+:
Daniel Kampert
Es gibt 10 Arten von Menschen. Die einen können Binär, die anderen nicht.
Gruß
Daniel
Lesezeichen