精品国产人成在线_亚洲高清无码在线观看_国产在线视频国产永久2021_国产AV综合第一页一个的一区免费影院黑人_最近中文字幕MV高清在线视频

0
  • 聊天消息
  • 系統消息
  • 評論與回復
登錄后你可以
  • 下載海量資料
  • 學習在線課程
  • 觀看技術視頻
  • 寫文章/發帖/加入社區
會員中心
創作中心

完善資料讓更多小伙伴認識你,還能領取20積分哦,立即完善>

3天內不再提示

用樹莓派控制交通紅綠燈(進階版)

CHANBAEK ? 來源:和娃一起玩樹莓派 ? 作者:老孟K ? 2023-07-02 15:10 ? 次閱讀

哇奧,今天才發現上一次建造的紅綠燈居然不對,綠燈一般在下方,當紅燈變綠燈時黃燈閃爍,我做的是綠燈變紅燈時黃燈閃爍!。這在我們開發時也會碰到,就像找bug一樣,對于發現的問題要及時修正。在修正問題之前,我們還是先看看如何讓紅綠燈更快的響應按鈕操作,然后修正紅綠燈問題。

要想更快的響應按鈕,則需要找出原因,上一講提到因為程序運行時沒有及時檢測按鈕是不是被按下了,那么我們第一反應可能是在程序中加上更多的檢測語句,但這樣程序將變得特別臃腫,也不容易被別人理解。其實,計算機設計者早就考慮到了這個問題,他們利用一個叫做“中斷”的概念來對需要及時響應的事情進行處理。

什么是中斷

中斷是指計算機運行過程中,出現某些需要及時處理時,計算機能自動暫停正在運行的程序并轉入處理新情況的程序,處理完畢后又返回原被暫停的程序繼續運行。中斷發生時運行的程序叫做中斷程序。

在我們的紅綠燈程序中,當按鈕被按下時,我們希望計算機可以把它作為一個中斷,然后運行中斷程序,及時修改運行狀態。

研究gpiozero的文檔,我們發現Button類有一個when_pressed的方法,說明如下

圖片

意思是說當按鈕按下時將調用一個函數(function)。那么什么是函數呢?

函數是什么

函數是可以完成某些任務的代碼塊,而且這些代碼塊可以被重復使用,就像我們玩具里的積木塊一樣。在python中,用def來定義或者說創建函數,其語法如下

def 函數名(參數):     #注意最后的冒號
   函數代碼(完成工作需要的代碼)
   return 返回值      #不是必須的,當需要向調用函數的程序返回數值或對象時使用

函數是編程語言非常重要的一部分內容,參數有形參和實參,參數也可以是多個,返回值可以是各種數據類型,有了函數后,變量也就分為全局 變量和局部變量了,這些內容我們會逐步涉及到。今天我們先從最簡單的無參數函數開始,顧名思義,這樣的函數沒有參數。

創建參數

回過頭來看我們的紅綠燈程序,只閃爍黃燈還是正常工作取決于其中的一個變量kaiguan。

from gpiozero import LED,Button


from time import sleep


kaiguan = False   


red = LED(26)  #紅燈鏈接了GPIO26
yellow= LED(5)   #黃燈鏈接了GPIO5
green = LED(22)  #綠燈連接了GPIO22
control = Button(17) #按鈕連接了GPIO17
while True:
    if kaiguan == False:   #當kaiguan變量為False時,黃燈閃爍
        yellow.on()
        sleep(0.5)
        yellow.off()
        sleep(0.5)
    else:          #當kaiguan變量為True時
        green.on()   
        sleep(3)    #綠燈亮3green.off()
        yellow.on()  #黃燈亮1sleep(1)
        yellow.off()
        red.on()     #紅燈亮3sleep(3)
        red.off()
    if control.is_pressed:  ##判斷按鈕是否被按下
            print("Pressed")
            kaiguan = bool(1-kaiguan)

所以,利用中斷,我們的需要在按鈕按下時及時改變kaiguan這個變量的數值,然后在程序中及時判斷這個值是否已經變化了,從而作出正確的邏輯控制。

現在我們創建一個叫做changeKaiguan的函數:

def changeKaiguan():   #創建無參數函數:修改kaiguan變量,從而控制紅綠燈
    print("Pressed")
    global kaiguan       #kaiguan是全局變量,在主程序中已經聲明
    kaiguan = bool(1 - kaiguan)    #取反操作
    print(kaiguan)                #打印kaiguan的數值,True或False

因為kaiguan變量是在主函數聲明的,函數如果要使用它,需要用global關鍵字,表示它是一個全局變量 。

當控制按鈕按下時,調用changeKaiguan函數,通過如下代碼實現:

control.when_pressed = changeKaiguan  #按下按鈕時調用changeKaiguan函數

注意: 這一個語句應該在changeKaiguan函數創建之后才行,否則就會報變量沒有定義的錯誤。

驗證中斷程序

