Python 3 Объединение Кода Вместе-Raspberry Pi

У меня есть проблема по объединению этих 3 кучу кодов вместе. Данный проект представляет собой дымовую сигнализацию. Когда датчик дыма обнаружит дым, будет сделана фотография и будет отправлено электронное письмо с вложением фотографии. Что меня смущает, так это то, как объединить 3 кода вместе.

Спасибо за помощь!

Код Камеры:

#!/usr/bin/python
import os
import pygame, sys

from pygame.locals import *
import pygame.camera

width = 480
height = 360

#initialise pygame   
pygame.init()
pygame.camera.init()
cam = pygame.camera.Camera("/dev/video0",(width,height))
cam.start()

#setup window
windowSurfaceObj = pygame.display.set_mode((width,height),1,16)
pygame.display.set_caption('Camera')

#take a picture
image = cam.get_image()
cam.stop()

#display the picture
catSurfaceObj = image
windowSurfaceObj.blit(catSurfaceObj,(0,0))
pygame.display.update()

#save picture
pygame.image.save(windowSurfaceObj,'picture.jpg')

Код Электронной Почты:

#!/usr/bin/env python
# encoding: utf-8
import os
import smtplib
from email import encoders
from email.mime.base import MIMEBase
from email.mime.multipart import MIMEMultipart

COMMASPACE = ', '

def main():
    sender = ''
    gmail_password = ''
    recipients = ['']

    # Create the enclosing (outer) message
    outer = MIMEMultipart()
    outer['Subject'] = 'SMOKE HAS BEEN DETECTED!'
    outer['To'] = COMMASPACE.join(recipients)
    outer['From'] = sender
    outer.preamble = 'You will not see this in a MIME-aware mail reader.n'

    # List of attachments
    attachments = ['']

    # Add the attachments to the message
    for file in attachments:
        try:
            with open(file, 'rb') as fp:
                msg = MIMEBase('application', "octet-stream")
                msg.set_payload(fp.read())
            encoders.encode_base64(msg)
            msg.add_header('Content-Disposition', 'attachment', filename=os.path.basename(file))
            outer.attach(msg)
        except:
            print("Unable to open one of the attachments. Error: ", sys.exc_info()[0])
            raise

    composed = outer.as_string()

    # Send the email
    try:
        with smtplib.SMTP('smtp.gmail.com', 587) as s:
            s.ehlo()
            s.starttls()
            s.ehlo()
            s.login(sender, gmail_password)
            s.sendmail(sender, recipients, composed)
            s.close()
        print("Email sent!")
    except:
        print("Unable to send the email. Error: ", sys.exc_info()[0])
        raise

if __name__ == '__main__':
    main()

Код датчика дыма MQ2:

import time
import botbook_mcp3002 as mcp #

smokeLevel= 0

def readSmokeLevel():
global smokeLevel
smokeLevel= mcp.readAnalog()

def main():
while True: #
readSmokeLevel() #
print ("Current smoke level is %i " % smokeLevel) #
if smokeLevel > 120:
print("Smoke detected")
time.sleep(0.5) # s

if_name_=="_main_":
main()

2 ответа

  1. Вероятно, самый простой способ-использовать subprocess.runна Python 3.5 (или subprocess.callна более ранних версиях), чтобы запустить сначала программу фото, а затем программу электронной почты из программы обнаружения дыма.

    Другой способ, который также будет работать, заключается в преобразовании программы камеры и программы электронной почты в модули .

    Модуль камеры может выглядеть следующим образом;

    """Camera module"""
    
    import pygame
    
    
    def picture(filename):
        """Take a picture.
    
        Arguments:
            filename: Path where to store the picture
        """
        pygame.init()
        pygame.camera.init()
        cam = pygame.camera.Camera("/dev/video0", (480, 360))
        cam.start()
        image = cam.get_image()
        cam.stop()
        pygame.image.save(image, filename)
    

    Таким же образом можно создать emailмодуль с функцией send_mail(sender, password, recipient, attachments).

    В программе обнаружения дыма, вы смогли после этого сделать;

    import camera
    import email
    
    # if smoke detected...
    imagename = 'smoke.jpg'
    camera.picture(imagename)
    email.send_mail('foo@bar.com', 'sfwrterger', 'you@erewhon.com',
                    [imagename])
    
  2. Кажется, что вы могли бы извлечь выгоду из выполнения Python учебник или два 🙂

    Самый простой (но не обязательно лучший) способ сделать то, что вы хотите, — это сделать один файл, поместить все операторы импорта вверху, а затем сделать это:

    Добавьте код камеры, но преобразуйте его в функцию:

    def take_picture():
        width = 480
        height = 360
    
        # initialise pygame   
        pygame.init()
        [etc.]
    

    Обратите внимание, что начальные пробелы важны.

    Функция также может быть записана, чтобы указать имя файла, когда он вызывается (как пример Roland делает). Это был бы лучший способ сделать это в случае, если вы хотите сохранить более одного изображения.

    Затем добавьте в e-mail код, но здесь вы должны изменить имя mainфункции на что-то другое, как email_picture. Кроме того, вам нужно будет заполнить детали, такие как, например, изменение attachmentsпеременной, чтобы соответствовать имени файла, который take_pictureфункция сохраняет. (Опять же, было бы лучше позволить звонящему указать такие вещи, как адреса отправителя/получателя и имена файлов, как в Примере Roland. Также не включайте if __name__ == "__main__"часть здесь.

    например.:

    COMMASPACE = ', '
    
    def email_picture():
        sender = 'Your@Email.address'
        gmail_password = 'YourGmailPassword'
        recipients = ['Your@Email.address']
    
        # Create the enclosing (outer) message
        outer = MIMEMultipart()
        outer['Subject'] = 'SMOKE HAS BEEN DETECTED!'
        outer['To'] = COMMASPACE.join(recipients)
        outer['From'] = sender
        outer.preamble = 'You will not see this in a MIME-aware mail reader.\n'
    
        # List of attachments
        # This must match what the take_picture funtion is saving the file as
        attachments = ['picture.jpg']
        [etc.]
    

    Затем добавьте код обнаружения дыма. Код в вашем сообщении немного искажен. В нем отсутствуют начальные пробелы, и некоторые двойные подчеркивания были заменены на одиночные подчеркивания.

    Добавьте вызовы в код камеры и код электронной почты в код обнаружения дыма. Кроме того, вы, вероятно, хотите добавить в спящем режиме после отправки электронной почты, когда дым обнаружен, так что ваш сценарий не отправляет вам сотни/тысячи сообщений электронной почты, когда он обнаруживает дым.

    Это должно выглядеть так (хотя глобальная переменная кажется ненужной):

    smokeLevel = 0
    
    def readSmokeLevel():
        global smokeLevel
        smokeLevel = mcp.readAnalog()
    
    def main():
        while True: # Loop forever
            readSmokeLevel() #
            print("Current smoke level is %i " % smokeLevel) #
            if smokeLevel > 120:
                print("Smoke detected")
                take_picture()
                email_picture()
                time.sleep(600) # Cut down on emails when smoke detected
            time.sleep(0.5) # seconds
    
    if __name__ == "__main__":
        main()