Industriële fabricage
Industrieel internet der dingen | Industriële materialen | Onderhoud en reparatie van apparatuur | Industriële programmering |
home  MfgRobots >> Industriële fabricage >  >> Manufacturing Technology >> Productieproces

Het hydroMazing Smart Garden-systeem

Componenten en benodigdheden

Raspberry Pi 3 Model B
OPTIONEEL - Internet of Things - sms'en
× 1
Arduino Nano R3
× 2
Arduino Nano-uitbreidingsschild
× 2
DHT21/22 Temperatuur-/vochtigheidssensor
heeft mogelijk een weerstand van 10k nodig tussen Vcc/Data
× 1
Fotocelmodule
× 1
nRF24L01 2,4 Ghz draadloze radiozendontvangermodule
met of zonder SMA-antenne
× 1
Dallas temperatuursensor (voor de temperatuur van de voedingsoplossing)
heeft waarschijnlijk een connector nodig
× 1
433MHz RF-zender- en -ontvangermodules
× 1
set 3-5 pack van draadloze gecontroleerde stopcontacten inclusief afstandsbediening
× 1
DFRobot LCD met knoppen Shield voor Arduino Uno
× 1

Benodigde gereedschappen en machines

Soldeerbout (algemeen)

Apps en online services

Arduino IDE
Microsoft Visual Studio 2015

Over dit project



Het was niet mijn bedoeling om een ​​product te maken. Ik wilde gewoon een veelvoorkomend probleem oplossen. Ik wil planten binnen of onder gecontroleerde omstandigheden kweken. Hoe kan ik een optimale omgeving creëren voor planten om te gedijen met behulp van algemeen beschikbare elektronica en huishoudelijke artikelen? Wat is het beste, aarde of hydrocultuur?

hydroMazing is een hulpmiddel om het gemakkelijker te maken om optimale groeiomstandigheden te creëren voor het succesvol kweken van planten thuis. Een onafhankelijk gegevensverzamelingssysteem en webinterface op uw eigen apparaat, niet in een externe cloud.

~

Het leren kweken van planten kan ingewikkeld en kostbaar zijn. Planten zijn veerkrachtig, maar slechts één onschuldige vergissing kan uw gewas verpesten. U kunt deze kostbare fouten vermijden door een slim tuiniersysteem het harde werk voor u te laten doen!

Het was twee jaar geleden toen ik besloot om te proberen een Arduino Uno-microcontroller te gebruiken om mijn individuele Lux WIN100 programmeerbare uitlaatthermostaat voor verwarming en koeling te vervangen. Deze uitgangen sturen een apparaat aan, zoals een kleine kachel of in dit geval een ventilator. Een apparaat dat op het stopcontact is aangesloten, schakelt het apparaat in en uit met behulp van temperatuurinstellingen die u handmatig in elk apparaat programmeert. Deze techniek voor het aansturen van de ventilatoren is effectief, maar maakt gebruik van meerdere verlengsnoeren. De temperatuuruitgangsregelaars gebruiken ouderwetse relais om de toestand van het apparaat te schakelen. Mijn eerste poging was om een ​​uitbreidingsdoos te hacken door mijn eigen relais erin te steken en ze aan te sluiten op de Arduino Uno. Het duurde niet lang voordat er een wirwar van draden was met veel connectormoeren en ik voelde me ontmoedigd.

Domotica

Een idee voor domotica dat ik al een tijdje in mijn hoofd had, was om draadloos bediende AC-stopcontacten te gebruiken die een draagbare afstandsbediening gebruiken. Het hacken van de afstandsbediening om het signaal voor de AAN- of UIT-knop te verzenden die is geselecteerd door een overeenkomstige pin op de Arduino Uno, zou niet zo moeilijk moeten zijn, toch? De knagende zorg die me ervan weerhield dit idee te testen, was de angst dat het signaal niet betrouwbaar zou zijn en dat de Uno zou kunnen "denken" dat het een apparaat had ingeschakeld terwijl het feitelijk faalde. Uiteindelijk kon ik mezelf ervan overtuigen dat de beste manier om erachter te komen is om gewoon te proberen en te zien wat er gebeurt. Helaas waren de resultaten van deze test niet veel beter dan de estafettepoging.

