파이썬 코드 질문 드립니다. 두 가지 동작이 동시에 되질 않습니다. (소켓, 서버, 진동 센서)

조회수 1114회

안녕하세요. 파이썬 코드를 짬뽕을 하고 작동을 하는데 한개가 작동을 하면 한개는 작동을 하지 않더라구요 ... 뭐가 문제인지 모르겠습니다..

제가 파이썬을 잘 모르고 여러가지를 찾아보면서 짬뽕을 시켜서

  1. 라즈베리파이에서 진동이 감지가 되면 twilio 을 통해서 제 휴대폰으로 진동이 감지 되었다고 메세지가 오도록 설정해 두었고,

  2. 라즈베리파이를 서버로 만들어서 클라이언트쪽(휴대폰 어플)에서 제가 설정해 놓은 "picture" 라는 데이터를 라즈베리파이서버로 전송을 하면 라즈베리에서 카메라 모듈로 카메라가 찍히게 해놓았습니다.

1번 따로 실행을 하면 잘 동작을 하고 2번 따로 실행을 하면 잘 작동을 합니다 근데 두개를 짬뽕 시켜서 라즈베리파이에서 실행을 시키면 1번이 동작을 하면 2번이 동작을 하지않고 2번이 동작하면 1번이 동작을 하지 않습니다.

파이썬 고인물들님 문제가 무엇이고 해결방법은 무엇인지 알려주시면 감사하겠습니다. 읽어주셔서 감사합니다. 밑에 코드 첨부하겠습니다.

ip와 개인정보에 해당하는 휴대폰번호, 토큰 등 은 지웠습니다.

제가 참고한 블로그 출처 입니다 https://blog.naver.com/PostView.nhn?blogId=cosmosjs&logNo=220805719737&proxyReferer=https:%2F%2Fwww.google.com%2F --> 진동 감지

https://m.blog.naver.com/cosmosjs/220834751822 --> 서버 만들어서 소켓 통신

import RPi.GPIO as GPIO
import time
from twilio.rest import Client
from subprocess import call
import socket
from picamera import PiCamera
from time import sleep
import datetime

account_sid = '***********************'
auth_token = '*********************'
client = Client(account_sid, auth_token)

ip = '172.30.xxx.xxx'
port = 8888
camera = PiCamera()
camera.rotation = 180

s = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
print('Socket created') 
s.bind((ip, port))
print('Socket bind complete')
s.listen(60)
print('Socket now listening')

def camera_picture(input_string):

    if input_string == "picture":
        dateString = datetime.datetime.now().strftime('%b %d %H:%M:%S')
        saveFileName = datetime.datetime.now().strftime('%y%m%d-%H%M%S') +'.jpg'
        input_string = "Take a picture , " + saveFileName
        camera.start_preview()
        camera.annotate_text = dateString
        sleep(5)
        camera.capture(saveFileName)
        camera.stop_preview()

    elif input_string == "video":
        input_string = "Take a video"
        camera.start_preview()
        camera.start_recording('/home/pi/Desktop/server_video.h264')
        sleep(5)

        camera.stop_recording()
        camera.stop_preview()

    else:
        input_string = input_string + "unknown command"

    return input_string

while True:

    conn, addr = s.accept()
    print("Connected by ", addr)
    data = conn.recv(1024)
    data = data.decode("utf8").strip()

    if not data: break
    print("Received : " + data)
    res = camera_picture(data)
    print("ras pi action : " + res)
    conn.sendall(res.encode("utf-8"))

    conn.close()

s.close()

class Sw420(object):

    def __init__(self, pin, led):
        self.led = led
        GPIO.setmode(GPIO.BCM)
        GPIO.setup(self.led, GPIO.OUT)
        self.pin = pin
        GPIO.setup(self.pin, GPIO.IN, pull_up_down=GPIO.PUD_DOWN)
        GPIO.add_event_detect(self.pin, GPIO.RISING, callback=self.callback, bouncetime=1)
        self.count = 0

    def callback(self, pin):
        self.count += 1        
    def LedOn(self):
        GPIO.output(self.led, 1)
        print("Vibration Detected")        
    def LedOff(self):
        GPIO.output(self.led, 0)
        print("NOT Vibration Detected")  

def main():

    sensor = Sw420(17,16)

    try:
        while True:
            time.sleep(1)
            if sensor.count >= 30:
                sensor.LedOn()
                message = client.messages\
                                .create(
                                    body="Vibration Detected from raspi",
                                    from_='+1212341234',
                                    to='+821012341234'
                                )
                print(message.sid)
            else:
                sensor.LedOff()               
            sensor.count = 0

    except KetboardInterrupt:
        GPIO.cleanup()

if __name__ == '__main__':
    main()

고수님들 읽어주셔서 항상 감사합니다.

  • (•́ ✖ •̀)
    알 수 없는 사용자

1 답변

답변을 하려면 로그인이 필요합니다.

프로그래머스 커뮤니티는 개발자들을 위한 Q&A 서비스입니다. 로그인해야 답변을 작성하실 수 있습니다.

(ಠ_ಠ)
(ಠ‿ಠ)