太热了,程序员用Arduino为女朋友做了个智能小风扇


黄花深巷,红叶低窗,凄凉一片秋声。
豆雨声来,中间夹带风声。
疏疏二十五点,丽谯门、不锁更声。
故人远,问谁摇玉佩,檐底铃声。
彩角声吹月堕,渐连营马动,四起笳声。
闪烁邻灯,灯前尚有砧声。
知他诉愁到晓,碎哝哝、多少蛩声。
诉未了,把一半、分与雁声。

一首短诗《声声慢 秋声》献与大家。如今,生活在钢筋水泥之间,对季节的感觉淡漠了,似乎是麻木了,唯一触发人知觉的只有温度,冷了暖气,热了风扇/空调;对于季节的感受全然变了被遗弃的孩子,尽管它在冬天里猛力的哭号,也没有多少人能听见……向往古人感受季节的敏锐……
……
我这是说哪去了呢……哎……情不自禁啊……大家谅解……
话说,长沙天气的热是出了名的,四大火炉之一啊!只是今年天气有点异常,只有在7月热了一小段时间,后面一直是清凉气爽的天!!!在这样的天气下,舒服地过了几个月后(咱家席子都换成被子了),现在又突然变热,大家都有点不适应,GF表现得尤为突出。坐一会就焦躁不安地站起来,说热死了,热死了,显得燥热难耐的样子(她本身散热面积就挺大,不知为啥比我还热……)。好吧,那就开风扇吧,可没吹多久,又说这风吹着不舒服,风大了点还冷。额……,这可是开得最小档啊!为了让GF乖乖的做在我旁边陪我写代码(当然她可以用手机玩游戏),我试着用技术来解决这个问题……
学技术,去哪里,当然是山东蓝翔啊,哈哈……开个玩笑,最近关于蓝翔的段子还真不少,咱就不跟这个风了。 咱可是程序员,用一现有技术拼凑(高大上的说法是集成)就能解决问题好不。

下面就说说我要做的智能风扇的功能吧:
1、 风速无级调节
2、 手机控制风扇开关及风速
3、 语音控制风扇开关及风速(能够根据语义进行智能控制)
4、 通过检测皮肤的温湿度控制风扇开关及风速(手环啊)
要做的功能确定了,那就设计方案和准备材料吧。

硬件

1、 风扇

282201569517358
7寸大号丝雨usb电风扇,用着好用就帮人家推荐下(塑料的,轻,便宜),这是我做人的原则

2、主控板

282204452016826
拿着师弟做的带WiFi功能的Arduino板子,不给钱的,光线暗拍着不好看,其实做的还蛮精致的。

282207003734356

3、 控制接口电路

通过主控板pwm输出控制电源给风扇供电,用万用板焊接好后如下
282208212648800

4、 手机

282209063429805
如果配送这个手机的话,风扇应该会被扔掉,所以坚决不用这种档次的手机。

5、 手环

听说又要变天了,为了在天气变凉前把风扇做出来,这个还是在第二版再做吧。

软件

1、 Arduino IDE编程

是的,控制端的程序我就是用arduino写的,你们就尽情的鄙视我吧。
282210308264584

而且关于pwm调节只要这么一条语句就实现了哦。

analogWrite( 7 , hp*25 );

2、ALLJOYN通讯

用Alljoyn完全是为了装逼,可以对别人吹牛说,我的风扇里用了最先进的物联网技术,其实用tcp通信就能实现。2、 Alljoyn通信
主控板端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

做出来手机软件界面是这样的
282214109207489

结果

我最初想做出来的智能风扇应该是这样的:
282216218736030

但事实上做出来却是这样的:
282217207326444

至于具体功能怎么样,我晚点上视频。至于GF用着什么反应,这个……

本想抽时间拍一个好玩一点的视频,只是一直没有抽出时间,很是抱歉! 上传了最初拍的视频, 大家手下留情哈!
http://v.youku.com/v_show/id_XODA4MzgzMDky.html

 

原文链接:http://www.cnblogs.com/alljoyn/p/3999122.html


《“太热了,程序员用Arduino为女朋友做了个智能小风扇”》 有 1 条评论

发表回复

您的电子邮箱地址不会被公开。 必填项已用*标注