發表文章

目前顯示的是 9月, 2017的文章

raspberry pi 3 上安裝 python的pyalsaaudio 來控制音量

圖片
目前我安裝pyalsaaudio的目的,是要用程式的方式控制rpi3上音量的大小 但在安裝過程中遇到一些瓶頸,因為我用的是python3,在這裡紀錄遇到的情形,及是如何解決的。 安裝 一開始輸入 sudo pip3 install pyalsaaudio 出現以下錯誤 pi@raspberrypi:~ $ sudo pip3 install pyalsaaudio Downloading/unpacking pyalsaaudio   Downloading pyalsaaudio-0.8.4.tar.gz (315kB): 315kB downloaded   Running setup.py (path:/tmp/pip-build-150927bh/pyalsaaudio/setup.py) egg_info for package pyalsaaudio         warning: no files found matching '*.json' under directory 'doc' Installing collected packages: pyalsaaudio   Running setup.py install for pyalsaaudio     building 'alsaaudio' extension     arm-linux-gnueabihf-gcc -pthread -DNDEBUG -g -fwrapv -O2 -Wall -Wstrict-prototypes -g -fstack-protector-strong -Wformat -Werror=format-security -D_FORTIFY_SOURCE=2 -fPIC -I/usr/include/python3.4m -c alsaaudio.c -o build/temp.linux-armv7l-3.4/alsaaudio.o     alsaaudio.c:28:28: fatal error: alsa/asoundlib.h: 沒有此一檔案或目錄      #include                                 ^     compilation

python pyautogui 簡介

pyautogui 是 python的一個模組,他能控制鍵盤和滑鼠的操作,能利用它做自動化操作,像是用在軟體測試、重複性動作等。 pyautogui 暫停幾秒鐘 >>>pyautogui.PAUSE = 1.5 fail-safe (預設false) 當滑鼠一道螢幕左上角時,觸發 pyautogui 的failsafeexception 異常 >>>pyautogui.FAILSAFE = True 螢幕上的座標軸 (0,0) →→→→(1920,0)    ↓    ↓    ↓    ↓ (0,1080) 取得螢幕解析度 >>>import pyautogui >>>pyautogui.size() (1920, 1080) >>>width, height = pyautogui.size() 滑鼠部分 moveTo(width, height, duration) example移動到(300, 400)位置 pyautogui.moveTo(300, 400)                 #立即到 pyautogui.moveTo(300, 400, duration = 1.5) #花1.5秒移到 moeRel(width, height, duration) 移到相對座標,以當前滑鼠座標為基準點 pyautogui.moveRel(0, 100, duration=0.25) pyautogui.moveRel(-100, 0, duration=0.25) position() 獲得滑鼠當前的座標位置 >>>pyautogui.position() (300, 400) click(width, height, button) 滑鼠點擊 button = 'left', 'middle', 'right'。 pyautogui.click()                                #在當前位置點擊(預設左鍵) pyautogui.click(width, height)    

raspberry pi 3 安裝python pyautogui

圖片
主要安裝步驟 linux 需安裝其他的東西 sudo apt-get install python-tk sudo apt-get install python3-dev sudo apt-get install scrot sudo pip3 install python3-xlib 最後安裝 sudo pip3 install pyautogui 新版的應該是已安裝好以下: python-tk python3-dev scrot 錯誤一 如果直接安裝pyautogui會出現以下的錯誤 表示缺少xlib 只要安裝 python3-xlib完,再安裝pyautogui就可以了 錯誤二 如果像我其他都安裝好了,但是pyautogui還是安裝不成功,出現以下錯誤 那就把 sudo pip3 install pyautogui 改成 sudo xvfb-run pip3 install pyautogui 上網查 xvfb-run 應該是模擬安裝的意思 pi@raspberrypi:~ $ sudo pip3 install pyautogui Downloading/unpacking pyautogui Downloading PyAutoGUI-0.9.36.tar.gz (46kB): 46kB downloaded Running setup.py (path:/tmp/pip-build-0mnn6hrh/pyautogui/setup.py) egg_info for package pyautogui Traceback (most recent call last): File "/usr/local/lib/python3.4/dist-packages/Xlib/xauth.py", line 43, in __init__ raw = open(filename, 'rb').read() FileNotFoundError: [Errno 2] No such file or directory: '/root/.Xauthority' During handling

空間活動偵測 -2 google app script

