The rapid changes in climate due to the effect of global warming cause a decrease in productivity in agricultural activities. In the 1500s, Daniel Barbaro built the first known greenhouse in history. Greenhouses are suitable environments for growing plants that can provide controllable air, water, heat and light conditions.
In greenhouses, heaters are used to balance the heat, electric water motors for irrigation, fans are used to regulate humidity and to provide pollination. With the development of technology, the producer can follow the status of the greenhouse with his phone from anywhere and can do the work that needs to be done. The general name of this technology is Internet of Things (IOT).
Special sensors are used to measure temperature, humidity and oxygen content in greenhouses. In addition, special sensors measuring soil moisture are used to decide on irrigation. Electronically controlled drip irrigation systems are used to increase irrigation efficiency.
In this project, we will prepare a simple greenhouse with IOT technology and PicoBricks. We will use PicoBricks with the ESP8266 wifi module in this greenhouse. In this way, we will turn the greenhouse into an object that we can track over the Internet.
Details and Algorithm
The greenhouse model you will prepare will include a soil moisture sensor, and a DHT11 temperature and humidity sensor hanging from the top. A submersible pump will be placed in the water tank outside the model, and the hose coming out of the end of the pump will go to the ground in the greenhouse. Picoboard will be placed in a suitable place outside the greenhouse model.
When Picobricks starts, it starts to broadcast wifi thanks to the ESP8266 wifi module. When we enter the IP address of Esp8266 from the smart phone connected to the same network, we encounter the web page where we will control the Greenhouse. Here we can see the temperature and humidity values. If we wish, we can start the irrigation process by giving the irrigation command.
Components
1X PicoBricks
1X Pump
1X Soil Humidity Sensor
1X ESP8266 Wifi Module
PicoBricks Smart Greenhouse Kit
Jumper Cables
Easy Connection Cables
Wiring Diagram
You can code and run Picobricks’ modules without wiring. If you are going to use the modules by separating them from the board, you should make the module connections with grove cables.
Construction Stages of the Project
1-Detach the floor of the Greenhouse model from the SR-2 coded part in the Greenhouse kit.
2- Attach the pieces in the middle of the SR-3 piece to the floor of the Greenhouse.
3- Remove the inner walls of the greenhouse from the SR-4 part and attach it to the ground of the greenhouse.
4- Remove the Greenhouse arches in SR-1 and SR-3 and place them on the greenhouse floor.
5-Cover the rectangular area where soil will be placed with cling film. After irrigation, you will protect the model parts. Pour the plant soil into the greenhouse. Fill so that there is no empty space.
6- Insert the parts of the SR-4 into the notches on the greenhouse.
7-Thread the remaining two thin flat pieces of SR-4 through the holes on both sides of the greenhouse from the underside. This process makes the greenhouse more robust.
8- Pass the hose to the submersible pump. You will install an irrigation system similar to the drip irrigation system in the greenhouse. Pass the hose where you want the soil to be irrigated. Remember to cut the hose just enough to reach the water tank.
9- Place the DHT11 temperature and humidity sensor on the greenhouse model and the Soil Moisture Sensor in the soil.
10- Plug the Soil Moisture sensor to the pin number GPIO27 on the Picoboard and connect the 2 pen battery to the power input of the Picoboard. Place the submersible pump and the end of the hose in a deep container of water. Be careful not to get the motor drive wet.
MicroBlocks Codes of the PicoBricks
You can access the Microblocks codes of the project by dragging the image to the Microblocks Run tab or click the button.
MicroPython Codes of the PicoBricks
import utime
import uos
import machine
from machine import Pin, ADC
from picobricks import DHT11
from utime import sleep
dht_sensor = DHT11(Pin(11))
smo_sensor=ADC(27)
m1 = Pin(22, Pin.OUT)
m1.low()
print("Machine: \t" + uos.uname()[4])
print("MicroPython: \t" + uos.uname()[3])
uart0 = machine.UART(0, baudrate=115200)
print(uart0)
def Connect_WiFi(cmd, uart=uart0, timeout=5000):
print("CMD: " + cmd)
uart.write(cmd)
utime.sleep(7.0)
Wait_ESP_Rsp(uart, timeout)
print()
def Rx_ESP_Data():
recv=bytes()
while uart0.any()>0:
recv+=uart0.read(1)
res=recv.decode('utf-8')
return res
def Send_AT_Cmd(cmd, uart=uart0, timeout=2000):
print("CMD: " + cmd)
uart.write(cmd)
Wait_ESP_Rsp(uart, timeout)
print()
def Wait_ESP_Rsp(uart=uart0, timeout=2000):
prvMills = utime.ticks_ms()
resp = b""
while (utime.ticks_ms()-prvMills)'+'\r\n')
uart0.write(''+'\r\n')
uart0.write('CONNECTED...
'+'\r\n')
uart0.write('Irrigation Complete.
'+'\r\n')
uart0.write(''+'\r\n')
elif '/SERA' in res:
#sleep(1) # It was used for DHT11 to measure.
dht_sensor.measure() # Use the sleep() command before this line.
temp=dht_sensor.temperature
hum=dht_sensor.humidity
smo=round((smo_sensor.read_u16()/65535)*100)
sendStr="\"TEMP\":{}, \"Humidity\":{}, \"S.Moisture\":{}%".format(temp,hum,smo)
sendText="{"+sendStr+"}"
strLen=46+len(sendText)
connection_id = res[id_index+5]
print("connectionId:" + connection_id)
print ('! Incoming connection - sending webpage')
atCmd="AT+CIPSEND="+connection_id+","+str(strLen)
uart0.write(atCmd+'\r\n')
utime.sleep(1.0)
uart0.write('HTTP/1.1 200 OK'+'\r\n')
uart0.write('Content-Type: text/html'+'\r\n')
uart0.write(''+'\r\n')
uart0.write(sendText+'\r\n')
elif '/' in res:
print("resp:")
print(res)
connection_id = res[id_index+5]
print("connectionId:" + connection_id)
print ('! Incoming connection - sending webpage')
uart0.write('AT+CIPSEND='+connection_id+',200'+'\r\n')
utime.sleep(3.0)
uart0.write('HTTP/1.1 200 OK'+'\r\n')
uart0.write('Content-Type: text/html'+'\r\n')
uart0.write('Connection: close'+'\r\n')
uart0.write(''+'\r\n')
uart0.write(''+'\r\n')
uart0.write(''+'\r\n')
uart0.write('CONNECTED.
'+'\r\n')
uart0.write('INFO:Get Sensor DataWATERING:Run Water Pump
'+'\r\n')
uart0.write(''+'\r\n')
utime.sleep(4.0)
Send_AT_Cmd('AT+CIPCLOSE='+ connection_id+'\r\n') # once file sent, close connection
utime.sleep(3.0)
recv_buf="" #reset buffer
print ('Waiting For connection...')
Arduino C Codes of the PicoBricks
#include
#define RX 0
#define TX 1
#define LIMIT_TEMPERATURE 30
#define DHTPIN 11
#define DHTTYPE DHT11
#define smo_sensor 27
#define motor 22
#define DEBUG true
DHT dht(DHTPIN, DHTTYPE);
int connectionId;
void setup() {
Serial1.begin(115200);
dht.begin();
pinMode(smo_sensor, INPUT);
pinMode(motor, OUTPUT);
sendData("AT+RST\r\n", 2000, DEBUG); // reset module
sendData("AT+GMR\r\n", 1000, DEBUG); // configure as access point
sendData("AT+CIPSERVER=0\r\n", 1000, DEBUG); // configure as access point
sendData("AT+RST\r\n", 1000, DEBUG); // configure as access point
sendData("AT+RESTORE\r\n", 1000, DEBUG); // configure as access point
sendData("AT+CWMODE?\r\n", 1000, DEBUG); // configure as access point
sendData("AT+CWMODE=1\r\n", 1000, DEBUG); // configure as access point
sendData("AT+CWMODE?\r\n", 1000, DEBUG); // configure as access point
sendData("AT+CWJAP=\"WIFI_ID\",\"WIFI_PASSWORD\"\r\n", 5000, DEBUG); // ADD YOUR OWN WIFI ID AND PASSWORD
delay(3000);
sendData("AT+CIFSR\r\n", 1000, DEBUG); // get ip address
delay(3000);
sendData("AT+CIPMUX=1\r\n", 1000, DEBUG); // configure for multiple connections
delay(1000);
sendData("AT+CIPSERVER=1,80\r\n", 1000, DEBUG); // turn on server on port 80
delay(1000);
}
void loop() {
if (Serial1.find("+IPD,")) {
delay(300);
connectionId = Serial1.read() - 48;
String serialIncoming = Serial1.readStringUntil('\r');
Serial.print("SERIAL_INCOMING:");
Serial.println(serialIncoming);
if (serialIncoming.indexOf("/WATERING") > 0) {
Serial.println("Irrigation Start");
digitalWrite(motor, HIGH);
delay(1000); // 10 sec.
digitalWrite(motor, LOW);
Serial.println("Irrigation Finished");
Serial.println("! Incoming connection - sending WATERING webpage");
String html = "";
html += "";
html += "Irrigation Complete.
";
html += "";
espsend(html);
}
if (serialIncoming.indexOf("/SERA") > 0) {
delay(300);
float smo = analogRead(smo_sensor);
float smopercent = (460-smo)*100.0/115.0 ; //min ve max değerleri değişken.
Serial.print("SMO: %");
Serial.println(smo);
float temperature = dht.readTemperature();
Serial.print("Temp: ");
Serial.println(temperature);
float humidity = dht.readHumidity();
Serial.print("Hum: ");
Serial.println(humidity);
Serial.println("! Incoming connection - sending SERA webpage");
String html = "";
html += "";
html += "TEMPERATURE
";
html += "";
html += (String)temperature;
html += " C
";
html += "HUMIDITY
";
html += "";
html += (String)humidity;
html += "%
";
html += "SMO
";
html += "";
html += (String)smopercent;
html += "%
";
html += "";
espsend(html);
}
else
Serial.println("! Incoming connection - sending MAIN webpage");
String html = "";
html += "";
html += "CONNECTED.
";
html += "INFO:Get Sensor Data
WATERING:Run Water Pump ";
html += "";
espsend(html);
String closeCommand = "AT+CIPCLOSE="; ////////////////close the socket connection////esp command
closeCommand += connectionId; // append connection id
closeCommand += "\r\n";
sendData(closeCommand, 3000, DEBUG);
}
}
//////////////////////////////sends data from ESP to webpage///////////////////////////
void espsend(String d)
{
String cipSend = " AT+CIPSEND=";
cipSend += connectionId;
cipSend += ",";
cipSend += d.length();
cipSend += "\r\n";
sendData(cipSend, 1000, DEBUG);
sendData(d, 1000, DEBUG);
}
//////////////gets the data from esp and displays in serial monitor///////////////////////
String sendData(String command, const int timeout, boolean debug)
{
String response = "";
Serial1.print(command);
long int time = millis();
while ( (time + timeout) > millis())
{
while (Serial1.available())
{
char c = Serial1.read(); // read the next character.
response += c;
}
}
if (debug)
{
Serial.print(response); //displays the esp response messages in arduino Serial monitor
}
return response;
}
Project Image
Project Proposal 💡
In the smart greenhouse project, by adding an OLED screen to the greenhouse entrance, you can monitor the humidity and temperature values inside, and by adding sensors such as MQ2 gas sensor, carbon dioxide sensor, air quality sensor, you can monitor the weather inside the greenhouse via WiFi with your mobile phone. In addition, by adding a DC fan and relay to the greenhouse, you can turn the ventilation on and off according to the indoor air quality with a mobile phone via WiFi.