使用CircuitPython和W5100S-EVB-Pico 2在LCD屏幕上顯示您的用戶名和當前播放的歌曲的設備
歡迎來到我的新項目,將Spotify Web API與我們的W5100S-EVB-Pico 2結合在CircuitPython上。這個項目顯示您的用戶名和您的Spotify網(wǎng)絡播放器上的當前歌曲名稱到使用I2C協(xié)議與板連接的LCD屏幕上。
最初,這個項目是一個本地控制器,你可以通過選擇這個程序提供的功能來控制Spotify Web應用程序播放器,但是由于音樂暫停/恢復API需要Spotify Premium工作,當前的程序只允許打印你的名字。在這個程序中,跳過歌曲和暫停歌曲的模板已經(jīng)實現(xiàn)。
組件和電路python設置
對于硬件部分,您需要:
1. W5100S-EVB-Pico 2
2. 1602液晶顯示屏(I2C接口)
3. 搖桿模塊(Controller Knob模塊)
對于軟件部分,您需要:
1. CircuitPython
2. Spotify Web API
在開始項目之前,請確保按照本指南設置電路板。
按如下方式連接組件。
Spotify Web API設置
去Spotify的Web API網(wǎng)站注冊成為一名開發(fā)者。
要使用Spotify Web API,您首先需要轉到儀表板頁面并創(chuàng)建新應用程序。
1. 你可以根據(jù)你的喜好來命名你的應用。
2. 對于重定向URI,您需要使用以下URI才能使程序工作。
3. 選中Web API框
4. 保存應用程序。
現(xiàn)在您已經(jīng)創(chuàng)建了應用程序。接下來讓我們獲取客戶端憑據(jù)。
進入儀表板上的應用程序后,你應該去設置查看你的ID和秘密。
在微控制器的lib文件夾中創(chuàng)建一個secrets.py文件,并插入以下JSON
CircuitPython庫設置
在編寫項目代碼之前,從CircuitPython網(wǎng)站下載庫包,并將這些庫導入到lib文件夾中。
1. adafruit_wiznet5k
2. adafruit_connection_manager
3. adafruit_requests
接下來,從我的GitHub頁面下載hd44780庫。這是Bernhard Bablok對library的修改,因為我遇到了一些錯誤,我對library的write功能做了一些修改。
在下一節(jié)中,我將從我的Youtube頻道中跟隨我在Spotify名稱顯示器上的系列來解釋代碼,因此將有三個部分
1. 在CircuitPython上使用Spotify API
2在CircuitPython上使用162lcd
3. Spotify歌曲名稱顯示器主要功能
1. Spotify API與CircuitPython
首先,將這些庫導入到CircuitPython上的程序中。
接下來,我們檢查secrets.py是否包含在lib文件夾中。
之后,使用以下代碼設置互聯(lián)網(wǎng)連接。
我們的設備現(xiàn)在可以連網(wǎng)了。讓我們從Spotify API獲取授權碼開始。
我們首先將客戶端信息和重定向URI導入到本地變量。
接下來,定義一個包含將在程序中使用的作用域的列表。
您可以參考Spotify Web API作用域頁面來閱讀更多關于不同作用域使用的信息。
要顯示我們的名稱,顯示當前歌曲名稱,并修改Spotify播放器,我們將需要使用以下作用域。
1. user-read-private
2. user-read-currently-playing
3. user-modify-playback-state
參考Spotify API頁面,您需要訪問授權端點并重定向到特定頁面以獲取代碼。
在這個項目中,我們將授權url打印到編輯器的串行中,并通過web瀏覽器訪問它。
在頁面上,它為發(fā)出請求提供了一個明確的框架。
然而,由于我們不使用JS和express框架,我們需要了解代碼是如何工作的。
重定向調(diào)用只是重定向URL輸入。對于我們的程序,我們將打印URL到串行,并手動單擊它來授權我們的設備并獲取代碼。
字串。stringify使用默認連接器“&”連接JSON字典數(shù)據(jù)。
因此,我們可以創(chuàng)建要在串行上打印的手動URL。
在作用域中,我使用%20來連接作用域,因為它表示空白的URL編碼。
之后,運行程序一次并點擊鏈接。你應該到達下面的頁面,上面有你自己的應用程序名稱。
按下同意按鈕,您應該被重定向到包含您的授權碼信息的http bin org鏈接。
復制授權代碼,我們現(xiàn)在可以使用它來交換授權令牌。
要交換令牌,我們首先需要參考Spotify OAuth頁面。
如您所見,我們將需要body參數(shù)和頭參數(shù)來進行請求調(diào)用。
首先,讓我們創(chuàng)建body參數(shù)。將驗證代碼從HTTP BIN Org粘貼到一個變量中,并在程序中創(chuàng)建以下字典。
這是請求調(diào)用的主體。接下來,讓我們創(chuàng)建header參數(shù)。
如上圖所示,我們需要在base64中制作我們的身份驗證細節(jié)。
為此,我們需要首先導入binascii庫,以UTF-8格式編碼憑證詳細信息,然后使用binascii的b2a_base64函數(shù)將其更改為base64格式。
但是由于該函數(shù)返回的是字節(jié)字符串對象而不是base64字符串,因此我們需要將字節(jié)字符串解碼回UTF-8并刪除末尾的結束字符。
之后,將編碼憑據(jù)和內(nèi)容類型都包含到headers參數(shù)中。
最后,使用參數(shù)發(fā)出HTTP請求以交換令牌。
令牌現(xiàn)在應該被打印到代碼編輯器上的序列上。復制令牌并將其粘貼到lib文件夾中auth_token密鑰下的secrets.py文件中。
請注意,令牌只持續(xù)一個小時,如果您完成了on過程,您應該注釋令牌交換部分,以允許程序運行其余部分。
我們現(xiàn)在已經(jīng)完成了Spotify Web API的授權過程。您可以通過嘗試使用以下代碼打印您的帳戶名來測試令牌
2. 1602液晶顯示屏(I2C接口)
接下來,讓我們討論一下如何使用CircuitPython在W5100S-EVB-Pico2上具有I2C接口的1602LCD模塊。
在我們的板中,它支持兩個I2C接口,供用戶使用I2C設備。
I2C設備連接示意圖
該模塊有四個端口,分別是Voltage, Ground, SCL和SDA。連接電壓端口到VBus為5V,并連接接地端口。接下來,我將GP2用于SDA端口,GP3用于SCL端口。
之后,讓我們將引腳制作成I2C對象。
在CircuitPython中,為了使引腳與I2C設備連接,我們需要使用以下代碼。
根據(jù)這個頁面,在連接完程序中的端口后,我們需要檢查我們的設備是否被鎖定,是否與我們的板通信。為此,我們需要調(diào)用下面的while循環(huán)。
接下來,我們需要搜索I2C設備地址,以便我們的程序與之交互。使用i2c.sacn()函數(shù)查找地址,并用十六進制對其進行編碼,以將字符串轉換為十六進制。
要檢查地址是否正確,您可以參考設備的數(shù)據(jù)表。對于162lcd模塊,地址應該是0x27。這將用作HD44780對象的初始化地址。
現(xiàn)在,我們可以在程序中使用HD44780庫。讓我們談談我對原始文件所做的更改。
我們對庫使用的導入進行了更改。
原件:
改變:
首先,我改變了對象的初始化,因為我在使用adafruit總線設備時遇到了錯誤。
原件:
改變:
接下來,我用更長的延遲和不同的方法更改了_write_to_i2c函數(shù),以便將數(shù)據(jù)寫入I2C設備,因為我們不再使用adafruit總線設備。我參考了I2C教程頁面將字節(jié)數(shù)據(jù)寫入地址。
原件:
改變:
我還增加了_strobe函數(shù)內(nèi)的延遲。
原件:
改變:
最后,我改變了寫函數(shù)的工作方式。在原始函數(shù)中,如果字符串超過16個字符,我們應該寫入的行將不顯示剩余的字符。因此,我改變了庫的工作方式,這樣它就可以顯示每個字符,因為歌曲的名字通常很長。
首先,我檢查單詞是否超過16個字符。如果沒有超出,則在將字符寫入模塊時保持原始代碼。
接下來,我計算了歌曲中所有角色所需的最短臺詞。
我用了數(shù)學。將字符串的長度除以16得到所需的行數(shù)。
我還初始化了一個filled_line變量,該變量存儲了我們已經(jīng)為lcd屏幕填充的行數(shù)。
start和end變量指向當前正在打印的字符串的位置。
之后,我使用for循環(huán)打印所需的行。
每次迭代時,我將行數(shù)增加1,并檢查行數(shù)是否大于2。
如果大于2,我將在LCD行上的每個字符中寫入空格。將字符寫入LCD屏幕的方法是首先將要打印的行地址寫入設備,然后我們將所需的字符寫入行??崭竦腁SCII碼為32。
之后,我們就可以開始打印字符了。
我首先找出(I %2) + 1要打印的行,這樣行可能的值是1和2。
然后,我們按照原始代碼從GitHub逐字打印字符串。
最后,我們更新要在下一次迭代中打印到屏幕上的字符的開始和結束位置。
下面是原始代碼和更新后的代碼的整個write函數(shù)。
原件:
改變:
然后,讓我們回到code.py文件。
首先使用庫設置顯示對象,并從secrets py文件中讀取驗證令牌。使用地址0x27或從I2C.scan()函數(shù)打印的地址。
接下來,用任何字符串測試寫函數(shù),或者您可以使用我們之前獲得的Spotify用戶名,因為我們將Spotify用戶名存儲在my_name變量中
現(xiàn)在,我們可以開始獲取當前歌曲名稱以及如何使用控制器旋鈕來控制這個設備的部分。
3. Spotify歌曲名稱顯示的主要功能
對于本節(jié),我們將分為兩個部分,一個是打印歌曲名稱的主要功能,另一個是列出設備中可用功能的中斷功能。
在分開這兩個部分之前,我們可以先初始化這兩個部分中要使用的變量。
將模擬桿設置為控制器旋鈕的縱軸,將CountIO設置為控制器模塊上的按鈕。
與DigitalIO不同,CountIO存儲按鈕按下的變化次數(shù),而不是按鈕的當前狀態(tài)。
你可以在這個網(wǎng)站上了解更多。在我們的程序中,當按鈕的初始狀態(tài)為高而按下狀態(tài)為低時,我們計算下降邊的數(shù)量。
接下來,我們設置要打印到LCD屏幕的可用函數(shù)、一個電源變量和一個刷新計時器變量,它們類似于發(fā)送請求和刷新LCD屏幕的倒計時計時器。另外,設置一個常數(shù)204,它表示一個空響應的狀態(tài)碼。
我們現(xiàn)在可以開始從Spotify Web Player獲取歌曲名稱。
從一個while循環(huán)開始,將power變量作為繼續(xù)while循環(huán)的條件。然后,我們調(diào)用中斷函數(shù),稍后我們將對其進行編碼。
在while循環(huán)中,我們現(xiàn)在可以發(fā)送獲取當前歌曲名稱的請求。
首先,讓我們參考URL端點上的Spotify頁面及其所需的參數(shù)。
從Spotify API頁面上獲取當前歌曲選項卡,它顯示了端點和HTTP方法以及所需的標頭。
我們首先用授權令牌設置GET請求的報頭。
然后,我們將檢查我們的倒計時計時器。
如果倒計時計時器小于0,那么我們將開始發(fā)出請求。
如果沒有,顯示將不會改變,我們將定時器減少1。
在請求部分,我們首先將倒計時計時器設置為5并清除顯示。然后,我們可以開始使用URL端點和授權頭發(fā)出請求。
通常,如果你打開了Spotify網(wǎng)絡播放器,你應該會收到一個非空的回復。在這種情況下,您應該成功地從請求中獲取JSON。
但是,如果您沒有打開Web Player并向該端點發(fā)出請求,您將收到一個空響應,并且您的程序將在讀取從GET請求獲得的JSON時出錯。
因此,我們需要首先檢查響應是否為空。
從這個頁面,你可以得到Spotify API空響應的狀態(tài)碼,它是在我們的初始化部分定義的204。
如果狀態(tài)碼不是204,我們將從響應中讀取JSON。
在我的程序中,我只會在Spotify Web Player播放歌曲時顯示名稱。因此,我需要JSON中的當前播放狀態(tài)和歌曲名稱。
如果播放狀態(tài)為True,則顯示歌曲名稱。
如果播放狀態(tài)為False,那么我們在程序中向用戶顯示設備暫?;蜿P閉。
對于狀態(tài)碼為204的情況,意味著Spotify播放器已關閉,我們顯示Spotify斷開連接的消息并關閉機器。
接下來,我們可以創(chuàng)建中斷函數(shù)
首先,我將power變量、操縱桿模塊按鈕的pressed_count變量和refresh_timer變量設置為全局變量,因為這些值將在此函數(shù)中更改。
此外,我們初始化了另一個計時器變量,用于模擬一個倒計時計時器,如果用戶在函數(shù)頁上閑置太長時間,它可以幫助返回到主函數(shù),并初始化了用戶選擇在此函數(shù)頁中使用的函數(shù)選擇。
之后,我們檢查用戶是否在操縱桿模塊上執(zhí)行了任何按壓。
可以從pressed_count中讀取該值。計數(shù)變量,如果值不為0,那么我們將啟動中斷函數(shù)。
如果變量為0,則忽略中斷函數(shù)并返回到主顯示代碼。
然后,我們將主代碼的計時器重置為-1,并將按鈕按下的計數(shù)重置為0,因為我們需要檢查用戶是否通過按下按鈕從本頁選擇了任何功能。
清空LCD屏幕,顯示功能頁面的第一個選項,即暫停功能。
接下來,我們編寫一個while循環(huán)來檢查用戶空閑時間是否過長。在while循環(huán)結束時,我們將中斷計時器的值減少1,并將按鈕按下計數(shù)重置為0。
在while循環(huán)中,我們首先設置更改選項的閾值。
我將上限閾值設置為55000,下限閾值設置為5000。如果操縱桿達到這兩個值,選項將分別轉到功能列表中的下一個功能或上一個功能。
對于每個更改,我們清除顯示并將新選擇打印到LCD屏幕上。
接下來,我們可以檢查用戶在選擇功能的動作中是否按下了按鈕。如果count變量不為0,則表示用戶按下了操縱桿模塊。在這種情況下,我們立即將中斷定時器設置為其下限,重置計數(shù)變量并執(zhí)行所請求的功能。如果不是,我們簡單地繼續(xù)中斷定時器的循環(huán),直到它達到下限。
正如介紹中所描述的,目前唯一支持的選項是退出設備,但我也檢查了Spotify API頁面并制作了暫停播放器的代碼。如果您有Spotify Premium,您可以測試和驗證代碼。
對于退出設備的選項,我們只需將power變量設置為False,設備將在返回主顯示代碼后退出。
對于暫停設備的選項,我們可以參考Spotify API網(wǎng)頁,查看請求示例和響應示例。
如網(wǎng)頁所述,我們需要使用HTTP PUT方法來暫停播放器。
雖然Spotify API網(wǎng)站的報頭只包括授權令牌,但在CircuitPython中,為了執(zhí)行PUT請求,我們還需要包括內(nèi)容類型和內(nèi)容長度。
將這兩個參數(shù)分別設置為“application/json”和“0”,因為我們不會將任何數(shù)據(jù)放入API端點。
接下來,我們調(diào)用暫停API端點。如果成功,請求將返回一個空響應。如果失敗,它將返回一個包含錯誤原因的響應。
因此,我們可以用下面的代碼發(fā)出暫停請求。
類似地,根據(jù)Spotify API頁面,跳過函數(shù)的工作原理與暫停函數(shù)相同,但使用不同的API端點。
至于Start/Resume回放功能,我沒有實現(xiàn)示例,因為需要額外的主體參數(shù)。
在我的程序中,我決定忽略這兩個函數(shù),并簡單地將返回主菜單字符串打印到串行。
總之,這是我的程序的中斷函數(shù)。
最后,當電源設置為False后,我清除了顯示,并在LCD屏幕上寫了一條關機消息,通知用戶設備已關機。
結論
這就是Spotify名稱顯示器的項目。我希望通過這個項目,你學會了如何在CircuirPython上使用W5100S-EVB-Pico 2操作I2C設備,將W5100S-EVB-Pico 2連接到Spotify Web API,并自己為Spotify制作本地控制器。
本文編譯自hackster.io