본문 바로가기
식물 수경재배 시스템 만들기

Arduino 제어 스마트 수경 재배 모듈 시스템

by 굿뜨클랑 2023. 6. 5.
728x90
반응형

아두이노(Arduino) 제어 스마트 수경 재배 모듈 시스템은 식물을 자동으로 재배하고 관리할 수 있는 시스템입니다. 이러한 시스템은 농업 분야에서 매우 유용하게 사용됩니다. 아두이노 제어 모듈은 수경을 통해 작물을 균일하게 관리할 수 있습니다. 이를 위해서는 pH, 온도 및 다른 환경 인자에 대한 제어가 필요합니다. 아두이노 제어 모듈은 이러한 제어를 자동으로 처리하며, 입력을 받아 조절합니다.

아두이노 제어 스마트 수경 재배 모듈 시스템에서는 물의 pH 및 온도를 계측하고, 이를 제어하여 가장 적합한 조건에서 작물을 자동으로 재배할 수 있습니다. 또한, 작물이 올바른 영양분을 흡수하도록 하는 수위 제어도 포함되어 있습니다. 이를 통해 자동화된 수경 시스템은 많은 농장에서 농작물의 생산성을 향상시키는 데 사용됩니다.

또한, 이 시스템은 능률적이고 열악한 재배 조건에서도 농작물 키울 수 있습니다. 이는 전체 시스템이 자동으로 제어되고 모니터링되기 때문입니다. 이러한 특징은년 식물재배에 소요되는 물 및 비료 사용량을 줄이고, 농작물의 생산성 및 수확량을 증가시킵니다.

마지막으로, 이 시스템은 소형 농장 및 연구용 재배 시설뿐만 아니라, 대규모 재배 시설에서도 사용됩니다. 이러한 시스템을 사용함으로써 더욱 적극적으로 농업 생산성을 높일 수 있습니다.

 

수경 법

우리에게 수경법은 즐거운 취미 일뿐만 아니라 친환경적인 취미이기도합니다.

수경법은 흙에서 자란 식물에 필요한 물의 10 %만 사용하며, 식물이 필요할 때 항상 필요한 영양소를 사용할 수 있기 때문에 수확량이 높아집니다.

폐쇄 시스템이기 때문에 비료가 지하수면에서 벗어나 환경에 좋습니다.

 

1단계: 프로젝트

우리의 프로젝트는 수경 재배, 수경법을 기반으로 한 실내 재배, 토양 대신 광물 용액을 사용하여 식물을 재배하는 데 사용되는 방법입니다. 일반적인 구조는 알루미늄으로 만들어집니다. 물이 순환하는 구조는 손으로 자르고 접착 한 PVC 파이프로 구성되며 물이 통과하는 6 단계로 구성됩니다. 각 레벨은 냄비를 놓기 위해 뚫렸습니다. 3D 조각은 냄비가 움직이지 않고 조명을 지원하도록 설계되었습니다. 하부에는 시스템의 물이 떨어지고 다른 구성 요소를 물에 첨가 할 수있는 탱크가 있습니다. 탱크를 배수해야 하는 경우 수동 배수구가 있습니다.

우리의 플랫폼은 세 부분으로 구성되어 있습니다.

  • 모듈 구조: 모든 수경 재배 시스템을 지원하기 위해 PVC 및 알루미늄 프레임.
  • 전자 회로 : 우리 시스템의 디지털 "두뇌"의 주요 제어
  • 센서/액추에이터: 시스템의 모든 데이터와 매개변수를 측정하고 제어합니다.

이 장치는 여러 매개 변수를 감지하여 식물의 상태를 제어 할 수 있습니다.

  • 공기 온도 및 습도
  • 수온
  • 수소 이온 농도
  • 전도성
  • 시간

그런 다음 다양한 유형의 액추에이터를 사용하여 식물을 관개하거나 조명을 활성화하거나 영양분을 방출하여 식물의 상태를 수정합니다.

  • 물 펌프
  • 성장하는 빛
  • 영양소 공급기

