OpenVINOTM,给你看得见的未来!>>
电子产品世界 » 论坛首页 » 活动中心 » 板卡试用 » eepwnet的Intel® Edison开发进程--智能灯光控制系统

共38条 1/4 1 2 3 4 跳转至

eepwnet的Intel® Edison开发进程--智能灯光控制系统

专家
2016-07-21 13:17:44    评分


专家
2016-07-21 13:17:59    评分
2楼

基于Intel® Edison的智能灯光控制系统

eepwnet

详细的开发方案

准备用Edison和配套的传感器做一个智能灯光控制系统——MikuSmartLight,本系统是基于Intel® Edison的室内环境智能管控系统的一个子系统是MikuQ物联网与智能家居的重要组成部分。因为Edison的体积非常小,只有邮票那么大,非常适合智能家居和智能可穿戴设备的开发。智能灯光控制系统内嵌Edison和传感器,可以实现远程开关灯和调色,定时智能唤醒等智能家居的功能。

作为一个爱好者,曾参与过一些Edison相关制作文章的翻译,并获赠《英特尔® Quark 处理器开发手册》一书。

基于Intel® Edison的智能灯光控制系统,以Edison为核心,配合Grove - Starter Kit Plus套装,有效的实现对吸顶灯的开关和调色,需要完成如下几部分的工作:

1、多色吸顶灯的选择与改造

2、主控制器的嵌入与能源供应

3、灯光与环境光的采集

4、灯光强电控制及调色

5、云端网络的接入与控制

本次活动要实现的目标

智能开灯、智能关灯、智能调色、定时唤醒,融入社交元素,朋友远程协助开灯、朋友远程协助关灯、朋友远程协助调色等。

爱迪生发明了电灯,LED灯取代了电灯,现在是爱迪生来控制LED灯的时候啦!更多功能,敬请期待!


项目雏形:http://p.xuanq.top:8848/218.htm



专家
2016-07-21 13:18:08    评分
3楼

炫Q的爱迪生Edison初体验

就不秀什么开箱美图了,直接上手就用,不过也是奇怪,说好的只有SD卡大,怎么起码的诚信都没有啊。

01.jpg


好吧,不算底板,只算模块,可是那密密的70pin让人怎么用啊,也先不管了,找出配套的Grove包,配套足够全,不过里边的网线用在哪里去是没找到,有伙伴说是给伽利略2用的,真周到,配送的USB充电线看起来质量挺好的。

先插着看吧,发现了两个MicroUSB口,一般是先找调试口,发现角落有一个类似FT232的片子,估计就是这个了,装了驱动却没见板子亮,莫非错了,还是板子坏了,换另一个,终于亮起了绿灯,并且识别出了一个磁盘,或许也支持mbed吧。

02.png


还附送一个usb串口和一个usb网卡,驱动是用驱动软件搜的,装完要插拔一下usb才能识别,既然有个磁盘为啥不把驱动或者向导放在盘里呢,那样多方便。
下一步要做什么,一脸迷茫,听说支持Arduino,去搜搜看怎么用。
官方资料下载地址:https://downloadcenter.intel.com/product/84574/Intel-Edison-Board-for-Arduino-
发现了一个奇怪的现象,为啥1.0.3比1.0.4新?先随便下一个吧,都是好久没有维护过的了,选新的日期吧。

Version: 1.0.4 (Previously Released) Date: 10/16/2014 
Version: 1.0.3 (Previously Released) Date: 2/3/2015


下载了一个传说中闪退了许久都没更新的Arduino IDE,据说解决办法已经写进了《Intel Edison智能硬件开发指南》,可是最近修补电脑,经济拮据,还是通过网络吧。

控制面板-〉区域和语言-〉更改日期、时间或数字格式-〉格式换成“英语(美国)”

选择blink程序,板卡类型Edison和串口,直接运行,很顺利。

03.png


专家
2016-07-21 13:18:12    评分
4楼
爱迪生Edison的另一个blink -- Linux下的Mraa

炫Q不走寻常路,也懒得看文档,试着来吧,上次链接串口,账号root没有密码,偶然发现了USB网卡的IP是192.168.2.15也不知道是随机的还是固定,既然这样,这次直接用putty尝试,竟然真的有ssh服务,账号还是root,没有密码。

05.png

尝试了一下gcc -v,也自带了gcc,这么来说,除了arduino开发应该也支持C来开发了,迅速找个hello.c测试一下。

#include <stdio.h>
int main(void){
  printf("Hello, MikuQ.com!\n");
  return 0;
}

 

编译用gcc -o hello hello.c,然后运行,一切顺利!

06.png