通過上面的代碼,我們創建了一個中斷函數,當按鈕按下時,每次都調用changeKaiguan函數。讓我們來測試一下,完整代碼如下:

from gpiozero import LED,Button


from time import sleep


kaiguan = False   


green = LED(26)  #green燈鏈接了GPIO26
yellow= LED(5)   #黃燈鏈接了GPIO5
red = LED(22)  #red燈連接了GPIO22
control = Button(17) #按鈕連接了GPIO17




def changeKaiguan():   #創建無參數函數:修改kaiguan變量,從而控制紅綠燈
    print("Pressed")
    global kaiguan       #kaiguan是全局變量,在主程序中已經聲明
    kaiguan = bool(1 - kaiguan)    #取反操作
    print(kaiguan)                #打印kaiguan的數值,True或False


control.when_pressed = changeKaiguan  #按鈕按下時調用changeKaiguan函數


while True:
    if kaiguan == False:   #當kaiguan變量為False時,黃燈閃爍
        yellow.on()
        sleep(0.5)
        yellow.off()
        sleep(0.5)
    else:          #當kaiguan變量為True時,
        red.on()   
        sleep(3)    #綠燈亮3秒
        red.off()
        yellow.on()  #黃燈亮1秒
        sleep(1)
        yellow.off()
        green.on()     #紅燈亮3秒 
        sleep(3)
        green.off()

運行上面的程序,可以發現,無論程序運行在那個階段,當按下按鈕時,都可以馬上在Shell界面看到打印“Pressed"以及最新的kaiguan參數數值。

圖片

我們發現每次按鈕按下,都馬上進入了中斷程序changeKaiguan,在程序中修改了kaiguan變量的值并打印了出來,當前程序運行在sleep還是其他語句都沒有影響。

進階版紅綠燈程序

現在,是時候完成我們的進階版程序,讓紅綠燈可以在按鈕按下后及時切換工作狀態。在此之前,我們需要調整紅綠燈連接線,把紅燈和綠燈互換位置,同時修改程序。最新的電路圖:

圖片

電路實物照片:

圖片

要修改程序,需要考慮在什么時候探測kaiguan變量值,然后作出邏輯調整,原程序紅綠燈正常工作時不能及時探測kaiguan變量才造成對按鈕的反應遲鈍,所以需要修改這部分代碼,為了保證控制操作的完整性,我們不能在某個燈還亮著時進行切換,需要在燈滅后進行,所以修改如下:

from gpiozero import LED,Button


from time import sleep


kaiguan = False   


green = LED(26)  #green燈鏈接了GPIO26
yellow= LED(5)   #黃燈鏈接了GPIO5
red = LED(22)  #red燈連接了GPIO22
control = Button(17) #按鈕連接了GPIO17




def changeKaiguan():
    print("Pressed")

    global kaiguan
    kaiguan = bool(1 - kaiguan)
    print(kaiguan)



control.when_pressed = changeKaiguan


while True:
    if kaiguan == False:   #當kaiguan變量為False時,黃燈閃爍
        yellow.on()
        sleep(0.5)
        yellow.off()
        sleep(0.5)
    else:          #當kaiguan變量為True時,
        red.on()   
        sleep(3)    #綠燈亮3秒
        red.off()
        if kaiguan == False: #判斷kaiguan是否已經變為False,如果是,則跳出當前操作,繼續下一個循環
            continue     #跳過下面的代碼,開始下一個循環
        yellow.on()  #黃燈亮1秒
        sleep(1)
        yellow.off()
        if kaiguan == False: #判斷kaiguan是否已經變為False,如果是,則跳出當前操作,繼續下一個循環
            continue
        green.on()     #紅燈亮3秒 
        sleep(3)
        green.off()

運行程序,看看是不是按我們期望的正常運作了呢?

是的,現在只要我們按下按鈕,程序都可以及時切換,即使在紅燈或綠燈亮時按下按鈕,當燈滅時也會判斷出kaiguan值變為False,從而中止當前循環,進入下一個循環中。如此,進階版的紅綠燈大功告成!

聲明:本文內容及配圖由入駐作者撰寫或者入駐合作網站授權轉載。文章觀點僅代表作者本人,不代表電子發燒友網立場。文章及其配圖僅供工程師學習之用,如有內容侵權或者其他違規問題,請聯系本站處理。 舉報投訴
  • 計算機
    +關注

    關注

    19

    文章

    7430

    瀏覽量

    87733
  • 中斷
    +關注

    關注

    5

    文章

    895

    瀏覽量

    41401
  • python
    +關注

    關注

    56

    文章

    4783

    瀏覽量

    84473
  • 紅綠燈
    +關注

    關注

    2

    文章

    34

    瀏覽量

    11946
  • 樹莓派
    +關注

    關注

    116

    文章

    1699

    瀏覽量

    105537
