3.1.1 計数装置

前書き

ここでは、PIRセンサーと4桁のセグメントディスプレイで構成される数字表示カウンターシステムを作成する。 PIRが誰かが通り過ぎていることを検出すると、4桁のセグメントディスプレイの数字に1が加算される。 このカウンターを使用して、通路を歩いている人の数をカウントできる。

部品

_images/list_Counting_Device1.png _images/list_Counting_Device2.png

回路図

T-Board Name

physical

wiringPi

BCM

GPIO17

Pin 11

0

17

GPIO27

Pin 13

2

27

GPIO22

Pin 15

3

22

SPIMOSI

Pin 19

12

10

GPIO18

Pin 12

1

18

GPIO23

Pin 16

4

23

GPIO24

Pin 18

5

24

GPIO26

Pin 37

25

26

_images/Schematic_three_one1.png

実験手順

ステップ1: 回路を作る。

计数器_bb

C言語ユーザー向け

ステップ2: コードのフォルダーに入る。

cd /home/pi/davinci-kit-for-raspberry-pi/c/3.1.1/

ステップ3: コードをコンパイルする。

gcc 3.1.1_CountingDevice.c -lwiringPi

ステップ4: EXEファイルを実行する。

sudo ./a.out

コードの実行後、PIRが誰かが通り過ぎていることを検出すると、4桁のセグメントディスプレイの数字に1が加算される。

PIR モジュールには 2 つのポテンショメータがあり、 1 つは感度を調整するためのもので、もう 1 つは検出距離を調整するためのものです。 PIR モジュールがうまく機能するためには、両方を完全に反時計回りに回す必要があります。

コードの説明

void display()
{
    clearDisplay();
    pickDigit(0);
    hc595_shift(number[counter % 10]);

    clearDisplay();
    pickDigit(1);
    hc595_shift(number[counter % 100 / 10]);

    clearDisplay();
    pickDigit(2);
    hc595_shift(number[counter % 1000 / 100]);

    clearDisplay();
    pickDigit(3);
    hc595_shift(number[counter % 10000 / 1000]);
}

まず、4番目のセグメントディスプレイを開始し、1桁の数字を書き込む。 次に、3番目のセグメントディスプレイを開始し、10桁の数字を入力する。 その後、2番目と1番目のセグメントディスプレイをそれぞれ開始し、それぞれ数百桁と数千桁を書き込む。 リフレッシュ速度が非常に速いため、完全な4桁のディスプレイが表示される。

void loop(){
    int currentState =0;
    int lastState=0;
    while(1){
        display();
        currentState=digitalRead(sensorPin);
        if((currentState==0)&&(lastState==1)){
            counter +=1;
        }
        lastState=currentState;
    }
}

これが主な機能である:4桁のセグメントディスプレイに数字を表示し、PIR値を読み取る。 PIRが誰かが通り過ぎていることを検出すると、4桁のセグメントディスプレイの数字に1が加算される。

Python言語ユーザー向け

ステップ2: コードのフォルダーに入る。

cd /home/pi/davinci-kit-for-raspberry-pi/python/

ステップ3: EXEファイルを実行する。

sudo python3 3.1.1_CountingDevice.py

コードの実行後、PIRが誰かが通り過ぎていることを検出すると、 4桁のセグメントディスプレイの数字に1が加算される。

コード

注釈

以下のコードを 変更/リセット/コピー/実行/停止 できます。 ただし、その前に、 davinci-kit-for-raspberry-pi/python のようなソースコードパスに移動する必要があります。

import RPi.GPIO as GPIO
import time

sensorPin = 26

SDI = 24
RCLK = 23
SRCLK = 18

placePin = (10, 22, 27, 17)
number = (0xc0, 0xf9, 0xa4, 0xb0, 0x99, 0x92, 0x82, 0xf8, 0x80, 0x90)

counter = 0

def clearDisplay():
    for i in range(8):
        GPIO.output(SDI, 1)
        GPIO.output(SRCLK, GPIO.HIGH)
        GPIO.output(SRCLK, GPIO.LOW)
    GPIO.output(RCLK, GPIO.HIGH)
    GPIO.output(RCLK, GPIO.LOW)

def hc595_shift(data):
    for i in range(8):
        GPIO.output(SDI, 0x80 & (data << i))
        GPIO.output(SRCLK, GPIO.HIGH)
        GPIO.output(SRCLK, GPIO.LOW)
    GPIO.output(RCLK, GPIO.HIGH)
    GPIO.output(RCLK, GPIO.LOW)

def pickDigit(digit):
    for i in placePin:
        GPIO.output(i,GPIO.LOW)
    GPIO.output(placePin[digit], GPIO.HIGH)

def display():
    global counter
    clearDisplay()
    pickDigit(0)
    hc595_shift(number[counter % 10])

    clearDisplay()
    pickDigit(1)
    hc595_shift(number[counter % 100//10])

    clearDisplay()
    pickDigit(2)
    hc595_shift(number[counter % 1000//100])

    clearDisplay()
    pickDigit(3)
    hc595_shift(number[counter % 10000//1000])

def loop():
    global counter
    currentState = 0
    lastState = 0
    while True:
        display()
        currentState=GPIO.input(sensorPin)
        if (currentState == 0) and (lastState == 1):
            counter +=1
        lastState=currentState

def setup():
    GPIO.setmode(GPIO.BCM)
    GPIO.setup(SDI, GPIO.OUT)
    GPIO.setup(RCLK, GPIO.OUT)
    GPIO.setup(SRCLK, GPIO.OUT)
    for i in placePin:
        GPIO.setup(i, GPIO.OUT)
    GPIO.setup(sensorPin, GPIO.IN)

def destroy():   # When "Ctrl+C" is pressed, the function is executed.
    GPIO.cleanup()

if __name__ == '__main__':  # Program starting from here
    setup()
    try:
        loop()
    except KeyboardInterrupt:
        destroy()

コードの説明

1.1.5 4桁7セグメントディ スプレイに基づいて、このレッスンでは、 PIRモジュール を追加して、レッスン1.1.5の自動カウントをカウント検出に変更する。 PIRが誰かが通り過ぎていることを検出すると、4桁のセグメントディスプレイの数字に1が加算される。

def display():
    global counter
    clearDisplay()
    pickDigit(0)
    hc595_shift(number[counter % 10])

    clearDisplay()
    pickDigit(1)
    hc595_shift(number[counter % 100//10])

    clearDisplay()
    pickDigit(2)
    hc595_shift(number[counter % 1000//100])

    clearDisplay()
    pickDigit(3)
    hc595_shift(number[counter % 10000//1000])

まず、4番目のセグメントディスプレイを開始し、1桁の数字を書き込む。 次に、3番目のセグメントディスプレイを開始し、10桁の数字を入力する。 その後、2番目と1番目のセグメントディスプレイをそれぞれ開始し、それぞれ数百桁と数千桁を書き込む。 リフレッシュ速度が非常に速いため、完全な4桁のディスプレイが表示される。

def loop():
global counter
    currentState = 0
    lastState = 0
    while True:
        display()
        currentState=GPIO.input(sensorPin)
        if (currentState == 0) and (lastState == 1):
            counter +=1
        lastState=currentState

これが主な機能である:4桁のセグメントディスプレイに数字を表示し、PIR値を読み取る。 PIRが誰かが通り過ぎていることを検出すると、4桁のセグメントディスプレイの数字に1が加算される。

現象画像

_images/image236.jpeg