圖片
以Post的方式接收由pushingbox傳來的訊息,分別是磁簧開關5組,及人體紅外線6組 app script 接收端程式 function doPost(e) { var params = e.parameter; //現在時間 var now = Utilities.formatDate(new Date(), "GMT+8", "yyyy-MM-dd HH:mm:ss"); //編號1 的板子 if(params.board==1){ //*** 接收接點開關資料 ***// if(params.RS0){ Logger.log('接收接點開關資料'); //將Sheet指定為"資料庫"試算表 SpreadSheet = 試算表 var SpreadSheet = SpreadsheetApp.openById("xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx"); //取得頁籤:"工作表1" Sheet = 頁籤 var Sheet = SpreadSheet.getSheetByName("board1 接點開關"); //取得有資料的最後一行的"行數"(目的要在最後一行插入新資料) var LastRow = Sheet.getLastRow(); //--開始寫入資料-- //在最後一行的下一行寫入資料 Sheet.getRange(LastRow+1, 1).setValue(now); //寫入time Sheet.getRange(LastRow+1, 2).setValue(params.time); //寫入data Sheet.getRange(LastRow+1, 3).setValue(params.RS0); //RS = Reed Switch 磁簧開

空間活動偵測 -1 arduino

圖片
我想做一個能夠及時通知家中發生異狀的系統 研究結果 用Arduino接收感測器資料,定時傳送資料人體紅外線資料,及即時傳送開關門資料,再用google apps script 做資料交換與分析,將arduino傳送過來的資料存入google試算表,由試算表做圖表繪製,再由apps script 定時推播圖表訊息,以及分析內容推播異常或警告訊息。 研究過程 一開始想用自己架設的伺服器存資料,用raspberry pi安裝apache + mysql + phpMyAdmin,但因為網路IP位置是浮動的關係,資料無法從外部傳回進伺服器,只能做本地端的資料傳輸,如果單使用arduino上傳資料到google試算表,又因為arduino uno3無網路連線加密的問題無法傳輸資料。 之後找到國外的伺服器能做資料交換,加上用google的試算表做簡單的資料庫儲存,所以最後是用arduino接收感測器資訊,傳輸到資料交換伺服器再到google,由apps script 接收資料及填入試算表,完成了資料接收的問題。 硬體:使用arduino uno3 + 乙太網路擴充板 + 自己做的電路板 連接的感測器: 人體紅外線感測器 門窗的磁簧開關 #include <Dhcp.h> #include <Dns.h> #include <Ethernet.h> #include <EthernetClient.h> #include <EthernetServer.h> #include <EthernetUdp.h> //#include "net_function.cpp" #include "set_ID.h" #define PushingBox unsigned char hour = 0, minute = 0; boolean push_man_check; String URL_data; #define ReedS0_pin 2 #define ReedS1_pin 3 #define ReedS2_pin 4 #define ReedS3_pin 5 #define ReedS4_pin 6 #define

python nn 聲音辨識 -2 建立nn

建立神經網路 網路上查聲音用這個function,跟這個loss算法(網站沒記下來) output_layer = add_layer(intput, input_tensors = input_len, output_tensors = output_len, n_layer = 1, activation_function = tf.nn.softmax) loss = tf.reduce_mean(-tf.reduce_sum(y_feeds * tf.log(output_layer), reduction_indices=[1])) 訓練與預測的函數很像 #訓練 要餵入 x , y sess.run(train, feed_dict = {x_feeds: x_data, y_feeds: y_data}) #放入loss 就能輸出現在loss值 loss_ = sess.run(loss, feed_dict={x_feeds: x_data, y_feeds: y_data}) #預測 只要餵入 x result = sess.run(output_layer, feed_dict = {x_feeds: [x_test]}) 完整程式碼: import tensorflow as tf import numpy as np import wav_fft as wavf import os # 定義一個添加層的函數 def add_layer(inputs, input_tensors, output_tensors, n_layer, activation_function = None): layer_name = 'layer%s' % n_layer print(layer_name) with tf.name_scope('Layer'): with tf.name_scope('Weights'): W = tf.Variable(tf.random_normal([input_tensors, output_tensors]), dtype=tf.float32 ,name = 'W')

python nn 聲音辨識 -1 傅立葉轉換

圖片
辨識環境聲音判斷出這是甚麼聲音 主要想法是用頻域赫茲分布做判斷 首先先錄三種聲音的聲音檔,我每一種聲音重複錄製九個sample,所以有27個wav檔 讀取wav檔案,作正規劃處理,在做傅立葉轉換 一開始由於自己做的fft_domyself() function跟其他聲音處理軟體做出來的不一樣,數值非常小,之後找到有內建的spectrogram() function,使用也是數值很小,最後才想到要20log(),但由於內建的覺得不適合自由調整,所以還是修改自己的function。 import matplotlib.pyplot as plt from scipy.fftpack import fft from scipy.io import wavfile # get the api import numpy as np from scipy import signal import math import pyaudio import wave import time #buf=[] #讀入單一檔案測試 def init(): fs, data = wavfile.read('0106.wav') # load the data b=[(ele/2**16.) for ele in data] # this is 16-bit track, b is now normalized on [-1,1) c = fft(b) # calculate fourier transform (complex numbers list) d = len(c)/2 # you only need half of the fft list (real signal symmetry) plt.subplot(211) plt.plot(b,'b') plt.title('time line') plt.subplot(212) plt.plot(abs(c[:(d-1)]),'r') plt.title('fft') plt.show() return fs, b #取樣率 dat

python 爬蟲程式 -2 加入interface視窗介面

圖片
加入pythin的interface視窗介面 這裡要使用tkinter函式庫 import tkinter as tk # button 被按下觸發的事件 def clickon(): outputtext['text'] = inputtext.get() + '\n' + inputtext.get() #將文字方塊的文字填入outputtext的text裡面 win=tk.Tk() win.title("My First Tk GUI") # window title name label = tk.Label(win, text="Hello World!") #建立標籤物件 label.grid(row=0, column=0) # layout inputtext = tk.Entry(win) #建立填入文字方塊 inputtext.grid(row=0, column=1, columnspan=20) button = tk.Button(win)#, text="OK" #建立 button button['text'] = 'ok' button['command'] = clickon #button event事件 button.grid(row=1, column=1) outputtext = tk.Label(win, text = "output information") outputtext.grid(row = 2, column = 1) win.mainloop() GUI test 建立的物件的屬性有兩種寫法 #第一種 button = tk.Button(win)#, text="OK" #建立 button button['tex

python 爬蟲程式 -1

圖片
做一個抓取 104人力銀行 新鮮人找工作版 所有工作及公司資料的程式 首先要抓搜尋結果頁面的資訊 import requests from bs4 import BeautifulSoup as bs search_url = "https://www.104.com.tw/area/freshman/search?keyword=%E6%A9%9F%E5%99%A8%E4%BA%BA&area=6001001000,6001002000&jobcategory=2007000000&industry=&page=1&sortField=APPEAR_DATE&sortMode=DESC" head = {'User-Agent':'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/60.0.3112.90 Safari/537.36', 'Accept-Language':'zh-TW,zh;q=0.8,en-US;q=0.6,en;q=0.4'} res = requests.get(search_url, headers = head) print(res.encoding) res.encoding = 'utf8' soup = bs(res.text) Out[1]:ISO-8859-1 用request傳回網頁內容 res.encoding可得知網頁編碼方式,一開始我根據網站上寫utf-8編碼,跟python設定編碼一致,想說沒問題,之後才找到如何知道是用甚麼編碼的方法,print出來才知道被python判斷成ISO-8859-1,那就自行設定成utf-8 BeautifulSoup 是一個能解構及分析的一套很好用的工具,將res轉成文字"res.text",丟給 BeautifulSoup 抓取一個工作資料 用select擷取出我們要的資訊在哪個區域 job_box = soup.select(&qu

在blogger上顯示code block區塊(by google code prettify

加入方式 後台 版面配置 新增小工具 選擇 "HTML/JavaScript" 內容輸入 <script src="https://cdn.rawgit.com/google/code-prettify/master/loader/run_prettify.js?skin=sunburst"></script> 按儲存 在文章內容裡要輸入 <pre class="prettyprint linenums"> <code> ...            <-- 你的程式碼 </code> </pre> 例如我上方輸入在小工具的code,在文章中的HTML code,如下: <pre class="prettyprint"> <code> &lt;script src="https://cdn.rawgit.com/google/code-prettify/master/loader/run_prettify.js?skin=sunburst"&gt;&lt;/script&gt; </code> </pre> 注意轉碼 "<"與">"當文字的時候在HTML裡要轉碼,分別是"&lt;"與"&gt;",網上也有轉碼程式 其他設定 在pre class可加入 linenums:指要顯示行號 lang-:使用的語言,例如:"lang-js"是使用javascript,也可在 <code class="language-java"> <pre class="prettyprint linenums lang-js"> <code>...</code> </pre> <pre class="prett