收藏 人收藏

    評論

    相關推薦

    紅綠燈控制系統的LED城市路燈方案

    將LED路燈裝置與交通紅綠燈控制系統結合在一起,利用每一路段紅綠燈的轉換實現對下一路段燈光強弱的控制。將當前市場上 LED 集燈板上的LED燈分為兩組,在滿足不同時段照明要求前
    發表于 10-17 14:44 ?3856次閱讀

    PLC實現交通紅綠燈控制方法及原理

    PLC實現交通紅綠燈控制電路熟悉PLC編程原理及方法。掌握定時器使用方法。
    發表于 03-19 15:15

    交通紅綠燈帶仿真和程序

    交通紅綠燈帶仿真和程序
    發表于 03-29 10:53

    交通紅綠燈

    本帖最后由 samuergao 于 2014-7-3 14:13 編輯 交通燈,并顯示當前時間和倒計時,包含了單條路遇到人行道的紅綠燈,還有十字路口的紅綠燈,大家幫看看有的改進沒有。
    發表于 07-03 12:12

    如何去實現一種交通紅綠燈設計

    1、功能描述觀察十字路口紅綠燈工作流程,設計交通燈。1、初始時:南北向、東西向直行左轉均為紅燈2、南北向直行:①南北向直行綠燈亮,延時若干秒②啟動南北向左轉數碼管顯示:倒計時6秒;同時南北向直行
    發表于 11-09 09:21

    基于單片機的交通紅綠燈控制系統的設計

    前一段時間,做了一個關于基于單片機的交通紅綠燈控制系統的設計
    發表于 11-10 06:34

    交通紅綠燈PLC控制系統編程方法與技巧

    本文介紹了交通紅綠燈基本控制形式,針對帶綠閃的紅綠燈和帶數顯的紅綠控制和實現方法,詳細論述了相應的編程方法和技巧。實驗證明編制的程序運行可靠
    發表于 08-14 10:31 ?152次下載

    基于可編程控制交通紅綠燈模擬系統設計

    本文在綜合分析了8255A 及8253 芯片的特點之后,運用二者的特性,進行了交通紅綠燈模擬系統設計,在詳細闡述了設計思想及電路設計方案之后,對該系統的有效性測試表明了該交通紅
    發表于 05-18 11:03 ?199次下載
    基于可編程<b class='flag-5'>控制</b>的<b class='flag-5'>交通紅綠燈</b>模擬系統設計

    基于自定義時鐘脈沖的交通紅綠燈控制設計

    以三菱FX2N型PLC作為控制核心元件,闡明交通紅綠燈控制設計思路和控制方案。以PLC定時器構成的自定義時鐘脈沖程序段作為程序基本單元設計的交通紅
    發表于 06-19 11:42 ?6420次閱讀
    基于自定義時鐘脈沖的<b class='flag-5'>交通紅綠燈</b><b class='flag-5'>控制</b>設計

    EDA設計應用之紅綠燈交通控制器設計

    紅綠燈交通控制器EDA設計
    發表于 01-22 16:28 ?52次下載

    將VR技術應用于交通紅綠燈

    大家都知道,不管是行人還是汽車,在過路口的時候,一般都會有紅綠燈的存在,如果沒有紅綠燈的話,那整個交通都會混亂,交通事故絕對是層出不窮,而且堵車也會堵得水泄不通,所以
    發表于 12-22 09:38 ?3883次閱讀

    使用樹莓控制紅綠燈的源代碼免費下載

    本文檔的主要內容詳細介紹的是使用樹莓控制紅綠燈的源代碼免費下載。
    發表于 10-28 17:11 ?10次下載
    使用<b class='flag-5'>樹莓</b><b class='flag-5'>派</b><b class='flag-5'>控制</b><b class='flag-5'>紅綠燈</b>的源代碼免費下載

    基于8255A和8253芯片實現交通紅綠燈模擬系統的應用方案

    本文在綜合分析了8255A 及8253 芯片的特點之后,運用二者的特性,進行了交通紅綠燈模擬系統設計,在詳細闡述了設計思想及電路設計方案之后,對該系統的有效性測試表明了該交通紅綠燈模擬系統具有較為
    的頭像 發表于 03-23 14:47 ?5372次閱讀

    中文編程鴻蒙Hi3861開發基礎案例之-03交通紅綠燈

    中文編程鴻蒙Hi3861開發模擬交通紅綠燈亮與滅控制
    的頭像 發表于 05-11 11:27 ?2083次閱讀
    中文編程鴻蒙Hi3861開發基礎案例之-03<b class='flag-5'>交通紅綠燈</b>

    樹莓控制交通紅綠燈(簡潔版)

    前面我們通過控制LED燈和讀取按鈕狀態,簡單演示了樹莓如何通過GPIO來與外部世界溝通。今天我們要用樹莓模擬一個
    的頭像 發表于 07-02 15:08 ?2235次閱讀
    <b class='flag-5'>用</b><b class='flag-5'>樹莓</b><b class='flag-5'>派</b><b class='flag-5'>控制</b><b class='flag-5'>交通紅綠燈</b>(簡潔版)