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

hydroMazing 智能花园系统

组件和用品

Raspberry Pi 3 B 型
可选 - 物联网 - 短信
× 1
Arduino Nano R3
× 2
Arduino Nano 扩展板
× 2
DHT21/22 温度/湿度传感器
Vcc/Data 之间可能需要一个 10k 的电阻
× 1
光电模块
× 1
nRF24L01 2.4Ghz 无线电收发器模块
有或没有 SMA 天线
× 1
达拉斯温度传感器(用于营养液温度)
可能需要一个连接器
× 1
433MHz 射频发射器和接收器模块
× 1
设置 3-5 包无线控制插座,包括遥控器
× 1
DFRobot LCD 带按钮 Arduino Uno 屏蔽
× 1

必要的工具和机器

烙铁(通用)

应用和在线服务

Arduino IDE
Microsoft Visual Studio 2015

关于这个项目



做产品不是我的本意。我只是想解决一个常见的问题。我想在室内或受控条件下种植植物。如何使用常用的电子产品和家居用品为植物创造最佳环境?土壤和水培哪个最好?

HydroMazing 是一种工具,可以更轻松地为在家中成功种植植物提供最佳生长条件。位于您自己设备上的独立数据收集系统和网络界面,而不是远程云。

~

学习如何种植植物可能既复杂又昂贵。植物是有弹性的,但只是一个无心的疏忽就会毁了你的庄稼。通过让智能园艺系统为您完成繁重的工作,您可以避免这些代价高昂的错误!

两年前,我决定尝试使用 Arduino Uno 微控制器来替换我的个人 Lux WIN100 加热和冷却可编程出口恒温器。这些出口控制设备,例如小型加热器,或者在这种情况下是通风扇。插入插座的设备使用您手动编程到每个设备中的温度设置来打开和关闭设备。这种控制换气扇的技术很有效,但需要使用多条延长线。温度出口控制器使用老式继电器来切换设备的状态。我最初的尝试是破解一个扩展盒,将我自己的继电器插入其中并将它们连接到 Arduino Uno。没过多久就出现了一堆带有许多连接器螺母的电线,让我感到气馁。

家庭自动化

我脑子里闪过一段时间的家庭自动化想法是使用无线控制的交流电源插座,使用手持遥控器。破解遥控器以发送由 Arduino Uno 上相应引脚选择的 ON 或 OFF 按钮的信号应该不会太难,对吧?阻止我测试这个想法的烦人的担忧是担心信号不可靠并且 Uno 可能会“认为”它在实际失败时打开了设备。最终,我能够说服自己,找出答案的最好方法就是尝试看看会发生什么。不幸的是,这次测试的结果并不比接力尝试好多少。

在网络上搜索几乎所有带有“Arduino”的传感器或电子玩具爸爸,都会导致许多产品以几美元的价格出售。在这种情况下,我发现了 315Mhz 和 433Mhz 发射器和接收器对,它们在大多数商业无线控制插座的频率范围内。将 Arduino 系列微控制器用于这些类型的项目的最大优势在于,您可以找到开源软件以开始使用。在网上再次搜索“Arduino 库”,在这种情况下,是发送器和接收器或 tx/rx 对。现在,这对我来说越来越令人兴奋。我可以读取遥控器发出的代码,记录它们,然后对 Arduino 进行编程以控制相应的插座。设计在 Arduino Uno 上运行的软件成为一项挑战。 Arduino 软件附带的示例和库中包含的示例是项目的良好开端。根据我的经验,一旦您开始对示例进行组合和修改,很快就会遇到困难。我不认为我是一个好的程序员,我认为我是一个顽固的完美主义者。

在我最喜欢的一本书《禅与摩托车维修艺术》中,作者 Robert Pirsig 谈到了进取心陷阱。从本质上讲,进取心陷阱是一种事件或心态,它会导致一个人失去热情,对开始或继续一个项目感到气馁。知道何时克服不适和挫折,何时休息并离开项目是个人挑战。有时候,如果我休息一下,我可能不会想出一个很好的解决方案来解决我的源代码中的冲突。相反,有时我会离开一个月并从事一个完全不同类型的项目,感觉重新焕发活力。也许,如果该项目足够重要,我们将被迫返回工作。陷阱是说服我们自己,即使项目可能很棒,也不值得返回。也许真的不值得返回完成,这是许多项目结束的地方。

编程

