Nathan jimTerry
Published

Smart greenhouse

A automated and fully sustainable greenhouse capable of watering the plants without physical manpower.

BeginnerWork in progress184
Smart greenhouse

Things used in this project

Hardware components

M5Stack RGB Unit with NeoPixel RGB LED (SK6812)
M5Stack RGB Unit with NeoPixel RGB LED (SK6812)
×1
SG90 Micro-servo motor
SG90 Micro-servo motor
×1
Earth Module Grove Compatible Soil monitoring
M5Stack Earth Module Grove Compatible Soil monitoring
×1
Light Unit with Photo-resistance
M5Stack Light Unit with Photo-resistance
×1
M5Stack env. 2
×1

Software apps and online services

M5Stack UI flow

Story

Read more

Code

FINAL PROJECT.m5f

Python
This is done through ui flow
from m5stack import *
from m5ui import *
from uiflow import *
import time
import unit

setScreenColor(0x00262b)
servo_0 = unit.get(unit.SERVO, unit.PORTC)
env2_1 = unit.get(unit.ENV2, unit.PAHUB0)
pbhub_0 = unit.get(unit.PBHUB, unit.PAHUB5)
rgb_1 = unit.get(unit.RGB, unit.PORTB)


MOTORANGLE = None
BREATHINGEFFECT = None
LoadingbarLENGTH = None
TEMPERATURE = None
HUMIDITY = None
LIGHTVALUE = None
WATER = None



Temperature = M5TextBox(44, 49, "Temperature", lcd.FONT_Default, 0xFFFFFF, rotate=0)
image0 = M5Img(60, 20, "res/waiting.jpg", False)
Humidity = M5TextBox(70, 115, "Humidity", lcd.FONT_Default, 0xFFFFFF, rotate=0)
temptext = M5TextBox(210, 49, "Text", lcd.FONT_Default, 0xFFFFFF, rotate=0)
lighttext = M5TextBox(210, 148, "Text", lcd.FONT_Default, 0xFFFFFF, rotate=0)
humitext = M5TextBox(210, 115, "Text", lcd.FONT_Default, 0xFFFFFF, rotate=0)
Light = M5TextBox(96, 148, "Light", lcd.FONT_Default, 0xFFFFFF, rotate=0)
LoadingBox = M5Rect(60, 167, 200, 20, 0x000000, 0xFFFFFF)
Start = M5TextBox(53, 217, "Start", lcd.FONT_Default, 0xFFFFFF, rotate=0)
shutdown = M5TextBox(216, 217, "Shutdown", lcd.FONT_Default, 0xFFFFFF, rotate=0)
LoadingBar = M5Rect(60, 168, 10, 18, 0xffffff, 0xffffff)
reset = M5TextBox(139, 217, "Reset", lcd.FONT_Default, 0xFFFFFF, rotate=0)
watertext = M5TextBox(210, 83, "Text", lcd.FONT_Default, 0xFFFFFF, rotate=0)
WaterLevel = M5TextBox(49, 82, "Water Level", lcd.FONT_Default, 0xFFFFFF, rotate=0)
motortext = M5Title(title="Motor Currently Active", x=3, fgcolor=0xFFFFFF, bgcolor=0x0d5e00)

import math
from numbers import Number


# Describe this function...
def startstopshow():
  global MOTORANGLE, BREATHINGEFFECT, LoadingbarLENGTH, TEMPERATURE, HUMIDITY, LIGHTVALUE, WATER
  Start.show()
  shutdown.show()

# Describe this function...
def TEXTSHOW():
  global MOTORANGLE, BREATHINGEFFECT, LoadingbarLENGTH, TEMPERATURE, HUMIDITY, LIGHTVALUE, WATER
  Temperature.show()
  Humidity.show()
  Light.show()
  temptext.show()
  lighttext.show()
  humitext.show()
  watertext.show()
  WaterLevel.show()

