不久前,我買了一臺(tái)舊的、便宜的熱敏收據(jù)打印機(jī),我想通過(guò)另一種有用的方法來(lái)重新利用它。所以我準(zhǔn)備將收據(jù)打印機(jī)用作Alexa(或GoogleHome、Siri等)的IOT打印機(jī)。
從Pi打印
第一步是讓舊的收據(jù)打印機(jī)在新的設(shè)備中再次實(shí)現(xiàn)打印功能。我選擇使用RaspberryPiZeroW作為控制器,因?yàn)樗鼉r(jià)格便宜且體積小。實(shí)際上它也足夠小,可以放入收據(jù)打印機(jī)外殼本身,因此沒(méi)有外部連接。
為了讓Pi啟動(dòng)并運(yùn)行,我們需要下載RaspbianOS并使用Etcher等程序?qū)⑵淇啼浀絤icroSD卡上。將其與HDMI電纜、鍵盤、鼠標(biāo)和電源一起插入Pi。
當(dāng)Pi啟動(dòng)并進(jìn)入桌面界面時(shí),您可以通過(guò)單擊右上角的無(wú)線圖標(biāo)并選擇無(wú)線連接的名稱來(lái)連接到無(wú)線。然后,如果您右鍵單擊同一個(gè)無(wú)線圖標(biāo),您可以轉(zhuǎn)到網(wǎng)絡(luò)設(shè)置并設(shè)置靜態(tài)IP地址,以便我們可以輕松地通過(guò)網(wǎng)絡(luò)連接到它。最后,您要單擊主菜單并選擇“Raspbian配置編輯器”,然后在“接口”選項(xiàng)卡下,確保已啟用SSH。然后保存并重新啟動(dòng)您的Pi。
要遠(yuǎn)程連接到Pi,您需要一個(gè)SSH客戶端。Windows系統(tǒng)的話,建議使用Putty客戶端。您可以使用我們之前設(shè)置的Pi的靜態(tài)IP地址連接到它。然后您就可以使用“pi”作為用戶名和“raspberry”作為密碼登錄。
接下來(lái)展現(xiàn)在我們面前的就是Pi的終端界面,我們要做的第一件事是確保軟件是最新的,所以運(yùn)行:
隨著軟件的更新,我們現(xiàn)在可以安裝ESC-POS打印機(jī)軟件和所需的庫(kù)。
然后我們可以記下一個(gè)漂亮的小“HelloWorld”測(cè)試腳本。
連接到物聯(lián)網(wǎng)(第1部分)
如果沒(méi)有要打印的東西,打印機(jī)會(huì)有什么好處?我想啟用從不同互聯(lián)網(wǎng)服務(wù)打印的功能。一種選擇是選擇特定的互聯(lián)網(wǎng)服務(wù),跟蹤他們的API文檔并基于他們的API編寫應(yīng)用程序。
有一個(gè)很棒的網(wǎng)站叫做“IfThisThenThat”,它根據(jù)一組標(biāo)準(zhǔn)觸發(fā)不同互聯(lián)網(wǎng)服務(wù)(Alexa、GoogleHome、Gmail、Facebook、Instagram、Twitter等)的操作。例如,“如果”我在Facebook上發(fā)帖(this),“那么”給我發(fā)一封電子郵件(that)。
所以在前半部分,我注冊(cè)了一個(gè)免費(fèi)帳戶,你可以開(kāi)始為你想要觸發(fā)的不同服務(wù)創(chuàng)建一個(gè)新的“小程序”。我的小程序的“這個(gè)”部分將是Alexa。有很多Alexa觸發(fā)器可供選擇,但我將選擇顯示“詢問(wèn)您的購(gòu)物清單上有什么”的觸發(fā)器。我希望它最終可以觸發(fā)RaspberryPi上的Python腳本,因此對(duì)于腳本的“that”部分,我們要選擇Webhooks。
在Webhooks選項(xiàng)中,我們可以添加一個(gè)指向我們的Pi的URL,稍后我們將返回。我們可以將Method字段保留為“Get”,并為內(nèi)容類型選擇“PlainText”。對(duì)于正文字段,單擊“添加成分”并選擇“整個(gè)列表”。這會(huì)將整個(gè)購(gòu)物清單作為Get請(qǐng)求發(fā)送。
連接到物聯(lián)網(wǎng)(第2部分)
上一步處理“Internet”部分,現(xiàn)在讓我們使用RaspberryPi處理“things”部分。為了與“IfThisThenThat”webhooks小程序進(jìn)行通信,我們需要在RaspberryPi上設(shè)置一個(gè)Web服務(wù)器。有許多不同的方式來(lái)設(shè)置Web服務(wù)器,但考慮到我最終想要運(yùn)行Python腳本,我決定使用Python的Flask服務(wù)器。
Pi已經(jīng)預(yù)裝了所有的Flask庫(kù),所以我們需要做的就是開(kāi)始編寫一個(gè)測(cè)試腳本:
在其中添加一些提供簡(jiǎn)單網(wǎng)頁(yè)的代碼。
現(xiàn)在只需保存程序并使用以下命令運(yùn)行它:
您將通過(guò)命令響應(yīng)看到Flask運(yùn)行的默認(rèn)端口是端口5000。因此,在Web瀏覽器中,如果您輸入Pi的IP地址:5000,您應(yīng)該會(huì)看到文本“您的Flask服務(wù)器正在運(yùn)行!”
我們已經(jīng)有了測(cè)試Python代碼,以及我們的測(cè)試Flask服務(wù)器。所以接下來(lái)我們需要將它們結(jié)合起來(lái),并結(jié)合一些從我們的Webhook小程序中提取數(shù)據(jù)的代碼,以能夠打印到我們的收據(jù)打印機(jī)中。
先創(chuàng)建一個(gè)新的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‘)
您可以運(yùn)行它以查看它是否返回任何錯(cuò)誤,但它還不能與我們的webhook一起使用,因?yàn)榈竭@一步為止,服務(wù)器僅在本地運(yùn)行。尚無(wú)Webhook可連接的外部URL。我們可以在路由器上設(shè)置端口轉(zhuǎn)發(fā),只使用面向外部的IP地址,但這并不是太安全。作為替代方案,我決定選擇NGROK。
使用Ngrok設(shè)置外部訪問(wèn)
Ngrok可以建立與網(wǎng)絡(luò)的安全連接,而無(wú)需暴露您的外部IP或弄亂端口轉(zhuǎn)發(fā)。注冊(cè)一個(gè)免費(fèi)帳戶后,它會(huì)為您提供一個(gè)授權(quán)令牌。然后在您的RaspberryPi上,您可以下載它、解壓縮它、連接您的身份驗(yàn)證令牌,然后在端口5000上運(yùn)行它:
在結(jié)果屏幕上,它會(huì)為您提供一個(gè)轉(zhuǎn)發(fā)地址(http://random-string.ngrok.io),您可以在我們的Webhook小程序中使用該地址。所以回到“IfThisThenThat”,在URL字段中,輸入您的Ngrok轉(zhuǎn)發(fā)地址并將其指向我們Flask服務(wù)器上的“列表”頁(yè)面。它應(yīng)該看起來(lái)像這樣
然后繼續(xù)保存更改。
我為了測(cè)試它能夠保持Ngrok運(yùn)行,打開(kāi)一個(gè)新終端,然后運(yùn)行我們的python腳本。當(dāng)這兩個(gè)項(xiàng)目都運(yùn)行時(shí),詢問(wèn)Alexa購(gòu)物清單上有什么。一兩分鐘后,它應(yīng)該可以打印出結(jié)果。
如果您想立即打印,只需轉(zhuǎn)到IFTTT上的Applet,然后單擊“立即檢查”。如果一切順利,收據(jù)打印機(jī)應(yīng)該會(huì)打印出您的購(gòu)物清單上的內(nèi)容!
我們需要添加的最后一點(diǎn)代碼是每次Pi啟動(dòng)時(shí)自動(dòng)啟動(dòng)ngrok和我們的燒瓶服務(wù)器的方法。我們可以通過(guò)使我們的Python腳本可執(zhí)行來(lái)輕松地做到這一點(diǎn):
然后我們可以編輯我們的/etc/rc.local文件,使它看起來(lái)像這樣:
將Pi添加到打印機(jī)
我的收據(jù)打印機(jī)在外殼內(nèi)有很多空白空間。由于RaspberryPiZero是如此之小,所以我認(rèn)為將其隱藏在收據(jù)打印機(jī)中以使其看起來(lái)像一個(gè)設(shè)備會(huì)更酷。唯一的問(wèn)題是收據(jù)打印機(jī)在12v上運(yùn)行,而Pi在5v上運(yùn)行。因此,如果我們只想要一根電源線為它們兩者供電,我們將不得不將12v電源降為5v。
使用7805穩(wěn)壓器、1uf電容器和10uf電容器,我能夠創(chuàng)建簡(jiǎn)單的5v穩(wěn)壓器,并將其連接到收據(jù)打印機(jī)的邏輯板上。我將“-”線焊接到公共地線,然后將“+”線焊接到電源開(kāi)關(guān)的“開(kāi)”側(cè),以便在打開(kāi)和關(guān)閉打印機(jī)時(shí)Pi會(huì)打開(kāi)和關(guān)閉。我使用萬(wàn)用表進(jìn)行了測(cè)試,以確認(rèn)輸出對(duì)于Pi來(lái)說(shuō)是安全的。然后我焊接了一根微型USB電纜并將其連接到Pi。將電纜插入打印機(jī)并翻轉(zhuǎn)開(kāi)關(guān)后,打印機(jī)和Pi都打開(kāi)了!
最后,我鉆了一個(gè)孔,將USB電纜從Pi連接到打印機(jī)。我找到了一個(gè)將5v穩(wěn)壓器和Pi放入打印機(jī)外殼的地方,然后我將所有東西放回原處。所以現(xiàn)在打印機(jī)也有它自己的獨(dú)立網(wǎng)絡(luò)服務(wù)器了!
-
物聯(lián)網(wǎng)
+關(guān)注
關(guān)注
2909文章
44557瀏覽量
372777 -
打印機(jī)
+關(guān)注
關(guān)注
10文章
768瀏覽量
45659 -
樹(shù)莓派
+關(guān)注
關(guān)注
116文章
1706瀏覽量
105607
發(fā)布評(píng)論請(qǐng)先 登錄
相關(guān)推薦
評(píng)論