我开发的软件已被编程到微控制器中,并具有一组用于计时、管理、传输和接收“传感器”对象和“设备”对象的基本参数。电器的控制是通过我命名为“TheDecider”的一组算法实现的,它根据传感器读数和预编程的阈值做出决定,并提示微控制器打开或关闭无线控制的插座。我希望系统可以轻松修改以与其他环境一起使用,包括鱼菜共生、蘑菇种植以及通过读取传感器和基于编程规则操作设备来实现控制的任何环境。事实证明,无线控制的插座是一种使用 Arduino 控制风扇的可靠方法,可根据温度传感器的读数发送信号。没过多久,源代码就进化成了野兽。 Arduino 系列微控制器在它可以运行的指令数量方面受到限制,当您想要控制多个闪烁的 LED 时,达到程序大小限制不会花费很长时间。我发现大小限制迫使我编写比最初更好、更高效的代码。即使有了创造性的变量处理和自定义库,最终还是需要另一个微控制器或迁移到更大的微控制器。

无互联网无线监控

微控制器可以通过多种方式相互通信。我能找到的最便宜的无线方法是 nRF24L01 无线电收发器。该模块是一种低功耗、轻量级的蓝牙,使 HydroMazing 能够与监控单元进行通信。

我决定添加另一个带有液晶显示屏屏蔽的 Arduino Uno,以便我可以显示传感器正在读取的内容、设备状态以及带有通知的警报。

我制作了自己的开放且适应性强的平台,可以根据各种园艺需求和条件进行定制;然而,也是一个独立的无线系统。该系统的开放式架构允许轻松集成互联网连接和网络服务。

互联网监控

进入与nRF24L01模块相连的树莓派。

我能够修改我的大部分 Arduino 源代码来监听传入的传输,然后将该数据写入几个文件。首先是一个日志文件,用于捕获 Pi 和 hydroMazing Monitor 之间的所有通信。接下来,我让程序写出所有传感器对象的当前状态和所有设备对象的文件。当警报发生时,程序将创建一个包含该警报的文件。然后我添加了一个 PHP 脚本来从它们各自的文件中读取数据对象并在 Pi 的 Apache 服务器上实时显示。

接下来,我编写了一个 Python 脚本来读取警报文件的目录,如果存在,则读取该文件,解析出相关信息,然后通过电子邮件或通过 SMS 文本发送给用户。除了发送电子邮件或文本警报之外,python 脚本还将警报文件移动到 PHP 脚本读取和显示的位置。使用创建的日志文件,我能够将数据导入数据库。一旦 HydroMazing 的数据被记录到驻留在 Raspberry Pi 上的数据库中,我们就可以开始执行分析并生成一些报告。监控和控制系统主要是为我们完成的,但是当 HydroMazing 需要提醒我们出现问题时,它现在可以使用 Raspberry Pi。

引导您完成整个成长过程的水迷宫花园向导!该系统提供有关如何管理 HydroMazing 发现的问题的反馈和提示。 http://www.hydroMazing.com

营养液监测

必须监测水培容器系统的营养液液位。

随着营养液液位下降,需要补充淡水,否则营养液会变得更浓,一些植物反应不佳。 HydroMazing Nutrient Controller 可以启动一个泵来添加淡水,使浓度恢复到启动时的水平,通常称为“加水”。 HydroMazing 营养控制器还将监控您的 pH 值和 EC,激活泵来管理溶液,并在您需要进行更改时通知您。

想要更多吗?

  • 存在危机 - Arduino 角色扮演游戏模拟器
  • 既然可以购买,为什么还要 DIY?
  • 什么是“智能”花园?
  • 启动智能室内花园
  • 深入了解室内园艺
  • 室内园艺:会出现什么问题?
  • 管理营养液系统
  • 为什么可以使用 Arduino 来做圆周率?

代码

  • 对象设置
