LumiCube:一款工作空间照明辅助设备


ナルト
转载
发布时间: 2025-09-29 11:57:32 | 阅读数 0收藏数 0评论数 0
封面
你是否曾在工作或学习时感到不适,难以集中注意力?你知道工作环境中的照明(光强和光色)会影响工作质量、工作速度、情绪、整体 productivity 以及人体健康吗? 为了确保我们的舒适度和工作效率,照明应根据具体的工作活动/任务进行适当设置。但是,我们如何判断照明是否适合该任务呢? LumiCube是我们工作空间的照明助手,它可以帮助我们轻松了解工作空间的当前照明情况,基本上,LumiCube有两种模式:工作模式和放松模式。 整个工作流程分为7个步骤:知识探索、原型制作、硬件实现、软件开发、外观设计、测试和组装。
1

知识探索

查找一些关于不同程度视觉信息处理工作所推荐的光照强度和色温的可靠指导,并找到适合测量光照强度和色温的光传感器。

根据美国国家光学天文台(NOAO)提供的《室内外场所推荐光照水平(照度)》指南,针对不同工作任务设置了四种光照强度:

  1. 轻松工作:250勒克斯
  2. 普通办公室工作、电脑工作:500勒克斯
  3. 普通绘图工作、机械工作:1000勒克斯
  4. 精细绘图工作、精密机械工作:1500勒克斯

根据西屋电气公司提供的指导,针对不同的工作状态定义了三个灯光色温范围:

  1. 温馨:2000-3000开尔文
  2. 明亮:3100-4500开尔文
  3. 神醒脑:4600-6500开尔文

适合用于测量光强度和色温的光传感器:

Adafruit RGB Color Sensor with IR filter and White LED - TCS34725带红外滤光片和白色LED的Adafruit RGB颜色传感器 - TCS34725


2

原型制作 - 草图

通过草图设计产品的整体结构。

控制板:顶面将设有一个电源开关和一个模式开关。光线传感器也将安装在顶面,以便充分暴露在光照下,从而更准确地测量光强和色温。

工作模式:正面通过一个LED NeoPixel环展示两种照明信息(光照强度和色温)。当顶面的模式开关切换至“工作”时,光传感器开始测量当前照明环境的光照强度和色温。LED NeoPixel环会根据实时的光照强度和色温亮起。环的上半部分附近设有四个工作任务图标,分别代表阅读、常规办公、常规绘图工作和精细工作,对应不同的光照强度。环的下半部分附近设有三个工作氛围图标,分别代表舒适、明亮和活力,对应不同的色温范围。

休闲模式:当顶面的模式开关切换至“休闲”时,屏幕将显示当前的天气温度。此外,LED 霓虹像素环会呈现天气图标以及相应的户外着装/装备建议。

3

硬件实现

主要电子设备:

NeoPixel环形灯 - 24个带集成驱动器的5050 RGB LED * 1

NeoPixel环形灯 - 16个带集成驱动器的5050 RGB LED * 1

0.96" * 1 串行OLED屏幕,0.96英寸 × 1

带红外滤光片和白色LED的RGB颜色传感器 - TCS34725 * 1

4节AA电池座 * 1

AA电池组 × 4

单刀双掷开关 * 2

带引脚的按钮 * 1

4

软件开发

开发工具:Particle Web IDE

包含的库:

  1. Arduino (0.0.10) Arduino(0.0.10)
  2. Adafruit_TCS34725 (1.0.0) Adafruit_TCS34725(1.0.0)
  3. Adafruit_SSD1306 (0.0.2) Adafruit_SSD1306(0.0.2)
  4. SparkJson (0.0.2) SparkJson(0.0.2)
  5. NeoPixel (0.0.14) NeoPixel(0.0.14)

编程:

在Particle控制台的“集成”标签页中创建Webhook,以从OpenWeatherMap API请求天气信息。在OpenWeatherMap.org上应用appid和天气API。获取带有邮政编码和appid的当前天气API调用,例如https://samples.openweathermap.org/data/2.5/weather?zip=94040,us&appid=b6907d289e10d714a6e88b30761fae22。此API响应将采用JSON格式。

