天天看點

(原創)天氣又轉熱了,我給她做了個智能小風扇

黃花深巷,

紅葉低窗,

凄涼一片秋聲。

豆雨聲來,

中間夾帶風聲。

疏疏二十五點,

麗谯門、不鎖更聲。

故人遠,

問誰搖玉佩,

檐底鈴聲。

彩角聲吹月堕,

漸連營馬動,

四起笳聲。

閃爍鄰燈,

燈前尚有砧聲。

知他訴愁到曉,

碎哝哝、多少蛩聲。

訴未了,把一半、分與雁聲。

一首短詩《聲聲慢 秋聲》獻與大家。蔣捷的這首短詩共96字,其中有十個“聲”字;其通過風聲、雨聲、更聲、鈴聲、笳聲、砧聲、蛩聲、雁聲來形容秋天的到來,頗有節奏感。

一直頗喜歡古典詩詞,怎奈天賦不佳,至今連完整的四言詩都木寫出來過……哎……不提傷心往事了……五音不全不能阻止我喜愛音樂,不能作詩亦不能阻止我愛詩哒!!記得小時候在鄉間,對四季的變化非常敏銳,樹枝張新芽了,知春來了;知了叫了,知夏來了,樹葉黃了,知秋來了;雪花飄了,知深冬了。如今,生活在鋼筋水泥之間,對季節的感覺淡漠了,似乎是麻木了,唯一觸發人知覺的隻有溫度,冷了暖氣,熱了風扇/空調;對于季節的感受全然變了被遺棄的孩子,盡管它在冬天裡猛力的哭号,也沒有多少人能聽見……向往古人感受季節的敏銳……

……

我這是說哪去了呢……哎……情不自禁啊……大家諒解……

話說,長沙天氣的熱是出了名的,四大火爐之一啊!隻是今年天氣有點異常,隻有在7月熱了一小段時間,後面一直是清涼氣爽的天!!!在這樣的天氣下,舒服地過了幾個月後(咱家席子都換成被子了),現在又突然變熱,大家都有點不适應,GF表現得尤為突出。坐一會就焦躁不安地站起來,說熱死了,熱死了,顯得燥熱難耐的樣子(她本身散熱面積就挺大,不知為啥比我還熱……)。好吧,那就開風扇吧,可沒吹多久,又說這風吹着不舒服,風大了點還冷。額……,這可是開得最小檔啊!為了讓GF乖乖的做在我旁邊陪我寫代碼(當然她可以用手機玩遊戲),我試着用技術來解決這個問題……

學技術,去哪裡,當然是山東藍翔啊,哈哈……開個玩笑,最近關于藍翔的段子還真不少,咱就不跟這個風了。 咱可是程式員,用一現有技術拼湊(高大上的說法是內建)就能解決問題好不。下面就說說我要做的智能風扇的功能吧:

1、  風速無級調節

2、  手機控制風扇開關及風速

3、  語音控制風扇開關及風速(能夠根據語義進行智能控制)

4、  通過檢測皮膚的溫濕度控制風扇開關及風速(手環啊)

要做的功能确定了,那就設計方案和準備材料吧。

硬體

1、風扇

(原創)天氣又轉熱了,我給她做了個智能小風扇

7寸大号絲雨usb電風扇,用着好用就幫人家推薦下(塑膠的,輕,便宜),這是我做人的原則

2、主要闆

(原創)天氣又轉熱了,我給她做了個智能小風扇
拿着師弟做的帶WiFi功能的Arduino闆子,不給錢的,光線暗拍着不好看,其實做的還蠻精緻的。
(原創)天氣又轉熱了,我給她做了個智能小風扇

3、  控制接口電路

通過主要闆pwm輸出控制電源給風扇供電,用萬用闆焊接好後如下

(原創)天氣又轉熱了,我給她做了個智能小風扇
3、  手機
(原創)天氣又轉熱了,我給她做了個智能小風扇

如果配送這個手機的話,風扇應該會被扔掉,是以堅決不用這種檔次的手機。

3、  手環

聽說又要變天了,為了在天氣變涼前把風扇做出來,這個還是在第二版再做吧。

軟體

1、  Arduino IDE程式設計

是的,控制端的程式我就是用arduino寫的,你們就盡情的鄙視我吧。

