预定的夜灯

图片

随着孩子的出生,出现了关于夜灯的问题。 他们在某个地方读到,有必要安静地睡觉。 快速习惯在昏暗的灯光下入睡。 在半夜从尖叫声和how叫声中醒来,看看婴儿在抱怨什么(如果您能理解的话),非常方便。 此外,在昏暗的灯光下,您可以摇晃,翻身并继续入睡。

最初,灯的测试样品是由一块黄色的LED灯带(12伏)制成的,使用了1.5年。


图片

除了脆弱的设计之外,它每天早晨都开始烦人,需要从插座上卸下灯的电源单元。 我早上起床,充足的光线从街上进入房间。 因此,灯每天浪费了几个小时。 半年后,中文RGB磁带控制器再次忘记了当前设置,因此有必要寻找一个控制面板来提醒他如何工作。 我决定制造一种具有自动关闭功能的新灯泡,并使用电位计和收音机进行颜色调整。

快速组装基于arduino nano的原型。 调试基本功能。

图片

我借此机会尝试了Fritzing。 我不喜欢它,但是照片清晰且“有趣”。 显然没有什么新发明。

图片

用一个鲜为人知的,与arduino兼容的模块替换“ nano”,该模块带有内置的无线电收发器(8位控制器,性能和填充物可与“ Nana”媲美)。 在家里,我已经有一个设备以868 MHz的频率运行,这将是第二个。 制造商网站上的简要规格:

简要特征
图片


图片

我看不到在ESP8266上做同样的大问题(在LUA上有一个方便的在线固件收集器来存放脚本)。 蓝牙稍微复杂一些(要刷新HM-10模块,您需要便宜的编程器,开发环境和协议的理解)。 虽然您可以将蓝牙模块与arduino一起使用。 但是我使用了ZUNo,因为它一直在躺着等待我很长时间,并且整个基础架构都准备好将相似的设备连接和管理到一个网络中(我在谈论智能家庭网络控制器)。
对于所有在arduino上使用过的腿,在模块中都找到了类似物。

图片

要从Arduino IDE使用该模块,您需要对其进行配置(设置说明位于制造商的网站上)。 没有奇迹发生。 尝试编译时,出现“不支持”错误,指出“有空列或没有主体的语句!” 我使用了Adafruit_NeoPixel库。 我爬上去,看到里面有多少个循环然后关上了。 我不得不再次访问制造商的网站,寻找使用LED的示例(很快发现了一个示例)。 因此,我不是第一个遇到类似问题的人。

为了在Arduino代码中通过收音机控制此灯,您需要添加一个宏并实现以下功能:

ZUNO_SETUP_CHANNELS( ZUNO_SWITCH_MULTILEVEL(getRed, setRed), ZUNO_SWITCH_MULTILEVEL(getGreen, setGreen), ZUNO_SWITCH_MULTILEVEL(getBlue, setBlue), ZUNO_SWITCH_BINARY(switch_getter, switch_setter) ); 

该宏描述了一个Z-Wave设备,该设备具有三个多级开关(RGB控制)和一个简单的开关(简单的开/关)。

我使用的功能最简单(如制造商网站上的示例所示)。 您可以在附件清单中看到它。

案例选择


我已经有个案子了 用透明盖密封 。 盖子下方装有25个LED。 测试成功。 灯对我的房间有很大的亮度裕度。 这种情况下的封面是透明的,所以我决定稍微散开光线。

图片

草绘的彩色珠子和丙烯酸立方体,充满透明环氧树脂。 在树脂的影响下,有色珠粒的涂料溶解。

图片

最有趣的是密封外壳的盖子泄漏了,几乎所有的树脂都泄漏了。 我不知道我在哪里碰到了盖子,但干燥后裂缝清晰可见。

图片

印刷电路板通过光致抗蚀剂方法制成。

图片

图片

酸洗加工后

图片

带有微控制器的模块被其原型替换,该原型位于壁橱中(因为这很可惜,但是ZUNo需要受到保护)。 ZUNo的第一个版本,但是尺寸比天线更大或更小,您已经无法购买。 测试或多或少是成功的。 最后一段必须重新焊接。 它最初被焊接到错误的一侧。 并调整固件中的LED数量。

图片

图片

这是发生了什么:

图片

无线电控制


带灯控制通道的主窗口

图片