장치는 주기적으로 정보를 web WiFi를 사용하는 서버. 또한 Android 기기에서 이 데이터를 시각화할 수 있는 앱을 설계했습니다. 우리는 그것을 오픈 소스 코드로 공개했습니다.

2 단계 : 재료

구조 재료:

  • 100mm 직경 PVC 튜브 x6 미터
  • 40mm 직경 PVC 튜브 x2 미터
  • 100-40mm PVC 커넥터 x12
  • 40-10mm PVC 커넥터 x1
  • 90º 40mm 커넥터 x12
  • 물 아크릴 침전물 (또는 5l 병)
  • 유연한 10mm 튜브 x 2 미터
  • 2m 나무 테이블 2x1x1 미터
  • 알루미늄 프레임 x 16 미터
  • 알루미늄 3 프레임 커넥터 x8
  • 알루미늄 4 프레임 커넥터 x8
  • 알루미늄 5 프레임 커넥터 x2
  • 휠 x4
  • PVC 접착제

전자/전기 재료:

다른:

  • 화분

도구:

  • 로터리 핸드 툴
  • 핸드 드릴
  • 납땜
  • 와이어 스트리퍼
  • 뜨거운 접착제 총
  • 구멍 톱
  • 클램프

3단계: 모듈식 프레임

이 프로젝트를 위해 모듈식 저비용 수경재배 시스템이 설계되었습니다.
메인 다이어그램과 같이 다른 크기의 커넥터를 사용하여 PVC 파이프를 연결합니다.

시공 단계

  • PVC의 절단 길이
  • 모든 것을 하나로 맞추기
  • 드릴링

지원 프레임

파이프를 지지할 프레임이 필요합니다. 프레임은 모듈식 특성(여러 모듈을 함께 장착하기 쉬움)과 크기 조정을 위한 사용 용이성(기본 도구로 직선으로 자르기 쉬움)을 위해 알루미늄으로 제작되었습니다.

모듈러 베이스

우리는 휴대용 시스템을 만들기 위해 4개의 바퀴가 있는 모듈식 목재 베이스를 통합했습니다.

4단계: PVC 조립

안정성을 높이기 위해 개별 다리 구성 요소를 함께 접착했습니다.

구조의 치수는 수경 재배 시스템의 크기와 시스템이 지원할 수있는 행 수를 나타냅니다.

현재 모델에는 6개의 레벨이 있습니다. 행 사이의 간격을 줄여 더 많은 성장 영역을 지원하도록 간격을 수정할 수 있습니다.

메모: 이 프로젝트의 PVC 파이프는 마이터 쏘를 사용하여 절단하는 것이 가장 좋습니다. 이들은 저렴한 수동 톱 또는 시간 효율적인 전기 톱의 두 가지 유형으로 쉽게 사용할 수 있습니다.

 

5단계: 구멍 심기

우리는 각 튜브에 5-7 개의 구멍을 뚫었습니다. 먼저 각 구멍의 지점을 표시하십시오. 연삭 헤드가 있는 드레멜 도구를 가져와 컵이 의도한 대로 맞을 때까지 구멍을 청소하십시오.
우리는 플라스틱 안경을 식물 플롯으로 사용했습니다. 그것들도 사용하는 경우 뿌리가 유리 외부의 물에 닿을 수 있도록 바닥과 가장자리에 구멍을 뚫습니다.

컵을 사용하여 점토 공을 물 양동이에 넣습니다. 물은 공에 있을 수 있는 먼지를 씻어냅니다.

6단계: 수경 구조

수경법에서는 영양이 풍부한 물을 식물의 뿌리까지 끌어들이는 동시에 물에 충분한 산소가 있는지 확인하는 것이 중요합니다.
우리는 NFT(Nutrient Film Technique) 시스템을 만들었습니다. 이를 위해 우리는 식물의 뿌리가 접촉 할 수있는 작지만 일정한 물의 흐름이 필요했습니다.

