資料介紹
描述
我們熱愛電子和植物,因此我們?cè)?Juan de Lanuza 學(xué)校的“家庭機(jī)器人”活動(dòng)中創(chuàng)建了一個(gè)水培系統(tǒng)。我們想創(chuàng)建一個(gè)便攜式系統(tǒng),以便向所有學(xué)校展示它并在一年中種植區(qū)域植物。
水培法
對(duì)我們來說,水培不僅是一種愉快的愛好,也是一種綠色的愛好。
水培法僅使用在泥土中生長(zhǎng)的植物所需的 10% 的水,并且由于植物在需要時(shí)總能獲得必要的養(yǎng)分,因此產(chǎn)量更高。
作為一個(gè)封閉系統(tǒng),這也意味著肥料不會(huì)進(jìn)入地下水位,這對(duì)環(huán)境非常有益。
第 1 步:項(xiàng)目
我們的項(xiàng)目是水培,一種基于水培的室內(nèi)種植,一種使用礦物質(zhì)溶液代替土壤來種植植物的方法。一般結(jié)構(gòu)由鋁制成。水循環(huán)的結(jié)構(gòu)由手工切割和粘合的 PVC 管組成,由 6 層水通過。每個(gè)級(jí)別都已鉆孔以放置花盆。還設(shè)計(jì)了 3D 部件,使花盆不會(huì)移動(dòng)并支持照明。在下部有一個(gè)水箱,系統(tǒng)的水落入其中,通過該水箱可以將不同的成分添加到水中。如果必須排空水箱,我們有一個(gè)手動(dòng)排水。
我們的平臺(tái)由三個(gè)不同的部分組成:
- 模塊化結(jié)構(gòu):PVC 和鋁框架,以支持所有的水培系統(tǒng)。
- 電子電路:我們系統(tǒng)數(shù)字“大腦”的主控
該設(shè)備允許通過感應(yīng)幾個(gè)參數(shù)來控制植物的狀態(tài):
- 空氣溫度和濕度
- 水溫
- 酸堿度
- 電導(dǎo)率
- 時(shí)間
然后它使用不同類型的執(zhí)行器通過灌溉、激活燈光或釋放養(yǎng)分來改變植物的狀態(tài):
- 水泵
- 成長(zhǎng)之光
- 營(yíng)養(yǎng)喂食器
該設(shè)備使用 WiFi 定期將信息發(fā)送到網(wǎng)絡(luò)服務(wù)器。我們還設(shè)計(jì)了一個(gè)應(yīng)用程序,允許從 Android 設(shè)備可視化這些數(shù)據(jù)。我們已將其作為開源代碼發(fā)布。
第 2 步:材料
結(jié)構(gòu)材料:
- 100mm直徑PVC管x6米
- 40mm直徑PVC管x2米
- 100-40mm PVC 連接器 x12
- 40-10mm PVC接頭 x1
- 90o 40mm 連接器 x12
- 水壓克力沉積物(或 5l 瓶)
- 靈活的 10 毫米管 x 2 米
- 2m木桌2x1x1米
- 鋁框 x 16 米
- 鋁制 3 框架連接器 x8
- 鋁制 4 框架連接器 x8
- 鋁制 5 框架連接器 x2
- 輪子 x4
- PVC膠
電子/電工材料:
- 阿杜諾巨型
- Arduino MEGA 盒子:
- 原型板 MEGA
- 連接器原型板 MEGA:
- 12v電源:
- 中繼模塊:
- ESP8266 模塊:
- HC05模塊:
- 溫度傳感器防水:
- 溫濕度環(huán)境傳感器:
- 水泵:
- PH/電導(dǎo)板:
- PH 傳感器:
- 電導(dǎo)率傳感器:
- 生長(zhǎng)燈:
- 喂魚器:
其他:
- 花盆
工具:
- 旋轉(zhuǎn)手動(dòng)工具
- 手鉆
- 烙鐵
- 剝線機(jī)
- 熱膠槍
- 孔鋸
- 鋸
第 3 步:模塊化框架
為該項(xiàng)目設(shè)計(jì)了一個(gè)模塊化的低成本水培系統(tǒng)。使用不同尺寸的連接器連接 PVC 管道,如主圖所示。
施工步驟
- PVC的切割長(zhǎng)度
- 把所有東西放在一起
- 鉆孔
支撐架
我們需要一個(gè)框架來支撐我們的管道。框架由鋁制成,具有模塊化特性(易于將多個(gè)模塊安裝在一起)和易于使用的尺寸(易于使用基本工具直接切割)。
模塊化底座
我們集成了一個(gè)帶有 4 個(gè)輪子的模塊化木底座,以創(chuàng)建一個(gè)便攜式系統(tǒng)。
第 4 步:PVC 組裝
我們將各個(gè)腿部組件粘合在一起以增加穩(wěn)定性。
結(jié)構(gòu)的尺寸決定了水培系統(tǒng)的大小和系統(tǒng)可以支持的行數(shù)。
我們當(dāng)前的模型包括 6 個(gè)級(jí)別。可以通過減小行間距來修改間距以支持更多的生長(zhǎng)區(qū)域。
注意:該項(xiàng)目的 PVC 管最好使用斜切鋸切割。這些很容易以兩種類型獲得:便宜的手動(dòng)鋸或省時(shí)的電動(dòng)鋸。
第5步:植物洞
我們?cè)诿扛茏由香@了 5 到 7 個(gè)孔。首先,標(biāo)記每個(gè)孔的點(diǎn)。用磨頭獲取您的 dremel 工具并清理孔,直到杯子符合您的預(yù)期。我們使用塑料玻璃作為植物地塊。如果您也使用它們,請(qǐng)?jiān)诘撞亢瓦吘夈@孔,以便根部可以接觸玻璃外的水。
用杯子量出粘土球放入一桶水中。水會(huì)洗掉球中可能存在的任何灰塵。
第6步:水培結(jié)構(gòu)
在水培中,這一切都是為了將??富含營(yíng)養(yǎng)的水輸送到植物的根部,同時(shí)確保水中仍有足夠的氧氣。我們創(chuàng)建了 NFT(營(yíng)養(yǎng)膜技術(shù))系統(tǒng)。為此,我們需要植物根部可以接觸到的少量但恒定的水流。
水含有植物所需的所有營(yíng)養(yǎng)物質(zhì),而恒定的流量確保水中有足夠的氧氣。
植物需要一些東西來支撐它們,雖然我們沒有土壤來支撐它們,但這就是水培介質(zhì)的用武之地。我們使用了上面提到的膨脹粘土球。這些給植物提供支持,并提供一個(gè)小的緩沖來保持水分。
第 7 步:電氣連接
我們使用鋁框架作為支撐連接所有電纜和電氣系統(tǒng)。它使用 3A 12V 電源連接到 220V。在結(jié)構(gòu)頂部,我們連接了生長(zhǎng)燈。我們的是 12V LED 燈條,每米長(zhǎng)度消耗大約 0.5A。在底部,我們連接了使用 1A 的水泵。
主電路消耗在0.5A左右。
第 8 步:3D 打印支撐
我們?cè)O(shè)計(jì)了不同的 3D 打印部件以支持不同的元素:
- 花盆/塑料玻璃杯:我們制作了圓形支架,將它們安裝在管道頂部。
- 生長(zhǎng)燈:我們創(chuàng)建了支架以將它們放置在鋁制框架上。
我們使用了 Tinkercad,這是一個(gè)非常簡(jiǎn)單的在線 3D CAD 程序,您可以在此處使用:www.tinkercad.com
第 9 步:電子電路
在這里您可以找到水培電路的主圖和項(xiàng)目的引腳排列。
第 10 步:水泵
我們使用防水泵將水從地板的水箱中提升到結(jié)構(gòu)的頂部。
第 11 步:營(yíng)養(yǎng)喂食器
水培需要特殊的養(yǎng)分,因?yàn)槠胀ǚ柿系呐浞绞桥c土壤一起使用的,不應(yīng)該用于水培。根據(jù)植物生長(zhǎng)的不同階段和作物類型,水培肥料可以有不同的類型。
我們破解了一個(gè)“喂魚器”,以便用 Arduino 控制它。這是我們的個(gè)性化營(yíng)養(yǎng)喂食器。我們?cè)谛枰臅r(shí)候控制它,以便我們可以向水箱釋放更多的營(yíng)養(yǎng)。然后我們重新打開水泵,讓植物獲得營(yíng)養(yǎng)。
第 12 步:水培傳感器
必須定期添加營(yíng)養(yǎng)物質(zhì),很難說何時(shí)需要添加。人們每周一次到每月一次,這取決于您每次添加多少肥料。另一種選擇是控制 pH 值和電導(dǎo)率水平以相應(yīng)地調(diào)整肥料量。
我們?yōu)樗嘞到y(tǒng)集成了 2 個(gè)特定傳感器。
PH傳感器
pH 傳感器探頭有一個(gè) BNC 連接器,它集成了傳感器的所有不同電線。
特征:
- 測(cè)量范圍:0~14pH
- 適用溫度:0~60°
- CBNC 連接器
- 電纜:2.9 米
- 模擬輸出
校準(zhǔn)傳感器
為了校準(zhǔn) pH 傳感器,需要一個(gè) pH 校準(zhǔn)套件。
電導(dǎo)率傳感器
電導(dǎo)率傳感器探頭有兩個(gè)非極化觸點(diǎn),因此可以互換。
特征:
- 適用溫度:0~60°
- CBNC 連接器
- 電纜:2.9 米
- 模擬輸出
校準(zhǔn)傳感器
為了校準(zhǔn) EC 傳感器,您需要一個(gè)電導(dǎo)率校準(zhǔn)套件
第 13 步:主代碼
目標(biāo)是使用 Arduino MEGA 實(shí)現(xiàn)自動(dòng)化。這包括:
- 通過計(jì)時(shí)器進(jìn)行水循環(huán)
- 計(jì)時(shí)器點(diǎn)亮
- 數(shù)據(jù)測(cè)量
- 通過測(cè)量營(yíng)養(yǎng)(電導(dǎo)率)和通過營(yíng)養(yǎng)劑量進(jìn)行校正
- 泵控制
- 測(cè)量的水質(zhì) (pH)
- 數(shù)據(jù)采集
- 記錄傳感器測(cè)量和動(dòng)作
我們附上了項(xiàng)目的主要 Arduino 代碼。如果您使用不同的 pH 或電導(dǎo)率傳感器,則可能需要更改計(jì)算以獲得真實(shí)值。
Arduino程序
- 保持時(shí)間
- 讀取傳感器
- 通過藍(lán)牙與應(yīng)用程序通信:- 發(fā)送數(shù)據(jù)(pH、電導(dǎo)率、水溫、空氣溫度、空氣濕度、arduino 時(shí)間、泵狀態(tài)和燈狀態(tài))- 從應(yīng)用程序接收時(shí)間更新
- 每小時(shí)打開/關(guān)閉泵數(shù)分鐘
- 打開/關(guān)閉燈
- 每隔 15 分鐘將數(shù)據(jù)傳輸?shù)?ThingSpeak(pH、電導(dǎo)率、水溫、氣溫、空氣濕度)
圖書館:
我們已經(jīng)包含了所有使用的庫。
代碼:
// 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
// -----------------------------------------------------------#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#include "OpenGarden.h"
#include
#include
#include
#include
#include // 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);// 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;bool nuevoSegundo;
int viejoSegundo = 0;bool nuevoMinuto;
int viejoMinuto = 0;bool nuevaHora;
int viejaHora = 0;// 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;// 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#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/* SENSOR DHT22 (AIRE) */
#define DHTPIN 2
#define DHTTYPE DHT22float TemperaturaAire;
float HumedadAire;
DHT dht(DHTPIN, DHTTYPE);/* SENSOR Temperatura DALLAS (TemperaturaAgua) */
#define ONE_WIRE_BUS 3
OneWire oneWireBus (ONE_WIRE_BUS);
DallasTemperature sensors (&oneWireBus);
float TemperaturaAgua;/* 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// 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 Ecfloat pH;
float EC;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 ....."); setupEsp8266(); // inicia conexión WiFi
pinMode(PinBombaAgua, OUTPUT);
pinMode(PinLuz, OUTPUT); Serial3.begin(9600);
Serial.begin(115200); // establece fecha y hora al arrancar
setTime(hora, minuto, segundo, dia, mes, ano); // Start up the libraries
sensors.begin(); // DALLAS
dht.begin(); // DHT 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);
}void loop() {
// 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 // Lee DHT 22
HumedadAire = dht.readHumidity();
TemperaturaAire = dht.readTemperature(); //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 ;
} //Read the conductivity sensor in μS/cm
float resistanceEC = OpenGarden.readResistanceEC(); //EC Value in resistance
EC = OpenGarden.ECConversion(resistanceEC); //EC Value in μS/cm // Alarmas datos Agua
AlarmaPH = 0; // Resetea el valor de la alarma Ph
if ( pH > PhAlto ) {
AlarmaPH = 2 ;
}
if ( pH < PhBajo ) {
AlarmaPH = 1 ;
} AlarmaTempAgua = 0; // Resetea el valor de la alarma Temp Agua
if ( TemperaturaAgua > TempAguaAlto ) {
AlarmaTempAgua = 2 ;
}
if ( TemperaturaAgua < TempAguaBajo ) {
AlarmaTempAgua = 1 ;
} AlarmaEC = 0; // Resetea el valor de la alarma EC
if ( EC > EcAlto ) {
AlarmaEC = 2 ;
}
if ( EC < EcBajo ) {
AlarmaEC = 1 ;
}
if ( EC < EcMuyBajo ) {
AlarmaEC = 3 ;
} // Construye y envia a ESP 8266
if (viejoMinuto != minute()) {
nuevoMinuto = true;
viejoMinuto = minute();
} else {
nuevoMinuto = false;
} if (minute() % 15 == 0 && nuevoMinuto) { // 5= cada 5 minutos, 15= cada 15 minutos
updateTemp(String(pH) , String(EC), String(TemperaturaAgua), String(TemperaturaAire), String(HumedadAire));
} // 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
} 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;
} // 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(">"); // 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;
} // 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;
} // refresca LCD cada segundo
if (viejoSegundo != second()) {
nuevoSegundo = true;
viejoSegundo = second();
} else {
nuevoSegundo = false;
} if (nuevoSegundo == true) {
visualiza ();
}}
//-------------------------------------------------------------------
// 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); 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");
}
}
}//-------------------------------------------------------------------
// 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;
}
}//-------------------------------------------------------------------
// 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); 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;
}
}//-------------------------------------------------------------------
// 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);
} 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);
} 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");
}
}
}// -------------------------------------
// Muetra datos LCD
// -------------------------------------
void visualiza() { // 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"); lcd.setCursor(0, 1);
lcd.print(format(hour()));
lcd.print(":");
lcd.print(format(minute()));
lcd.print(":");
lcd.print(format(second()));
} // 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"); lcd.setCursor(0, 1);
lcd.print("pH=");
lcd.print(pH);
lcd.print("; ");
lcd.print(TemperaturaAgua);
lcd.print(" C"); }
// visualiza datos AIRE
if (second() % 30 >= 14 && second() % 30 < 21) {
borrarLCD();
lcd.setCursor(0, 0); // posiciona cursor linea 0, columna 0
lcd.print(" AIRE "); lcd.setCursor(0, 1); // posiciona cursor linea 0, columna
lcd.print((int)TemperaturaAire);
lcd.print(" C ; ");
lcd.print((int)HumedadAire);
lcd.print("%"); }
// visualiza ALARMAS
if (second() % 30 >= 21 && second() % 30 < 30) {
borrarLCD();
lcd.setCursor(0, 0); // posiciona cursor linea 0, columna 0
lcd.print(" ALARMAS "); 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");
}
}
}
}void borrarLCD() {
lcd.setCursor(0, 0);
lcd.print(" ");
lcd.setCursor(0, 1);
lcd.print(" ");
}String format(int info) {
String infoEditada;
if (info < 10) {
infoEditada += 0;
}
infoEditada += info; return infoEditada;
}
第 14 步:數(shù)據(jù)可視化
我們集成了一個(gè) LCD 顯示屏,以便查看所有傳感器數(shù)據(jù),而無需無線連接到水培栽培。
第 15 步:安卓應(yīng)用程序
我們使用 App Inventor 創(chuàng)建了一個(gè)特定的應(yīng)用程序。在這里您可以找到源文件。
應(yīng)用程序
- 接收和查看來自傳感器的數(shù)據(jù)。
- 發(fā)送手機(jī)的當(dāng)前時(shí)間以更新 Arduino 的時(shí)間。
第 16 步:網(wǎng)絡(luò)服務(wù)器
我們使用 ESP8266 模塊將系統(tǒng)連接到 Thingspeak(提供數(shù)據(jù)存儲(chǔ)和分析的服務(wù))。
第17步:水培工作!
最后!我們?cè)趯W(xué)校創(chuàng)建了一個(gè)可工作的模塊化水培系統(tǒng)!:)
?
?
?
- Arduino儀器來控制水培系統(tǒng)營(yíng)養(yǎng)液的PPM值
- Arduino垂直水培農(nóng)場(chǎng)
- Arduino控制的水培安裝
- 基于Arduino Nano的自動(dòng)化水培系統(tǒng) 2次下載
- 電路模塊化電路圖紙參考設(shè)計(jì) 15次下載
- 模塊化逆變電源的設(shè)計(jì)與應(yīng)用總結(jié)
- 電賽模塊化程序案例下載 12次下載
- FPGA模塊化設(shè)計(jì)與AlteraHardCopy結(jié)構(gòu)化ASIC 6次下載
- 模塊化多電平換流器優(yōu)化模型預(yù)測(cè)控制策略研究論文資料下載.pdf 3次下載
- 模塊化多電平儲(chǔ)能系統(tǒng)開路故障診斷方法 4次下載
- 模塊化APF無線并聯(lián)控制策略 4次下載
- 基于DSP和FPGA的模塊化實(shí)時(shí)圖像處理系統(tǒng)設(shè)計(jì) 9次下載
- 一種基于單片機(jī)系統(tǒng)的DMA控制電路的模塊化設(shè)計(jì)方案 19次下載
- 某無人機(jī)導(dǎo)航控制系統(tǒng)模塊化設(shè)計(jì) 48次下載
- 基于PLC控制的模塊化自動(dòng)分揀系統(tǒng)
- 模塊化插座接線方法有哪些 697次閱讀
- 模塊化不間斷電源常見組件,旁路路徑的關(guān)鍵 454次閱讀
- PLC模塊化和結(jié)構(gòu)化編程實(shí)例 1091次閱讀
- 如何模塊化編程 1338次閱讀
- 模塊化儀器系統(tǒng)如何滿足自動(dòng)化測(cè)試設(shè)備需求 1377次閱讀
- PLC模塊化編程和結(jié)構(gòu)化編程 8714次閱讀
- 單表多用戶模塊化智能電表系統(tǒng)的原理及設(shè)計(jì) 1987次閱讀
- 模塊化氣動(dòng)閥門控制單元的原理及設(shè)計(jì) 1886次閱讀
- 關(guān)于類別化與模塊化設(shè)計(jì)模式的解釋 5467次閱讀
- 智能水表模塊化結(jié)構(gòu)設(shè)計(jì)及原理 7371次閱讀
- 解讀:一種基于模塊化設(shè)計(jì)的PLM平臺(tái)建設(shè) 1755次閱讀
- 模塊化UPS電源的構(gòu)成以及優(yōu)缺點(diǎn)盤點(diǎn) 7273次閱讀
- 模塊化電源有什么優(yōu)勢(shì) 6755次閱讀
- 基于DSP的模塊化教育機(jī)器人硬件系統(tǒng)方案 2285次閱讀
- 基于嵌入式多核主控制器的模塊化機(jī)器人設(shè)計(jì) 2227次閱讀
下載排行
本周
- 1山景DSP芯片AP8248A2數(shù)據(jù)手冊(cè)
- 1.06 MB | 532次下載 | 免費(fèi)
- 2RK3399完整板原理圖(支持平板,盒子VR)
- 3.28 MB | 339次下載 | 免費(fèi)
- 3TC358743XBG評(píng)估板參考手冊(cè)
- 1.36 MB | 330次下載 | 免費(fèi)
- 4DFM軟件使用教程
- 0.84 MB | 295次下載 | 免費(fèi)
- 5元宇宙深度解析—未來的未來-風(fēng)口還是泡沫
- 6.40 MB | 227次下載 | 免費(fèi)
- 6迪文DGUS開發(fā)指南
- 31.67 MB | 194次下載 | 免費(fèi)
- 7元宇宙底層硬件系列報(bào)告
- 13.42 MB | 182次下載 | 免費(fèi)
- 8FP5207XR-G1中文應(yīng)用手冊(cè)
- 1.09 MB | 178次下載 | 免費(fèi)
本月
- 1OrCAD10.5下載OrCAD10.5中文版軟件
- 0.00 MB | 234315次下載 | 免費(fèi)
- 2555集成電路應(yīng)用800例(新編版)
- 0.00 MB | 33566次下載 | 免費(fèi)
- 3接口電路圖大全
- 未知 | 30323次下載 | 免費(fèi)
- 4開關(guān)電源設(shè)計(jì)實(shí)例指南
- 未知 | 21549次下載 | 免費(fèi)
- 5電氣工程師手冊(cè)免費(fèi)下載(新編第二版pdf電子書)
- 0.00 MB | 15349次下載 | 免費(fèi)
- 6數(shù)字電路基礎(chǔ)pdf(下載)
- 未知 | 13750次下載 | 免費(fèi)
- 7電子制作實(shí)例集錦 下載
- 未知 | 8113次下載 | 免費(fèi)
- 8《LED驅(qū)動(dòng)電路設(shè)計(jì)》 溫德爾著
- 0.00 MB | 6656次下載 | 免費(fèi)
總榜
- 1matlab軟件下載入口
- 未知 | 935054次下載 | 免費(fèi)
- 2protel99se軟件下載(可英文版轉(zhuǎn)中文版)
- 78.1 MB | 537798次下載 | 免費(fèi)
- 3MATLAB 7.1 下載 (含軟件介紹)
- 未知 | 420027次下載 | 免費(fèi)
- 4OrCAD10.5下載OrCAD10.5中文版軟件
- 0.00 MB | 234315次下載 | 免費(fèi)
- 5Altium DXP2002下載入口
- 未知 | 233046次下載 | 免費(fèi)
- 6電路仿真軟件multisim 10.0免費(fèi)下載
- 340992 | 191187次下載 | 免費(fèi)
- 7十天學(xué)會(huì)AVR單片機(jī)與C語言視頻教程 下載
- 158M | 183279次下載 | 免費(fèi)
- 8proe5.0野火版下載(中文版免費(fèi)下載)
- 未知 | 138040次下載 | 免費(fèi)
評(píng)論