跳转至

Hack.init( ) 黑客马拉松

—— Wight · 基于云平台的去线缆化照明系统。

项目仓库:linyuxuanlin / Wight

背景

项目制作于 2017 hack.init() 创客马拉松。 20 多个小时的敲代码、建模、调试各种乱七八糟的 bug、等待打印、展示 & 演讲,终于有点成品的样子。

这个项目主要用于乡村偏远地区的路灯照明系统。 模型有点抽象,其实它正扮演的是一杆路灯。

项目创新点

  • 太阳能供电。 自给自足(经查阅详细资料,太阳能发电量足以点亮 LED)
  • 去线缆化。 为偏远山区不方便铺线缆提供便利
  • 智能算法。 检测到夜晚,自动开灯;检测到人或车辆经过,提高 LED 亮度
  • 云平台统一控制。 用的是 GSM 主控,可以批量远程调试
  • 拓展性。 对个别有自定义照明需求的特殊用户提供各种自定义的功能

原理及实现

代码:

#define BUTTONS_address   "channel/widget4_0/cmd/control" //开关命令
#define LIGHT_STATUS_address  "channel/widget4_0/data/light"//开关状态
#define ITENSITY_DATA_address "channel/widget4_0/data/lightsensor"
#define LEDPIN1    D1    //定义灯泡控制引脚
#define LEDPIN2    D2
#define LEDPIN3    D3
#define LEDPIN4    D5
#define CHECKIN1   A0
#define CHECKIN2   D4

int autostate = 2;
int light_state = 2;
void buttons_function(uint8_t *payload, uint32_t len)//自动&浇水按钮
{
    uint8_t SwitchKey;
    uint8_t SwitchKey2;
    aJsonClass aJson;
    aJsonObject *root = aJson.parse((char *)payload);
    if(root == NULL)
    {
        aJson.deleteItem(root);
        return;
    }
    aJsonObject *_switch = aJson.getObjectItem(root, "mode");
    if(_switch != NULL)
    {
        SwitchKey = atoi(_switch->valuestring);
        if(SwitchKey)
        {
            SerialUSB.println("auto on");
            autostate=1;
             IntoRobot.publish(LIGHT_STATUS_address,"1");
        }
        else
        {
            SerialUSB.println("auto off");
            autostate=0;
             IntoRobot.publish(LIGHT_STATUS_address,"0");
        }
    }
    aJsonObject *_switch2 = aJson.getObjectItem(root, "manual");
    if(_switch2 != NULL)
    {
        SwitchKey2 = atoi(_switch2->valuestring);
        if(SwitchKey2)
        {
            SerialUSB.println("manual on");
            light_state=1;
             IntoRobot.publish(LIGHT_STATUS_address,"1");
        }
        else
        {
            SerialUSB.println("manual off");
            light_state=0;
             IntoRobot.publish(LIGHT_STATUS_address,"0");
        }
    }
    else
    {
    }
    aJson.deleteItem(root);
}
void lightup()
{
    digitalWrite(LEDPIN1, HIGH);    // 打开灯泡
    digitalWrite(LEDPIN2, HIGH);    // 打开灯泡
    digitalWrite(LEDPIN3, HIGH);    // 打开灯泡
    digitalWrite(LEDPIN4, HIGH);    // 打开灯泡

}
void light_half_up()
{
    analogWrite(LEDPIN1, 80);    // 打开灯泡
    analogWrite(LEDPIN2, 80);    // 打开灯泡
    analogWrite(LEDPIN3, 80);    // 打开灯泡
    analogWrite(LEDPIN4, 80);    // 打开灯泡

}
void lightdown()
{
    digitalWrite(LEDPIN1, LOW);
    digitalWrite(LEDPIN2, LOW);
    digitalWrite(LEDPIN3, LOW);
    digitalWrite(LEDPIN4, LOW);

}
int getlight()
{
    int k  = analogRead(CHECKIN1);

    SerialUSB.println(k);
    return k;
}
int get_IR_data()
{
    int b = digitalRead(CHECKIN2);
    SerialUSB.println(b);
    return b;
}
void automode()
{
    if(getlight()>=400)
    {
        IntoRobot.publish(LIGHT_STATUS_address,"1");
        if (get_IR_data()==0)
        lightup();
        else
        light_half_up();
    }
    else
    {
    IntoRobot.publish(LIGHT_STATUS_address,"0");
    lightdown();
    }
}

void HUMIDITY_print_function(uint8_t *payload, uint32_t len)
{

}

// IntoRobot.publish(LIGHT_STATUS_address,"1");
// IntoRobot.publish(LIGHT_STATUS_address,"0");
void setup()
{
    pinMode(D4,INPUT);
    SerialUSB.begin(115200);
    SerialUSB.println("hello world");
    pinMode(LEDPIN1, OUTPUT);    //初始化
    pinMode(LEDPIN2, OUTPUT);    //初始化
    pinMode(LEDPIN3, OUTPUT);    //初始化
    pinMode(LEDPIN4, OUTPUT);    //初始化
    //设备接收云平台的灯开关命令
    IntoRobot.subscribe(BUTTONS_address,NULL,buttons_function);
    IntoRobot.subscribe(ITENSITY_DATA_address,NULL,HUMIDITY_print_function);
}
void loop()
{
   int a =map(getlight() ,0,1024,100,0);
   IntoRobot.publish(LIGHT,a);
    SerialUSB.println(getlight());
    if(autostate==0)
    {
        if(light_state ==1)
        lightup();
        else
        lightdown();
    }
    else if (autostate==1)
    {
        SerialUSB.println("state=1");
        automode();
    }
    delay(100);
}

因比赛时间所限,只能粗略画出模型,打印出来组装。

FAQ

Q:项目后期还有跟进吗?
A:暂时没有跟进的计划。创新点挺不错,但是否有商业应用价值,还有待验证。

总结

我们在这次比赛中并没有获奖。不过,比赛锻炼了赶代码和路演的能力,也让我提前体验了加班上线的感受,也认识了很多人,收获了好多纪念品。

参考与致谢

原文地址:https://wiki-power.com/
本篇文章受 CC BY-NC-SA 4.0 协议保护,转载请注明出处。