You don’t need any pull up or pull down resistors, useĀ
pull_up_down=GPIO.PUD_DOWN
instead.
The setup:
![](https://wiki.lupsha.com/wp-content/uploads/2021/11/image-50.png)
The wiring:
![](https://wiki.lupsha.com/wp-content/uploads/2021/11/image-51.png)
![](https://wiki.lupsha.com/wp-content/uploads/2021/11/image-52.png)
The test program: test.py
# Door open/closed detector # # (c) Alan Lupsha 2020 # wiki.lupsha.com import RPi.GPIO as GPIO import time GPIO.setmode(GPIO.BCM) # GPIO Numbers instead of board numbers MAGNET_GPIO = 18 GPIO.setup(MAGNET_GPIO, GPIO.IN, pull_up_down=GPIO.PUD_DOWN) # GPIO Assign mode print("monitoring in progress...") try: while (True): print('MAGNET_GPIO is: %s' % GPIO.input(MAGNET_GPIO)) time.sleep(0.1) # If user presses ^C cleanup the GPIO except KeyboardInterrupt: GPIO.cleanup() print("Exiting program, bye.")
Run it.
python3 test.py
Open:
![](https://wiki.lupsha.com/wp-content/uploads/2021/11/image-53.png)
![](https://wiki.lupsha.com/wp-content/uploads/2021/11/image-54.png)
Closed:
![](https://wiki.lupsha.com/wp-content/uploads/2021/11/image-55.png)
![](https://wiki.lupsha.com/wp-content/uploads/2021/11/image-56.png)
A more complex example: (2 files)
door.py
# Door open/closed detector # # This programs monitors a reed switch connected to GPIO 18 and 3VDC # When the reed switch is open, the sendalert method is called, which # contacts other alarm systems. When the reed switch is closed, the # alarm mode is reset and sendstopalert is called. # # (c) Alan Lupsha 2020 # wiki.lupsha.com import RPi.GPIO as GPIO import time from datetime import datetime import urllib3 import requests, json #import http.client as httplib #import sys import ledstuff GPIO.setmode(GPIO.BCM) # GPIO Numbers instead of board numbers MAGNET_GPIO = 18 GPIO.setup(MAGNET_GPIO, GPIO.IN, pull_up_down=GPIO.PUD_DOWN) # GPIO Assign mode #LED_GPIO = 23 #GPIO.setup(LED_GPIO, GPIO.OUT) # the red LED # initially there is no alert alert = False def loginfo(message): rightnow = datetime.now().strftime("[%Y/%m/%d %H:%M:%S]") print(rightnow, ' [INFO] ', message) return def logerror(message): rightnow = datetime.now().strftime("[%Y/%m/%d %H:%M:%S]") print(rightnow, ' [ERROR] ', message) return def logexception(message, exception): rightnow = datetime.now().strftime("[%Y/%m/%d %H:%M:%S]") print(rightnow, ' [ERROR] ', message, ' ==> ', exception) return def urlhit(httpurl, userMessage): sample = { "message": userMessage } jsonData = json.dumps( sample ) loginfo('urlhit %s with message %s' % ( httpurl, jsonData)) try: response = requests.post(httpurl, jsonData) except urllib3.exceptions.NewConnectionError as e: logexception('new connection error 1 yo', e) except urllib3.exceptions.MaxRetryError as e: logexception('max retry error 2 yo', e) except requests.exceptions.ConnectionError as e: logexception('connection error 3 yo', e) return def startalert( str ): # GPIO.output(LED_GPIO, True) # Send an alert into the cloud now = datetime.now() rightnow = now.strftime("[%Y/%m/%d %H:%M:%S]") message = "Door open at " + rightnow loginfo(message) urlhit('http://localhost:8080/door/open', message) return def stopalert( str ): # GPIO.output(LED_GPIO, False) # Send END of alert into the cloud now = datetime.now() rightnow = now.strftime("[%Y/%m/%d %H:%M:%S]") message = "Door closed at " + rightnow loginfo(message) urlhit('http://localhost:8080/door/close', message) return loginfo("monitoring in progress...") ledstuff.arm() totalcounts = 0 try: while (True): totalcounts = totalcounts + 1 # MAGNET_GPIO = 1 means the circuit is closed, there is NO alert, = 0 means ALERT # print('******************** MAGNET_GPIO is: %s' % GPIO.input(MAGNET_GPIO)) # a break took place just now if alert == False and GPIO.input(MAGNET_GPIO) == 0: alert = True startalert( time ) loginfo('=> alert now is: DOOR OPEN') ledstuff.ledon() # an ongoing breach is STILL taking place if alert == True and GPIO.input(MAGNET_GPIO) == 0: # loginfo('=> breach still taking place') ledstuff.ledon() # the breach has ended, we are resetting the alert mode as well if alert == True and GPIO.input(MAGNET_GPIO) == 1: alert = False # reset it stopalert( time ) loginfo('=> alert is reset, door is now CLOSED') # there is no breach, sensor is closed #if alert == False and GPIO.input(MAGNET_GPIO) == 1: # loginfo('=> all ok, GPIO.INPUT(MAGNET_GPIO) is %s' % GPIO.input(MAGNET_GPIO)) # every x times, blink the LED if totalcounts == 10: ledstuff.blink() totalcounts = 0 # wait a bit time.sleep(1) # If user presses ^C cleanup the GPIO except KeyboardInterrupt: GPIO.cleanup() loginfo("Exiting program, bye.")
ledstuff.py
# LED on/off tester # (c) Alan Lupsha 2020 # wiki.lupsha.com import RPi.GPIO as GPIO import time GPIO.setmode(GPIO.BCM) # GPIO Numbers instead of board numbers LED_GPIO = 21 GPIO.setup(LED_GPIO, GPIO.OUT) # GPIO Assign mode def ledon(): #print('led ON') GPIO.output(LED_GPIO, True) return def ledoff(): #print('led OFF') GPIO.output(LED_GPIO, False) return # short blinks every X seconds def blink(): ledon() time.sleep(0.1) ledoff() return def angry(): ledon() time.sleep(0.5) ledoff() return # blink a number of times per second, to signify alertness def blinkpersecond(timestoblink): delay = 1 / timestoblink for i in range( 0, timestoblink ): #print('delay = ' + str(delay) + ' blink = ' + str(i)) ledon() time.sleep(delay) ledoff() time.sleep(delay) return # arming def arm(): blinkpersecond(2) blinkpersecond(5) blinkpersecond(10) ledoff() return def disarm(): ledoff() return