调整LED灯带一个通道的亮度

图片

设置小夜灯的早晨关闭

图片

结论


设备正在运行。 它紧凑紧凑。 它通过为手机充电来供电。
从发现的问题:

  • 在组装期间,请撕下可变电阻上的部分走线,因此在手动模式下,您只能控制一个通道。
  • 25个LED中只有20个能正常工作。我有很多这样的事情,所以我很可能将其留出以找出更严重的缺点

夜灯素描
 #include "ZUNO_NeoPixel.h" #define MAX_PIXELS 20 // NB! Z-Uno can not control more than 25 WS2811 without harming RF communications #define PIXEL_SIZE 3 // Three colors per pixel #define BUFF_SIZE (MAX_PIXELS * PIXEL_SIZE) byte pixel_buff[BUFF_SIZE]; NeoPixel pixels(pixel_buff, BUFF_SIZE); #define B_PRESSED 1 #define BUTTON_PIN 1 // Digital IO pin connected to the button. This will be #define DEF_RED 30 #define DEF_GREEN 20 byte red = DEF_RED; byte green = DEF_GREEN; byte blue = 0; #define POWER_ON 1 #define POWER_OFF 0 byte light_power = POWER_ON; byte last_light_power = POWER_OFF; ZUNO_SETUP_CHANNELS( ZUNO_SWITCH_MULTILEVEL(getRed, setRed), ZUNO_SWITCH_MULTILEVEL(getGreen, setGreen), ZUNO_SWITCH_MULTILEVEL(getBlue, setBlue), ZUNO_SWITCH_BINARY(switch_getter, switch_setter) ); void switch_setter(byte value) { Serial.println("switch"); Serial.print("value= "); Serial.println(value); if(value > 1) light_power = POWER_ON; else light_power = POWER_OFF; } byte switch_getter() { return light_power; } int getRed() { return red/2.56; } int getGreen() { return green/2.56; } int getBlue() { return blue/2.56; } void setRed(byte value) { red = value * 2,56; for(uint8_t i = 0; i < MAX_PIXELS; i++) pixels.setPixelColor(i, pixels.Color(red, green, blue)); pixels.show(); Serial.print("set red = "); Serial.println(value); } void setGreen(byte value) { green = value * 2,56; for(uint8_t i = 0; i < MAX_PIXELS; i++) pixels.setPixelColor(i, pixels.Color(red, green, blue)); pixels.show(); Serial.print("set red = "); Serial.println(value); } void setBlue(byte value) { blue = value * 2,56; for(uint8_t i = 0; i < MAX_PIXELS; i++) pixels.setPixelColor(i, pixels.Color(red, green, blue)); pixels.show(); Serial.print("set red = "); Serial.println(value); } void set_LEDS() { for(uint8_t i = 0; i < MAX_PIXELS; i++) pixels.setPixelColor(i, pixels.Color(red, green, blue)); pixels.show(); } void read_resistors() { red = (analogRead(A0) >> 2) & 0xff; green = (analogRead(A1) >> 2) & 0xff; blue = (analogRead(A3) >> 2) & 0xff; Serial.print(red); Serial.print(" "); Serial.print(green); Serial.print(" "); Serial.print(blue); Serial.print(" "); Serial.println(); set_LEDS(); } #define DEBOUNCE_ACK 10 byte check_button() { static bool oldState = HIGH; byte debounce_cnt = 0; static byte ret = 0; if(digitalRead(BUTTON_PIN) == LOW) { if(ret != B_PRESSED) while(digitalRead(BUTTON_PIN) == LOW) { if(debounce_cnt == DEBOUNCE_ACK) { ret = B_PRESSED; break; } else debounce_cnt++; delay(10); } } else { debounce_cnt = 0; ret = 0; } return ret; } void setup() { Serial.begin(9600); pixels.begin(); pixels.clear(); pinMode(BUTTON_PIN, INPUT_PULLUP); } void loop() { if(check_button() == B_PRESSED) read_resistors(); if(last_light_power != light_power) { Serial.println("set power"); if(light_power == POWER_OFF) { Serial.println("power off"); red = 0; green = 0; blue = 0; } else { Serial.println("power on"); red = DEF_RED; green = DEF_GREEN; blue = 0; } set_LEDS(); last_light_power = light_power; } } 

Source: https://habr.com/ru/post/zh-CN433194/


All Articles