不久前,我買了一臺舊的、便宜的熱敏收據打印機,我想通過另一種有用的方法來重新利用它。所以我準備將收據打印機用作Alexa(或GoogleHome、Siri等)的IOT打印機。
從Pi打印
第一步是讓舊的收據打印機在新的設備中再次實現打印功能。我選擇使用RaspberryPiZeroW作為控制器,因為它價格便宜且體積小。實際上它也足夠小,可以放入收據打印機外殼本身,因此沒有外部連接。

為了讓Pi啟動并運行,我們需要下載RaspbianOS并使用Etcher等程序將其刻錄到microSD卡上。將其與HDMI電纜、鍵盤、鼠標和電源一起插入Pi。

當Pi啟動并進入桌面界面時,您可以通過單擊右上角的無線圖標并選擇無線連接的名稱來連接到無線。然后,如果您右鍵單擊同一個無線圖標,您可以轉到網絡設置并設置靜態IP地址,以便我們可以輕松地通過網絡連接到它。最后,您要單擊主菜單并選擇“Raspbian配置編輯器”,然后在“接口”選項卡下,確保已啟用SSH。然后保存并重新啟動您的Pi。

要遠程連接到Pi,您需要一個SSH客戶端。Windows系統的話,建議使用Putty客戶端。您可以使用我們之前設置的Pi的靜態IP地址連接到它。然后您就可以使用“pi”作為用戶名和“raspberry”作為密碼登錄。

接下來展現在我們面前的就是Pi的終端界面,我們要做的第一件事是確保軟件是最新的,所以運行:

隨著軟件的更新,我們現在可以安裝ESC-POS打印機軟件和所需的庫。

然后我們可以記下一個漂亮的小“HelloWorld”測試腳本。

連接到物聯網(第1部分)
如果沒有要打印的東西,打印機會有什么好處?我想啟用從不同互聯網服務打印的功能。一種選擇是選擇特定的互聯網服務,跟蹤他們的API文檔并基于他們的API編寫應用程序。
有一個很棒的網站叫做“IfThisThenThat”,它根據一組標準觸發不同互聯網服務(Alexa、GoogleHome、Gmail、Facebook、Instagram、Twitter等)的操作。例如,“如果”我在Facebook上發帖(this),“那么”給我發一封電子郵件(that)。

所以在前半部分,我注冊了一個免費帳戶,你可以開始為你想要觸發的不同服務創建一個新的“小程序”。我的小程序的“這個”部分將是Alexa。有很多Alexa觸發器可供選擇,但我將選擇顯示“詢問您的購物清單上有什么”的觸發器。我希望它最終可以觸發RaspberryPi上的Python腳本,因此對于腳本的“that”部分,我們要選擇Webhooks。
在Webhooks選項中,我們可以添加一個指向我們的Pi的URL,稍后我們將返回。我們可以將Method字段保留為“Get”,并為內容類型選擇“PlainText”。對于正文字段,單擊“添加成分”并選擇“整個列表”。這會將整個購物清單作為Get請求發送。

連接到物聯網(第2部分)
上一步處理“Internet”部分,現在讓我們使用RaspberryPi處理“things”部分。為了與“IfThisThenThat”webhooks小程序進行通信,我們需要在RaspberryPi上設置一個Web服務器。有許多不同的方式來設置Web服務器,但考慮到我最終想要運行Python腳本,我決定使用Python的Flask服務器。
Pi已經預裝了所有的Flask庫,所以我們需要做的就是開始編寫一個測試腳本:

在其中添加一些提供簡單網頁的代碼。

現在只需保存程序并使用以下命令運行它:

您將通過命令響應看到Flask運行的默認端口是端口5000。因此,在Web瀏覽器中,如果您輸入Pi的IP地址:5000,您應該會看到文本“您的Flask服務器正在運行!”

我們已經有了測試Python代碼,以及我們的測試Flask服務器。所以接下來我們需要將它們結合起來,并結合一些從我們的Webhook小程序中提取數據的代碼,以能夠打印到我們的收據打印機中。
先創建一個新的Python文件:

并在其中添加以下代碼:
#!flask/bin/python
#IMPORTTHEFLASKANDPRINTERLIBRARIES
fromflaskimportFlask,request
fromescpos.printerimportUsb
#ASSIGNVARIABLESFORTHEPRINTERANDFLASK
p=Usb(0x0416,0x5011)
app=Flask(__name__)
#CREATE‘INDEX’PAGE
@app.route(‘/’)
defindex():
return‘YourFlaskserverisworking!’
#CREATE“PAGE”CALLED“LIST”FORPRINTINGALEXASHOPPINGLIST
@app.route(‘/list’)
deflist():
#CAPTURE“GET”DATAFROMIFTTTWEBOOKS
content=request.get_data()
#CONVERTRAWDATATOSTRING
str_content=str(content)
#DIVIDEDATAINTOSEPERATELINES
str_split=str_content.splitlines()
#SEPERATEWORDSBYCOMMAANDADDTOANEWLIST
newlist=[]
forwordinstr_split:
word=word.split(‘,’)
newlist.extend(word)
#REMOVEFORMATTINGMARKS
rmv_marks=[s.strip(“b‘”)forsinnewlist]
#PRINTHEADER
#print(“ShoppingList\n”)
p.text(“ShoppingList:\n”)
#ENUMERATEANDPRINTEACHITEMINLIST
r=1
forxinrmv_marks:
#print(str(r)+“。”+x+“\n”)
p.text(str(r)+“。”+x+“\n”)
r+=1
#RETURNRESULTS
return’x‘
#RUNTHEPROGRAM
if__name__==’__main__‘:
app.run(debug=True,host=’0.0.0.0‘)
您可以運行它以查看它是否返回任何錯誤,但它還不能與我們的webhook一起使用,因為到這一步為止,服務器僅在本地運行。尚無Webhook可連接的外部URL。我們可以在路由器上設置端口轉發,只使用面向外部的IP地址,但這并不是太安全。作為替代方案,我決定選擇NGROK。
使用Ngrok設置外部訪問
Ngrok可以建立與網絡的安全連接,而無需暴露您的外部IP或弄亂端口轉發。注冊一個免費帳戶后,它會為您提供一個授權令牌。然后在您的RaspberryPi上,您可以下載它、解壓縮它、連接您的身份驗證令牌,然后在端口5000上運行它:

在結果屏幕上,它會為您提供一個轉發地址(http://random-string.ngrok.io),您可以在我們的Webhook小程序中使用該地址。所以回到“IfThisThenThat”,在URL字段中,輸入您的Ngrok轉發地址并將其指向我們Flask服務器上的“列表”頁面。它應該看起來像這樣

然后繼續保存更改。
我為了測試它能夠保持Ngrok運行,打開一個新終端,然后運行我們的python腳本。當這兩個項目都運行時,詢問Alexa購物清單上有什么。一兩分鐘后,它應該可以打印出結果。
如果您想立即打印,只需轉到IFTTT上的Applet,然后單擊“立即檢查”。如果一切順利,收據打印機應該會打印出您的購物清單上的內容!
我們需要添加的最后一點代碼是每次Pi啟動時自動啟動ngrok和我們的燒瓶服務器的方法。我們可以通過使我們的Python腳本可執行來輕松地做到這一點:

然后我們可以編輯我們的/etc/rc.local文件,使它看起來像這樣:

將Pi添加到打印機
我的收據打印機在外殼內有很多空白空間。由于RaspberryPiZero是如此之小,所以我認為將其隱藏在收據打印機中以使其看起來像一個設備會更酷。唯一的問題是收據打印機在12v上運行,而Pi在5v上運行。因此,如果我們只想要一根電源線為它們兩者供電,我們將不得不將12v電源降為5v。

使用7805穩壓器、1uf電容器和10uf電容器,我能夠創建簡單的5v穩壓器,并將其連接到收據打印機的邏輯板上。我將“-”線焊接到公共地線,然后將“+”線焊接到電源開關的“開”側,以便在打開和關閉打印機時Pi會打開和關閉。我使用萬用表進行了測試,以確認輸出對于Pi來說是安全的。然后我焊接了一根微型USB電纜并將其連接到Pi。將電纜插入打印機并翻轉開關后,打印機和Pi都打開了!

最后,我鉆了一個孔,將USB電纜從Pi連接到打印機。我找到了一個將5v穩壓器和Pi放入打印機外殼的地方,然后我將所有東西放回原處。所以現在打印機也有它自己的獨立網絡服務器了!
-
物聯網
+關注
關注
2927文章
45964瀏覽量
388849 -
打印機
+關注
關注
10文章
795瀏覽量
46820 -
樹莓派
+關注
關注
121文章
1956瀏覽量
107049
發布評論請先 登錄
WIZ珍藏 #1:來自Adafruit的IoT(物聯網)打印機
樹莓派網店票據打印機
3D打印的樹莓派相機(又要3D打印機了)
樹莓派之無線打印機
樹莓派3連打印機問題。顯示stopped“Filter failed”
基于3D打印機和樹莓派diy家用PC
樹莓派“牽手”Formlabs:3D打印機界的“工業新寵”誕生記

評論