# Describe this function...
def startstophide():
  global MOTORANGLE, BREATHINGEFFECT, LoadingbarLENGTH, TEMPERATURE, HUMIDITY, LIGHTVALUE, WATER
  Start.hide()
  shutdown.hide()

# Describe this function...
def TEXTHIDE():
  global MOTORANGLE, BREATHINGEFFECT, LoadingbarLENGTH, TEMPERATURE, HUMIDITY, LIGHTVALUE, WATER
  Temperature.hide()
  temptext.hide()
  Light.hide()
  lighttext.hide()
  humitext.hide()
  Humidity.hide()
  watertext.hide()
  WaterLevel.hide()
  reset.hide()
  motortext.hide()
  LoadingBox.hide()
  LoadingBar.hide()

# Describe this function...
def LOADING_BAR():
  global MOTORANGLE, BREATHINGEFFECT, LoadingbarLENGTH, TEMPERATURE, HUMIDITY, LIGHTVALUE, WATER
  image0.show()
  LoadingbarLENGTH = 1
  LoadingBox.show()
  LoadingBar.show()
  while not LoadingbarLENGTH == 160:
    while True:
      LoadingBar.setSize(LoadingbarLENGTH, 18)
      wait_ms(5)
      LoadingbarLENGTH = (LoadingbarLENGTH if isinstance(LoadingbarLENGTH, Number) else 0) + 1
      break
      wait_ms(2)
  while not LoadingbarLENGTH == 200:
    while True:
      LoadingBar.setSize(LoadingbarLENGTH, 18)
      wait_ms(30)
      LoadingbarLENGTH = (LoadingbarLENGTH if isinstance(LoadingbarLENGTH, Number) else 0) + 1
      break
      wait_ms(2)
  wait_ms(200)
  image0.hide()
  TEXTHIDE()

# Describe this function...
def MOTORTEST():
  global MOTORANGLE, BREATHINGEFFECT, LoadingbarLENGTH, TEMPERATURE, HUMIDITY, LIGHTVALUE, WATER
  MOTORANGLE = 0
  servo_0.write_angle(MOTORANGLE)
  for count in range(15):
    MOTORANGLE = MOTORANGLE + 30
    servo_0.write_angle(MOTORANGLE)
    wait_ms(250)
    MOTORANGLE = MOTORANGLE - 20
    servo_0.write_angle(MOTORANGLE)
    wait_ms(50)
  MOTORANGLE = 0
  servo_0.write_angle(MOTORANGLE)

# Describe this function...
def RGB_breathing_effect():
  global MOTORANGLE, BREATHINGEFFECT, LoadingbarLENGTH, TEMPERATURE, HUMIDITY, LIGHTVALUE, WATER
  BREATHINGEFFECT = 0
  for count2 in range(100):
    BREATHINGEFFECT = (BREATHINGEFFECT if isinstance(BREATHINGEFFECT, Number) else 0) + 1
    wait_ms(10)
  for count3 in range(100):
    BREATHINGEFFECT = (BREATHINGEFFECT if isinstance(BREATHINGEFFECT, Number) else 0) + -1
    wait_ms(10)

# Describe this function...
def START():
  global MOTORANGLE, BREATHINGEFFECT, LoadingbarLENGTH, TEMPERATURE, HUMIDITY, LIGHTVALUE, WATER
  rgb.setColorAll(0x000000)
  image0.show()
  wait_ms(500)
  for count4 in range(5):
    rgb.setColorFrom(6 , 10 ,0xffff00)
    rgb.setColorFrom(1 , 5 ,0x000000)
    wait_ms(500)
    rgb.setColorFrom(6 , 10 ,0x000000)
    rgb.setColorFrom(1 , 5 ,0xffff00)
    wait_ms(500)
  rgb.setColorAll(0x000000)
  image0.hide()
  wait(2)
  rgb.setColorAll(0x33ff33)

