today
长大了就能接受所有不可避免的分离。
2018.8.13 周一
长大了就能接受所有不可避免的分离。
2018.8.13 周一
轻量化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/
就可以看到界面了。
某个同学拿去开老师玩笑,用这个搞了一段音频,后来他走的很安详。
#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)
电路图:
原理:
其他电路不讲了,主要讲一下下面的部分:
上图是一个简单的反向器,在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返回后会继续执行后面的代码,在上面的代码中,不断的返回图片数据(流),请参考这篇文章。
效果:
有一定的延迟,帧数还是算流畅的。
防烤糊必备
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之类的工具合成视频就可以了。