眉山东坡论坛

 找回密码
 注册账号

QQ登录

只需一步,快速开始

扫一扫,访问微社区

查看: 3387|回复: 3
收起左侧

[制作DIY改进维修] 给我的她做了个智能小风扇

[复制链接]
发表于 2014-10-8 22:51 | 显示全部楼层 |阅读模式

马上注册,结交更多好友,享用更多功能,让你轻松玩转东坡论坛

您需要 登录 才可以下载或查看,没有帐号?注册账号

x
转自伯乐在线


话说,长沙天气的热是出了名的,四大火炉之一啊!只是今年天气有点异常,只有在7月热了一小段时间,后面一直是清凉气爽的天!!!在这样的天气下,舒服地过了几个月后(咱家席子都换成被子了),现在又突然变热,大家都有点不适应,GF表现得尤为突出。坐一会就焦躁不安地站起来,说热死了,热死了,显得燥热难耐的样子(她本身散热面积就挺大,不知为啥比我还热……)。好吧,那就开风扇吧,可没吹多久,又说这风吹着不舒服,风大了点还冷。额……,这可是开得最小档啊!为了让GF乖乖的做在我旁边陪我写代码(当然她可以用手机玩游戏),我试着用技术来解决这个问题……
学技术,去哪里,当然是山东蓝翔啊,哈哈……开个玩笑,最近关于蓝翔的段子还真不少,咱就不跟这个风了。 咱可是程序员,用一现有技术拼凑(高大上的说法是集成)就能解决问题好不。下面就说说我要做的智能风扇的功能吧:
1、  风速无级调节
2、  手机控制风扇开关及风速
3、  语音控制风扇开关及风速(能够根据语义进行智能控制)
4、  通过检测皮肤的温湿度控制风扇开关及风速(手环啊)
要做的功能确定了,那就设计方案和准备材料吧。
 楼主| 发表于 2014-10-8 22:51 | 显示全部楼层

硬件
1、风扇

7寸大号丝雨usb电风扇,用着好用就帮人家推荐下(塑料的,轻,便宜),这是我做人的原则
2、主控板
6941baebgw1el3kdwozyzj20kh0g3gno.jpg
拿着师弟做的带WiFi功能的Arduino板子,不给钱的,光线暗拍着不好看,其实做的还蛮精致的。
6941baebgw1el3kdxakvzj20e70e778j.jpg

3、  控制接口电路
通过主控板pwm输出控制电源给风扇供电,用万用板焊接好后如下
6941baebgw1el3kdxphufj20f70at0u2.jpg
3、  手机
6941baebgw1el3kdy6bucj20g40c8aav.jpg
如果配送这个手机的话,风扇应该会被扔掉,所以坚决不用这种档次的手机。

3、  手环
听说又要变天了,为了在天气变凉前把风扇做出来,这个还是在第二版再做吧。
 楼主| 发表于 2014-10-8 22:56 | 显示全部楼层

软件
1、  Arduino IDE编程
是的,控制端的程序我就是用arduino写的,你们就尽情的鄙视我吧。
6941baebgw1el3kdynaolj20jk0j6tbl.jpg
而且关于pwm调节只要这么一条语句就实现了哦。
1
analogWrite( 7 , hp*25 );




2、  Alljoyn通信
用Alljoyn完全是为了装逼,可以对别人吹牛说,我的风扇里用了最先进的物联网技术,其实用tcp通信就能实现。
主控板端Alljoyn接口代码:

1
2
3
4
5
6
7
static const char* const testInterface[] = {
    "org.alljoyn.sample.ledcontroller",
    "?Flash msec<u",
    "?On",
    "?Off",
    NULL
};



3、  科大飞讯语音引擎
大家用着都说好,我试了下,果然不错!科大飞讯,中国人都用它。
语音识别关键部分代码:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
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
做出来手机软件界面是这样的
6941baebgw1el3kdzngn2j20u01hcwkn.jpg

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

但事实上做出来却是这样的:
6941baebgw1el3ke128l1j20q00ep0vq.jpg
至于具体功能怎么样,我晚点上视频。至于GF用着什么反应,这个……
发表于 2014-10-9 09:30 | 显示全部楼层
视频呢
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 注册账号

本版积分规则

QQ|网站地图|关于我们|小黑屋|爱好群|眉山东坡论坛 ( 蜀ICP备05001993号-1 )

GMT+8, 2018-1-20 10:49

Powered by Discuz! X3.4 Licensed

© 2001-2017 Comsenz Inc.

快速回复 返回顶部 返回列表