Een zoekopdracht op internet naar bijna elke sensor of elektronische doo-dad met "Arduino" zal resulteren in een aantal producten die voor een paar dollar worden verkocht. In dit geval vond ik de zender- en ontvangerparen van 315 MHz en 433 MHz die zich binnen het frequentiebereik van de meeste commerciële draadloos bestuurde stopcontacten bevinden. Het grootste voordeel van het gebruik van de Arduino-familie van microcontrollers voor dit soort projecten, is dat je open-sourcesoftware kunt vinden om aan de slag te gaan. Nog een zoekopdracht op internet naar een "Arduino-bibliotheek" en in dit geval zender en ontvanger of tx/rx-paar. Nu werd het spannend voor mij. Ik kon de codes lezen die uit de afstandsbediening komen, ze opnemen en vervolgens de Arduino programmeren om de bijbehorende stopcontacten te bedienen. Het ontwerpen van de software om te werken op de Arduino Uno werd de uitdaging. De voorbeelden die bij de Arduino-software worden geleverd en de voorbeelden bij bibliotheken zijn een uitstekende start van een project. Mijn ervaring is dat als je eenmaal begint met combineren en wijzigingen aanbrengt in de voorbeelden, het niet lang duurt voordat je een muur raakt. Ik denk niet dat ik een goede programmeur ben, ik denk dat ik een koppige perfectionist ben.

In een van mijn favoriete boeken, Zen and the Art of Motorcycle Maintenance, spreekt de auteur, Robert Pirsig, over de gumption trap. In wezen is de gumption trap een gebeurtenis of mentaliteit die ervoor kan zorgen dat iemand zijn enthousiasme verliest en ontmoedigd raakt om een ​​project te starten of voort te zetten. Weten wanneer je het ongemak en de frustratie moet doorstaan ​​en wanneer je een pauze moet nemen en het project moet verlaten, zijn persoonlijke uitdagingen. Er zijn tijden geweest dat als ik een pauze had genomen, ik misschien geen uitstekende oplossing had bedacht voor een conflict in mijn broncode. Integendeel, er zijn tijden geweest dat ik een maand wegliep en aan een heel ander soort project werkte en ik voelde me herboren. Misschien zullen we, als het project belangrijk genoeg is, genoodzaakt zijn om er weer aan te gaan werken. De valkuil is onszelf ervan te overtuigen dat het project niet de moeite waard is om naar terug te keren, zelfs als het geweldig zou kunnen zijn. Misschien is het echt niet de moeite waard om terug te keren om het af te ronden en hier eindigen veel projecten.

Programmeren

De software die ik heb ontwikkeld, is in de microcontroller geprogrammeerd en beschikt over een set basisparameters voor het timen, beheren, verzenden en ontvangen van "sensor"-objecten en "apparaat"-objecten. De besturing van apparaten wordt bereikt door een reeks algoritmen die ik "TheDecider" heb genoemd, die beslissingen neemt op basis van sensormetingen en voorgeprogrammeerde drempels en de microcontroller ertoe aanzet de draadloos bestuurde stopcontacten in of uit te schakelen. Ik wilde dat het systeem eenvoudig kon worden aangepast om te werken met andere omgevingen, waaronder aquaponics, het kweken van paddenstoelen en alles waar controle wordt bereikt door sensoren te lezen en apparaten te bedienen op basis van geprogrammeerde regels. De draadloos bestuurde stopcontacten bleken een betrouwbare methode te zijn om de ventilatoren te besturen met behulp van de Arduino om de signalen te verzenden, afhankelijk van de meetwaarden van de temperatuursensor. Het duurde niet lang voordat de broncode tot een beest evolueerde. De Arduino-familie van microcontrollers is beperkt in het aantal instructies dat het kan uitvoeren en het bereiken van de limiet van de programmagrootte duurt niet lang als je meer dan een paar knipperende LED's wilt bedienen. Ik heb gemerkt dat de beperking van de grootte me heeft gedwongen betere, efficiëntere code te schrijven dan ik in eerste instantie doe. Zelfs met creatieve verwerking van variabelen en aangepaste bibliotheken, is er uiteindelijk behoefte aan een andere microcontroller of om over te stappen naar een grotere.

