Python 3 一起加入代码 - Raspberry Pi

标签 python linux python-3.x raspberry-pi raspbian

我在将这 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()

最佳答案

看起来你可能会从做一两个 Python 教程中受益:)

做你想做的最简单的方法(但不一定是最好的方法)是制作一个文件,将所有导入语句放在顶部然后执行此操作:

添加相机代码,但将其转换为函数:

def take_picture():
    width = 480
    height = 360

    # initialise pygame   
    pygame.init()
    [etc.]

请注意,前导空格很重要。

该函数也可以编写为在调用时指定文件名(就像 Roland 的示例那样)。如果您想保存多张图像,那将是一种更好的方法。

然后添加电子邮件代码,但在这里您应该将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.]

然后添加烟雾检测代码。您帖子中的代码有点困惑。它缺少前导空格,一些双下划线已更改为单下划线。

将对摄像头代码和电子邮件代码的调用添加到烟雾检测代码中。此外,您可能希望在检测到烟雾时发送电子邮件后添加 sleep ,这样您的脚本就不会在检测到烟雾时向您发送成百上千封电子邮件。

它应该看起来更像这样(虽然全局变量似乎是不必要的):

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()

关于Python 3 一起加入代码 - Raspberry Pi,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/36964636/

相关文章:

javascript - 在 Electron 应用程序中嵌入其他程序

python - "return"和 "return None"生成器中的行为差异

python - 如何使 Twisted 应用程序处理 SIGTERM?

python - 确定 x 对于 float 和 timedelta 是否均为正

python - pandas groupby 根据条件连接

c - Mongodb-c-driver 工作后出现段错误

linux - 将子域名指向本地ip

python - 使用 bash 或 python 脚本启动和停止 GCE 实例

python-3.x - python : request dependency idna failed "ImportError: No module named idna"

python - -> 在 Python 函数定义中是什么意思?