2.1.3 Neigungsschalter

Einführung

Dies ist ein Kugelkippschalter mit einer Metallkugel im Inneren. Es wird verwendet, um Neigungen eines kleinen Winkels zu erfassen.

Komponenten

_images/list_2.1.3_tilt_switch.png

Prinzip

Neigung

Das Prinzip ist sehr einfach. Wenn der Schalter in einem bestimmten Winkel gekippt wird, rollt die Kugel im Inneren nach unten und berührt die beiden Kontakte, die mit den Pins außen verbunden sind, wodurch Schaltkreise ausgelöst werden. Andernfalls bleibt der Ball von den Kontakten fern und unterbricht so die Stromkreise.

_images/image167.png

Schematische Darstellung

_images/image307.png _images/image308.png

Experimentelle Verfahren

Schritt 1: Bauen Sie die Schaltung auf.

_images/image169.png

Für Benutzer in C-Sprache

Schritt 2: Verzeichnis wechseln.

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

Schritt 3: Kompilieren.

gcc 2.1.3_Tilt.c -lwiringPi

Schritt 4: Ausführen.

sudo ./a.out

Wenn Sie die Neigung horizontal platzieren, leuchtet die grüne LED auf. Wenn Sie es kippen, „Neigung!“ wird auf dem Bildschirm gedruckt und die rote LED leuchtet auf. Stellen Sie es wieder horizontal auf und die grüne LED leuchtet wieder auf.

Code

#include <wiringPi.h>
#include <stdio.h>

#define TiltPin     0
#define Gpin        2
#define Rpin        3

void LED(char* color)
{
    pinMode(Gpin, OUTPUT);
    pinMode(Rpin, OUTPUT);
    if (color == "RED")
    {
        digitalWrite(Rpin, HIGH);
        digitalWrite(Gpin, LOW);
    }
    else if (color == "GREEN")
    {
        digitalWrite(Rpin, LOW);
        digitalWrite(Gpin, HIGH);
    }
    else
        printf("LED Error");
}

int main(void)
{
    if(wiringPiSetup() == -1){ //when initialize wiring failed,print message to screen
        printf("setup wiringPi failed !");
        return 1;
    }

    pinMode(TiltPin, INPUT);
    LED("GREEN");

    while(1){
        if(0 == digitalRead(TiltPin)){
            delay(10);
            if(0 == digitalRead(TiltPin)){
                LED("RED");
                printf("Tilt!\n");
                delay(100);
            }
        }
        else if(1 == digitalRead(TiltPin)){
            delay(10);
            if(1 == digitalRead(TiltPin)){
                LED("GREEN");
            }
        }
    }
    return 0;
}

Code Erklärung

void LED(char* color)
{
    pinMode(Gpin, OUTPUT);
    pinMode(Rpin, OUTPUT);
    if (color == "RED")
    {
        digitalWrite(Rpin, HIGH);
        digitalWrite(Gpin, LOW);
    }
    else if (color == "GREEN")
    {
        digitalWrite(Rpin, LOW);
        digitalWrite(Gpin, HIGH);
    }
    else
        printf("LED Error");
}

Definieren Sie eine Funktions- LED() , um die beiden LEDs ein- oder auszuschalten. Wenn die Parameterfarbe ROT ist, leuchtet die rote LED auf. Wenn die Parameterfarbe GRÜN ist, leuchtet die grüne LED ebenfalls auf.

while(1){
        if(0 == digitalRead(TiltPin)){
            delay(10);
            if(0 == digitalRead(TiltPin)){
                LED("RED");
                printf("Tilt!\n");
            }
        }
        else if(1 == digitalRead(TiltPin)){
            delay(10);
            if(1 == digitalRead(TiltPin)){
                LED("GREEN");
            }
        }
    }

Wenn der Lesewert des Neigungsschalters 0 ist, bedeutet dies, dass der Neigungsschalter gekippt ist. Dann schreiben Sie den Parameter „ROT“ in die Funktions-LED, damit die rote LED aufleuchtet. Andernfalls leuchtet die grüne LED.

Für Python-Sprachbenutzer

Schritt 2: Verzeichnis wechseln.

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

Schritt 3: Ausführen.

sudo python3 2.1.3_Tilt.py

Wenn Sie die Neigung horizontal platzieren, leuchtet die grüne LED auf. Wenn Sie es kippen, „Neigung!“ wird auf dem Bildschirm gedruckt und die rote LED leuchtet auf. Stellen Sie es wieder horizontal auf und die grüne LED leuchtet auf.

Code

Bemerkung

Sie können den folgenden Code Ändern/Zurücksetzen/Kopieren/Ausführen/Stoppen . Zuvor müssen Sie jedoch zu einem Quellcodepfad wie davinci-kit-for-raspberry-pi/python gehen.

