亿迅智能制造网
工业4.0先进制造技术信息网站!
首页 | 制造技术 | 制造设备 | 工业物联网 | 工业材料 | 设备保养维修 | 工业编程 |
home  MfgRobots >> 亿迅智能制造网 >  >> Manufacturing Technology >> 制造工艺

城市植物浇水解决方案

组件和用品

土壤湿度传感器
任何具有模拟输出的土壤湿度传感器都可以使用。也可以使用两个电极和一个分压器。这些是可选的。
× 2
雨量传感器
× 1
牛奶壶
任何可以盛水、切割并固定在表面上的容器都可以。这应该安装在升高的表面上。
× 1
软塑料柔性空心管
任何类型的管道都可以。我用了一根末端被剪掉的跳绳,因为它非常灵活,中心是空心的。
× 1
跳线(通用)
或多或少。
× 37
适用于 Arduino 101 的 SparkFun Inventor 套件
我使用了 Arduino 101、伺服器、面包板、电位器和 LCD。
× 1
造型粘土
× 1
短塑料棒
或任何非柔性杆。这是用来支撑水箱出水管的。
× 1
电阻 330 ohm
× 1

必要的工具和机器

剪刀
十字螺丝刀
电子胶带
以及普通胶带。

应用和在线服务

Nordic Semiconductor nRF Connect SDK
Arduino IDE

关于这个项目

该设备改善了城市环境中的植物灌溉。它由 Arduino 101 驱动,使用板载工具和一些外部传感器来计算在其自身环境中给植物浇水的最佳条件,然后在计算出的时间给植物自身浇水。

它基于以下概念:

重力和压力

这个设备从一个水库中汲取水源,我用一个牛奶罐、塑料管、用于密封管的粘土和一个伺服系统制作了这个水库。该容器的放置方式不仅可以升高,还可以从设备上方收集雨水。

水罐主要由家庭供水(由于不总是下雨),但由雨水补充。当水壶中有水时,重力的吸引力会将水拉向水壶内的地球。在壶的底部开一个孔,以允许插入出口管。因此重力将水拉过这个出口管。伺服调节何时允许水完全离开管道。正常情况下,伺服臂处于直立位置,防止水从管道中流出。然而,在给植物浇水时,手臂会降低 135 度,从而让水从管道中流出并灌溉植物。完成后手臂会重新抬起。

水对壶的压力不仅有助于壶的稳定性,还有助于水的排出,使灌溉过程中的水源源不断地流动。

TMP36 温度传感器和英特尔居里模式匹配引擎

这种概念的组合有助于推动确定浇灌植物的最佳时间的计算。 TMP36 是一种温度传感器,其工作方式类似于温度计,但具有电子模拟输出。该输出可由微控制器等设备读取,并转换为温度。在这个项目中,该设备试图计算最接近 25 摄氏度的植物浇水的最佳时间。它每小时生成 30 条记录,间隔两分钟,并在每个周期结束时计算其中 29 条的平均值(不包括第一个,因为它通常是不准确的)。这就是模式匹配引擎的用武之地。

Intel Curie PME 或模式匹配引擎是一种内置于 Arduino 101 的人工神经网络。其库可在 GitHub 上找到。它由 128 个神经元组成,能够根据现有数据或分类为类别的向量对保存在向量中的数据进行学习和分类。可用的类别越多,PME 可以追求的分类选项就越多。

对于该项目,PME 会记录一天中的温度数据,并尝试在这些数据中对 25 摄氏度的最佳条件进行分类。结果变成了第二天给植物浇水的时间。

从早上 8 点到晚上 9 点,每小时记录一次数据。第一次这样做时,数据将保存到板载串行闪存 .这将允许设备启动到数据集,即使它已关闭。获得数据集后,它尝试对最佳条件进行分类。如果能够这样做,则所选类别将成为下一轮使用的小时。如果不是,则设备将使用月常数,或每个月中温度最高的时间。应该注意的是,这些并不总是给植物浇水的最佳温度 ,这就是我使用 PME 的原因。

在第一次学习课程之后,数据会被清除并在第二天重新学习,在选定的时间给植物浇水。这个循环无限重复,或者直到设备断开电源,再次打开时,它使用保存的参数作为选择的小时并继续运行。

英特尔居里实时时钟和低功耗蓝牙

Intel Curie RTC 或实时时钟是该设备的重要组成部分。 RTC 控制设备上的所有内容何时发生。对于该项目,RTC 在跟踪小时(用于给植物浇水和何时记录数据)和月份(用于确定备用峰值温度常数)方面尤为重要。但是,需要通过代码或用户输入手动设置此 RTC 的精确日期。这已通过 BLE 解决。

低功耗蓝牙是蓝牙的较新版本,专为低功耗设备而设计。它在中央-外设系统上运行,其中中央或输入写入外设或输出。这更像是一个公告板系统,其中中央将数据放在公告上,供所有外围设备阅读。在这种情况下,我在移动设备上使用 Nordic Semiconductor 的 nRF Connect 作为中心,使用 Arduino 101 作为外围设备。移动设备能够连接到 Arduino 并向其发送数据。在这种情况下,移动设备需要发送四次数据,每个必填输入字段一次。

移动设备上输入的数据以十六进制输入。从基数 10 转换相当容易,但可以使用在线转换器。

如何构建

构建这种灌溉解决方案需要一些电路知识,但不要太多。它还需要一些非电气元件才能完成。这是完整的零件清单:

电子元件

  • Arduino 101
  • 400 系带面包板,带 +- 导轨
  • 旋转电位器
  • 16x2 液晶显示屏
  • 330 欧姆电阻
  • TMP36 温度传感器
  • 180 度舵机,带舵机喇叭
  • 雨量传感器和控制板
  • 土壤湿度传感器和控制板(可选,包含硬件作为参考)
  • 大量的跳线;见弗里茨图

