任何普通/智能家居或建筑物中使用的闪电系统仍在按照百年的开或关原理工作,需要对其进行现代化改造以实现安全能源。在白天,我们可以使用自然光来照亮我们的房屋/建筑物,但在清晨、傍晚或恶劣天气期间,当可用的自然光较少时,我们必须使用人造光。使用当前的照明系统,我们只需将其全功率打开,而不是用人造光补充自然光。这导致大量能源的浪费,这也是我们星球上最大的危机。因此,为了节省能源,我们需要构建一个足够智能的照明系统,以便在可用时补充自然光,而不是简单地打开并消耗最大功率。
为我们的智能家居/建筑构建节能照明系统,设计具有自适应亮度控制的智能智能照明,以最大限度地利用自然光。在对这种解决方案进行很少的研究时,到目前为止我只发现了很少的 IEEE 研究论文所以这可能是第一个这样的解决方案。这种系统的最大优势是它的能源效率,通过改变亮度和补充自然光来保持充足的光线。
这个 Idea 被选为免费硬件,它通过 USPS 运送,但从未到货。项目中使用的Sony Main + Ext板由Electromaker.IO提供
u8g2: https://github.com/olikraus/u8g2
apds9930: https://github.com/Depau/APDS9930
需要 RTC 才能为 IOT 平台启用它并在夜间进入省电模式,因为由于外部(太阳)光不可用,我们不需要大量计算。最初我无法使用 Arduino IDE 使用 SONY Spresense 板的 CXD5602GG mcu 的内部 RTC 模块,但在研究了它提供的 SDK 之后,我惊讶地发现了很多有用的内置函数、传感器库和 RTC。在这里我会要求SONY团队提供一些关于SDK和MCU注册及其功能的文档。为了使用 RTC 模块,我们需要使用给定代码修改...\Arduino15\packages\SPRESENSE\tools\spresense-sdk\1.1.3\spresense\release\include\sdk\文件夹中可用的cxd56_rtc.h文件. 同时创建新的cxd56_rtc.c文件位于同一位置,其代码如下所示。
内置 GPS 令人印象深刻的室内性能鼓励我添加自动 RTC 配置功能。启动时,GPS 时间变量的值为 1980 年。因此,一旦该值发生变化,我们就可以使用 GPS 时间配置 RTC。RTC 模块需要 Unix 时间,GPS 模块提供标准的当前时间。可以使用time.h库mktime()和struct tm将 GPS 时间转换为 Unix 时间。下面给出了通过 GPS 时间更新 RTC 模块的代码。
void setup_rtc(){
if(!timeSinceEpoch){ /* check if RTC is already configured or not */
if (Gnss.waitUpdate(-1)){ /* read GPS data */
SpNavData NavData;
Gnss.getNavData(&NavData);
if (NavData.time.year!=1980){ /* check if GPS time is acquired or not */
struct tm tm; /* create time struct variable */
/*
tm_sec -> The number of seconds after the minute, normally in the range 0 to 59, but can be up to 60 to allow for leap seconds.
tm_min -> The number of minutes after the hour, in the range 0 to 59.
tm_hour -> The number of hours past midnight, in the range 0 to 23.
tm_mday -> The day of the month, in the range 1 to 31.
tm_mon -> The number of months since January, in the range 0 to 11.
tm_year -> The number of years since 1900.
tm_wday -> The number of days since Sunday, in the range 0 to 6.
tm_yday -> The number of days since January 1, in the range 0 to 365.
*/
tm.tm_year = NavData.time.year-1900; /*Subtract 1900 from GPS time to get years since 1900 */
tm.tm_mon = NavData.time.month-1; /*Subtract 1 from GPS months*/
tm.tm_mday = NavData.time.day;
tm.tm_hour = NavData.time.hour;
tm.tm_min = NavData.time.minute;
tm.tm_sec = NavData.time.sec;
timeSinceEpoch = mktime(&tm); /* get GMT unix time */
}
}
if(timeSinceEpoch){ /* Check if time is updated */
rtcTime.tv_sec=timeSinceEpoch; /* update the RTC module sec register */
rtcTime.tv_nsec=0; /* no info available to update nano sec register */
up_rtc_settime(&rtcTime); /* update the RTC time */
rtc_status=true; /* RTC status variable to ON/OFF RTC icon */
}
}
else{
rtc_status=false;
}
}
通用 PIR 传感器的输出不能与外部上拉条件一起使用。当它与任何单片机连接时,我们需要设置引脚“INPUT FLOAT”。对于具有 1.8V VDD-IO 及其 EXT 的 Sony spresense。LSF0204x 4 位双向多电压电平转换器板(数据表:此处) 用于输出上拉电阻的 3.3/5V 电平转换。所以这意味着 J2 和 J13 的每个数字 IO 引脚都不能用作浮动或下拉输入。如果我们尝试直接用 EXT 连接一个下拉电阻。电路板 IO 引脚将构成一个分压器,这不是下拉电阻的目的。使用下拉的输入低电平只能通过连接一个 R<<1K 的电阻来实现。(1K 上拉电阻用于 ext.board 上,详情请参考 EXT.board schematic documents available HERE )
为了克服这个问题,我们需要添加到外部缓冲器 IC,我使用74LS245(数据表:此处)作为 PIR 传感器输入和 LED 驱动器 pwm 输出的输入/输出缓冲器(Fritzing 电路图)。
数字环境光传感器 APDS9930(详情:此处)由于其超低功耗和可编程中断功能(此处未使用),用于代替模拟传感器(LDR 等)进行光强度测量。这里使用的模块有板载 5 至 3.3V LDO 和 I2C 电平转换电路,用于 5V 操作。
PIR 传感器设置为最小延迟时间,具有超时功能的 Sony 外部中断用于根据 PIR 传感器输出打开/关闭 LED。最低延迟时间设置用于使 LED 关闭延迟时间完全可编程。当 PIR 传感器模块设置为最小延迟时间时,如果检测到任何物体,它会连续提供约 1 秒的开启和约 1 秒的脉冲序列。如果 mcu 将继续接收脉冲,则 LED 将保持点亮状态,否则 LED 可以在接收到最后一个脉冲后经过用户可编程的延迟时间后关闭。因此,它还可以让我们在离开房间后(约 1 秒延迟)立即关闭 LED。
/* PIR senosr Input configured as external interrupt */
pinMode(PIR_PIN, INPUT);
attachInterrupt(PIR_PIN, pir_ISR, CHANGE);
每次恢复 PIR 中断时,我们都会使用用户定义的延迟(秒)变量更新pir_delay变量。
/* PIR interrupt service routine */
void pir_ISR(){
/* assign user defined delay value (seconds) to program pir delay value */
pir_delay=pir_user_delay;
}
在我们的代码中,我们每秒检查一次pir_delay是否设置。如果它的设置然后打开 LED 并减少pir_delay直到变为零并关闭 LED,否则它可以通过 PIR ISR 继续更新。这里的 pir_status变量用于在 OLED 显示器上显示 LED ON 或 OFF 图标。
bool pir_sw(){
if (pir_delay>0){
pir_status=true;
pir_delay--;
return true;
}
else{
pir_status=false;
return false;
}
}
LED 亮度可以通过可编程恒流源或通过施加 PWM 控制的恒压进行数字控制。在这个项目中,我使用恒压源和 pwm 来调节 LED 亮度。
我在这个项目中使用的电源 LED (3W) 的开启电压约为 9.8V。为了从通用 12V 电源适配器生成此电压,我使用了 DC-DC 降压转换器(也如下图所示)。现在,将 Sony Spresense pwm 转换为 LED 电源 pwm 所需的第二件事。经过一些在线研究,我找到了一个单电源驱动器 IC L9110(数据表:此处)。现在是从 EXT 的 3.3V 电压电平安全驱动输入引脚的问题。板 IO 板使用夏普PC817低成本光隔离器解决(数据表:此处)。
本项目中使用的 L9110 板的数字输入被上拉至电源电压。因此,为了打开输出,需要在数字 IO 引脚之一输入低电平。这里是 EXT 的永久 PULL-UP IO 引脚。板变得非常有用,因为 LED 将保持关闭状态,直到对其应用开启信号。对于 LED 的最大亮度(全功率打开),只需低电平(0 pwm 值-Arduino)输入。要完全关闭 LED 高电平(1023 pwm 值-Arduino)输入是必需的。
由于功耗低,该项目中使用的显示模块是双色 0.96" OLED。显示屏分为 128x16 黄色和 128x48 蓝色两半。黄色的上半部分用于显示不同的图标和相关的 LED 功耗级别。 LED 开/关和成功的自动 RTC 配置通过其内置 GPS 模块也使用图标显示。为 OLED 模块构建自定义图标的最简单方法之一是使用在线 XBM 编辑器(在此处用于此项目)。
当 u8g2 库与 Arduino 或任何其他板一起使用时,代码将毫无问题地编译。但在 SONY 板上,它会给出 ram over flow 错误,因为没有为编译和链接过程设置“ gcc-arm-none-eabi ”的代码优化标志。并使用 u8g2 库为 RAM 提供流代码。
凭借我有限的编译器知识,我尝试在 Sony Spresense 的platform.txt文件中设置代码优化标志“-ffunction-sections,-fdata-sections”(位于 ...\AppData\Local\Arduino15\packages\SPRESENSE \hardware\spresense\1.1.3) 但生成的文件对我不起作用。所以我选择修改字体文件。
为了克服这个 ram 溢出错误,我们需要修改u8g2 库的“u8g2_fonts.c”和“u8x8_fonts.c” ,如上一节所示。
声明:本文内容及配图由入驻作者撰写或者入驻合作网站授权转载。文章观点仅代表作者本人,不代表电子发烧友网立场。文章及其配图仅供工程师学习之用,如有内容侵权或者其他违规问题,请联系本站处理。 举报投诉
全部0条评论
快来发表一下你的评论吧 !