是否也能blink呢,这就需要查一下资料了,似乎需要一个较mraa的东西,开始查询如何安装,其实内置了,只是编译的时候要加上-lmraa和MikuDuino一样一样的,开始上blink.c

#include <unistd.h>
#include <stdio.h>
#include "mraa/gpio.h"

int main()
{
    mraa_gpio_context gpio = mraa_gpio_init(13);

    mraa_gpio_dir(gpio, MRAA_GPIO_OUT);

    while(1){
        mraa_gpio_write(gpio,1);
        sleep(1);
        mraa_gpio_write(gpio,0);
        sleep(1);
    }

    mraa_gpio_close(gpio);
}

 

编译gcc -o blink blink.c -lmraa,运行./blink小灯如期闪动,不错不错!


专家
2016-07-21 13:18:16    评分
5楼

材料准备

本次制作重点放在灯的改造上,需要准备以下材料:

三色调光LED吸顶灯x1

好大的一个6元,对了就是6元还包邮,有的小伙伴花了3元比如小撸,我花了6.5元呢,反正很核算啦,说是三色,其实是冷色、暖色、双色三种。通过反复开关灯来控制变色。


MikuRelay低功耗继电器模块x1

光耦隔离低功耗继电器,这个是MikuDuino系列的内供模块,省电又安全,一般市场上可买不到,也可以用普通继电器模块代替,建议选用带隔离的更安全。

l


双路隔离电压采集模块x1

为了本项目在分析LED灯工作原理的基础上用洞洞板自制的采集模块,主要原理是通过分压和光耦隔离,安全采集LED灯的工作状态。


AC-DC电源模块x1

选用某宝上5V700ma的模块即可,大概5元左右,也可以由手机充电器中获得,由于采用低功耗设计500mA就足够,3.3V可以由小e提供。



连接线若干

可以某宝上搜“杜邦线”,基本几块钱就一大把,各种颜色都有,使用起来非常方便。



其它工具

如烙铁、焊锡、镊子、插线板、螺丝刀等




专家
2016-07-21 13:18:20    评分
6楼

吸顶灯改造

灯到手了,要先研究一下特性,看看从哪里开刀比较合适

30.jpg

这个灯除了螺丝扎手外还是听好玩的,说是三色灯,不过可别以为是RGB,分为冷色(纯白)、暖色(黄白)和双色(一起亮),是这三种颜色,靠反复开关变换“颜色”,经测试记忆时效大概也就5秒,应该是通过电容实现的。

33.jpg

冒着被闪瞎的危险测试了一些工作参数,灯分两串,每串两并十八串,据说是18瓦,工作电压58V左右,共正极,负极分别控制。

31.jpg

由于有测量宜家LED灯泡开路110V的经验,控制器只是拆开看看,没敢动手脚,只能说现在的电路越来越简单了,不明觉厉。

专家
2016-07-21 13:18:25    评分
7楼

搭建WEBSERVER

首先测试wifi环境,打开ScanNetworks项目运行


#include <SPI.h>
#include <WiFi.h>

void setup() {
  //Initialize serial and wait for port to open:
  Serial.begin(9600); 
  while (!Serial) {
    ; // wait for serial port to connect. Needed for Leonardo only
  }

  // check for the presence of the shield:
  if (WiFi.status() == WL_NO_SHIELD) {
    Serial.println("WiFi shield not present"); 
    // don't continue:
    while(true);
  } 

  String fv = WiFi.firmwareVersion();
  if( fv != "1.1.0" )
    Serial.println("Please upgrade the firmware");

  // Print WiFi MAC address:
  printMacAddress();

  // scan for existing networks:
  Serial.println("Scanning available networks...");
  listNetworks();
}

void loop() {
  delay(10000);
  // scan for existing networks:
  Serial.println("Scanning available networks...");
  listNetworks();
}

void printMacAddress() {
  // the MAC address of your Wifi shield
  byte mac[6];                     

  // print your MAC address:
  WiFi.macAddress(mac);
  Serial.print("MAC: ");
  Serial.print(mac[5],HEX);
  Serial.print(":");
  Serial.print(mac[4],HEX);
  Serial.print(":");
  Serial.print(mac[3],HEX);
  Serial.print(":");
  Serial.print(mac[2],HEX);
  Serial.print(":");
  Serial.print(mac[1],HEX);
  Serial.print(":");
  Serial.println(mac[0],HEX);
}