使用电池运行(可能不会持续太久;我使用的设置):

  • 2 个 4xAA 电池盒,带开/关开关和导线
  • 8 节 AA 1.2V 镍氢充电电池

要使用 USB 电源运行,无论是壁挂式设备还是笔记本电脑:

  • USB 公 A - 公 B 电缆,其长度取决于您的需要

非电气硬件组件

  • 牛奶罐
  • 柔性塑料管,长约 20-30 厘米
  • 造型粘土、热胶或任何可用作密封剂的东西
  • 塑料杆,用于支撑油管臂
  • 工艺篮,用于放置设备
  • 用于放置水壶的升高表面,例如小凳子或桌子
  • 一株植物

工具

  • 普通和电动胶带
  • 剪刀
  • 十字螺丝刀,将舵机喇叭连接到舵机

步骤

1. 根据下面的 Fritzing 图构建电路。请注意土壤湿度传感器是可选的,雨水传感器和伺服可能需要更长的电线才能到达所需的位置。电路的最终布置见下面的第二张照片。

2.(如果使用 USB 电源,请跳到第 5 步)。将电池插入两个电池盒中,并将一个盒的正极和另一个盒的负极绑在一起。

3. 使用电工胶带将盒子粘在一起。固定盒子,使两者的盖子都连接起来,并且两者的外壳都连接起来,并且盖子可以作为一个整体拆卸。为电源开关留出插槽。

4. 将电池盒的双盖贴在 Arduino 101 和面包板的底部。这将使电池可以通过从电路板下方滑出而轻松更换。

5. 将设备插入工艺篮并在设备一侧切出两个槽。第一个插槽将用于编程(或 USB 电源,如果您选择这样做),第二个将是不在设备上的传感器和执行器的插座。随意使用电工胶带将松散的电线固定在此插座中。

6. 拿一个牛奶罐,切掉顶部,使罐子有足够大的开口来收集水和足够大的容量以确保可靠。我建议切口在靠近手柄底部的地方。

7. 在水壶底部直接在水壶顶部开口的最大部分下方切一个小孔。将塑料管的一端插入该孔中。确保孔足够小,使管道保持在原位,但又足够大,不会挤压管道。

8. 使用粘土密封孔中管道周围的顶部和底部区域。确保粘土不会进入管道本身。

9. 使用粘土和电工胶带,将伺服器尽可能低地固定在牛奶罐底部。将管的中间和一根塑料杆粘在伺服喇叭上。确保塑料棒也用胶带粘在管子的上端。 使用下图作为步骤 8 到 10 的参考。

10. 将水壶固定在升高的表面上。必要时使用胶带。

11. 当处于降低位置时,将植物放在管出口正下方。如果您正在使用湿度传感器,请将它们插入土壤中,然后将雨水传感器沿着地板靠近植物放置。将传感器和伺服器插入设备中,将设备放置在远离水壶和植物的位置。

编程

使用附加的代码对 Arduino 101 进行编程。使用 Arduino IDE 和 Curie Core 2.0.2 或更高版本(如果可用)上传。代码中包含许多有用的注释。

设备操作

当设备第一次打开时,它会等待移动设备连接。使用 nRF Connect 连接设备后,它将等待时间输入。为此,请按顺序在 nRF Connect 中输入以 10 小时、分钟、日和月为基数的十六进制代码,如下图所示。

在输入时间之前,必须输入并发送 ID 输入或任何数字。

输入时间后,101会等待移动设备断开连接。这样做之后,它将等待当天或第二天早上 8 点。

到达上午 8 点时,开发板将检查闪存中是否保存了任何内容。如果没有,那么它将按照前面描述的14小时收集过程,然后对数据进行分类并确定最佳时间,此时它将重复收集循环。如果存储了某些内容,则该数据将用作小时常量,并且循环继续正常。

在董事会为植物浇水期间,雨水或土壤水分过多(可选)将阻止植物浇水。然后它将跳过当天的浇水并等待下一天。

该解决方案旨在通过采用自动设置来处理城市植物灌溉,从而使城市植物灌溉更简单、更优化。它还通过使用蓄水池来保存雨水和现有的房屋供应,从而充分利用不直接流向植物的雨水。

希望这个项目能让我们不断变化的世界变得更美好!

代码

  • Arduino 101 灌溉系统
