轻量化BT下载器,有Web界面,非常适合树莓派等类似的小板子使用。

1.更新&安装

sudo apt-get update && sudo apt-get install transmission-daemon

2.关闭transmission-daemon服务

先关闭transmission-daemon服务,因为要改它的配置。

sudo service transmission-daemon stop

3.修改配置文件

sudo nano /etc/transmission-daemon/settings.json
(or sudo vi /etc/transmission-daemon/settings.json)
#-------------------------------------------------------
修改如下配置项
1. rpc-whitelist 允许访问的IP,写入IP路由器段或单独IP,如:192.168.1.*,多个用“,”分隔
2. incomplete-dir 下载中目录,可以换成自己的
3. download-dir 下载完成目录,可以换成自己的
4. rpc-password 用户密码,删除密文,写入明文密码,运行后会自动加密
5. rpc-username 用户名

4.启动服务

sudo service transmission-daemon start

5.访问WebUI

访问http://你的IP:9091/transmission/就可以看到界面了。

440_0.png

某个同学拿去开老师玩笑,用这个搞了一段音频,后来他走的很安详。

#coding=utf-8
#百度语音合成 by blog.chutian.bid
import requests,json,sys
class baidutoaudio:
    def __init__(self,appKey,appSecret,Cuid):
        self.ak = appKey
        self.sk = appSecret
        self.cuid = Cuid
        self.token = self.gettoken(appKey,appSecret)
        return
    def utf8(self): #UTF8环境
        reload(sys)
        sys.setdefaultencoding('utf-8')
    def getapi(self,url):
        data = requests.get(url)
        return data.text
    def writeauido(self,url,file): #写音频
        data = requests.get(url)
        f = open(file, 'w+')
        f.write(data.content)
        f.close()
    def gettoken(self,ak,sk): #获取鉴权
        data = self.getapi('https://aip.baidubce.com/oauth/2.0/token?grant_type=client_credentials&client_id=' + ak + '&client_secret=' + sk)
        if(data.find('error_description') == -1):
            data = json.loads(data)
            return data['access_token']
        else:
            data = json.loads(data)
            print data['error_description']
            return 'ERROR'
    def getsay(self,tex,spd,pit,vol,per,file): #写音频并返回链接
        #tex:合成用文本 spd:语速 pit:音调 vol:音量 per:发音人选择
        #0为普通女声,1为普通男生,3为情感合成-度逍遥,4为情感合成-度丫丫,默认为普通女声
        url = 'http://tsn.baidu.com/text2audio'
        url += '?tex='
        url += str(tex)
        url += '&tok='
        url += self.token
        url += '&cuid='
        url += str(self.cuid)
        url += '&ctp=1&lan=zh'
        url += '&spd='
        url += str(spd)
        url += '&vol='
        url += str(vol)
        url += '&per='
        url += str(per)
        self.writeauido(url,file)
        return url
if __name__ == '__main__':
    appKey = 'You AK'#AK
    appSecret = 'You SK'#SK
    cuid = '1'#用户ID
    say = baidutoaudio(appKey,appSecret,cuid)
    say.utf8()
    print say.getsay(raw_input('Say:'),5,6,12,4,'say.mp3')

当有人触发传感器时,自动拍照,相机使用RaspberryPi的CSI接口摄像头。

1.安装GPIO,picamera库:

pip install RPi.GPIO picamera
(仅pip)

2.在raspi-config中打开摄像头:

sudo raspi-config
5 Interfacing Options > P1 Camera > Yes(enabled)

源代码:

# -*- coding: utf-8 -*-
import RPi.GPIO as GPIO #Python GPIO库
import time,picamera
GPIO.setmode(GPIO.BOARD) #引脚模式
GPIO.setup(7,GPIO.IN) #板上7号引脚,输入
img = picamera.PiCamera() #初始化相机
img.brightness = 70 #相机亮度

while 1:
    if GPIO.input(7): #检测电平
        filename = time.strftime("%Y-%m-%d+%H:%M:%S",time.localtime()) + '.jpg'
        img.capture(filename) #保存一张照片
        print '[info] action'
    else:
        print '[info] no action'
    time.sleep(1)

电路图:

418_0.png

原理:

其他电路不讲了,主要讲一下下面的部分:

418_1.png

上图是一个简单的反向器,在IN输入一个高电平,使三极管导通,由于电流向电阻小的方向流动,所以这时没有电流流向A,所以A点为低电平,当IN没有输入(低电平)时,由于三极管没有导通,所以电流通过10K电阻流向A,于是在A处就产生了高电平。

把Q3的LED和500欧姆电阻去了,接入负载,就可以当做简单的UPS来使,大电流把Q3换成MOS就行了。

安装模块:

apt install python-opencv python-flask
(自动处理依赖关系)

源码:

1.easycamera