# Describe this function...
def RESET():
  global MOTORANGLE, BREATHINGEFFECT, LoadingbarLENGTH, TEMPERATURE, HUMIDITY, LIGHTVALUE, WATER
  servo_0.write_angle(0)
  LOADING_BAR()

# Describe this function...
def OFF():
  global MOTORANGLE, BREATHINGEFFECT, LoadingbarLENGTH, TEMPERATURE, HUMIDITY, LIGHTVALUE, WATER
  rgb.setColorAll(0x000000)
  for count5 in range(5):
    rgb.setColorAll(0xffff00)
    wait_ms(250)
    rgb.setColorAll(0x000000)
    wait_ms(250)
  servo_0.write_angle(180)
  for count6 in range(2):
    rgb.setColorAll(0xffff00)
    wait_ms(250)
    rgb.setColorAll(0x000000)
    wait_ms(250)
  servo_0.write_angle(0)
  for count7 in range(4):
    rgb.setColorAll(0xffff00)
    wait_ms(250)
    rgb.setColorAll(0x000000)
    wait_ms(250)
    image0.hide()
  image0.hide()
  wait(2)
  rgb.setColorAll(0xff0000)


def buttonC_wasPressed():
  global MOTORANGLE, BREATHINGEFFECT, LoadingbarLENGTH, TEMPERATURE, HUMIDITY, LIGHTVALUE, WATER
  TEXTHIDE()
  startstophide()
  image0.show()
  OFF()
  image0.hide()
  servo_0.write_angle(0)
  while not (btnA.isPressed()):
    while True:
      Start.show()
      break
      wait_ms(2)
  pass
btnC.wasPressed(buttonC_wasPressed)


rgb.setColorAll(0x3366ff)
TEXTHIDE()
Start.show()
rgb.setBrightness(100)

def buttonA_wasPressed():
  global MOTORANGLE, BREATHINGEFFECT, LoadingbarLENGTH, TEMPERATURE, HUMIDITY, LIGHTVALUE, WATER
  servo_0.write_angle(0)
  shutdown.hide()
  Start.hide()
  START()
  TEXTSHOW()
  shutdown.show()
  reset.show()
  while not ((btnB.isPressed()) or (btnC.isPressed())):
    while True:
      TEMPERATURE = int((env2_1.temperature))
      HUMIDITY = int((env2_1.humidity))
      LIGHTVALUE = int((10 - (math.ceil(math.sqrt(pbhub_0.analogRead(5))) - 50)))
      WATER = int((14 - (math.ceil(math.sqrt(pbhub_0.analogRead(4))) - 50)))
      wait(0.2)
      temptext.setText(str(TEMPERATURE))
      humitext.setText(str(HUMIDITY))
      lighttext.setText(str(LIGHTVALUE))
      watertext.setText(str(WATER))
      if (WATER < 5) & (LIGHTVALUE > 7):
        motortext.show()
        MOTORTEST()
        motortext.hide()
      elif (TEMPERATURE > 29) & (WATER < 3):
        motortext.show()
        MOTORTEST()
        motortext.hide()
      break
      wait_ms(2)
  TEXTHIDE()
  pass
btnA.wasPressed(buttonA_wasPressed)

def buttonB_wasPressed():
  global MOTORANGLE, BREATHINGEFFECT, LoadingbarLENGTH, TEMPERATURE, HUMIDITY, LIGHTVALUE, WATER
  rgb.setColorAll(0xffff00)
  TEXTHIDE()
  startstophide()
  RESET()
  while not ((btnA.isPressed()) or (btnC.isPressed())):
    while True:
      Start.show()
      shutdown.show()
      rgb.setColorAll(0x3333ff)
      break
      wait_ms(2)
  pass
btnB.wasPressed(buttonB_wasPressed)

Credits

Nathan jim
1 project • 0 followers
Terry
1 project • 0 followers

Comments