制作自动化系统的想法来自我们的村屋,那里有鸡、狗和植物。我父亲制作了一个电子系统来自动化日常任务,例如给植物浇水、喂狗和喂鸡、给鸡开门等。他为那个系统使用了定时继电器,并且大部分时间都运行良好。但是,我们村的房子经常停电,导致我父亲的自动化系统出现问题。如果在一个继电器的分闸和合闸时间之间断电,当电回来时,它不会安排继电器的状态。当我们处理植物,主要是动物时,这是一个巨大的问题。而且定时继电器的成本比Netduino+Relay高,使用起来也不是你想的那么简单。
为了解决这个问题,我申请了Netduino Contest的Idea Round,我的想法被接受了。我买了一个 16 通道 5V 继电器模块,用于多继电器控制。我需要知道时间。因此,我使用了一个外部 RTC 模块 DS3231 不仅可以获取实时时间,还可以获取星期几,这鼓励我每周编写一个程序作品。我写了一个循环函数,根据时间确定继电器的状态。此函数每秒循环一次并检查每个继电器的情况,然后比较来自 SD 卡(或直接来自代码——我在代码中解释)的继电器时间,并根据时间打开/关闭继电器。但是,我想独立使用传感器,以完成紧急需求。我设法连接了三个传感器,以用我的系统举例说明传感器的工作过程。
由于缺乏互联网连接、时间和库存,开发过程对我来说有点困难。我在我们村的房子里,我不得不使用我的旧传感器,我没有足够的时间购买新的,因为运往村庄的货物受到限制。因此,我完成了我所拥有的。我熟悉 Arduino,这就是为什么示例项目的引脚图或威廉希尔官方网站 对我来说很容易。我一直在努力集成 DS3231 并使用传感器(包括 LDR、水位和运动检测)。虽然有相关的教程,但大多数教程都有点老了。但是,Netduino 基金会很棒,而且大部分都是最新的!
我使用Netduino Foundation DS32xx 集成代码从 DS3231 RTC 模块获取时间数据。对于传感器,我尝试使用 SecretLabs.NETMF.Hardware.AnalogInput 参考,但 VS 2015 向我显示了一次又一次检查设备的错误。没有这个参考,所有的项目都像魅力一样运行。这就是为什么我检查了 AnalogInput 的库以了解如何从模拟输入中获取数据。之后,我从 Microsoft.SPOT.Hardware 获得了如下值:
Microsoft.SPOT.Hardware.AnalogInput waterLevel = new Microsoft.SPOT.Hardware.AnalogInput(Cpu.AnalogChannel.ANALOG_0);
Debug.Print("Water Level Sensor: " + (int)(waterLevel.Read() * 100));
我写了一个函数来确定继电器的情况。下面是我的函数的参数的示例和含义:
// Relay no:2 12:10 - 16:27 Only Tuesday
TimeToAct(2, currentHour, currentMinute, DayOfWeekToString(dayOfWeek), 12, 10, 16, 27, DetectDay(3));
///
/// Main Alarm System
///
/// Relay No
/// current Hour
/// current Minute
/// current Day String
/// Relay opens: hr
/// Relay opens: min
/// Relay closes: hr
/// Relay closes: min
/// Relay opens at specific day or days of week
static void TimeToAct(int relayNo, int currentHour, int currentMinute, String currentDay, int hourAct, int minuteAct, int hourReAct, int minuteReAct, String[] daysAct) {
我的代码在一天的操作中运行得很好(例如中继 6 仅在星期三工作)。然而,我的目标是让我的继电器每周工作好几天。我考虑过如何理解为多个操作选择了多少天,这是我的解决方案,使用素数:)
///
/// Detect Day depending on first 7 prime numbers
/// 2 --> Monday
/// 3 --> Tuesday
/// 5 --> Wednesday
/// 7 --> Thursday
/// 11 --> Friday
/// 13 --> Saturday
/// 17 --> Sunday
/// If we want our relay to open only one day, we need to enter days' prime number, for instance 5 for Wednesday.
/// If we want our delay to open multiple days, we need to multiply days' prime numbers.
/// For instance, all the days of week, we need to enter 2*3*5*7*11*13*17 = 510510
/// Monday + Tuesday = 2*3 = 6
/// Wednesday + Saturday + Sunday = 5*13*17 = 1105
///
/// dayNumber
/// Detect Day String array
static String[] DetectDay(int dayNumber)
{
String[] days = { "", "", "", "", "", "", "" };
for (int i = 0; i < 7; i++)
{
days[i] = "";
}
if (dayNumber % 2 == 0) { days[0] = "Monday"; }
if (dayNumber % 3 == 0) { days[1] = "Tuesday"; }
if (dayNumber % 5 == 0) { days[2] = "Wednesday"; }
if (dayNumber % 7 == 0) { days[3] = "Thursday"; }
if (dayNumber % 11 == 0) { days[4] = "Friday"; }
if (dayNumber % 13 == 0) { days[5] = "Saturday"; }
if (dayNumber % 17 == 0) { days[6] = "Sunday"; }
Debug.Print("DayNo: " + dayNumber);
Debug.Print("Days: ");
for (int i = 0; i < 7; i++)
{
if (days[i].Length > 5)
{
Debug.Print("-" + days[i]);
}
}
return days;
}
我的最后一个挑战是将数据存储在 SD 卡中。我有许多甚至超过 8GB 的 micro SD (SDHC) 卡。但是,Netduino 页面说您需要使用高达 2GB 的 SD 卡(不是 SDHC),这使我无法使用我的卡。我曾尝试与我的卡一起使用,但它不起作用。然后我决定使用 DS32xx 的 EEPROM 来存储所有数据。我从 Netduino.Foundation 找到了一个库,但是这个库导致 VS 出现问题(上面同样的错误)我需要存储数据,所以我为 SD 卡编写了代码,但我无法使用 SD 卡进行测试。
我很高兴也很自豪能够完成这个项目并找到解决我们问题的方法!我的系统可以处理许多事情,例如:
我真的很感谢 Wilderness Labs 给我们一个机会来解决我们使用 Netduino 的问题,他们的高级语言支持卡。
声明:本文内容及配图由入驻作者撰写或者入驻合作网站授权转载。文章观点仅代表作者本人,不代表电子发烧友网立场。文章及其配图仅供工程师学习之用,如有内容侵权或者其他违规问题,请联系本站处理。 举报投诉
全部0条评论
快来发表一下你的评论吧 !