#coding=utf-8
#摄像头模块
import cv2
class easycamera:
    def __init__(self,cameraid): #初始化
        self.cap = cv2.VideoCapture(cameraid)
    def setimage(self,height,width): #设置图像高度宽度
        self.cap.set(3,width)
        self.cap.set(4,height)
    def getimage(self,format = '.jpg'): #读取图像
        ret,image = self.cap.read()
        ret,image = cv2.imencode(format,image)
        return image.tobytes()
    def writeimage(self,filename): #写图像
        ret,image = self.cap.read()
        ret,image = cv2.imencode(format,image)
        f = open(file,'w')
        f.write(image.tobytes())
        f.close()
    def getcamerainfo(self): #获取图像高度宽度
        return {'width':self.cap.get(3),'height':self.cap.get(4)}

2.server

#coding=utf-8
#服务器模块
from flask import Flask,Response
from camera import easycamera

app = Flask(__name__)
def getimage(id): #产生流
    image = easycamera(id)
    image.setimage(720,1280)
    while True:
        data = image.getimage()
        yield('--frame\r\n Content-Type: image/jpeg\r\n\r\n' + data + b'\r\n\r\n')

@app.route('/')
def index(): #主页,简单的html拼凑
    return '<html><body><h1>Web Camera</h1><img src="/getcamera"></body></html>'

@app.route('/getcamera') #取图像
def getcamera():
    return Response(getimage(0),mimetype='multipart/x-mixed-replace; boundary=frame')

if __name__ == '__main__':
    app.run(host='0.0.0.0',port=80, debug=True)

解析:

mimetype='multipart/x-mixed-replace; boundary=frame'

游览器报文,请参考这篇文章,在这里是服务器向游览器发送图片流。

yield

类似于return,但与return不同的是,return执行后就不再执行return后的代码了,而yield返回后会继续执行后面的代码,在上面的代码中,不断的返回图片数据(流),请参考这篇文章。

效果:

有一定的延迟,帧数还是算流畅的。

412_0.png

防烤糊必备

import os
import time
from pyA20.gpio import gpio
from pyA20.gpio import port
#GPIO:https://github.com/duxingkei33/orangepi_PC_gpio_pyH3
#适用于全H3系列和H2+
Pin = port.PA10
gpio.init() #初始化
gpio.setcfg(Pin, gpio.OUTPUT) #输出
while 1:
    output = os.popen('cat /sys/devices/virtual/hwmon/hwmon1/temp1_input') 
    #读取温度,来自CPU的温度传感器
    #初版Zero由于基准电压的原因,可能偏高
    wd = output.read()
    print int(wd)
    if(int(wd)>50): #大于50度开启
        gpio.output(Pin, 1)
        time.sleep(1)
    if(int(wd)<50):
        gpio.output(Pin, 0)
        time.sleep(1)

需要安装Python-Opencv:

apt install python-opencv
(自动处理依赖关系)

一段简短的代码:

#coding=utf-8
import cv2,time
cap = cv2.VideoCapture(0) #选择设备
cap.set(3,1280) #设置宽度(720p)
cap.set(4,720) #设置高度
while(1):
    file = 'photo/' + time.strftime('%Y-%m-%d-%H:%M:%S',time.localtime(time.time())) + '.jpg' #存储在photo文件夹,以时间命名,JPG格式
    print 'GET',file
    ret,photo = cap.read()  #读取摄像头
    cv2.imwrite(file,photo) #写照片
    time.sleep(10) #延时时间,10s一张

之后照片用FFmpeg之类的工具合成视频就可以了。

写这个是为了下载纪录片用的。

比如这个页面:舌尖上的中国第二季

它会抓取这个页面的所有视频链接并输出到txt文件。

#!/usr/bin/env python
# -*- coding: UTF-8 -*-
import requests,re,os
#取网页内容
def gethtml(url):
    data = requests.get(url)
    return data.text
#正则匹配部分
def reurlstart(url):
    #os.remove('getcntv.txt')
    info = []
    text = gethtml(url)
    #央视的视频链接一般为 http://tv.cctv.com/年/月/日/乱七八糟.shtml
    #正则匹配式:[a-zA-z]+://tv.cctv.com/[0-9]*/[0-9]*/[0-9]*/.*"
    data = re.findall(r'[a-zA-z]+://tv.cctv.com/[0-9]*/[0-9]*/[0-9]*/.*"',text,re.I)
    for i in data:
        i = i.split('"')
            if i[0] != url:
                #这里要进行一次分割,因为原链接是 视频链接 + " + html
                info.append(i[0])
    #得到的数组有重复的链接,所以要去重
        dellist(info)
#去除重复链接
def dellist(list):
    list2 = []
    for i in list:
        if i not in list2:
            print i
            wfile(i)
                list2.append(i)
    return list2
#写文件
def wfile(text):
    f = open('getcntv.txt','a+')
    f.write(text + '\n')
    f.close()

a = raw_input('URL:')
reurlstart(a)

374_0.png