물에는 식물이 원하는 모든 영양소가 포함되어 있으며 일정한 흐름은 물에 충분한 산소가 있는지 확인합니다.

식물은 그들을 지탱할 무언가가 필요하며, 우리는 그들을 지탱할 토양이 없지만 수경 재배 매체가 들어오는 곳입니다. 위에서 언급한 팽창된 점토 공을 사용했습니다. 이것들은 식물에 지지대와 물을 담을 수 있는 작은 완충 장치를 제공합니다.

7단계: 전기 연결

알루미늄 프레임을 지지대로 모든 케이블과 전기 시스템을 연결합니다. 220A 3V 전원 공급 장치를 사용하여 12V에 연결됩니다.
구조물 위에 우리는 성장하는 조명을 연결했습니다. 우리는 12V LED 스트립이며 길이 미터당 약 0.5A를 소비합니다. 하단에는 1A를 사용하는 워터 펌프를 연결했습니다.

주 회로 소비는 약 0.5A입니다.

 

8단계: 3D 프린팅 지지대

우리는 다양한 요소를 지원하기 위해 다양한 3D 프린팅 부품을 설계했습니다.

  • 화분 / 플라스틱 안경 : 파이프 상단에 맞도록 둥근 지지대를 만들었습니다.
  • 성장하는 조명: 알루미늄 프레임에 배치할 수 있는 지지대를 만들었습니다.

F5M5IUWJJT6L37W.stl
0.03MB
F4KLOZDJJT6L366.stl
0.01MB

9단계: 전자 회로

여기에서 수경 재배 회로의 주요 다이어그램과 프로젝트의 핀아웃을 찾을 수 있습니다.

10단계: 워터 펌프

우리는 방수 펌프를 사용하여 바닥의 탱크에서 구조물 상단으로 물을 들어 올렸습니다.

 

11단계: 영양소 공급기

 

수경재배에는 일반 비료가 토양과 함께 사용하도록 제조되고 수경법으로 사용해서는 안 되기 때문에 특별한 영양소가 필요합니다.
수경법용 비료는 식물 성장의 여러 단계와 작물의 종류에 따라 다른 유형으로 나타날 수 있습니다.

우리는 Arduino로 제어하기 위해 "물고기 피더"를 해킹했습니다. 그것은 우리의 개인화 된 영양 공급기입니다. 우리는 물 탱크에 더 많은 영양분을 방출 할 수 있도록 원할 때 제어합니다. 그런 다음 식물이 영양분을 섭취 할 수 있도록 워터 펌프를 다시 켭니다.

12단계: 수경 센서

영양소는 주기적으로 첨가해야 하며, 언제 해야 하는지 알기 어렵습니다. 사람들은 일주일에 한 번에서 한 달에 한 번까지 그것을 하며 매번 비료를 얼마나 추가하느냐에 달려 있습니다.
또 다른 옵션은 pH와 전도도 수준을 제어하여 그에 따라 비료 양을 조정하는 것입니다.

우리는 수경 재배 시스템을 위한 2개의 특정 센서를 통합했습니다.

PH 센서

pH 센서 프로브에는 센서의 모든 다른 와이어를 통합하는 BNC 커넥터가 있습니다.

기능:

  • 측정 범위: 0~14pH
  • 적용 가능한 온도: 0~60°
  • CBNC 커넥터
  • 케이블: 2.9 미터
  • 유추 출력

센서 보정

pH 센서를 교정하려면 pH 교정 키트가 필요합니다.

 

전도도 센서

전기 전도도 센서 프로브에는 극성이 없는 두 개의 접점이 있어 상호 교환이 가능합니다.

기능:

  • 적용 가능한 온도: 0~60°
  • CBNC 커넥터
  • 케이블: 2.9 미터
  • 유추 출력

센서 보정

EC 센서를 교정하려면 전도도 교정 키트가 필요합니다