对象设置C/C++
CoreSettings.h 文件包含许多关键设置,包括 nRF 网络、AC 插座远程开关代码、HydroMazing 系统使用的定时器、设备和传感器对象定义。
/** @file CoreSettings.h* 版权所有 ( C) 2015 Cory J. Potter - 保留所有权利* 您可以根据 LICENSE.txt* 的*条款使用、分发和修改此代码!*您应该已经收到了 LICENSE.txt 的副本* 这个文件。如果没有,请写信至:*/#ifndef __CORESETTINGS_H__#define __CORESETTINGS_H__#ifdef ARDUINO//达拉斯温度探测器使用的RX_PIN 3#define RX_PIN 103#define TONE_PIN 104#define What TX_PIN 8是我们的地址 1 或 2uint8_t node_address =1;uint8_t totalNodes =3;unsigned long lastRxTimeStamp =0;const uint64_t nRFbaseAddress =1034834473100;uint8_t nRFaddress =0; // 00 - 255 //注: “LL” 以恒定的端部是 “LONGLONG” 类型// 1034834473185,1034834473170 //常量uint64_t中tx_pipes [5] ={0xF0F0F0F0E1LL,0xF0F0F0F0D2LL,0xF0F0F0F141LL,0xF0F0F0F1B0LL,0xF0F0F0F1BBLL}; //常量uint64_t中rx_pipes [5] ={0xF0F0F0F22ALL,0xF0F0F0F299LL,0xF0F0F0F308LL,0xF0F0F0F377LL,0xF0F0F0F3E6LL}; // uint64_t中tx_pipes [3] ={0xF0F0F0F0E8LL,0xF0F0F0F0E7LL,0xF0F0F0F0E6LL}; // uint64_t中rx_pipes [3] ={0xF0F0F0F0E1LL,0xF0F0F0F0E2LL, 0xF0F0F0F0E3LL };uint64_t tx_pipes[3] ={ 0xF0F0F0F0F8LL, 0xF0F0F0F0F7LL, 0xF0F0F0F0F6LL };uint64_t rx_pipes,0Fx_pipes[3],0F0F****0Fx0F****0Fx0F****0Fx0F****0Fx0F****0F10F**** ****************************************************** ****//// 无线控制插座开关/**************************************** **********************************//// ETEKCITY #1401// unsigned long mySwitchOn[] ={ 24 , 1398067,1398211,1398531 };// unsigned long mySwitchOff[] ={ 24, 1398076,1398220,1398540 };// ETEKCITY #1405// unsigned l ong mySwitchOn[] ={ 24,1135923,1136067,1136387 };// unsigned long mySwitchOff[] ={ 24,1135932,1136076,1136396 };// ETEKCITY #1406// unsigned long mySwitch24[5],142 ,4281795,4282115 };// unsigned long mySwitchOff[] ={ 24,4281660,4281804,4282124 };// ETEKCITY #1407// unsigned long mySwitchOn[] ={ 24,87347,877//unsigned }; long mySwitchOff[] ={ 24,87356,87500,87820 };// ETEKCITY #1411// unsigned long mySwitchOn[] ={ 24,283955,284099,284419 };// unsigned long mySwitchOff[] ={ 24,283 ,284108,284428 };// ETEKCITY #1415// unsigned long mySwitchOn[] ={ 24,21811,21955,22275,23811,29955 };// unsigned long mySwitchOff[] ={ 24,219824,2221 23820,29964 };// ETEKCITY #1419// unsigned long mySwitchOn[] ={24,333107,333251,333571,335107,341251};// unsigned long mySwitchOff[] ={24,333116,333330 ,341260};// ETEKCITY #0319uint8_t totalSwitches =5;unsigned long mySwitchOn[] ={24,333107,333251,333571,335107,341251};unsigned long mySwitchOff[] ={24,33331 33260,333580,335116,341260};/**************************************** ********************************//* I2C 通信 *//********** ****************************************************** ************/const int MY_ADDRESS =42;const int SEND_TO_ADDRESS =22;/************************ ****************************************************// * 定时器 *//************************************************* ****************************//Timer Object ={ (type), (interval in millis), ready, trigger, timestamp, (指向下一个对象的指针)Timer Timer_txData ={ TIMER_TX_DATA, 30000UL, true, false, 0, NULL };// Timer Timer_Lcd ={ TIMER_LCD, 12000UL, true, false, 0, &Timer_Log };// Timer Timer_Lcd_Cycle,LCD ={CYCLEYR 6000UL, true, false, 0, &Timer_Lcd };//定时器 Timer_Lcd_Scroller ={ TIMER_LCD_SCROLLER, 500UL, true, false, 0, &Timer_Lcd_Cycle };//定时器 Timer_Ping ={ TIMER_SENSOR_READINGS, &,Time_UL, true }; /Timer Timer_Lite ={ TIMER_LITE, 180000UL, true, false, 0, &Timer_Ping };定时器Timer_Save_Settings ={ TIMER_SAVE_SETTINGS, 3600000UL, true, false, 0, &Timer_txData };//Timer Timer_Sensor_Read ={ TIMER_SENSOR_READINGS, 7000UL, true, false, 0, &Timer_Save_SETTINGS, 3600000UL, true, false, 0, &Timer_txData };//定时器 Timer_Sensor_Read ={ TIMER_SENSOR_READINGS, 7000UL, true, false, 0, &Timer_Save_SETTINGS, TIMER_SAVE_RT 时间设置},//Alert0R0Timer0, 0 , &Timer_Sensor_Read };定时器 Timer_rxData ={ TIMER_RX_DATA, 6000UL, true, false, 0, &Timer_Save_Settings };/**************************** ********************************************////初始化设备/ ****************************************************** **********************/Appliance Appliance_Light_1 ={101, 1, APPLIANCE_LIGHT, DEFAULT_TIME, true, false, OFF, NULL };// Appliance Appliance_Light_2 ={ 102, 0, APPLIANCE_LIGHT, DEFAULT_TIME, true, false, OFF, &Appliance_Light_1 };// Appliance Appliance_Light_3 ={103, 0, APPLIANCE_LIGHT, DEFAULT_TIME, true, false, OFF, &Appliance_Light_2 };Appliance Appliance_INT,APPLIANCE_IntakeFan DEFAULT_TIME, true, false, OFF, &Appliance_Light_1 };Appliance Appliance_ExhaustFan ={1 03,如图1所示,APPLIANCE_EXHAUST_FAN,DEFAULT_TIME,TRUE,FALSE,OFF,&Appliance_IntakeFan};电器Appliance_Humidifier ={102,0,APPLIANCE_HUMIDIFIER,DEFAULT_TIME,TRUE,FALSE,OFF,&Appliance_ExhaustFan};电器Appliance_Heater ={101,0,APPLIANCE_HEATER,DEFAULT_TIME, true, false, OFF, &Appliance_Humidifier };//Appliance Appliance_AirPump ={PIN4, 2, APPLIANCE_PUMP, DEFAULT_TIME, true, false, OFF, &Appliance_Heater };Appliance Appliance_FeedPump ={105, 1, APPLIANCE_PUMP, true,false, false &Appliance_Heater };uint8_t totalAppliances =6;/********************************************* ********************************//// 初始化传感器/************* ****************************************************** *********////传感器:={ pin;节点地址;传感器_类型;频率;最小值;最大值; UL 时间戳;浮点值; struct Sensor *next; }// 第一个为 NULL - 我们不能指向尚未创建的对象。Sensor Sensor_Photocell ={ PIN_A0, 1, SENSOR_PHOTO, 100, 50, 100, 0, 25, NULL };Sensor Sensor_Temp ={ PIN7, 1, SENSOR_TEMPF, 50, 70, 80, 0, 75, &Sensor_Photocell };Sensor Sensor_Humidity ={PIN7, 1, SENSOR_HUMIDITY, 50, 40, 70, 0, 50, &Sensor_Temp };Sensor Sensor_WaterTemp ={PIN7, 1, SENSOR_HUMIDITY, 50, 50, &Sensor_Temp };Sensor Sensor_WaterTemp ={PIN7, 1, SENSOR_HUMIDITY, 100, 50, 70, 0, 65, &Sensor_Humidity };Sensor Sensor_Flow ={PIN2_INT0, 2, SENSOR_FLOW, 100, 50, 50, 0, 75, &Sensor_WaterTemp };//Sensor Sensor_Microphone ={PIN_A1, SENSOR_0, 10, 100, 0, 75, &Sensor_Flow };//Sensor Sensor_Ultrasonic ={PIN_A2, 0, SENSOR_ULTRASONIC, 60, 10, 100, 0, 75, &Sensor_Microphone };//Sensor Sensor_PIR ={PIN_A2, 0, PHOTO S 10, 100, 0, 75, &Sensor_Microphone };//Sensor Sensor_Moisture ={PIN_A2, 0, SENSOR_MOISTURE, 60, 10, 100, 0, 75, &Sensor_Flow };Sensor Sensor_Float ={PIN_A2, 1, SENSOR,100 1, 0, 1, &Sensor_Flow };Sensor Sensor_Voltage ={PIN1_ TX, 1, SENSOR_VOLTAGE, 100, 0, 100, 0, 50, &Sensor_Float };uint8_t totalSensors =7;/************************* ****************************************************/ 

示意图

通过无线交流电源插座自动控制进排气扇、植物灯、加热器、除湿机和泵 本项目中常用的无线控制交流电源插座。 组装测试 hydroMazing 原型 Web 界面 用于警报通知的hydroMazing 原型Web 界面。

制造工艺

  1. Raspberry Pi 上的温度监控
  2. 使用 LM35 的基于温度的设备控制系统
  3. 使用 MCP3008 的 Raspberry Pi 上的模拟传感器
  4. 智能家居技能差距
  5. 一切都可以变得智能:最新智能城市的关键特征——第 1 部分
  6. 借助物联网驱动的液位监控系统让饮料行业更智能
  7. 5 Ws 便携式盲文显示器
  8. 了解防抱死制动系统(ABS)的工作原理
  9. 了解电子点火系统的工作原理
  10. 了解磁电机点火系统的工作原理
  11. 什么是美国制造系统?
  12. 液压系统的优势