import RPi.GPIO as GPIO
import time

dhtPin = 17

GPIO.setmode(GPIO.BCM)

MAX_UNCHANGE_COUNT = 100

STATE_INIT_PULL_DOWN = 1
STATE_INIT_PULL_UP = 2
STATE_DATA_FIRST_PULL_DOWN = 3
STATE_DATA_PULL_UP = 4
STATE_DATA_PULL_DOWN = 5

def readDht11():
    GPIO.setup(dhtPin, GPIO.OUT)
    GPIO.output(dhtPin, GPIO.HIGH)
    time.sleep(0.05)
    GPIO.output(dhtPin, GPIO.LOW)
    time.sleep(0.02)
    GPIO.setup(dhtPin, GPIO.IN, GPIO.PUD_UP)

    unchanged_count = 0
    last = -1
    data = []
    while True:
        current = GPIO.input(dhtPin)
        data.append(current)
        if last != current:
            unchanged_count = 0
            last = current
        else:
            unchanged_count += 1
            if unchanged_count > MAX_UNCHANGE_COUNT:
                break

    state = STATE_INIT_PULL_DOWN

    lengths = []
    current_length = 0

    for current in data:
        current_length += 1

        if state == STATE_INIT_PULL_DOWN:
            if current == GPIO.LOW:
                state = STATE_INIT_PULL_UP
            else:
                continue
        if state == STATE_INIT_PULL_UP:
            if current == GPIO.HIGH:
                state = STATE_DATA_FIRST_PULL_DOWN
            else:
                continue
        if state == STATE_DATA_FIRST_PULL_DOWN:
            if current == GPIO.LOW:
                state = STATE_DATA_PULL_UP
            else:
                continue
        if state == STATE_DATA_PULL_UP:
            if current == GPIO.HIGH:
                current_length = 0
                state = STATE_DATA_PULL_DOWN
            else:
                continue
        if state == STATE_DATA_PULL_DOWN:
            if current == GPIO.LOW:
                lengths.append(current_length)
                state = STATE_DATA_PULL_UP
            else:
                continue
    if len(lengths) != 40:
        #print ("Data not good, skip")
        return False

    shortest_pull_up = min(lengths)
    longest_pull_up = max(lengths)
    halfway = (longest_pull_up + shortest_pull_up) / 2
    bits = []
    the_bytes = []
    byte = 0

    for length in lengths:
        bit = 0
        if length > halfway:
            bit = 1
        bits.append(bit)
    #print ("bits: %s, length: %d" % (bits, len(bits)))
    for i in range(0, len(bits)):
        byte = byte << 1
        if (bits[i]):
            byte = byte | 1
        else:
            byte = byte | 0
        if ((i + 1) % 8 == 0):
            the_bytes.append(byte)
            byte = 0
    #print (the_bytes)
    checksum = (the_bytes[0] + the_bytes[1] + the_bytes[2] + the_bytes[3]) & 0xFF
    if the_bytes[4] != checksum:
        #print ("Data not good, skip")
        return False

    return the_bytes[0], the_bytes[2]

def main():

    while True:
        result = readDht11()
        if result:
            humidity, temperature = result
            print ("humidity: %s %%,  Temperature: %s C`" % (humidity, temperature))
        time.sleep(1)

def destroy():
    GPIO.cleanup()

if __name__ == '__main__':
    try:
        main()
    except KeyboardInterrupt:
        destroy()

Code Erklärung

GPIO.add_event_detect(TiltPin, GPIO.BOTH, callback=detect, bouncetime=200)

Richten Sie eine Erkennung auf TiltPin und eine Rückruffunktion zur Erkennung ein.

def Led(x):
    if x == 0:
        GPIO.output(Rpin, 1)
        GPIO.output(Gpin, 0)
    if x == 1:
        GPIO.output(Rpin, 0)
        GPIO.output(Gpin, 1)

Definieren Sie eine Funktion Led() , um die beiden LEDs ein- oder auszuschalten. Wenn x = 0 ist, leuchtet die rote LED auf. Andernfalls leuchtet die grüne LED.

def Print(x):
    if x == 0:
        print ('    *************')
        print ('    *   Tilt!   *')
        print ('    *************')

Erstellen Sie eine Funktion, Print() , um die obigen Zeichen auf dem Bildschirm zu drucken.

def detect(chn):
    Led(GPIO.input(TiltPin))
    Print(GPIO.input(TiltPin))

Definieren Sie eine Rückruffunktion für den Neigungsrückruf. Holen Sie sich den Lesewert des Neigungsschalters, dann steuert die Funktion LED() das Ein- oder Ausschalten der beiden LEDs, abhängig vom Lesewert des Neigungsschalters.

Phänomen Bild

_images/image170.jpeg