13 단계 : 메인 코드

 

목표는 Arduino MEGA를 사용하여 자동화를 구현하는 것이 었습니다. 여기에는 다음이 포함됩니다.

  • 타이머에 의한 물 순환
  • 타이머에 의한 조명
  • 데이터 측정
  • 측정에 의한 영양 (전기 전도도) 및 영양소 투여를 통한 시정 조치
  • 펌프 제어
  • 측정에 의한 수질(pH)
  • IoT 통합
  • 데이터 수집
  • 센서 측정 및 동작 기록

프로젝트의 주요 Arduino 코드를 첨부했습니다. 다른 pH 또는 전도도 센서를 사용하는 경우 실제 값을 얻기 위해 계산을 변경해야 할 수 있습니다.

아두이노 절차

  • 시간을 지킨다
  • 센서 판독
  • 블루투스를 통해 앱과 통신:

    - 데이터 전송(pH, 전도도, 수온, 공기 온도, 공기 습도, arduino 시간, 펌프 상태 및 조명 상태)

    - 앱에서 시간 업데이트를 받습니다.
  • 매시간 특정 분 동안 펌프를 켜거나 끕니다.
  • 조명 켜기/끄기
  • 15분 간격으로 ThingSpeak에 데이터 전송(pH, 전도도, 수온, 공기 온도, 공기 습도)

라이브러리:

사용된 모든 라이브러리가 포함되어 있습니다.

코드:

// HidroponicoCole_v5.8 NO CLAVES//
// bluetooht RX3-TX3
// DALLAS pin 3
// DHT pin 2
// Bomba pin 6
// Luz pin 7
// Shield ESP 8266 con comandos AT
// Utiliza libreria TimeLib para la fecha y hora
// Envia datos cada 15 minutos
// LCD con ALARMAS
// Invierte salida Bomba y Luz 0= activo, 1= inactivo
// -----------------------------------------------------------</p><p>#define DEBUG 0                                // change value to 1 to enable debuging using serial monitor  
String network = "SSID NAME";                  // your access point SSID
String password = "PASSWORD";                  // your wifi Access Point password
#define IP "184.106.153.149"                   // IP address of thingspeak.com  184.106.153.149
String GET = "GET /update?key=CHANNEL_KEY";    // replace with your channel key</p><p>#include "OpenGarden.h"
#include 
#include 
#include 
#include 