Draadloze bewaking zonder internet

Er zijn verschillende manieren waarop de microcontrollers met elkaar kunnen communiceren. De goedkoopste draadloze methode die ik kon vinden, is de nRF24L01 draadloze radiozendontvanger. De module is een low-power, lichtgewicht variant van bluetooth die hydroMazing de mogelijkheid geeft om te communiceren met een monitoring unit.

Ik besloot om nog een Arduino Uno toe te voegen met een Liquid Crystal Display-schild, zodat ik kon weergeven wat de sensoren aan het lezen waren, de status van apparaten en waarschuwingen met meldingen.

Ik heb mijn eigen open en aanpasbare platform gemaakt dat op maat kan worden aangepast aan een breed scala aan tuinbehoeften en -omstandigheden; maar toch ook een op zichzelf staand draadloos systeem. De open architectuur van het systeem zorgt voor een gemakkelijke integratie van internetconnectiviteit en webservices.

Internetbewaking

Voer de Raspberry Pi in die is aangesloten op een nRF24L01-module.

Ik was in staat om veel van mijn Arduino-broncode aan te passen om te luisteren naar inkomende transmissies en die gegevens vervolgens naar een paar bestanden te schrijven. Ten eerste een logbestand dat alle communicatie tussen de Pi en de hydroMazing Monitor vastlegt. Vervolgens laat ik het programma de huidige status van alle sensorobjecten wegschrijven en een bestand voor alle apparaatobjecten. Wanneer een waarschuwing optreedt, maakt het programma een bestand met die waarschuwing. Vervolgens heb ik een PHP-script toegevoegd om de data-objecten uit hun respectievelijke bestanden in te lezen en live weer te geven op de Pi's Apache-server.

Vervolgens heb ik een Python-script geschreven om de map voor het waarschuwingsbestand te lezen en als het bestaat, het bestand te lezen, de relevante informatie te ontleden en vervolgens de gebruiker een e-mail of sms te sturen. Naast het verzenden van een e-mail- of sms-waarschuwing, verplaatst het python-script het waarschuwingsbestand naar de positie zodat het PHP-script kan worden gelezen en weergegeven. Met behulp van de logbestanden die zijn gemaakt, kan ik de gegevens in een database importeren. Zodra de gegevens van de hydroMazing zijn vastgelegd in een database op de Raspberry Pi, kunnen we beginnen met het uitvoeren van analyses en het genereren van enkele rapporten. Het monitoren en besturen van het systeem wordt meestal voor ons gedaan, maar wanneer de hydroMazing ons op een probleem moet wijzen, kan dat nu met behulp van de Raspberry Pi.

De hydroMazing Garden Wizard die je door je hele kweek leidt! Het systeem geeft feedback en tips voor het beheren van de problemen die hydroMazing identificeert. http://www.hydroMazing.com

Bewaking van voedingsoplossingen

Het niveau van de voedingsoplossing van het hydrocultuurcontainersysteem moet worden gecontroleerd.

Naarmate het niveau van de voedingsoplossing daalt, moet deze worden aangevuld met vers water, anders wordt de voedingsoplossing meer geconcentreerd en zullen sommige planten niet goed reageren. De hydroMazing Nutrient Controller kan een pomp activeren die vers water toevoegt om de concentratie terug te brengen naar het niveau dat het was toen het werd gestart, vaak aangeduid als "topping-off". De hydroMazing Nutrient Controller bewaakt ook uw pH en EC, activeert pompen om de oplossing te beheren en waarschuwt u wanneer u wijzigingen moet aanbrengen.

