感谢EEPW和Intel提供的Intel Edison开发套件。
	
	 
	
本楼为帖子内容索引。
~~~~~~~~~~~~~~~~~~~~~~~~~~~
3:爱迪生Edison的另一个blink -- Linux下的Mraa
	
 
					
				
	
感谢EEPW和Intel提供的Intel Edison开发套件。
	
	 
	
本楼为帖子内容索引。
~~~~~~~~~~~~~~~~~~~~~~~~~~~
3:爱迪生Edison的另一个blink -- Linux下的Mraa
	
 
					
				基于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
	
 
					
				就不秀什么开箱美图了,直接上手就用,不过也是奇怪,说好的只有SD卡大,怎么起码的诚信都没有啊。
		 
 
	
		
	
好吧,不算底板,只算模块,可是那密密的70pin让人怎么用啊,也先不管了,找出配套的Grove包,配套足够全,不过里边的网线用在哪里去是没找到,有伙伴说是给伽利略2用的,真周到,配送的USB充电线看起来质量挺好的。
先插着看吧,发现了两个MicroUSB口,一般是先找调试口,发现角落有一个类似FT232的片子,估计就是这个了,装了驱动却没见板子亮,莫非错了,还是板子坏了,换另一个,终于亮起了绿灯,并且识别出了一个磁盘,或许也支持mbed吧。
		 
 
	
		
	
		还附送一个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和串口,直接运行,很顺利。
		 
 
	
 
					
				炫Q不走寻常路,也懒得看文档,试着来吧,上次链接串口,账号root没有密码,偶然发现了USB网卡的IP是192.168.2.15也不知道是随机的还是固定,既然这样,这次直接用putty尝试,竟然真的有ssh服务,账号还是root,没有密码。
		 
	
尝试了一下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,然后运行,一切顺利!
		 
	
是否也能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小灯如期闪动,不错不错!
 
					
				材料准备
本次制作重点放在灯的改造上,需要准备以下材料:
三色调光LED吸顶灯x1
	 好大的一个6元,对了就是6元还包邮,有的小伙伴花了3元比如小撸,我花了6.5元呢,反正很核算啦,说是三色,其实是冷色、暖色、双色三种。通过反复开关灯来控制变色。
好大的一个6元,对了就是6元还包邮,有的小伙伴花了3元比如小撸,我花了6.5元呢,反正很核算啦,说是三色,其实是冷色、暖色、双色三种。通过反复开关灯来控制变色。 
	 
 
MikuRelay低功耗继电器模块x1
	 光耦隔离低功耗继电器,这个是MikuDuino系列的内供模块,省电又安全,一般市场上可买不到,也可以用普通继电器模块代替,建议选用带隔离的更安全。
光耦隔离低功耗继电器,这个是MikuDuino系列的内供模块,省电又安全,一般市场上可买不到,也可以用普通继电器模块代替,建议选用带隔离的更安全。 
	l 
 
	
 
双路隔离电压采集模块x1
	 为了本项目在分析LED灯工作原理的基础上用洞洞板自制的采集模块,主要原理是通过分压和光耦隔离,安全采集LED灯的工作状态。
为了本项目在分析LED灯工作原理的基础上用洞洞板自制的采集模块,主要原理是通过分压和光耦隔离,安全采集LED灯的工作状态。 
	 
 
AC-DC电源模块x1
	 选用某宝上5V700ma的模块即可,大概5元左右,也可以由手机充电器中获得,由于采用低功耗设计500mA就足够,3.3V可以由小e提供。
选用某宝上5V700ma的模块即可,大概5元左右,也可以由手机充电器中获得,由于采用低功耗设计500mA就足够,3.3V可以由小e提供。 
	 
 
	
 
连接线若干
	 可以某宝上搜“杜邦线”,基本几块钱就一大把,各种颜色都有,使用起来非常方便。
可以某宝上搜“杜邦线”,基本几块钱就一大把,各种颜色都有,使用起来非常方便。 
	
 
	
其它工具
如烙铁、焊锡、镊子、插线板、螺丝刀等
 
					
				搭建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了
	
| 有奖活动 | |
|---|---|
| 硬核工程师专属补给计划——填盲盒 | |
| “我踩过的那些坑”主题活动——第002期 | |
| 【EEPW电子工程师创研计划】技术变现通道已开启~ | |
| 发原创文章 【每月瓜分千元赏金 凭实力攒钱买好礼~】 | |
| 【EEPW在线】E起听工程师的声音! | |
| 高校联络员开始招募啦!有惊喜!! | |
| 【工程师专属福利】每天30秒,积分轻松拿!EEPW宠粉打卡计划启动! | |
| 送您一块开发板,2025年“我要开发板活动”又开始了! | |