#include </p><p>// initialize the library by associating any needed LCD interface pin
// with the arduino pin number it is connected to
const int rs = 51, en = 53, d4 = 39, d5 = 37, d6 = 35, d7 = 33;
LiquidCrystal lcd(rs, en, d4, d5, d6, d7);</p><p>// Establece valores inicio de fecha y hora
int hora = 9;
int minuto = 0;
int segundo = 0;
int dia = 1;
int mes = 1;
int ano = 17;</p><p>bool nuevoSegundo;
int viejoSegundo = 0;</p><p>bool nuevoMinuto;
int viejoMinuto = 0;</p><p>bool nuevaHora;
int viejaHora = 0;</p><p>// variables telegrama recibido de bluethooh
// cabecera, cuerpo1, cuerpo2, cuerpo3, fin
int cabecera = 0;
int cuerpo1 = 0;
int cuerpo2 = 0;
int cuerpo3 = 0;
int fin = 0;</p><p>// Sensores PH y EC
#define calibration_point_4 2246  //Write here your measured value in mV of pH 4
#define calibration_point_7 2080  //Write here your measured value in mV of pH 7
#define calibration_point_10 1894 //Write here your measured value in mV of pH 10</p><p>#define point_1_cond 40000   // Write here your EC calibration value of the solution 1 in µS/cm
#define point_1_cal 40       // Write here your EC value measured in resistance with solution 1
#define point_2_cond 10500   // Write here your EC calibration value of the solution 2 in µS/cm
#define point_2_cal 120      // Write here your EC value measured in resistance with solution 2</p><p>/*   SENSOR DHT22 (AIRE)  */
#define DHTPIN 2
#define DHTTYPE DHT22</p><p>float TemperaturaAire;
float HumedadAire;
DHT dht(DHTPIN, DHTTYPE);</p><p>/*   SENSOR Temperatura DALLAS  (TemperaturaAgua) */
#define ONE_WIRE_BUS 3
OneWire oneWireBus (ONE_WIRE_BUS);
DallasTemperature sensors (&oneWireBus);
float TemperaturaAgua;</p><p>/*   BOMBA y LUZ   */
#define PinBombaAgua 6  // Bomba en pin 6
#define PinLuz 7        // Luces en pin 7
#define Amanece 8      // Hora de encendido Luz  
#define Anochece 20    // Hora apagado Luz
#define MinutosBomba 20    // Minutos funcionando bomba
bool BombaAgua = 0;   // 0=parada , 1= marcha
bool Luz = 0;         // 0= apagada , 1= encendida</p><p>// VALORES DE ALARMAS
#define PhAlto 10          // Valor alto alarma Ph
#define PhBajo 5           // Valor bajo alarma Ph
#define EcAlto 3000        // Valor alto alarma Ec
#define EcBajo 900         // Valor bajo alarma Ec
// Valor EcMuyBajo activa "Falta de agua". NO PERMITE FUNCIONAMIENTO BOMBA
#define EcMuyBajo 200
#define TempAguaAlto 40    // Valor alto alama Temp Agua
#define TempAguaBajo 5     // Valor bajo alama Temp Agua
int AlarmaPH;         // alarma Ph
int AlarmaTempAgua;   // alarma Temp
int AlarmaEC;         // alarma Ec</p><p>float pH;
float EC;</p><p>void setup() {
  lcd.begin(16, 2);                 // Inicia LCD 16 caracteres, 2 filas
  // Mensaje de arranque en LCD
  borrarLCD();
  lcd.setCursor(0, 0);              // posiciona cursor linea 0, columna 0
  lcd.print("INICIANDO");
  lcd.setCursor(0, 1);
  lcd.print("ESPERE .....");</p><p>  setupEsp8266();                    // inicia conexión WiFi</p><p>  pinMode(PinBombaAgua, OUTPUT);
  pinMode(PinLuz, OUTPUT);</p><p>  Serial3.begin(9600);
  Serial.begin(115200);</p><p>  // establece fecha y hora al arrancar
  setTime(hora, minuto, segundo, dia, mes, ano);</p><p>  // Start up the libraries
  sensors.begin(); // DALLAS
  dht.begin(); // DHT</p><p>  OpenGarden.initSensors(); //Initialize sensors power
  OpenGarden.sensorPowerON();//Turn On the sensors
  OpenGarden.calibratepH(calibration_point_4, calibration_point_7, calibration_point_10);
  OpenGarden.calibrateEC(point_1_cond, point_1_cal, point_2_cond, point_2_cal);
  delay(500);
}</p><p>void loop() {</p><p>  // Read DALLAS
  // call sensors.requestTemperatures() to issue a global temperature
  // request to all devices on the bus
  sensors.requestTemperatures(); // Send the command to get temperatures
  TemperaturaAgua = (sensors.getTempCByIndex(0)); // Why "byIndex"?
  // You can have more than one IC on the same bus.
  // 0 refers to the first IC on the wire</p><p>  // Lee DHT 22
  HumedadAire = dht.readHumidity();
  TemperaturaAire = dht.readTemperature();</p><p>  //Read the pH sensor
  int mvpH = OpenGarden.readpH(); //Value in mV of pH
  pH = OpenGarden.pHConversion(mvpH); //Calculate pH value
  if ( pH < 0 || pH > 14) {
    pH = 0 ;
  }</p><p>  //Read the conductivity sensor in µS/cm
  float resistanceEC = OpenGarden.readResistanceEC(); //EC Value in resistance
  EC = OpenGarden.ECConversion(resistanceEC); //EC Value in µS/cm</p><p>  // Alarmas datos Agua
  AlarmaPH = 0;  // Resetea el valor de la alarma Ph
  if ( pH > PhAlto ) {
    AlarmaPH = 2 ;
  }
  if ( pH < PhBajo ) {
    AlarmaPH = 1 ;
  }</p><p>  AlarmaTempAgua = 0;  // Resetea el valor de la alarma Temp Agua
  if ( TemperaturaAgua > TempAguaAlto ) {
    AlarmaTempAgua = 2 ;
  }
  if ( TemperaturaAgua < TempAguaBajo ) {
    AlarmaTempAgua = 1 ;
  }</p><p>  AlarmaEC = 0;  // Resetea el valor de la alarma EC
  if ( EC > EcAlto ) {
    AlarmaEC = 2 ;
  }
  if ( EC < EcBajo ) {
    AlarmaEC = 1 ;
  }
  if ( EC < EcMuyBajo ) {
    AlarmaEC = 3 ;
  }</p><p>  // Construye y envia a ESP 8266
  if (viejoMinuto != minute()) {
    nuevoMinuto = true;
    viejoMinuto = minute();
  } else {
    nuevoMinuto = false;
  }</p><p>  if (minute() % 15 == 0 && nuevoMinuto) {     //  5= cada 5 minutos,  15= cada 15 minutos
    updateTemp(String(pH) , String(EC), String(TemperaturaAgua), String(TemperaturaAire), String(HumedadAire));
  }</p><p>  // comprobar recepción datos desde bluetooth
  if (Serial3.available () > 10) {
    cabecera = Serial3.parseInt ();
    cuerpo1 = Serial3.parseInt ();
    cuerpo2 = Serial3.parseInt ();
    cuerpo3 = Serial3.parseInt ();
    fin = Serial3.parseInt ();
    String basura = Serial3.readString(); // vacía el buffer de lectura
  }</p><p>  if (cabecera == fin && cabecera == 20) {   // si cabecera=fin=20 actualiza hora
    setTime(cuerpo1, cuerpo2, cuerpo3, dia, mes, ano);
    cabecera = 0; // borra cabecera y fin para no repetir
    fin = 0;
  }</p><p>  // Envía datos por Bluetooth
  Serial3.print("<");
  Serial3.print(pH);
  Serial3.print(", ");
  Serial3.print(EC);
  Serial3.print(", ");
  Serial3.print(TemperaturaAgua);
  Serial3.print(", ");
  Serial3.print(HumedadAire);
  Serial3.print(", ");
  Serial3.print(TemperaturaAire);
  Serial3.print(", ");
  Serial3.print(hour());   // envia hora actual
  Serial3.print(", ");
  Serial3.print(minute()); // envia minuto actual
  Serial3.print(", ");
  Serial3.print(second()); // envia segundo actual
  Serial3.print(", ");
  Serial3.print(BombaAgua); //envia estado BombaAgua
  Serial3.print(", ");
  Serial3.print(Luz); // envia estado Luz
  Serial3.print(">");</p><p>  // control bomba de agua minutos cada hora
  if (minute() < MinutosBomba  && EC > EcMuyBajo) {    // EC muy bajo implica riego de falta de agua
    digitalWrite (PinBombaAgua, LOW);  // LOW = Bomba on
    BombaAgua = 1;
  }
  else {
    digitalWrite (PinBombaAgua, HIGH);  // HIGH = Bomba off
    BombaAgua = 0;
  }</p><p>  // control luz encendida de Amanece a Anochece
  if (hour() > Amanece && hour() < Anochece) {
    digitalWrite (PinLuz, LOW);          // LOW = Luz on
    Luz = 1;
  }
  else {
    digitalWrite (PinLuz, HIGH);          // HIGH = Luz off
    Luz = 0;
  }</p><p>  // refresca LCD cada segundo
  if (viejoSegundo != second()) {
    nuevoSegundo = true;
    viejoSegundo = second();
  } else {
    nuevoSegundo = false;
  }</p><p>  if (nuevoSegundo == true) {
    visualiza ();
  }</p><p>}</p><p>//-------------------------------------------------------------------
