在线观看www成人影院-在线观看www日本免费网站-在线观看www视频-在线观看操-欧美18在线-欧美1级

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

    文章

    7636

    瀏覽量

    90274
  • 中斷
    +關注

    關注

    5

    文章

    904

    瀏覽量

    42551
  • python
    +關注

    關注

    56

    文章

    4825

    瀏覽量

    86293
  • 紅綠燈
    +關注

    關注

    2

    文章

    34

    瀏覽量

    12115
  • 樹莓派
    +關注

    關注

    121

    文章

    1956

    瀏覽量

    107049
收藏 人收藏

    評論

    相關推薦
    熱點推薦

    使用PLC實現紅綠燈控制示例

    如圖為一個紅綠燈控制時序圖,啟動信號導通后,紅綠燈程序開始動作。
    的頭像 發表于 05-29 09:45 ?371次閱讀
    使用PLC實現<b class='flag-5'>紅綠燈</b><b class='flag-5'>控制</b>示例

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

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

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

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

    交通紅綠燈帶仿真和程序

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

    交通紅綠燈

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

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

    前一段時間,做了一個關于基于單片機的交通紅綠燈控制系統的設計
    發表于 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 ?6857次閱讀
    基于自定義時鐘脈沖的<b class='flag-5'>交通紅綠燈</b><b class='flag-5'>控制</b>設計

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

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

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

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

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

    本文檔的主要內容詳細介紹的是使用樹莓控制紅綠燈的源代碼免費下載。
    發表于 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 ?6115次閱讀

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

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

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

    前面我們通過控制LED燈和讀取按鈕狀態,簡單演示了樹莓如何通過GPIO來與外部世界溝通。今天我們要用樹莓模擬一個
    的頭像 發表于 07-02 15:08 ?3219次閱讀
    <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>(簡潔版)
    主站蜘蛛池模板: 久久亚洲精品玖玖玖玖 | 奇米4色| 青青热久免费精品视频在线观看 | 亚洲一区二区三区不卡视频 | 黄色福利网 | 伊人久操 | 国产色视频一区 | 性欧美高清强烈性视频 | 黄网观看 | 免费国产成人午夜私人影视 | 色多多www视频在线观看免费 | 成人性色生活片免费看爆迷你毛片 | 欧美黑人性色黄在线视频 | 国产日本特黄特色大片免费视频 | 亚洲免费视频播放 | 一级毛片真人免费播放视频 | 欧美成人伊人久久综合网 | 国产精品11页 | 色激情综合网 | 亚洲欧美高清在线 | 亚洲精品福利网站 | 欧美一区二区三区四区在线观看 | 护士巨好爽好大乳 | 色多多网 | 久久综合综合久久 | 黄色免费看视频 | 8050午夜一级| 国产激情视频一区二区三区 | 色操网 | 色激情综合网 | 性欧美日本 | 特级毛片网站 | 日日碰狠狠添天天爽五月婷 | 国产日本特黄特色大片免费视频 | 四虎国产永久在线精品免费观看 | 午夜视频在线网站 | 国产伦精品一区二区三区在线观看 | 欧美网站黄| 日本h视频在线 | 天天看天天爽天天摸天天添 | 日日噜噜夜夜狠狠久久aⅴ 日日噜噜夜夜狠狠久久丁香 |