Particle 控制台->集成标签页->新建集成->Webhook:定义名为weatherinfo的Webhook,URL应为当前天气API调用。由于LumiCube只需要天气描述和温度,可以使用mustache模板来处理Webhook响应中的JSON数据。因此,在Webhook的高级设置中,将响应模板设置为“{{#weather}}{{0.main}}~{{/weather}}{{#main}}{{temp}}~{{/main}}”。然后保存该Webhook。

在代码中,定义用于webhook和天气数据的变量:

unsigned long request_interval=1000*60*15;// request weather info from openweathermap every 15min
unsigned long lastReq=0;
bool ifUpdate = false; //for weather info update
String wx_main="";
String wx_temp="";
//for storing last-updated weather info
String main="loading";
float temp=0.0;
unsigned long request_interval=1000*60*15;// 每15分钟从openweathermap请求一次天气信息
unsigned long lastReq=0;
bool ifUpdate = false; //用于天气信息更新
String wx_main="";
String wx_temp="";//用于存储上次更新的天气信息
String main="loading";
float temp=0.0;

在setup()中使用以下方式订阅响应事件:

Particle.subscribe("hook-response/weatherInfo", myHandler, MY_DEVICES);

将myHandler函数定义为如下形式以处理webhook响应:

void myHandler(const char *event, const char *data) {<br> String str = String(data);
char strBuffer[256] = "";
str.toCharArray(strBuffer, 256);
wx_main = strtok(strBuffer, "\"~");
wx_temp = strtok(NULL, "~");
ifUpdate = true;
return;
}

通过以下方式触发Webhook以请求天气信息:

Particle.publish("weatherInfo", PRIVATE);

根据电路在代码中初始化两个LED NeoPixel环、OLED屏幕、RGB光传感器和模式开关:

// IMPORTANT: Set pixel COUNT, PIN and TYPE for the 24 neopixel ring<br>#define PIXEL_COUNT 24
#define PIXEL_PIN D6
#define PIXEL_TYPE WS2812B


// 重要提示:为16位NeoPixel环形灯设置像素数量、引脚和类型
#define PIXEL_COUNT_S 16
#define PIXEL_PIN_S D2
#define PIXEL_TYPE_S WS2812B


// 为OLED屏幕使用硬件SPI
#define OLED_DC D3
#define OLED_CS D4
#define OLED_RESET D5


//initialize two neopixel rings
Adafruit_NeoPixel strip = Adafruit_NeoPixel(PIXEL_COUNT, PIXEL_PIN, PIXEL_TYPE);
Adafruit_NeoPixel strip_s = Adafruit_NeoPixel(PIXEL_COUNT_S, PIXEL_PIN_S, PIXEL_TYPE_S);


//initialize OLED screen
Adafruit_SSD1306 display(OLED_DC, OLED_RESET, OLED_CS);
char buf[64];


//initialize rgb light sensor
Adafruit_TCS34725 tcs = Adafruit_TCS34725(TCS34725_INTEGRATIONTIME_50MS, TCS34725_GAIN_4X);
double r, g, b, l, c;
bool init = false;


// mode switch
int switchPin = A0;


代码每个循环中的主要功能:

检查模式开关的状态。

如果模式开关的状态为LOW,即被设置为LumiCube的工作模式:

使用以下方式从RGB光传感器读取数值:

void getRawData(uint16_t *r, uint16_t *g, uint16_t *b, uint16_t *c);

使用以下方式计算光强度和色温:

uint16_t calculateColorTemperature(uint16_t r, uint16_t g, uint16_t b);
uint16_t calculateLux(uint16_t r, uint16_t g, uint16_t b);

根据光照强度和色温,使用以下方式点亮24位NeoPixel上的NeoPixels:

strip.setPixelColor(i, r, g, b);

如果模式开关的状态为高电平,即设置为LumiCube的放松模式:

每15分钟触发Webhook以请求并更新天气信息

在OLED屏幕上显示天气温度:

//display temperature on OLED Screen <br>display.setTextSize(3);
display.setTextColor(WHITE);
display.setCursor(0,0);
snprintf(buf, sizeof(buf), "Temp");
display.println(buf);
snprintf(buf, sizeof(buf), "%0.1f C", temp);
display.println(buf);


根据天气描述和温度,使用以下方式点亮16个NeoPixel上的NeoPixels:

strip_s.setPixelColor(i, r, g, b);

完整代码位于lumicube.ino文件中。

INO
FGJHJJ1JPIO13DB.ino
7.78KB
5

外观设计

使用Adobe Illustrator设计LumiCube的外观:4.5×4.5×4.5英寸。

使用1/8英寸的桦木对设计进行激光切割。

6

测试

让Photon连接到云端,并通过Particle Web IDE将代码刷入其中。

调试并确保光照信息和天气信息能正常显示。

7

组装

将电子元件与木方块组装在一起。

8

最终原型


阅读记录0
点赞0
收藏0
禁止 本文未经作者允许授权,禁止转载
猜你喜欢
评论/提问(已发布 0 条)
评论 评论
收藏 收藏
分享 分享
pdf下载 下载
pdf下载 举报