// Following function setup the esp8266, put it in station mode and
// connect to wifi access point.
//------------------------------------------------------------------
void setupEsp8266()
{
  if (DEBUG) {
    //Serial3.println("Reseting esp8266");
  }
  Serial.flush();
  Serial.println(F("AT+RST"));
  delay(7000);</p><p>  if (Serial.find("OK"))
  {
    if (DEBUG) {
      Serial3.println("Found OK");
      Serial3.println("Changing espmode");
    }
    Serial.flush();
    changingMode();
    delay(5000);
    Serial.flush();
    connectToWiFi();
  }
  else
  {
    if (DEBUG) {
      Serial3.println("OK not found");
    }
  }
}</p><p>//-------------------------------------------------------------------
// Following function sets esp8266 to station mode
//-------------------------------------------------------------------
bool changingMode()
{
  Serial.println(F("AT+CWMODE=1"));
  if (Serial.find("OK"))
  {
    if (DEBUG) {
      Serial3.println("Mode changed");
    }
    return true;
  }
  else if (Serial.find("NO CHANGE")) {
    if (DEBUG) {
      Serial3.println("Already in mode 1");
    }
    return true;
  }
  else
  {
    if (DEBUG) {
      Serial3.println("Error while changing mode");
    }
    return false;
  }
}</p><p>//-------------------------------------------------------------------
// Following function connects esp8266 to wifi access point
//-------------------------------------------------------------------
bool connectToWiFi()
{
  if (DEBUG) {
    Serial3.println("inside connectToWiFi");
  }
  String cmd = F("AT+CWJAP=\"");
  cmd += network;
  cmd += F("\",\"");
  cmd += password;
  cmd += F("\"");
  Serial.println(cmd);
  delay(15000);</p><p>  if (Serial.find("OK"))
  {
    if (DEBUG) {
      Serial3.println("Connected to Access Point");
    }
    return true;
  }
  else
  {
    if (DEBUG) {
      Serial3.println("Could not connect to Access Point");
    }
    return false;
  }
}</p><p>//-------------------------------------------------------------------
// Following function sends sensor data to thingspeak.com
//-------------------------------------------------------------------
void updateTemp(String valor1, String valor2, String valor3, String valor4, String valor5)
{
  String cmd = "AT+CIPSTART=\"TCP\",\"";
  cmd += IP;
  cmd += "\",80";
  Serial.println(cmd);
  if (DEBUG) {
    Serial3.println (cmd);
  }</p><p>  delay(5000);
  if (Serial.find("Error")) {
    if (DEBUG) {
      Serial3.println("ERROR while SENDING");
    }
    return;
  }
  cmd = GET + "&field1=" + valor1 + "&field2=" + valor2 + "&field3=" + valor3 + "&field4=" + valor4 + "&field5=" + valor5 + "\r\n";
  if (DEBUG) {
    Serial3.println (valor1);
    Serial3.println (valor2);
    Serial3.println (valor3);
    Serial3.println (valor4);
    Serial3.println (valor5);
    Serial3.println (cmd);
  }</p><p>  Serial.print("AT+CIPSEND=");
  Serial.println(cmd.length());
  delay(15000);
  if (Serial.find(">"))
  {
    Serial.print(cmd);
    if (DEBUG) {
      Serial3.println("Data sent");
    }
  } else
  {
    Serial.println("AT+CIPCLOSE");
    if (DEBUG) {
      Serial3.println("Connection closed");
    }
  }
}</p><p>// -------------------------------------
//  Muetra datos LCD
// -------------------------------------
void visualiza() {</p><p>  // visualiza fecha y hora
  if (second() % 30 >= 0 && second() % 30 < 7) {
    borrarLCD();
    lcd.setCursor(0, 0); // posiciona cursor linea 0, columna 0
    lcd.print("HORA ACTUAL");</p><p>    lcd.setCursor(0, 1);
    lcd.print(format(hour()));
    lcd.print(":");
    lcd.print(format(minute()));
    lcd.print(":");
    lcd.print(format(second()));
  }</p><p>  // visualiza datos AGUA
  if (second() % 30 >= 7 && second() % 30 < 14) {
    borrarLCD();
    lcd.setCursor(0, 0); // posiciona cursor linea 0, columna 0
    lcd.print("AGUA: ");
    lcd.print((int)EC);
    lcd.print(" uS/cm");</p><p>    lcd.setCursor(0, 1);
    lcd.print("pH=");
    lcd.print(pH);
    lcd.print("; ");
    lcd.print(TemperaturaAgua);
    lcd.print(" C");</p><p>  }</p><p>  // visualiza datos AIRE
  if (second() % 30 >= 14 && second() % 30 < 21) {
    borrarLCD();
    lcd.setCursor(0, 0); // posiciona cursor linea 0, columna 0
    lcd.print("    AIRE ");</p><p>    lcd.setCursor(0, 1); // posiciona cursor linea 0, columna
    lcd.print((int)TemperaturaAire);
    lcd.print(" C  ;  ");
    lcd.print((int)HumedadAire);
    lcd.print("%");</p><p>  }</p><p>  // visualiza ALARMAS
  if (second() % 30 >= 21 && second() % 30 < 30) {
    borrarLCD();
    lcd.setCursor(0, 0); // posiciona cursor linea 0, columna 0
    lcd.print("   ALARMAS ");</p><p>    lcd.setCursor(0, 1); // posiciona cursor linea 0, columna
    if (AlarmaPH == 0 && AlarmaTempAgua == 0 && AlarmaEC == 0) {    // verifica si hay alarmas
      lcd.print("NO HAY ALARMAS");
    }
    else {
      if (AlarmaPH > 0) {
        lcd.print("pH;");
      }
      if (AlarmaTempAgua > 0) {
        lcd.print("Temp Agua;");
      }
      if (AlarmaEC > 0 && AlarmaEC < 3 ) {
        lcd.print("EC");
      }
      if (AlarmaEC == 3 ) {
        lcd.print("No Agua");
      }
    }
  }
}</p><p>void borrarLCD() {
  lcd.setCursor(0, 0);
  lcd.print("                ");
  lcd.setCursor(0, 1);
  lcd.print("                ");
}</p><p>String format(int info) {
  String infoEditada;
  if (info < 10) {
    infoEditada += 0;
  }
  infoEditada += info;</p><p>  return infoEditada;
}

FNONFEWJJT6L357.rar
0.00MB
FWW7RJBJJT6L34F.rar
0.00MB

14단계: 데이터 시각화

우리는 수경재배 재배에 무선으로 연결할 필요 없이 모든 센서 데이터를 볼 수 있도록 LCD 디스플레이를 통합했습니다.

15단계: Android 앱

App Inventor를 사용하여 특정 응용프로그램을 만들었습니다.
여기에서 소스 파일을 찾을 수 있습니다.

앱 절차

  • 센서에서 데이터를 수신하고 봅니다.
  • 모바일의 현재 시간을 보내 Arduino의 시간을 업데이트합니다.

FNDNAQZJJT6L33G.aia
0.02MB
FQM8H13JJT6L33L.apk
2.55MB

16단계: 웹 서버

ESP8266 모듈을 사용하여 시스템을 Thingspeak(데이터 저장 및 분석을 제공하는 서비스)에 연결했습니다.

17 단계 : 수경 재배 작업!

 

 

COUPANG

쿠팡은 로켓배송

www.coupang.com

"이 포스팅은 쿠팡 파트너스 활동의 일환으로, 이에 따른 일정액의 수수료를 제공받습니다."

728x90
반응형

댓글