• 极客圈(一)树莓派3B协同Python打造个性化天气闹钟


    人生苦短,我用Python~ 

    一直想自己折腾些极客的东西出来,供自己使用或者是供他人使用。一则可能对自己的生活是一种帮助,二则是对自己技能的提高,三则显得高大上,一直努力,一直提高,一直Happy!~

    直到,在京东白条了一个树莓派3,我知道,有一段兴奋的苦旅要开始了...

    【前言】

    本文拟使用Python开发一个智能时钟,并且将智能时钟部署在 树莓派3 微机上,7*24小时开机,以达到实时监控时钟并在适当的时侯作出响应的目的。其实是每天早上邪恶的提示语,加一段提示音乐。每天中午吵醒午睡的闹钟,房东在没人的时候进屋能吓他一跳...zzzhhh

    【实现功能】

    这篇文章将要介绍的主要内容如下:

    1、早上闹钟,天气预报,音乐提醒

    2、整点报时,半点报时

    【实现思路】

    1、python对天气网站信息的web爬虫爬取

    2、通过分析爬取的数据,并拼接需要语音播报的文本

    3、调用百度的语音合成api进行语音文本转化成mp3

    4、使用python脚本将mp3下载到本地

    5、设置计划任务,每分钟检测一下当前时间是否满足条件

    6、早上闹钟+天气预报+音乐,整点报时,半点响音

    【开发及部署环境】

    开发环境:Windows 7 ×64 英文版

         JetBrains PyCharm 2017.1.3 x64

    部署环境:Raspberry Pi 3 Ubuntu OS

    【所需技术】

    1、Python语言的熟练掌握,Python版本2.7

    2、利用Python语言,实现web爬虫,网络爬虫的理解

    3、正则表达式的简单使用

    4、BeautifulSoup html解析库的使用

    5、linux常用命令的熟练掌握

    【实现过程】

    首先附上程序结构:

    我们这次写的py文件是 main_SmartClock.py ,然后还有个配置文件 qx_shs.ini、配置文件全局读取 ConfigField.py ,GetWeatherText.py 爬取墨迹天气的py脚本,TextToAudio.py 将文本转化成语音的脚本。我们可能主要用到这几个py文件。

    1、首先是配置ini 配置文件

     1 [System]
     2 OWNER = 东爷 ;语音播报的名字
     3 
     4 [ClockTime]
     5 CLOCK_MORNING_AWAKE = 7:16
     6 CLOCK_MORNING_GO = 8:30
     7 CLOCK_NOON = 13:30
     8 CLOCK_AFTERNOON = 19:00
     9 CLOCK_EVENING = 23:00
    10 
    11 [CameraRecognition]
    12 IMAGE_SIMILARITY = 0.85       ;视屏监控图片匹配相似度
    13 SAMPLE_IMAGES_NAME = 东爷     ;图片样本名称
    14 
    15 [Text]
    16 ATTACK_ALERT_TEXT = Some People Attack
    17 ALERT_TXT_MORNING = 早上好,美好的一天开始啦
    18 ALERT_TXT_NOON = 中午好,小憩一下,睡个午觉,美美哒
    19 ALERT_TXT_AFTERNOON = 下午好,夕阳无限好,只是近黄昏啊
    20 ALERT_TXT_NIGHT = 晚上好,夜深了,早点休息吧,记得睡前喝牛奶哦
    21 ALERT_TXT_OFF_WORK = 您下班啦,工作一天累了吧,休息一下吧
    22 ALERT_TXT_HELLO = '您好'
    23 
    24 
    25 [Path]
    26 MP3_ALERT = soundFiles/alert.mp3
    27 MP3_START = soundFiles/start.mp3
    28 MP3_NORMAL = soundFiles/chengdu.mp3
    29 MP3_WEATHER = soundFiles/weatherGreeting.mp3
    30 MP3_MORNING_AWAKE = soundFiles/piaoyangguohailaikanni.mp3
    31 MP3_MORNING_GO = soundFiles/chengdu.mp3
    32 MP3_NOON = soundFiles/shiguangzhenghao.mp3
    33 MP3_AFTERNOON = soundFiles/wenwendexinfu.mp3
    34 MP3_EVENING = soundFiles/guqin.mp3
    35 MP3_HALF_HOUR = soundFiles/short2.mp3
    36 MP3_HOUR = soundFiles/short3.mp3
    37 MP3_BACKGROUND = soundFiles/background2.mp3
    38 
    39 CLASSIFIER_PATH = Resources/haarcascade_frontalface_default.xml
    40 SAMPLE_IMAGES_SAVE_PATH = sampleImages/
    41 CAMERA_MONITORING_FILES_PATH = cameraMonitoringFiles/

    2、然后是对配置文件的读取,并设置到全局变量,因为我好几个主要py文件都要调用这几个全局变量,所以我就直接设置在全局了,避免重复获取ini文件

     1 # coding=utf-8
     2 import ConfigParser
     3 
     4 # 树莓派的ubuntu系统里面如果要使用计划任务,则必须写成绝对路径,意味着这里需要加前缀
     5 # RASPBERRY_PI_PATH_ROOT = '/root/C/'
     6 # RASPBERRY_PI_PATH_PROJECT = 'QX_SHS/'
     7 
     8 # Windows调试不需要加绝对路径
     9 RASPBERRY_PI_PATH_ROOT = ''
    10 RASPBERRY_PI_PATH_PROJECT = ''
    11 
    12 RASPBERRY_PI_PATH_PLUS = RASPBERRY_PI_PATH_ROOT + RASPBERRY_PI_PATH_PROJECT
    13 
    14 HEADERS = {
    15     'User-Agent': 'Mozilla/5.0 (Windows NT 6.1; Win64; x64) AppleWebKit'
    16                   '/537.36 (KHTML, like Gecko) Chrome/53.0.2785.143 Safar'
    17                   'i/537.36',
    18 }
    19 
    20 # get configuration
    21 config = ConfigParser.ConfigParser()
    22 config.readfp(open(RASPBERRY_PI_PATH_PLUS + 'qx_shs.ini'))
    23 
    24 # 获取System
    25 OWNER = config.get('System', 'OWNER')
    26 
    27 # 获取Text
    28 ATTACK_ALERT_TEXT = config.get('Text', 'ATTACK_ALERT_TEXT')
    29 ALERT_TXT_MORNING = config.get('Text', 'ALERT_TXT_MORNING')
    30 ALERT_TXT_NOON = config.get('Text', 'ALERT_TXT_NOON')
    31 ALERT_TXT_AFTERNOON = config.get('Text', 'ALERT_TXT_AFTERNOON')
    32 ALERT_TXT_NIGHT = config.get('Text', 'ALERT_TXT_NIGHT')
    33 ALERT_TXT_OFF_WORK = config.get('Text', 'ALERT_TXT_OFF_WORK')
    34 ALERT_TXT_HELLO = config.get('Text', 'ALERT_TXT_HELLO')
    35 
    36 # 获取闹钟时间参数
    37 CLOCK_MORNING_AWAKE = config.get('ClockTime', 'CLOCK_MORNING_AWAKE')
    38 CLOCK_MORNING_GO = config.get('ClockTime', 'CLOCK_MORNING_GO')
    39 CLOCK_NOON = config.get('ClockTime', 'CLOCK_NOON')
    40 CLOCK_AFTERNOON = config.get('ClockTime', 'CLOCK_AFTERNOON')
    41 CLOCK_EVENING = config.get('ClockTime', 'CLOCK_EVENING')
    42 
    43 # 获取CameraRecognition参数
    44 IMAGE_SIMILARITY = config.get('CameraRecognition', 'IMAGE_SIMILARITY')
    45 SAMPLE_IMAGES_NAME = config.get('CameraRecognition', 'SAMPLE_IMAGES_NAME')
    46 
    47 # 获取路径
    48 MP3_ALERT = RASPBERRY_PI_PATH_PLUS + config.get('Path', 'MP3_ALERT')
    49 MP3_START = RASPBERRY_PI_PATH_PLUS + config.get('Path', 'MP3_START')
    50 MP3_NORMAL = RASPBERRY_PI_PATH_PLUS + config.get('Path', 'MP3_NORMAL')
    51 MP3_WEATHER = RASPBERRY_PI_PATH_PLUS + config.get('Path', 'MP3_WEATHER')
    52 MP3_MORNING_AWAKE = RASPBERRY_PI_PATH_PLUS + config.get('Path', 'MP3_MORNING_AWAKE')
    53 MP3_MORNING_GO = RASPBERRY_PI_PATH_PLUS + config.get('Path', 'MP3_MORNING_GO')
    54 MP3_NOON = RASPBERRY_PI_PATH_PLUS + config.get('Path', 'MP3_NOON')
    55 MP3_AFTERNOON = RASPBERRY_PI_PATH_PLUS + config.get('Path', 'MP3_AFTERNOON')
    56 MP3_EVENING = RASPBERRY_PI_PATH_PLUS + config.get('Path', 'MP3_EVENING')
    57 MP3_HALF_HOUR = RASPBERRY_PI_PATH_PLUS + config.get('Path', 'MP3_HALF_HOUR')
    58 MP3_HOUR = RASPBERRY_PI_PATH_PLUS + config.get('Path', 'MP3_HOUR')
    59 MP3_BACKGROUND = RASPBERRY_PI_PATH_PLUS + config.get('Path', 'MP3_BACKGROUND')
    60 
    61 CLASSIFIER_PATH = RASPBERRY_PI_PATH_PLUS + config.get('Path', 'CLASSIFIER_PATH')
    62 SAMPLE_IMAGES_SAVE_PATH = RASPBERRY_PI_PATH_PLUS + config.get('Path', 'SAMPLE_IMAGES_SAVE_PATH')
    63 CAMERA_MONITORING_FILES_PATH = RASPBERRY_PI_PATH_PLUS + config.get('Path', 'CAMERA_MONITORING_FILES_PATH')

    3、使用requests库进行对墨迹天气网站信息的爬取http://tianqi.moji.com/,网络爬虫的代码我就不进行介绍了,代码里面也有详细的注释,要注意对其他文件的调用,包导入。

      1 # coding=utf-8
      2 
      3 # RASPBERRY_PI_PATH_ROOT 执行Ubuntu计划任务必须声明绝对路径
      4 RASPBERRY_PI_PATH_ROOT = '/root/C/'
      5 
      6 import sys
      7 
      8 sys.path.append(RASPBERRY_PI_PATH_ROOT)
      9 import re
     10 import requests
     11 from bs4 import BeautifulSoup
     12 from datetime import datetime
     13 from Helper_DG.DateTimeHelper_DG import *
     14 from QX_SHS.ConfigField import *
     15 
     16 reload(sys)
     17 sys.setdefaultencoding('utf8')
     18 
     19 
     20 def numtozh(num):
     21     num_dict = {1: '', 2: '', 3: '', 4: '', 5: '', 6: '', 7: '',
     22                 8: '', 9: '', 0: ''}
     23     num = int(num)
     24     if 100 <= num < 1000:
     25         b_num = num // 100
     26         s_num = (num - b_num * 100) // 10
     27         g_num = (num - b_num * 100) % 10
     28         if g_num == 0 and s_num == 0:
     29             num = '%s百' % (num_dict[b_num])
     30         elif s_num == 0:
     31             num = '%s百%s%s' % (num_dict[b_num], num_dict.get(s_num, ''), num_dict.get(g_num, ''))
     32         elif g_num == 0:
     33             num = '%s百%s十' % (num_dict[b_num], num_dict.get(s_num, ''))
     34         else:
     35             num = '%s百%s十%s' % (num_dict[b_num], num_dict.get(s_num, ''), num_dict.get(g_num, ''))
     36     elif 10 <= num < 100:
     37         s_num = num // 10
     38         g_num = (num - s_num * 10) % 10
     39         if g_num == 0:
     40             g_num = ''
     41         num = '%s十%s' % (num_dict[s_num], num_dict.get(g_num, ''))
     42     elif 0 <= num < 10:
     43         g_num = num
     44         num = '%s' % (num_dict[g_num])
     45     elif -10 < num < 0:
     46         g_num = -num
     47         num = '零下%s' % (num_dict[g_num])
     48     elif -100 < num <= -10:
     49         num = -num
     50         s_num = num // 10
     51         g_num = (num - s_num * 10) % 10
     52         if g_num == 0:
     53             g_num = ''
     54         num = '零下%s十%s' % (num_dict[s_num], num_dict.get(g_num, ''))
     55     return num
     56 
     57 
     58 # timeRegion 时间区间 1=早上,2=中午,3=傍晚,4=夜晚,其他=现在
     59 def get_weather(name, timeRegion):
     60     # 下载墨迹天气主页源码
     61     res = requests.get('http://tianqi.moji.com/', headers=HEADERS)
     62     # 用BeautifulSoup获取所需信息
     63     soup = BeautifulSoup(res.text, "html.parser")
     64     address = soup.find('div', attrs={'class': 'search_default'}).em.getText()
     65     temp = soup.find('div', attrs={'class': 'wea_weather clearfix'}).em.getText()
     66     temp = numtozh(int(temp))
     67     weather = soup.find('div', attrs={'class': 'wea_weather clearfix'}).b.getText()
     68     sd = soup.find('div', attrs={'class': 'wea_about clearfix'}).span.getText()
     69     sd_num = re.search(r'\d+', sd).group()
     70     sd_num_zh = numtozh(int(sd_num))
     71     sd = sd.replace(sd_num, sd_num_zh)
     72     wind = soup.find('div', attrs={'class': 'wea_about clearfix'}).em.getText()
     73     aqi = soup.find('div', attrs={'class': 'wea_alert clearfix'}).em.getText()
     74     aqi_num = re.search(r'\d+', aqi).group()
     75     aqi_num_zh = numtozh(int(aqi_num))
     76     aqi = aqi.replace(aqi_num, aqi_num_zh).replace(' ', ',空气质量')
     77     info = soup.find('div', attrs={'class': 'wea_tips clearfix'}).em.getText()
     78     sd = sd.replace(' ', '百分之').replace('%', '')
     79     aqi = 'aqi' + aqi
     80     info = info.replace('', ',')
     81     # 获取今天的日期
     82     timeNow = datetime.datetime.now()
     83 
     84     # 将获取的信息拼接成一句话
     85     weatherText = ''
     86     if timeRegion == 1:
     87         weatherText = '早上好!%s ,今天是%s年,%s月,%s日,星期%s,现在的时间是%s点,%s分。您所在的地区是%s,天气%s,温度%s摄氏度,%s,%s,%s,%s 开始美好的一天吧,么么哒。' % \
     88                       (
     89                           name, timeNow.year, timeNow.month, timeNow.day, get_week_day_by_date(timeNow), timeNow.hour,
     90                           timeNow.minute, address,
     91                           weather, temp,
     92                           sd,
     93                           wind,
     94                           aqi, info)
     95     elif timeRegion == 2:
     96         weatherText = '中午好!%s ,今天是%s年,%s月,%s日,星期%s,现在的时间是%s点,%s分。您所在的地区是%s,天气%s,温度%s摄氏度,%s,%s,%s,%s 中午一定要记得休息哦,么么哒。' % \
     97                       (
     98                           name, timeNow.year, timeNow.month, timeNow.day, get_week_day_by_date(timeNow), timeNow.hour,
     99                           timeNow.minute, address,
    100                           weather, temp,
    101                           sd,
    102                           wind,
    103                           aqi, info)
    104     elif timeRegion == 3:
    105         weatherText = '下午好!%s ,今天是%s年,%s月,%s日,星期%s,现在的时间是%s点,%s分。您所在的地区是%s,天气%s,温度%s摄氏度,%s,%s,%s,%s 忙了一天,累了吧,么么哒。' % \
    106                       (
    107                           name, timeNow.year, timeNow.month, timeNow.day, get_week_day_by_date(timeNow), timeNow.hour,
    108                           timeNow.minute, address,
    109                           weather, temp,
    110                           sd,
    111                           wind,
    112                           aqi, info)
    113     elif timeRegion == 4:
    114         weatherText = '晚上好!%s ,今天是%s年,%s月,%s日,星期%s,现在的时间是%s点,%s分。您所在的地区是%s,天气%s,温度%s摄氏度,%s,%s,%s,%s 夜已深了,早点休息吧,么么哒。' % \
    115                       (
    116                           name, timeNow.year, timeNow.month, timeNow.day, get_week_day_by_date(timeNow), timeNow.hour,
    117                           timeNow.minute, address,
    118                           weather, temp,
    119                           sd,
    120                           wind,
    121                           aqi, info)
    122     elif timeRegion == 5:
    123         weatherText = '现在是,北京时间 %s年,%s月,%s日,星期%s,%s点,%s分。' % \
    124                       (
    125                           timeNow.year, timeNow.month, timeNow.day, get_week_day_by_date(timeNow), timeNow.hour,
    126                           timeNow.minute)
    127     else:
    128         weatherText = '您好!%s ,今天是%s年,%s月,%s日,星期%s,现在的时间是%s点,%s分。您所在的地区是%s,天气%s,温度%s摄氏度,%s,%s,%s,%s 么么哒。' % \
    129                       (
    130                           name, timeNow.year, timeNow.month, timeNow.day, get_week_day_by_date(timeNow), timeNow.hour,
    131                           timeNow.minute, address,
    132                           weather, temp,
    133                           sd,
    134                           wind,
    135                           aqi, info)
    136 
    137     return weatherText

    4、接下来就是我们的主程序入口了,首先上代码,然后再进行介绍

     1 # coding=utf-8
     2 
     3 # RASPBERRY_PI_PATH_ROOT 执行Ubuntu计划任务必须声明绝对路径
     4 RASPBERRY_PI_PATH_ROOT = '/root/C/'
     5 
     6 import sys
     7 
     8 sys.path.append(RASPBERRY_PI_PATH_ROOT)
     9 import os
    10 from FunctionCode.GetWeatherText import *
    11 from FunctionCode.TextToAudio import *
    12 
    13 # 播放器(totem)和音乐文件(The_Snow.mp3)需要用户指定,需要指定时间
    14 def play_mp3_weather(time_index):
    15     # 通过不同的时间,获取不同时间的天气信息
    16     text = get_weather(str(OWNER), time_index)
    17     # 将文字信息转换成语音信息
    18     text2voice(text, MP3_WEATHER)
    19     os.system("mpg321 {0}".format(str(MP3_WEATHER)))
    20 
    21 
    22 if __name__ == '__main__':
    23 
    24     timeNow = get_current_time()
    25 
    26     print('{0} -> welcome to use qixiao`s program .  starting ...'.format(timeNow))
    27 
    28     # os.system("mpg321 {0}".format(str(MP3_START)))
    29     # text = get_weather(str(OWNER), 0)
    30     # print(text)
    31 
    32     try:
    33         # 获取特定格式的当前时间
    34         timeNowStringFormat = str('{0}:{1}'.format(timeNow.hour, timeNow.minute))
    35         # 打印当前时间
    36         # print('time now -> {0}'.format(timeNow))
    37         # 进行时间判断,并在不同时间段进行对应的操作
    38         if timeNowStringFormat == CLOCK_MORNING_AWAKE:
    39             print('{0} >>> morning ! it`s time to awake ... '.format(str(CLOCK_MORNING_AWAKE)))
    40             play_mp3_weather(1)
    41             os.system("mpg321 {0}".format(str(MP3_MORNING_AWAKE)))
    42         if timeNowStringFormat == CLOCK_MORNING_GO:
    43             print('{0} >>> morning ! it`s time to go ... '.format(str(CLOCK_MORNING_GO)))
    44             play_mp3_weather(1)
    45             os.system("mpg321 {0}".format(str(MP3_MORNING_GO)))
    46         elif timeNowStringFormat == CLOCK_NOON:
    47             print('{0} >>> good noon have a good mood ... '.format(str(CLOCK_NOON)))
    48             play_mp3_weather(2)
    49             os.system("mpg321 {0}".format(str(MP3_NOON)))
    50         elif timeNowStringFormat == CLOCK_AFTERNOON:
    51             print('{0} >>> good afternoon it`s time to happy ... '.format(str(CLOCK_AFTERNOON)))
    52             play_mp3_weather(3)
    53             os.system("mpg321 {0}".format(str(MP3_AFTERNOON)))
    54         elif timeNowStringFormat == CLOCK_EVENING:
    55             print('{0} >>> good night it`s time to sleep ... '.format(str(CLOCK_EVENING)))
    56             play_mp3_weather(4)
    57             os.system("mpg321 {0}".format(str(MP3_EVENING)))
    58         # 整点报时功能 早7点以后,晚24点之前 除去13点午休时间
    59         elif timeNow.hour > 7 and timeNow.hour < 24 and timeNow.hour != 13 and timeNow.minute == 00:
    60             print('# >>> integral point. ... ')
    61             os.system("mpg321 {0}".format(str(MP3_HOUR)))
    62             play_mp3_weather(5)
    63         # 半点报时功能 早7点以后,晚24点之前 除去13点午休时间
    64         elif timeNow.hour >= 7 and timeNow.hour < 24 and timeNow.hour != 13 and timeNow.minute == 30:
    65             print('# >>> half an hour ... ')
    66             os.system("mpg321 {0}".format(str(MP3_HALF_HOUR)))
    67         else:
    68             pass
    69 
    70     except Exception:
    71         print(str(timeNow) + ' >>> ' + Exception)

    该主程序通过方法获取到了当前的时间,并进行时间的匹配,对应的时间执行对应的操作。在主程序定义的方法中,我们进行对天气等信息的获取,并拼接字符串,调用百度声音合成api进行声音的获取及转化成mp3,保存到本地,最后进行声音的播放。

    5、百度接口的调用

     1 # coding=utf-8
     2 
     3 # RASPBERRY_PI_PATH_ROOT 执行Ubuntu计划任务必须声明绝对路径
     4 RASPBERRY_PI_PATH_ROOT = '/root/C/'
     5 
     6 import sys
     7 
     8 sys.path.append(RASPBERRY_PI_PATH_ROOT)
     9 import requests
    10 import json
    11 from QX_SHS.ConfigField import *
    12 
    13 # 将文字转化成mp3 并保存到本地
    14 def text2voice(text,mp3_path):
    15     urlGetToken = 'https://openapi.baidu.com/oauth/2.0/token?grant_type=client_credentials&client_id=************&client_secret=************'
    16 
    17     token = requests.post(urlGetToken, headers=HEADERS)
    18     tokenJson = json.loads(token.content.decode(encoding="utf-8"))
    19     access_token = tokenJson['access_token']
    20 
    21     # spd 语速 pit 音调 per 0 女 1 男
    22     url = 'http://tsn.baidu.com/text2audio?tex={0}&lan=zh&cuid={1}&ctp=1&tok={2}&spd=4&pit=8&per=0'.format(text, 'qixiao_text2audio',
    23                                                                                          access_token)
    24     # 下载转换后的mp3格式语音
    25     res = requests.get(url, headers=HEADERS)
    26     # 将MP3存入本地
    27     with open(mp3_path, 'wb') as f:
    28         f.write(res.content)

    通过调用百度的api接口,我们就可以将文字转化成声音啦,多种声音设置可以选择。

    进行到这一步,我们就可以进行部署测试了。

    【系统测试】

    1、使用FTP或任何方式将代码部署到 Raspberry Pi上

    2、由于树莓派是ubuntu系统,需要安装支持mp3播放的播放器,这里我采用 mpg321 

    安装mpg321,终端输入命令:sudo apt-get install mpg123

    等待片刻就可以安装好mpg321了,该命令可以直接跟mp3 文件进行mp3的播放

    mpg321 test.mp3

    如果打开想要关闭的话,需要执行进程关闭命令:

    killall mpg321  就可以关掉啦

    3、将该py脚本添加到计划任务中去,并且使其每分钟执行一次,来扫描当前的时间

    使用crontab命令,可以添加计划任务,终端运行命令

     crontab -e 执行编辑任务

    crontab -l 查看当前用户下的全部计划任务

    第一次执行 crontab -e 会让你选择默认的编辑器,最后终于发现vi居然是最好用的。

    crontab默认编辑器为nano.
    修改crontab默认编辑器为vi或者其他的编辑器。
    法一:
    export EDITOR="/usr/bin/vim" ; crontab -e
    法二:
    执行命令:select-editor
    然后选择编辑器.

    添加计划任务的方法也很简单了,这里有模板可以参考:

    每一项cron实体的内容都包含六个部分:分钟、小时、月份中的哪一天、年份中的哪一月、星期中的哪一天,还有定时执行的命令。

    # m h  dom mon dow   command  
      
    # * * * * *  command to execute  
    # ┬ ┬ ┬ ┬ ┬  
    # │ │ │ │ │  
    # │ │ │ │ │  
    # │ │ │ │ └───── 星期中的哪一天(0-7)(从0到6代表星期日到星期六,也可以使用名字;7是星期天,等同于0)  
    # │ │ │ └────────── 月份 (1 - 12)  
    # │ │ └─────────────── 月份中的日 (1 - 31)  
    # │ └──────────────────── 小时 (0 - 23)  
    # └───────────────────────── 分钟 (0 - 59)  

    例如我的计划任务是这么写的:

    */1 * * * * python2 /root/C/QX_SHS/main_SmartClock.py

    */1的意思是每分钟执行一次。

    我们设置完后,esc->shift+;->wq 回车

    这样,计划任务就启动了。如果不出意外,能达到理想的效果。关于其他计划任务的命令,需要自行学习了。 

    这里附上我的大PI的写真~

    由于要搁到下面的桌子上安装opencv 所以显示器放在下面了,正常时候是在床上 很 “美观”的 放置着的。

    摄像头刚到,欸,继续去研究下一个课题,人脸识别问候系统+室内监控系统,代码已完成,正在跳部署的坑~~~(此处附上女友挚爱的~/摊手)

    【可能遇到问题】

    1、 部署到树莓派时候,可能装到计划任务,却没有反应;没关系,我们先将代码main方法里的 最上面写一段模拟的音乐播放,直接播放已经存在的路径里的音乐。

      或者将我的注释取消掉即可,我本身也是做过测试的。

      

      然后直接在终端运行我们计划任务里的命令,ok,如果报路径找不到之类的问题就对了。

      计划任务里的脚本执行命令,和直接切换到脚本所在的目录执行的方式是不太一样的,总之,如果在根目录执行某一个带目录路径的脚本的话,所有的脚本里的相对路径都会找不到,那么我们只有拼接一个绝对路径到项目所有的目录前面了,这里我在ConfigFeild.py里面,最上面有两行注释进行了该操作。

      再次附上ConfigFeild.py的代码:

     1 # coding=utf-8
     2 import ConfigParser
     3 
     4 # 树莓派的ubuntu系统里面如果要使用计划任务,则必须写成绝对路径,意味着这里需要加前缀
     5 # RASPBERRY_PI_PATH_ROOT = '/root/C/'
     6 # RASPBERRY_PI_PATH_PROJECT = 'QX_SHS/'
     7 
     8 # Windows调试不需要加绝对路径
     9 RASPBERRY_PI_PATH_ROOT = ''
    10 RASPBERRY_PI_PATH_PROJECT = ''
    11 
    12 RASPBERRY_PI_PATH_PLUS = RASPBERRY_PI_PATH_ROOT + RASPBERRY_PI_PATH_PROJECT
    13 
    14 HEADERS = {
    15     'User-Agent': 'Mozilla/5.0 (Windows NT 6.1; Win64; x64) AppleWebKit'
    16                   '/537.36 (KHTML, like Gecko) Chrome/53.0.2785.143 Safar'
    17                   'i/537.36',
    18 }
    19 
    20 # get configuration
    21 config = ConfigParser.ConfigParser()
    22 config.readfp(open(RASPBERRY_PI_PATH_PLUS + 'qx_shs.ini'))
    23 
    24 # 获取System
    25 OWNER = config.get('System', 'OWNER')
    26 
    27 # 获取Text
    28 ATTACK_ALERT_TEXT = config.get('Text', 'ATTACK_ALERT_TEXT')
    29 ALERT_TXT_MORNING = config.get('Text', 'ALERT_TXT_MORNING')
    30 ALERT_TXT_NOON = config.get('Text', 'ALERT_TXT_NOON')
    31 ALERT_TXT_AFTERNOON = config.get('Text', 'ALERT_TXT_AFTERNOON')
    32 ALERT_TXT_NIGHT = config.get('Text', 'ALERT_TXT_NIGHT')
    33 ALERT_TXT_OFF_WORK = config.get('Text', 'ALERT_TXT_OFF_WORK')
    34 ALERT_TXT_HELLO = config.get('Text', 'ALERT_TXT_HELLO')
    35 
    36 # 获取闹钟时间参数
    37 CLOCK_MORNING_AWAKE = config.get('ClockTime', 'CLOCK_MORNING_AWAKE')
    38 CLOCK_MORNING_GO = config.get('ClockTime', 'CLOCK_MORNING_GO')
    39 CLOCK_NOON = config.get('ClockTime', 'CLOCK_NOON')
    40 CLOCK_AFTERNOON = config.get('ClockTime', 'CLOCK_AFTERNOON')
    41 CLOCK_EVENING = config.get('ClockTime', 'CLOCK_EVENING')
    42 
    43 # 获取CameraRecognition参数
    44 IMAGE_SIMILARITY = config.get('CameraRecognition', 'IMAGE_SIMILARITY')
    45 SAMPLE_IMAGES_NAME = config.get('CameraRecognition', 'SAMPLE_IMAGES_NAME')
    46 
    47 # 获取路径
    48 MP3_ALERT = RASPBERRY_PI_PATH_PLUS + config.get('Path', 'MP3_ALERT')
    49 MP3_START = RASPBERRY_PI_PATH_PLUS + config.get('Path', 'MP3_START')
    50 MP3_NORMAL = RASPBERRY_PI_PATH_PLUS + config.get('Path', 'MP3_NORMAL')
    51 MP3_WEATHER = RASPBERRY_PI_PATH_PLUS + config.get('Path', 'MP3_WEATHER')
    52 MP3_MORNING_AWAKE = RASPBERRY_PI_PATH_PLUS + config.get('Path', 'MP3_MORNING_AWAKE')
    53 MP3_MORNING_GO = RASPBERRY_PI_PATH_PLUS + config.get('Path', 'MP3_MORNING_GO')
    54 MP3_NOON = RASPBERRY_PI_PATH_PLUS + config.get('Path', 'MP3_NOON')
    55 MP3_AFTERNOON = RASPBERRY_PI_PATH_PLUS + config.get('Path', 'MP3_AFTERNOON')
    56 MP3_EVENING = RASPBERRY_PI_PATH_PLUS + config.get('Path', 'MP3_EVENING')
    57 MP3_HALF_HOUR = RASPBERRY_PI_PATH_PLUS + config.get('Path', 'MP3_HALF_HOUR')
    58 MP3_HOUR = RASPBERRY_PI_PATH_PLUS + config.get('Path', 'MP3_HOUR')
    59 MP3_BACKGROUND = RASPBERRY_PI_PATH_PLUS + config.get('Path', 'MP3_BACKGROUND')
    60 
    61 CLASSIFIER_PATH = RASPBERRY_PI_PATH_PLUS + config.get('Path', 'CLASSIFIER_PATH')
    62 SAMPLE_IMAGES_SAVE_PATH = RASPBERRY_PI_PATH_PLUS + config.get('Path', 'SAMPLE_IMAGES_SAVE_PATH')
    63 CAMERA_MONITORING_FILES_PATH = RASPBERRY_PI_PATH_PLUS + config.get('Path', 'CAMERA_MONITORING_FILES_PATH')

    这下应该可以理解为什么需要在每个路径前面拼接了一段了,如果在windows下,用 当前的拼接值,如果在树莓派,则上面注释的两行,写上自己的目录绝对路径值。

    当然了,每个脚本最上面,为了引用其他文件夹里的脚本,我也进行了相应的操作:

    1 # coding=utf-8
    2 
    3 # RASPBERRY_PI_PATH_ROOT 执行Ubuntu计划任务必须声明绝对路径
    4 RASPBERRY_PI_PATH_ROOT = '/root/C/'

    这里按需求来吧。

    【系统展望】

    1、音乐调取网易云的每日推荐歌单,改掉现在每日播放重复歌曲的情况

    本文为七小站主原创作品,转载请注明出处:http://www.cnblogs.com/7tiny/ 且在文章页面明显位置给出原文链接。

    作者信息(详情):

    QiXiao_柒小(東)
    Software Development
    北京市海淀区 Haidian Area Beijing 100089,P.R.China
    郵箱Email : seventiny@foxmail.com  
    網址Http: http://www.7tiny.com
    QQ:1124999434 , WeChat: wd8622088 (尽量加微信)
    (专好结交天下英雄好汉,可聊天,可谈技,可约饭,可..嗯,原则是要有的~) 更多联系方式点我哦~


    Best Regard ~
  • 相关阅读:
    10个最好的游戏开发在线资源
    程序员什么时候该考虑辞职
    程序员常去的14个顶级开发社区
    如何成为10倍速的程序员
    (通用)深度学习环境搭建:tensorflow安装教程及常见错误解决
    20行JS代码实现贪吃蛇
    程序员必备工具目录
    发布 Google Chrome插件教程
    高并发思路
    30分钟入门Java
  • 原文地址:https://www.cnblogs.com/7tiny/p/7128075.html
Copyright © 2020-2023  润新知