void listNetworks() {
  // scan for nearby networks:
  Serial.println("** Scan Networks **");
  int numSsid = WiFi.scanNetworks();
  if (numSsid == -1)
  { 
    Serial.println("Couldn't get a wifi connection");
    while(true);
  } 

  // print the list of networks seen:
  Serial.print("number of available networks:");
  Serial.println(numSsid);

  // print the network number and name for each network found:
  for (int thisNet = 0; thisNet<numSsid; thisNet++) {
    Serial.print(thisNet);
    Serial.print(") ");
    Serial.print(WiFi.SSID(thisNet));
    Serial.print("\tSignal: ");
    Serial.print(WiFi.RSSI(thisNet));
    Serial.print(" dBm");
    Serial.print("\tEncryption: ");
    printEncryptionType(WiFi.encryptionType(thisNet));
  }
}

void printEncryptionType(int thisType) {
  // read the encryption type and print out the name:
  switch (thisType) {
  case ENC_TYPE_WEP:
    Serial.println("WEP");
    break;
  case ENC_TYPE_TKIP:
    Serial.println("WPA");
    break;
  case ENC_TYPE_CCMP:
    Serial.println("WPA2");
    break;
  case ENC_TYPE_NONE:
    Serial.println("None");
    break;
  case ENC_TYPE_AUTO:
    Serial.println("Auto");
    break;
  } 
}

找到所在的SSID,然后修改SimpleWebServerWiFi,由于我们的扩展板最大IO是D8所以修改代码中的9为8,添加LED模块,运行代码

void loop() {
  WiFiClient client = server.available();   // listen for incoming clients

  if (client) {                             // if you get a client,
    Serial.println("new client");           // print a message out the serial port
    String currentLine = "";                // make a String to hold incoming data from the client
    while (client.connected()) {            // loop while the client's connected
      if (client.available()) {             // if there's bytes to read from the client,
        char c = client.read();             // read a byte, then
        Serial.write(c);                    // print it out the serial monitor
        if (c == '\n') {                    // if the byte is a newline character

          // if the current line is blank, you got two newline characters in a row.
          // that's the end of the client HTTP request, so send a response:
          if (currentLine.length() == 0) {  
            // HTTP headers always start with a response code (e.g. HTTP/1.1 200 OK)
            // and a content-type so the client knows what's coming, then a blank line:    
            client.println("HTTP/1.1 200 OK");
            client.println("Content-type:text/html");
            client.println();

            // the content of the HTTP response follows the header:
            client.print("Click <a href=\"/H\">here</a> turn the LED on pin 8 on<br>");
            client.print("Click <a href=\"/L\">here</a> turn the LED on pin 8 off<br>");

            // The HTTP response ends with another blank line:
            client.println();
            // break out of the while loop:
            break;         
          } 
          else {      // if you got a newline, then clear currentLine:
            currentLine = "";
          }
        }     
        else if (c != '\r') {    // if you got anything else but a carriage return character,
          currentLine += c;      // add it to the end of the currentLine
        }

        // Check to see if the client request was "GET /H" or "GET /L":
        if (currentLine.endsWith("GET /H")) {
          digitalWrite(8, HIGH);               // GET /H turns the LED on
        }
        if (currentLine.endsWith("GET /L")) {
          digitalWrite(8, LOW);                // GET /L turns the LED off
        }
      }
    }
    // close the connection:
    client.stop();
    Serial.println("client disonnected");
  }
}

 运行结果

Attempting to connect to Network named: MikuQ
SSID: MikuQ
IP Address: 192.168.  1.  8
signal strength (RSSI):-38 dBm
To see this page in action, open a browser to http://192.168.  1.  8

这样我们就可以通过手机浏览器访问192.168.1.8来控制LED了



专家
2016-07-21 13:18:29    评分
8楼

https://github.com/Seeed-Studio/Grove_LCD_RGB_Backlight/archive/master.zip

基本上包括了套件的所有例子,值得学习。

这里我们用到了屏幕、按键、继电器、光线传感器。

可以分别测试几个例子:Hello World、Grove_Button、Grove_Relay、Grove_Light_Sensor

实测手遮盖小于20,环境光250,强光750,demo阀值400还是不错的。

血红的1602其实是彩色的


专家
2016-07-21 13:18:34    评分
9楼

整体总装示意图如下

连接必要的模块后就可以开始灌入程序了,不能调节字的深浅有些遗憾


首屏显示的是项目名称MikuSmartLight和开发者i@MikuQ.com,联网成功后会显示IP和工作状态。


选用一个大一些的天猫盒子,中间画一个圆割开

废的保温袋,撕开,背面贴上双面胶,竟然用了两卷

从顶端看下去,一个带天井的房子

从侧面看的样子


专家
2016-07-21 13:18:38    评分
10楼

强电部分为了安全放到了一个饭盒中,打了热熔胶

整体组装完成,实验板还是比较大的

开始启动,一切顺利

模仿小同伴做的手机客户端

点击即可点亮

一段小视频


共38条 1/4 1 2 3 4 跳转至

回复

匿名不能发帖!请先 [ 登陆 注册 ]