zoukankan      html  css  js  c++  java
  • (原创)天气又转热了,我给她做了个智能小风扇

    黄花深巷,

    红叶低窗,

    凄凉一片秋声。

    豆雨声来,

    中间夹带风声。

    疏疏二十五点,

    丽谯门、不锁更声。

    故人远,

    问谁摇玉佩,

    檐底铃声。

    彩角声吹月堕,

    渐连营马动,

    四起笳声。

    闪烁邻灯,

    灯前尚有砧声。

    知他诉愁到晓,

    碎哝哝、多少蛩声。

    诉未了,把一半、分与雁声。

    一首短诗《声声慢 秋声》献与大家。蒋捷的这首短诗共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用着什么反应,这个……

    本想抽时间拍一个好玩一点的视频,只是一直没有抽出时间,很是抱歉! 上传了最初拍的视频, 大家手下留情哈!

     欢迎转载,请保留博客园原创连接。

  • 相关阅读:
    CSS Grid 网格布局全解析
    VSCode插件和首选项配置
    mybatis分页实现原理
    org.apache.ibatis.exceptions.PersistenceException解决办法
    使用ssm框架在使用id查询时应注意的问题
    出现Caused by: org.apache.ibatis.executor.ExecutorException: No constructor found in com.duowenjia.bean.StudentInfo matching [java.lang.Integer, java.lang.String, java.lang.String, java.lang.String]的问题
    如何实现每个页面都判断session
    count(*),count(常量),count(列名)的区别
    json的jsonarray是有区别的
    毕业设计(高校网上作业提交系统)开发记录(20)
  • 原文地址:https://www.cnblogs.com/alljoyn/p/3999122.html
Copyright © 2011-2022 走看看