Arduino 101 灌溉系统Arduino
操作 Arduino 101 灌溉系统的代码。使用 Curie 核心 2.0.2 和任何 1.8.x 或更高版本的 IDE 上传。 CuriePME 可以在 GitHub 上找到。
/*这是一个城市灌溉解决方案的草图。它使用 CuriePME 学习温度数据并根据它对最佳植物浇水条件进行分类。然后在当时给植物浇水,然后重新学习数据,无限循环。请注意,此草图必须在目标日的上午 8 点之前运行才能启动设备。数据来源:“WeatherSpark.com”。加拿大、温哥华的全年平均天气 - Weather Spark。 N.p.,日期不详网。 2017 年 7 月 4 日。。“只有 4 个种植者:全球花园社区。”只为种植者。 N.p.,日期不详网。 2017 年 7 月 10 日。。 */// 用于此代码的库。除了 CuriePME 之外的所有这些都可以在 ide 中找到。 CuriePME 可以从 GitHub 存储库下载。#include "CuriePME.h"#include #include #include #include #include #include // Servo pinout code.Servo waterPipe;// LCD pinout code.LiquidCrystal lcd(12, 11, 5, 4, 3, 2);//全局常量/变量.#define温度计A3 #definerainSensor 1#define湿度1 A4#define湿度2 A1int tm1;int tm2;int tm3;int tm4;int tm5;int tm6;int tm7;int tm8;int tm9;int tm10;int tm11;int tm12;int t int tm14;int tm15;int tm16;int tm17;int tm18;int tm19;int tm20;int tm21;int tm22;int tm23;int tm24;int tm25;int tm26;int tm23;int tm27;int tm28;int average;int progav;float voltage;float temperatureC;int tm;int hourTime =-1;int minuteTime =-1;int dayTime =-1;int monthTime =-1;int confirmTime =-1;// BLE 服务data.BLEService plantService("19B10000-E8F2-537E-4F6C-D104768A1214");// BLE特性,central.BLEUnsignedCharacteristic可读写racteristic(“19B10001-E8F2-537E-4F6C-D104768A1214”,BLERead | BLEWrite);void setup() { // 运行一次。 waterPipe.attach(9); waterPipe.write(0); pinMode(rainSensor, INPUT);液晶显示器。开始(16, 2); // 开始并清除 LCD。液晶显示器(); if (!SerialFlash.begin(ONBOARD_FLASH_SPI_PORT, ONBOARD_FLASH_CS_PIN)); lcd.setCursor(0, 0); lcd.print("输入时间:BLE"); // 使用名称、服务、特征和特征值初始化 BLE 服务。 BLE.开始(); BLE.setLocalName("Arduino 101"); BLE.setAdvertisedService(plantService); PlantService.addCharacteristic(timeCharacteristic); BLE.addService(植物服务); timeCharacteristic.setValue(0); // 0 直到被中央写入。 BLE.advertise(); lcd.setCursor(0, 1); lcd.print("等待"); // 准备连接.x:BLEDevice central =BLE.central(); if (central) { // 如果设备链接到板。 lcd.setCursor(8, 1); lcd.print("完成");延迟(3000); while (central.connected()) { // 当设备仍处于连接状态时。 if (timeCharacteristic.written()) { // 在从设备发送每个字节后顺序填充所有时间变量槽的代码。数据发送四次,外加一次用于确认链接。 if (confirmTime ==-1) { confirmTime =timeCharacteristic.value(); } else if (hourTime ==-1) { hourTime =timeCharacteristic.value(); } else if (minuteTime ==-1) { minuteTime =timeCharacteristic.value(); } else if (dayTime ==-1) { dayTime =timeCharacteristic.value(); } else if (monthTime ==-1) { monthTime =timeCharacteristic.value();液晶显示器(); lcd.setCursor(0, 0); lcd.print("时间设置。"); lcd.setCursor(0, 1); lcd.print("断开设备。"); } } } } else { 转到x; // 如果设备尚未连接,则循环返回。 } // 使用收集到的变量设置时间。秒和年对于这个系统来说无关紧要。 setTime(hourTime, minuteTime, 00, dayTime, monthTime, 2017); // 初始化 PME。液晶显示器(); CuriePME.begin(); lcd.setCursor(0, 0); lcd.print("正在检查保存。");延迟(3000); const char *filename ="NeurData.dat"; if (check_if_exists(filename) ==true) { restoreNetworkKnowledge(); lcd.setCursor(0, 1); lcd.print("找到了!");延迟(3000);液晶显示器();转到 z; } else { lcd.setCursor(0, 1); lcd.print("未找到!");延迟(3000);液晶显示器(); } /* 设置的其余部分收集一天中的温度数据。它每小时进行 30 次检查,间隔为 2 分钟,并在每小时结束时通过计算除第一次扫描以外的所有数据的算术平均值来计算该小时数据的平均值。然后将该均值放入 PME 并学习。这从上午 8 点到晚上 9 点重复,此时 PME 学习的完整数据集将保存到 CurieFlash 存储器中,作为设备断电或需要重新启动时的默认设置。 */ lcd.clear(); lcd.setCursor(0, 0); lcd.print("学习"); for (int i =8; i <22; i++) // 重复 14 次,每次保存在不同的类别下。 { // 采集30条温度数据,保存为0到255之间映射的int。电压=模拟读取(温度计)*3.3;电压 /=1024.0;温度 C =(电压 - 0.5) * 100; tm =map(温度C, -40, 125, 0, 255); tm1 =约束 (tm, 0, 255);延迟(114000); // 补偿上面的检查延迟。电压 =模拟读取(温度计)* 3.3;电压 /=1024.0;温度 C =(电压 - 0.5) * 100; tm =map(温度C, -40, 125, 0, 255); tm2 =约束(tm, 0, 255);延迟(120000);电压 =模拟读取(温度计)* 3.3;电压 /=1024.0;温度 C =(电压 - 0.5) * 100; tm =map(温度C, -40, 125, 0, 255); tm3 =约束(tm, 0, 255);延迟(120000);电压 =模拟读取(温度计)* 3.3;电压 /=1024.0;温度 C =(电压 - 0.5) * 100; tm =map(温度C, -40, 125, 0, 255); tm4 =约束 (tm, 0, 255);延迟(120000);电压 =模拟读取(温度计)* 3.3;电压 /=1024.0;温度 C =(电压 - 0.5) * 100; tm =map(温度C, -40, 125, 0, 255); tm5 =约束 (tm, 0, 255);延迟(120000);电压 =模拟读取(温度计)* 3.3;电压 /=1024.0;温度 C =(电压 - 0.5) * 100; tm =map(温度C, -40, 125, 0, 255); tm6 =约束 (tm, 0, 255);延迟(120000);电压 =模拟读取(温度计)* 3.3;电压 /=1024.0;温度 C =(电压 - 0.5) * 100; tm =map(温度C, -40, 125, 0, 255); tm7 =约束 (tm, 0, 255);延迟(120000);电压 =模拟读取(温度计)* 3.3;电压 /=1024.0;温度 C =(电压 - 0.5) * 100; tm =map(温度C, -40, 125, 0, 255); tm8 =约束 (tm, 0, 255);延迟(120000);电压 =模拟读取(温度计)* 3.3;电压 /=1024.0;温度 C =(电压 - 0.5) * 100; tm =map(温度C, -40, 125, 0, 255); tm9 =约束 (tm, 0, 255);延迟(120000);电压 =模拟读取(温度计)* 3.3;电压 /=1024.0;温度 C =(电压 - 0.5) * 100; tm =map(温度C, -40, 125, 0, 255); tm10 =约束 (tm, 0, 255);延迟(120000);电压 =模拟读取(温度计)* 3.3;电压 /=1024.0;温度 C =(电压 - 0.5) * 100; tm =map(温度C, -40, 125, 0, 255); tm11 =约束 (tm, 0, 255);延迟(120000);电压 =模拟读取(温度计)* 3.3;电压 /=1024.0;温度 C =(电压 - 0.5) * 100; tm =map(温度C, -40, 125, 0, 255); tm12 =约束 (tm, 0, 255);延迟(120000);电压 =模拟读取(温度计)* 3.3;电压 /=1024.0;温度 C =(电压 - 0.5) * 100; tm =map(温度C, -40, 125, 0, 255); tm13 =约束 (tm, 0, 255);延迟(120000);电压 =模拟读取(温度计)* 3.3;电压 /=1024.0;温度 C =(电压 - 0.5) * 100; tm =map(温度C, -40, 125, 0, 255); tm14 =约束 (tm, 0, 255);延迟(120000);电压 =模拟读取(温度计)* 3.3;电压 /=1024.0;温度 C =(电压 - 0.5) * 100; tm =map(温度C, -40, 125, 0, 255); tm15 =约束 (tm, 0, 255); // 在第一个学习期间,植物浇水将在该月的温度高峰期进行。 if ((month() ==1 || month() ==2 || month() ==11 || month() ==12) &&hour() ==12) { lcd.clear(); lcd.setCursor(0, 0); lcd.print("正在运行..."); // 如果不下雨且土壤湿度足够低,则给植物浇水。 int readRain =digitalRead(rainSensor); if (readRain ==HIGH) { lcd.setCursor(0, 1); lcd.print("现在在下雨。");转到a2; } // 取消使用湿度传感器的注释。 //else if (analogRead(湿度1)> 400 ||analogRead(湿度2)> 400) // 调整这些以匹配您的土壤。 //{ //lcd.setCursor(0, 1); //lcd.print("土壤太湿了。"); //转到a2; //} else { waterPipe.write(135);延迟(7000); // 浇水 7 秒。 waterPipe.write(0); } lcd.setCursor(0, 1); lcd.print(“完成”);a2:延迟(3000);液晶显示器(); lcd.setCursor(0, 0); lcd.print("学习"); } else if ((month() ==3 || month() ==4 || month() ==10) &&hour() ==14) { lcd.clear(); lcd.setCursor(0, 0); lcd.print("正在运行...");液晶显示器(); lcd.setCursor(0, 0); lcd.print("正在运行..."); // 如果不下雨且土壤湿度足够低,则给植物浇水。 int readRain =digitalRead(rainSensor); if (readRain ==HIGH) { lcd.setCursor(0, 1); lcd.print("现在在下雨。");转到a31; } // 取消使用湿度传感器的注释。 //else if (analogRead(湿度1)> 400 ||analogRead(湿度2)> 400) // 调整这些以匹配您的土壤。 //{ //lcd.setCursor(0, 1); //lcd.print("土壤太湿了。"); //转到a31; //} else { waterPipe.write(135);延迟(7000); // 浇水 7 秒。 waterPipe.write(0); } lcd.setCursor(0, 1); lcd.print(“完成”);a31:延迟(3000);液晶显示器(); lcd.setCursor(0, 0); lcd.print("学习");液晶显示器(); lcd.setCursor(0, 0); lcd.print("学习"); } else if ((month() ==5 || month() ==6 || month() ==9) &&hour() ==15) { lcd.clear(); lcd.setCursor(0, 0); lcd.print("正在运行...");液晶显示器(); lcd.setCursor(0, 0); lcd.print("正在运行..."); // 如果不下雨且土壤湿度足够低,则给植物浇水。 int readRain =digitalRead(rainSensor); if (readRain ==HIGH) { lcd.setCursor(0, 1); lcd.print("现在在下雨。");转到a3; } // 取消使用湿度传感器的注释。 //else if (analogRead(湿度1)> 400 ||analogRead(湿度2)> 400) // 调整这些以匹配您的土壤。 //{ //lcd.setCursor(0, 1); //lcd.print("土壤太湿了。"); //转到a3; //} else { waterPipe.write(135);延迟(7000); // 浇水 7 秒。 waterPipe.write(0); } lcd.setCursor(0, 1); lcd.print(“完成”);a3:延迟(3000);液晶显示器(); lcd.setCursor(0, 0); lcd.print("学习"); } else if ((month() ==7 || month() ==8) &&hour() ==16) { lcd.clear(); lcd.setCursor(0, 0); lcd.print("正在运行...");液晶显示器(); lcd.setCursor(0, 0); lcd.print("正在运行..."); // 如果不下雨且土壤湿度足够低,则给植物浇水。 int readRain =digitalRead(rainSensor); if (readRain ==HIGH) { lcd.setCursor(0, 1); lcd.print("现在在下雨。");转到a4; } // 取消使用湿度传感器的注释。 //else if (analogRead(湿度1)> 400 ||analogRead(湿度2)> 400) // 调整这些以匹配您的土壤。 //{ //lcd.setCursor(0, 1); //lcd.print("土壤太湿了。"); //转到a4; //} else { waterPipe.write(135);延迟(7000); // 浇水 7 秒。 waterPipe.write(0); } lcd.setCursor(0, 1); lcd.print(“完成”);a4:延迟(3000);液晶显示器(); lcd.setCursor(0, 0); lcd.print("学习"); } 延迟(110000);电压 =模拟读取(温度计)* 3.3;电压 /=1024.0;温度 C =(电压 - 0.5) * 100; tm =map(温度C, -40, 125, 0, 255); tm16 =约束 (tm, 0, 255);延迟(120000);电压 =模拟读取(温度计)* 3.3;电压 /=1024.0;温度 C =(电压 - 0.5) * 100; tm =map(温度C, -40, 125, 0, 255); tm17 =约束 (tm, 0, 255);延迟(120000);电压 =模拟读取(温度计)* 3.3;电压 /=1024.0;温度 C =(电压 - 0.5) * 100; tm =map(温度C, -40, 125, 0, 255); tm18 =约束 (tm, 0, 255);延迟(120000);电压 =模拟读取(温度计)* 3.3;电压 /=1024.0;温度 C =(电压 - 0.5) * 100; tm =map(温度C, -40, 125, 0, 255); tm19 =约束 (tm, 0, 255);延迟(120000);电压 =模拟读取(温度计)* 3.3;电压 /=1024.0;温度 C =(电压 - 0.5) * 100; tm =map(温度C, -40, 125, 0, 255); tm20 =约束 (tm, 0, 255);延迟(120000);电压 =模拟读取(温度计)* 3.3;电压 /=1024.0;温度 C =(电压 - 0.5) * 100; tm =map(温度C, -40, 125, 0, 255); tm21 =约束 (tm, 0, 255);延迟(120000);电压 =模拟读取(温度计)* 3.3;电压 /=1024.0;温度 C =(电压 - 0.5) * 100; tm =map(温度C, -40, 125, 0, 255); tm22 =约束 (tm, 0, 255);延迟(120000);电压 =模拟读取(温度计)* 3.3;电压 /=1024.0;温度 C =(电压 - 0.5) * 100; tm =map(温度C, -40, 125, 0, 255); tm23 =约束 (tm, 0, 255);延迟(120000);电压 =模拟读取(温度计)* 3.3;电压 /=1024.0;温度 C =(电压 - 0.5) * 100; tm =map(温度C, -40, 125, 0, 255); tm24 =约束 (tm, 0, 255);延迟(120000);电压 =模拟读取(温度计)* 3.3;电压 /=1024.0;温度 C =(电压 - 0.5) * 100; tm =map(温度C, -40, 125, 0, 255); tm25 =约束 (tm, 0, 255);延迟(120000);电压 =模拟读取(温度计)* 3.3;电压 /=1024.0;温度 C =(电压 - 0.5) * 100; tm =map(温度C, -40, 125, 0, 255); tm26 =约束 (tm, 0, 255);延迟(120000);电压 =模拟读取(温度计)* 3.3;电压 /=1024.0;温度 C =(电压 - 0.5) * 100; tm =map(温度C, -40, 125, 0, 255); tm27 =约束 (tm, 0, 255);延迟(120000);电压 =模拟读取(温度计)* 3.3;电压 /=1024.0;温度 C =(电压 - 0.5) * 100; tm =map(温度C, -40, 125, 0, 255); tm28 =约束 (tm, 0, 255);延迟(120000);电压 =模拟读取(温度计)* 3.3;电压 /=1024.0;温度 C =(电压 - 0.5) * 100; tm =map(温度C, -40, 125, 0, 255); tm29 =约束 (tm, 0, 255);延迟(120000);电压 =模拟读取(温度计)* 3.3;电压 /=1024.0;温度 C =(电压 - 0.5) * 100; tm =map(温度C, -40, 125, 0, 255); tm30 =约束 (tm, 0, 255);延迟(120000); // 将数据重新转换为温度传感器的规格。 tm1 =地图(tm1, 0, 255, -40, 125); tm1 =约束(tm1,-40,125); tm2 =地图(tm2, 0, 255, -40, 125); tm2 =约束 (tm2, -40, 125); tm3 =地图(tm3, 0, 255, -40, 125); tm3 =约束(tm3,-40,125); tm4 =地图(tm4, 0, 255, -40, 125); tm4 =约束(tm4,-40,125); tm5 =地图(tm5, 0, 255, -40, 125); tm5 =约束(tm5,-40,125); tm6 =地图(tm6, 0, 255, -40, 125); tm6 =约束 (tm6, -40, 125); tm7 =地图 (tm7, 0, 255, -40, 125); tm7 =约束(tm7,-40,125); tm8 =地图(tm8, 0, 255, -40, 125); tm8 =约束(tm8,-40,125); tm9 =地图(tm9, 0, 255, -40, 125); tm9 =约束(tm9,-40,125); tm10 =地图 (tm10, 0, 255, -40, 125); tm10 =约束(tm10,-40,125); tm11 =地图(tm11, 0, 255, -40, 125); tm11 =约束(tm11,-40,125); tm12 =地图(tm12, 0, 255, -40, 125); tm12 =约束 (tm12, -40, 125); tm13 =地图(tm13, 0, 255, -40, 125); tm13 =约束(tm13,-40,125); tm14 =map(tm14, 0, 255, -40, 125); tm14 =constrain(tm14, -40, 125); tm15 =map(tm15, 0, 255, -40, 125); tm15 =constrain(tm15, -40, 125); tm16 =map(tm16, 0, 255, -40, 125); tm16 =constrain(tm16, -40, 125); tm17 =map(tm17, 0, 255, -40, 125); tm17 =constrain(tm17, -40, 125); tm18 =map(tm18, 0, 255, -40, 125); tm18 =constrain(tm18, -40, 125); tm19 =map(tm19, 0, 255, -40, 125); tm19 =constrain(tm19, -40, 125); tm20 =map(tm20, 0, 255, -40, 125); tm20 =constrain(tm20, -40, 125); tm21 =map(tm21, 0, 255, -40, 125); tm21 =constrain(tm21, -40, 125); tm22 =map(tm22, 0, 255, -40, 125); tm22 =constrain(tm22, -40, 125); tm23 =map(tm23, 0, 255, -40, 125); tm23 =constrain(tm23, -40, 125); tm24 =map(tm24, 0, 255, -40, 125); tm24 =constrain(tm24, -40, 125); tm25 =map(tm25, 0, 255, -40, 125); tm25 =constrain(tm25, -40, 125); tm26 =map(tm26, 0, 255, -40, 125); tm26 =constrain(tm26, -40, 125); tm27 =map(tm27, 0, 255, -40, 125); tm27 =constrain(tm27, -40, 125); tm28 =map(tm28, 0, 255, -40, 125); tm28 =constrain(tm28, -40, 125); tm29 =map(tm29, 0, 255, -40, 125); tm29 =constrain(tm29, -40, 125); tm30 =map(tm30, 0, 255, -40, 125); tm30 =constrain(tm30, -40, 125); // Find the arithmetic mean and commit it to memory. average =(tm2 + tm3 + tm4 + tm5 + tm6 + tm7 + tm8 + tm9 + tm10 + tm11 + tm12 + tm13 + tm14 + tm15 + tm16 + tm17 + tm18 + tm19 + tm20 + tm21 + tm22 + tm23 + tm24 + tm25 + tm26 + tm27 + tm28 + tm29 + tm30) / 29; commitSample(i, average); } saveNetworkKnowledge(); // Save this new data to flash memory.z:delay(1);}void commitSample (int category, uint8_t s1){ // Commit to memory a single vector (the average), along with the category, which represents the hour of that data. uint8_t vector[1]; vector[0] =s1; CuriePME.learn(vector, 1, category);}void loop() { // Infinitely repeats. /* This code attempts to classify the optimum temperature for watering plants, 25 Celsius, among the data learned by the PME. If it can classify the data, the returned category becomes the hour at which the plant will be watered. The data is then erased and relearned, which infinitely repeats. IF IT CANNOT CLASSIFY THE DATA, it will take the monthly defaults from earlier in the sketch. */ uint8_t vector[1]; vector[0] =25; int answer =CuriePME.classify(vector, 1 ); if (answer ==CuriePME.noMatch) { lcd.clear(); lcd.setCursor(0, 0); lcd.print("NO MATCHES!"); if (month() ==1 || month() ==2 || month() ==11 || month() ==12) { answer =12; } else if (month() ==3 || month() ==4 || month() ==10) { answer =14; } else if (month() ==5 || month() ==6 || month() ==9) { answer =15; } else if (month() ==7 || month() ==8) { answer =16; } } else { lcd.clear(); lcd.setCursor(0, 0); lcd.print("Category:"); lcd.setCursor(0, 1); lcd.print(answer); } delay(3000);液晶显示器(); lcd.setCursor(0, 0); lcd.print("Optimization Done");延迟(3000); CuriePME.forget(); // Erase and relearn. This does not erase the flash memory.液晶显示器(); lcd.setCursor(0, 0); lcd.print("Waiting"); while (hour() !=8);液晶显示器(); lcd.setCursor(0, 0); lcd.print("Learning"); // Learn the data again. for (int i =8; i <22; i++) { voltage =analogRead(thermometer) * 3.3; voltage /=1024.0; temperatureC =(voltage - 0.5) * 100; tm =map(temperatureC, -40, 125, 0, 255); tm1 =constrain(tm, 0, 255); delay(120000); voltage =analogRead(thermometer) * 3.3; voltage /=1024.0; temperatureC =(voltage - 0.5) * 100; tm =map(temperatureC, -40, 125, 0, 255); tm2 =constrain(tm, 0, 255); delay(120000); voltage =analogRead(thermometer) * 3.3; voltage /=1024.0; temperatureC =(voltage - 0.5) * 100; tm =map(temperatureC, -40, 125, 0, 255); tm3 =constrain(tm, 0, 255); delay(120000); voltage =analogRead(thermometer) * 3.3; voltage /=1024.0; temperatureC =(voltage - 0.5) * 100; tm =map(temperatureC, -40, 125, 0, 255); tm4 =constrain(tm, 0, 255); delay(120000); voltage =analogRead(thermometer) * 3.3; voltage /=1024.0; temperatureC =(voltage - 0.5) * 100; tm =map(temperatureC, -40, 125, 0, 255); tm5 =constrain(tm, 0, 255); delay(120000); voltage =analogRead(thermometer) * 3.3; voltage /=1024.0; temperatureC =(voltage - 0.5) * 100; tm =map(temperatureC, -40, 125, 0, 255); tm6 =constrain(tm, 0, 255); delay(120000); voltage =analogRead(thermometer) * 3.3; voltage /=1024.0; temperatureC =(voltage - 0.5) * 100; tm =map(temperatureC, -40, 125, 0, 255); tm7 =constrain(tm, 0, 255); delay(120000); voltage =analogRead(thermometer) * 3.3; voltage /=1024.0; temperatureC =(voltage - 0.5) * 100; tm =map(temperatureC, -40, 125, 0, 255); tm8 =constrain(tm, 0, 255); delay(120000); voltage =analogRead(thermometer) * 3.3; voltage /=1024.0; temperatureC =(voltage - 0.5) * 100; tm =map(temperatureC, -40, 125, 0, 255); tm9 =constrain(tm, 0, 255); delay(120000); voltage =analogRead(thermometer) * 3.3; voltage /=1024.0; temperatureC =(voltage - 0.5) * 100; tm =map(temperatureC, -40, 125, 0, 255); tm10 =constrain(tm, 0, 255); delay(120000); voltage =analogRead(thermometer) * 3.3; voltage /=1024.0; temperatureC =(voltage - 0.5) * 100; tm =map(temperatureC, -40, 125, 0, 255); tm11 =constrain(tm, 0, 255); delay(120000); voltage =analogRead(thermometer) * 3.3; voltage /=1024.0; temperatureC =(voltage - 0.5) * 100; tm =map(temperatureC, -40, 125, 0, 255); tm12 =constrain(tm, 0, 255); delay(120000); voltage =analogRead(thermometer) * 3.3; voltage /=1024.0; temperatureC =(voltage - 0.5) * 100; tm =map(temperatureC, -40, 125, 0, 255); tm13 =constrain(tm, 0, 255); delay(120000); voltage =analogRead(thermometer) * 3.3; voltage /=1024.0; temperatureC =(voltage - 0.5) * 100; tm =map(temperatureC, -40, 125, 0, 255); tm14 =constrain(tm, 0, 255); delay(120000); voltage =analogRead(thermometer) * 3.3; voltage /=1024.0; temperatureC =(voltage - 0.5) * 100; tm =map(temperatureC, -40, 125, 0, 255); tm15 =constrain(tm, 0, 255); // The time in the day at which to water the plant, as determined by the PME. if (hour() ==answer) { lcd.clear(); lcd.setCursor(0, 0); lcd.print("Running..."); // Water the plant if it is not raining and soil moisture is low enough. int readRain =digitalRead(rainSensor); if (readRain ==HIGH) { lcd.setCursor(0, 1); lcd.print("Raining right now."); goto a5; } // Uncomment to use moisture sensors. //else if (analogRead(humidity1)> 400 || analogRead(humidity2)> 400) // Adjust these to match your soil. //{ // lcd.setCursor(0, 1); // lcd.print("Soil too moist."); // goto a5; //} else { waterPipe.write(135);延迟(7000); // Water for 7 seconds. waterPipe.write(0); } lcd.setCursor(0, 1); lcd.print("Done");a5:delay(3000);液晶显示器(); lcd.setCursor(0, 0); lcd.print("Learning"); } delay(110000); voltage =analogRead(thermometer) * 3.3; voltage /=1024.0; temperatureC =(voltage - 0.5) * 100; tm =map(temperatureC, -40, 125, 0, 255); tm16 =constrain(tm, 0, 255); delay(120000); voltage =analogRead(thermometer) * 3.3; voltage /=1024.0; temperatureC =(voltage - 0.5) * 100; tm =map(temperatureC, -40, 125, 0, 255); tm17 =constrain(tm, 0, 255); delay(120000); voltage =analogRead(thermometer) * 3.3; voltage /=1024.0; temperatureC =(voltage - 0.5) * 100; tm =map(temperatureC, -40, 125, 0, 255); tm18 =constrain(tm, 0, 255); delay(120000); voltage =analogRead(thermometer) * 3.3; voltage /=1024.0; temperatureC =(voltage - 0.5) * 100; tm =map(temperatureC, -40, 125, 0, 255); tm19 =constrain(tm, 0, 255); delay(120000); voltage =analogRead(thermometer) * 3.3; voltage /=1024.0; temperatureC =(voltage - 0.5) * 100; tm =map(temperatureC, -40, 125, 0, 255); tm20 =constrain(tm, 0, 255); delay(120000); voltage =analogRead(thermometer) * 3.3; voltage /=1024.0; temperatureC =(voltage - 0.5) * 100; tm =map(temperatureC, -40, 125, 0, 255); tm21 =constrain(tm, 0, 255); delay(120000); voltage =analogRead(thermometer) * 3.3; voltage /=1024.0; temperatureC =(voltage - 0.5) * 100; tm =map(temperatureC, -40, 125, 0, 255); tm22 =constrain(tm, 0, 255); delay(120000); voltage =analogRead(thermometer) * 3.3; voltage /=1024.0; temperatureC =(voltage - 0.5) * 100; tm =map(temperatureC, -40, 125, 0, 255); tm23 =constrain(tm, 0, 255); delay(120000); voltage =analogRead(thermometer) * 3.3; voltage /=1024.0; temperatureC =(voltage - 0.5) * 100; tm =map(temperatureC, -40, 125, 0, 255); tm24 =constrain(tm, 0, 255); delay(120000); voltage =analogRead(thermometer) * 3.3; voltage /=1024.0; temperatureC =(voltage - 0.5) * 100; tm =map(temperatureC, -40, 125, 0, 255); tm25 =constrain(tm, 0, 255); delay(120000); voltage =analogRead(thermometer) * 3.3; voltage /=1024.0; temperatureC =(voltage - 0.5) * 100; tm =map(temperatureC, -40, 125, 0, 255); tm26 =constrain(tm, 0, 255); delay(120000); voltage =analogRead(thermometer) * 3.3; voltage /=1024.0; temperatureC =(voltage - 0.5) * 100; tm =map(temperatureC, -40, 125, 0, 255); tm27 =constrain(tm, 0, 255); delay(120000); voltage =analogRead(thermometer) * 3.3; voltage /=1024.0; temperatureC =(voltage - 0.5) * 100; tm =map(temperatureC, -40, 125, 0, 255); tm28 =constrain(tm, 0, 255); delay(120000); voltage =analogRead(thermometer) * 3.3; voltage /=1024.0; temperatureC =(voltage - 0.5) * 100; tm =map(temperatureC, -40, 125, 0, 255); tm29 =constrain(tm, 0, 255); delay(120000); voltage =analogRead(thermometer) * 3.3; voltage /=1024.0; temperatureC =(voltage - 0.5) * 100; tm =map(temperatureC, -40, 125, 0, 255); tm30 =constrain(tm, 0, 255); delay(120000); tm1 =map(tm1, 0, 255, -40, 125); tm1 =constrain(tm1, -40, 125); tm2 =map(tm2, 0, 255, -40, 125); tm2 =constrain(tm2, -40, 125); tm3 =map(tm3, 0, 255, -40, 125); tm3 =constrain(tm3, -40, 125); tm4 =map(tm4, 0, 255, -40, 125); tm4 =constrain(tm4, -40, 125); tm5 =map(tm5, 0, 255, -40, 125); tm5 =constrain(tm5, -40, 125); tm6 =map(tm6, 0, 255, -40, 125); tm6 =constrain(tm6, -40, 125); tm7 =map(tm7, 0, 255, -40, 125); tm7 =constrain(tm7, -40, 125); tm8 =map(tm8, 0, 255, -40, 125); tm8 =constrain(tm8, -40, 125); tm9 =map(tm9, 0, 255, -40, 125); tm9 =constrain(tm9, -40, 125); tm10 =map(tm10, 0, 255, -40, 125); tm10 =constrain(tm10, -40, 125); tm11 =map(tm11, 0, 255, -40, 125); tm11 =constrain(tm11, -40, 125); tm12 =map(tm12, 0, 255, -40, 125); tm12 =constrain(tm12, -40, 125); tm13 =map(tm13, 0, 255, -40, 125); tm13 =constrain(tm13, -40, 125); tm14 =map(tm14, 0, 255, -40, 125); tm14 =constrain(tm14, -40, 125); tm15 =map(tm15, 0, 255, -40, 125); tm15 =constrain(tm15, -40, 125); tm16 =map(tm16, 0, 255, -40, 125); tm16 =constrain(tm16, -40, 125); tm17 =map(tm17, 0, 255, -40, 125); tm17 =constrain(tm17, -40, 125); tm18 =map(tm18, 0, 255, -40, 125); tm18 =constrain(tm18, -40, 125); tm19 =map(tm19, 0, 255, -40, 125); tm19 =constrain(tm19, -40, 125); tm20 =map(tm20, 0, 255, -40, 125); tm20 =constrain(tm20, -40, 125); tm21 =map(tm21, 0, 255, -40, 125); tm21 =constrain(tm21, -40, 125); tm22 =map(tm22, 0, 255, -40, 125); tm22 =constrain(tm22, -40, 125); tm23 =map(tm23, 0, 255, -40, 125); tm23 =constrain(tm23, -40, 125); tm24 =map(tm24, 0, 255, -40, 125); tm24 =constrain(tm24, -40, 125); tm25 =map(tm25, 0, 255, -40, 125); tm25 =constrain(tm25, -40, 125); tm26 =map(tm26, 0, 255, -40, 125); tm26 =constrain(tm26, -40, 125); tm27 =map(tm27, 0, 255, -40, 125); tm27 =constrain(tm27, -40, 125); tm28 =map(tm28, 0, 255, -40, 125); tm28 =constrain(tm28, -40, 125); tm29 =map(tm29, 0, 255, -40, 125); tm29 =constrain(tm29, -40, 125); tm30 =map(tm30, 0, 255, -40, 125); tm30 =constrain(tm30, -40, 125); average =(tm2 + tm3 + tm4 + tm5 + tm6 + tm7 + tm8 + tm9 + tm10 + tm11 + tm12 + tm13 + tm14 + tm15 + tm16 + tm17 + tm18 + tm19 + tm20 + tm21 + tm22 + tm23 + tm24 + tm25 + tm26 + tm27 + tm28 + tm29 + tm30) / 29; progav =(tm30 - tm2) / 2; commitSample(i, average); }}/* A quick note on the flash memory data:The data will only ever be saved once; that is, it cannot be changed with this code. As a result, if the device loses power, IT WILL DEFAULT TO THE SETTINGS OF THE FIRST TIME IT WAS USED WHEN IT IS REACTIVATED, even if the monthly averages have changed. Keeping the device on an extra day will allow it to software obtain new averages, but the flash memory will stay the same. To erase flash completely, upload "EraseEverything" from "CurieSerialFlash" in the IDE. Then reupload this sketch to save new averages to the flash memory.*/void saveNetworkKnowledge() // Code for saving to flash memory....This file has been truncated, please download it to see its full contents.

示意图

Fritzing diagram for the circuit. Note that batteries would be attached on the left. The soil moisture sensors are optional. rainpoweredsmartirrigationsystem_OHtd4bVfb3.fzz

制造工艺

  1. 钛合金
  2. 响板
  3. 胶水
  4. 线程
  5. 乙炔
  6. 石棉
  7. 骰子
  8. 胶合板
  9. Tin
  10. 银色
  11. Raspberry Pi 自动浇灌网站
  12. 西门子、宾利推出加速工厂数字化的解决方案