查看: 4998|回复: 0

[8月赛] [我行我秀]OneNet:从入门到放弃

[复制链接]

1

主题

1

帖子

3

积分

新手上路

Rank: 1

积分
3
发表于 2017-8-1 16:28:19 | 显示全部楼层 |阅读模式
本帖最后由 lys 于 2017-8-3 14:30 编辑

进入中移物联网实习已过三周,关于那些对学校的留恋,早已隐藏在胃里,来到中移的第一顿饭,真的给人打开了另一个世界大门的感觉(估计是我在学校活的太艰苦啦),虽然艰苦的环境有利于激发斗志,但是,我觉得,还是中移物联网的饭菜更能激发我的这股猛劲(40度高温下从产业园到光电园吃饭的一路悲催也无法阻挡)。XXX说过,一个人越缺什么,也就会更加追求什么,我只是追求一餐美食而已,这样看来,我似乎缺的不算多啦,哈哈。
     逛了一圈论坛,大家都是技术贴,我也就不敢再闲扯啦,不上个硬菜,怎敢长留餐桌。
     经过前几天的摸爬滚打,更加确定了接下来的工作的关键——团队合作。这里的小伙伴真的是棒棒到难以形容,第一次体会到用方言进行项目沟通的乐趣。好了,终于可以进入项目里面了,这是一个智能百叶窗控制的项目,主要功能:利用光照、天气等环境参数,基于OneNet平台控制百叶窗百叶倾角来达到遮阳、节能的效果,其中百叶倾角由电机来控制。本来是还想有更多屌炸天的功能,但是以我目前这水平真的怕后面打脸,不敢夸太大。这是一个五人完成的项目,我就分享一下我做的内容咯。
我完成的工作就是百叶窗的百叶倾角控制算法。算法主要根据外部采集的光照强度、天气、地理位置、24小时格式的时间以及预设的舒适光照强度来确定百叶的微调方向和角度。如何确定呢?拿到这样的任务我到底是该窃喜还是该沮丧呢,好吧,自己选的路,跪着也要走完。接下来,各种查看论文寻找资料,精神紧绷,这一切似乎都体现在我一天的饭量上啦(不是因为公司的饭菜好吃才多吃,而是真的能量透支啦)。
毫无疑问,每前进一步,都肯定会遇到问题,现在是什么问题,就是我需要此刻我所在的地方每一天每一刻太阳照射进来是的光线和地平面的夹角,也就是所谓的太阳高度角。其实这么简单的问题,当然百度啦。不查不知道,一查真的不简单,才发现我前面说的都是错的。百度给出的太阳入射角定义:“太阳入射角是太阳直射光线与壁面法线之间的夹角。太阳入射角随太阳高度角、方位、壁面方位、壁面倾斜度的不同而改变。”,显然,我需要的不是百度给的那个定义,还好,从一个如何计算房子采光的博文里找到了答案,入射角如下图所示:暂定为theta。知识真的很匮乏,第一感觉我是觉得大致就是0到90变化了,但是出现了南北回归线这个东西,纠正了我错误的观点。以重庆28°10’到32°15’的纬度区间,太阳是不可能经过你的“头顶”的。
1.png

图1 入射角

   根据所谓的知识,其实这里的入射角Angle主要由太阳赤纬角A、太阳时角B和观测地纬度D决定。读到这里,我自己都蒙啦,除了观测地纬度(暂定重庆为30°吧)有印象之外,其他的都是什么鬼。
继续:

太阳赤纬度是指太阳直射光线和地球赤道平面之间的夹角,哎,不够清晰,换个说法,就是太阳垂直照射地球上的点的纬度,即下图中的c。
太阳时角是指日面中心的时角,即从观测点天球子午圈沿天赤道量至太阳所在时圈的角距离,不等你说出那句我艹,我赶紧换个说法,就是将0°~360°对应到0~24时间段,然后根据当前时间几个计算出时角。到此,该说的都说完了,不该说的也没有了。
2.png
图2 太阳赤纬度角
    所以,入射角即满足下面的等式约束:
sin(Angle)=sin(D)sin(A)+sin(D)cos(A)cos(B)

    其实,到这一步我还是迷茫的额,知道了定义,却并不知道数据怎么来,尤其是太阳赤纬角,似乎超出了我的能力范围。好在有那么一个东西角太阳赤纬表,罗列了每个季度每一天的太阳赤纬角,所以,查表就OK啦。好啦,到这里,已经可以完全确定任何地点任意时刻的太阳光线入射角度啦。以下是我的实现:
    #include <math.h>
#define  PI 3.14159
double transform1 =( PI / 180);
double transform2 = (PI / 12);
//太阳赤纬角度分布情况,一个元素对应五天
int angleByTime[12][6]=
{
    {-23,-22,-21,-20,-19,-18},
    {-17,-15,-13,-12,-10,- 8},
    { -7, -5, -3, -1,  1 , 3},
    {  5,  7,  9, 11, 12, 14},
    { 15, 17, 18, 19, 20, 21},
    { 22, 23, 23, 23, 23, 23},
    { 23, 22, 22, 21, 20, 19},
    { 18, 16, 15, 13 ,11, 10},
    {  8,  6,  4,  2,  0, -2},
    { -4, -6, -7, -9,-11,-12},
    {-15,-16,-18,-19,-20,-21},
    {-22,-22,-23,-23,-23,-23}
};
int currentN = 32;
//获取太阳赤纬角度,不是弧度
int getChiWeiDu(int month, int day)
{
    if (day==31)
    {
        return angleByTime[month][5];
    }
    day = (day-1)/5;
    return angleByTime[month][day];
}
//返回阳光入射角,角度
int getCurrentLightAngle(int month, int day, int hour, int minute/*几时几分*/, double locationN=32/*当地纬度*/)
{
    double chiweidu = getChiWeiDu(month, day)*transform1;//赤纬度,弧度
    double shijiao = (hour+minute/60.0)*transform2;//时角,弧度
    return int( asin( sin(chiweidu)*sin(locationN) + sin(locationN)*cos(chiweidu)*cos(shijiao) )/transform1 );
}
获得光线入射角后,需要结合百叶的倾角来确定最优(不是最舒适,而是采光最多)采光角度。光线分为两个部分讨论:直射光和漫反射光,后者暂定为在各个方向光照相等,所以主要讨论前者。光照模型如图3所示:
3.jpg
图3 光照模型
A’B’是入射光线,C’D’是百叶窗的一片百叶,我们假设百叶窗接受的阳光中直射光的占比为x,则漫反射光占比为(1-x),接收光照强度主要有光线垂直平面的面积来决定,则百叶窗的采光模型如下:
4.png

由模型可知,E取值-90~90,Angle取值0~90,接下来就是仿真了,MATLAB是逃不过的。暂定x=0.8,即直射光和漫反射光比值为4:1,即最优采光角度主要由直射光决定,仿真代码如下:
Theta=-90:90;
for a=0:10:90;
% a=80;
y1=(4.*cosd(a)-4.*sind(abs(a-Theta))+cosd(Theta)).*(cosd(a)-sind(abs(a-Theta))>=0)+cosd(Theta).*(cosd(a)-sind(abs(a-Theta))<0);
hold on
plot(Theta,y1)

end
5.png
由此,即可得到每一时刻的最优采光角度,如果当前环境室内采光不足,则百叶倾角向最优采光角度不断微调,直到达到要求或调到最优角度为止,如果当前光线过强,则百叶倾角向0度角不断微调。
纳尼,到这里已经说完了。但是,OneNet呢?好吧,那部分是我的小伙伴负责,我能做的就这么多啦。最后自我鉴定一下:我就是个标题党。对于OneNet,我都还没有入门,谈什么放弃。

回复

举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

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