Wil je meer?

  • Existentiële crisis - Arduino-rollenspelsimulator
  • Waarom doe-het-zelf als je zou kunnen kopen?
  • Wat is een 'slimme' tuin?
  • Een slimme binnentuin beginnen
  • Dieper graven in binnentuinieren
  • Binnentuinieren:wat kan er mis gaan?
  • Beheer van voedingsoplossingssystemen
  • Waarom Arduino als je Pi kunt?

Code

  • Instellingen van objecten
Instellingen van objectenC/C++
Het CoreSettings.h-bestand bevat veel kritieke instellingen, waaronder het nRF-netwerk, de codes voor de externe schakelaar van het stopcontact, de timer-, apparaat- en sensor-objectdefinities die worden gebruikt door het hydroMazing-systeem.
/** @file CoreSettings.h* Copyright ( C) 2015 Cory J. Potter - Alle rechten voorbehouden* U mag deze code gebruiken, verspreiden en wijzigen onder de* voorwaarden van de LICENSE.txt* NIET BEDOELD VOOR COMMERCIEEL GEBRUIK!* U zou een kopie van de LICENSE.txt moeten hebben ontvangen met * dit bestand. Zo niet, schrijf dan naar:*/#ifndef __CORESETTINGS_H__#define __CORESETTINGS_H__#ifdef ARDUINO// RX_PIN 3 in gebruik door Dallas Temperature Probe#define RX_PIN 103#define TONE_PIN 104#define / TX_PIN 3 is ons adres 1 of 2uint8_t node_address =1;uint8_t totalNodes =3;unsigned long lastRxTimeStamp =0;const uint64_t nRFbaseAddress =1034834473100;uint8_t nRFaddress =0; // 00 - 255// OPMERKING:de "LL" aan het einde van de constante is van het type "LongLong"// 1034834473185, 1034834473170// const uint64_t tx_pipes[5] ={ 0xF0F0F0F0E1LL, 0xF0F0F0F0D2LL, 0xFll0F0F0F0F1F1F0F0F0F1Fll, 0F0F0F // const 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[3] ={ 0xF0FLL0F ********************************************** ****/// Draadloos bediende stopcontactschakelaars/************************************** ***********************************/// 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 mySwitchOn[] ={ 24.4281651 ,4281795.4282115 };// unsigned long mySwitchOff[] ={ 24.4281660.4281804.4282124 };// ETEKCITY #1407// unsigned long mySwitchOn[] ={ 24.87347.87491.87811 };// niet ondertekend lange mySwitchOff[] ={ 24,87356,87500,87820 };// ETEKCITY #1411// unsigned long mySwitchOn[] ={24,283955,284099,284419 };// unsigned long mySwitchOff[] ={ 24,283964 ,284108,284428 };// ETEKCITY #1415// niet-ondertekende lange mySwitchOn[] ={ 24,21811,21955,22275,23811,29955 };// niet-ondertekende lange mySwitchOff[] ={ 24,21820,21964,22284, 23820,29964 };// ETEKCITY #1419// niet-ondertekende lange mySwitchOn[] ={24,333107,333251,333571,335107,341251};// niet-ondertekende lange mySwitchOff[] ={24,333116,333260,333580.335116 ,341260};// ETEKCITY #0319uint8_t totalSwitches =5;unsigned long mySwitchOn[] ={24,333107,333251,333571.335107,341251};unsigned long mySwitchOff[] ={24,333116,3 33260,333580.335116,341260};/**************************************** *******************************//* I2C-communicatie *//********** ********************************************** ***********/const int MIJN_ADRES =42;const int SEND_TO_ADDRESS =22;/************************* **********************************************// * Timers *//********************************************* **************************///Timer Object ={ (type), (interval in millis), klaar, geactiveerd, tijdstempel, (aanwijzer naar volgend object)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,_D ={ CYCLE-CYCLUS 6000UL, true, false, 0, &Timer_Lcd };// Timer Timer_Lcd_Scroller ={TIMER_LCD_SCROLLER, 500UL, true, false, 0, &Timer_Lcd_Cycle };//Timer Timer_Ping ={TIMER_SENSOR_READINGS, 0, &Timer, true, /Timer Timer_Lite ={TIMER_LITE, 180000UL, true, false, 0, &Timer_Ping};Timer 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, 0, &Timer_txData };//Timer Timer_Sensor_Read ={TIMER_SENSOR_READINGS, 7000UL, true, false, 0, &Timer_Save_Settings, 0, &Timer_txData };//Timer Timer , &Timer_Sensor_Read };Timer Timer_rxData ={ TIMER_RX_DATA, 6000UL, true, false, 0, &Timer_Save_Settings };/****************************** *****************************************/// Apparaten initialiseren/ ********************************************** *********************/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_Intake 1, APPLIANCE, INT_104, 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 Appliance_Humidifier ={102, 0, APPLIANCE_HUMIDIFIER, DEFAULT_TIME, true, false, UIT, &Appliance_ExhaustFan, 0LIance_Holiance Appliance {102, 0, APPLIANCE_HUMIDIFIER, DEFAULT_TIME, true, false, UIT, &Appliance_ExhaustFan, 0LIance_Holiance Appliance, 0; 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, DEFAULT_TIME, &Appliance_Heater };uint8_t totalAppliances =6;/**************************************** ******************************/// Sensoren initialiseren/*************** ********************************************** **********///Sensor:={ pin; node_adres; SENSOR_TYPE; frequentie; minVal; maxVal; UL-tijdstempel; vlotterwaarde; struct Sensor *volgende; }// NULL voor de eerste - We kunnen niet verwijzen naar een object dat nog niet is gemaakt.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_Vochtigheid ={PIN7, 1, SENSOR_HUMIDITY, 50, 40, 70, 0, 50, &Sensor_Temp };Sensor Sensor_WaterTemp ={PIN3_INT1, 1, SENSOR_WATER_TEMPF, 100, 50, 70, 0, 65, &Sensor_Vochtigheid };Sensor Sensor_Flow ={PIN2_INT0, 2, SENSOR_FLOW, 100, 50, 50, 0, 75, &Sensor_WaterTemp };//Sensor Sensor_Microfoon ={PIN_A1, 0, SENSOR_SOUND, 60, 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, SENSOR_PHOTO, 60, 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_FLOAT, 100, 0, 1, 0, 1, &Sensor_Flow };Sensor Sensor_Voltage ={PIN1_ TX, 1, SENSOR_VOLTAGE, 100, 0, 100, 0, 50, &Sensor_Float };uint8_t totaalSensors =7;/************************* **********************************************/

Schema's

Inlaat- en uitlaatventilatoren, kweeklampen, verwarmingen, ontvochtigers en pompen die automatisch worden geregeld via draadloze AC-stopcontacten algemene draadloos bediende AC-stopcontacten die in dit project worden gebruikt. Gemonteerd en getest hydroMazing prototype webinterface hydroMazing prototype webinterface voor waarschuwingsmeldingen.

Productieproces

  1. Temperatuurbewaking op de Raspberry Pi
  2. Temperatuurgebaseerd apparaatbesturingssysteem met LM35
  3. Analoge sensoren op de Raspberry Pi met een MCP3008
  4. De kloof tussen slimme thuisvaardigheden
  5. Alles kan slim zijn:de belangrijkste eigenschappen van de nieuwste slimme steden – Deel 1
  6. De drankenindustrie slimmer maken met door IoT aangedreven niveaubewakingssysteem
  7. 5 W's van de draagbare brailleleesregel
  8. De werking van het antiblokkeersysteem (ABS) begrijpen
  9. De werking van een elektronisch ontstekingssysteem begrijpen
  10. De werking van het magneto-ontstekingssysteem begrijpen
  11. Wat is het Amerikaanse productiesysteem?