(原創)天氣又轉熱了,我給她做了個智能小風扇
而且關于pwm調節隻要這麼一條語句就實作了哦。

analogWrite( 7 , hp*25 );
      

  

2、  Alljoyn通信

用Alljoyn完全是為了裝逼,可以對别人吹牛說,我的風扇裡用了最先進的物聯網技術,其實用tcp通信就能實作。

主要闆端Alljoyn接口代碼:

static const char* const testInterface[] = {
    "org.alljoyn.sample.ledcontroller",
    "?Flash msec<u",
    "?On",
    "?Off",
    NULL
};
      

3、  科大飛訊語音引擎

大家用着都說好,我試了下,果然不錯!科大飛訊,中國人都用它。

語音識别關鍵部分代碼:

private InitListener mInitListener = new InitListener() {

		@Override
		public void onInit(int code) {
			Log.d(TAG, "SpeechRecognizer init() code = " + code);
        	if (code == ErrorCode.SUCCESS) {
        		findViewById(R.id.isr_recognize).setEnabled(true);
        	}
		}
    };
    	

	/**
     * 建構文法監聽器。
     */
	private GrammarListener grammarListener = new GrammarListener() {
		@Override
		public void onBuildFinish(String grammarId, SpeechError error) {
			if(error == null){
				String grammarID = new String(grammarId);
				Editor editor = mSharedPreferences.edit();
				if(!TextUtils.isEmpty(grammarId))
					editor.putString(KEY_GRAMMAR_ABNF_ID, grammarID);
				editor.commit();
				showTip("文法建構成功:" + grammarId);
			}else{
				showTip("文法建構失敗,錯誤碼:" + error.getErrorCode());
			}			
		}
	};
	
	/**
     * 識别監聽器。
     */
    private RecognizerListener mRecognizerListener = new RecognizerListener() {
        
        @Override
        public void onVolumeChanged(int volume) {
        	showTip("目前正在說話,音量大小:" + volume);
        }
        
        @Override
        public void onResult(final RecognizerResult result, boolean isLast) {
        	runOnUiThread(new Runnable() {
				@Override
				public void run() {
					if (null != result) {
						Log.d(TAG, "recognizer result:" + result.getResultString());
						String text = "";
						if(mEngineType.equals(SpeechConstant.TYPE_CLOUD))
						{
							//解析雲端結果
							text = JsonParser.parseGrammarResult(result.getResultString());
						}else {
							//解析本地結果
							text = XmlParser.parseNluResult(result.getResultString());
						}
		            	// 顯示
						//((EditText)findViewById(R.id.isr_text)).setText(text);   
						
						//分析識别結果
						Boolean analyzeRelult = analyzeWords(text);
						
						//發送控制指令
						if(analyzeRelult)
						{
							controlFan(mWindLevel);
						}
						
						
		            } else {
		                Log.d(TAG, "recognizer result : null");
		            }	
					SystemClock.sleep(100);
					//下一次語音識别
					Button recognizeButton = (Button)findViewById(R.id.isr_recognize);
					 
					recognizeButton.performClick();
				}
			});
            
        }
        
        @Override
        public void onEndOfSpeech() {
        	showTip("結束說話");
        	   
        }
        
        @Override
        public void onBeginOfSpeech() {
        	showTip("開始說話");
        }

		@Override
		public void onError(SpeechError error) {
			showTip("onError Code:"	+ error.getErrorCode());
			SystemClock.sleep(100);
			//下一次語音識别
			Button recognizeButton = (Button)findViewById(R.id.isr_recognize);
			 
			recognizeButton.performClick();
		}

		@Override
		public void onEvent(int eventType, int arg1, int agr2, String msg) {
		}
    };
      

4、  Android

做出來手機軟體界面是這樣的

(原創)天氣又轉熱了,我給她做了個智能小風扇

結果

我最初想做出來的智能風扇應該是這樣的:

(原創)天氣又轉熱了,我給她做了個智能小風扇

但事實上做出來卻是這樣的:

(原創)天氣又轉熱了,我給她做了個智能小風扇

至于具體功能怎麼樣,我晚點上視訊。至于GF用着什麼反應,這個……

本想抽時間拍一個好玩一點的視訊,隻是一直沒有抽出時間,很是抱歉! 上傳了最初拍的視訊, 大家手下留情哈!

 歡迎轉載,請保留部落格園原創連接配接。