from machine import Pin, SoftI2C, ADC, PWM
from servo import Servo
import dht
import math
import time
from lcd_api import LcdApi
from i2c_lcd import I2cLcd
import wifi
################################ Mo ta thiet bi
# relay dieu khien hoat dong may bom nuoc/may bom dung dich phan bon
# phần máy bơm hoạt động luân phiên đang bị auto hoạt động và chưa có biện pháp ngắt nguồn
# servo dieu khien mai che nang
# LRD la cam bien anh sang (cai mau xanh xanh nam tren breadboard)
# LRD -> servo
# cam bien do am dat la chip custom mau xanh luc o duoi
# nut bam thuc hien dieu khien thu cong
################################
#cam bien nhiet do, do am
sensor = dht.DHT22(Pin(14))
h = -1
################################
#man hinh led
I2C_ADDR = 0x27
totalRow = 2
totalColumns = 16
i2c = SoftI2C(scl = Pin(22), sda = Pin(21), freq = 10000) #initializing I2C method for ESP32
lcd = I2cLcd(i2c, I2C_ADDR, totalRow, totalColumns)
lcd.putstr("Hello")
# lcd.clear()
################################
#cam bien anh sang
#muc anh sang khong tot: direct sunlight (>30,000 lux)
adc = ADC(Pin(27))
adc.atten(ADC.ATTN_11DB)
rl10 = 50000 # LDR resistance at 10lux
gamma = 0.7 # log(R) / log(lux)
#tinh quang tro
def calculate_resistance():
value = adc.read()
voltage_ratio = value / (4095 - value)
return 10000 * voltage_ratio
#R = R_10 * (lux / 10) ^ -γ => lux = 10 * (R / R_10) ^ -1/γ
#tinh lux
def calculate_lux(resistance):
return 10 * math.pow(resistance / (rl10), -1 / gamma)
################################
#servo
motor = Servo(pin = 23)
# motor.move(n) # quay n°
servAngle = 0
################################
#relay
#relay led đỏ bơm nước tưới
#relay led vàng bơm dung dịch phân bón
waterRelay = Pin(25, Pin.OUT) # nước
fertilizerRelay = Pin(26, Pin.OUT) # phân bón
# relay.off cổng COM kết nối NC
# relay.on cổng COM kết nối NO
# relay.on()
################################
#soil_sensor_chip
# khoảng giá trị đầu ra 350-1024
# 350 là có nước, 1024 là không có nước
# cách dùng: soilMois.read()
soilMois = ADC(Pin(12))
soilMois.atten(ADC.ATTN_11DB)
#test button
button = Pin(4, Pin.OUT)
################################
# Khai báo biến đo lường
t = -1 #nhiệt độ
h = -1 #độ ẩm
lux = -1 #ánh sáng
soilMoisterValue = -1
countingTime = -1
#Các mảng này để lưu trữ và tính giá trị trung bình trong một khoảng thời gian
t_stack = []
h_stack = []
lux_stack = []
while True:
# t = sensor.temperature()
# if h != sensor.humidity():
# h = sensor.humidity()
# lcd.clear()
# lcd.putstr("Humidity:")
# lcd.putstr(str(h))
# # print(calculate_lux(calculate_resistance()))
# motor.move(servAngle)
# servAngle = (servAngle + 30) % 180
# soilMoisterValue = soilMois.read()
# print(soilMoisterValue)
# button.on()
# time.sleep(1)
# print
# # lcd.clear()
# Bộ đếm giây
countingTime += 1
# print(countingTime)
time.sleep(1)
#reset bộ đếm sau mỗi 12h
if countingTime > 12*60*60:
countingTime = 0
# Đo sau mỗi 5 giây
if countingTime % 5 == 0:
# đo từ cảm biến nhiệt độ, độ ẩm
sensor.measure()
t = sensor.temperature()
h = sensor.humidity()
#Lưu giá trị đo lường vào stack
t_stack.append(t)
h_stack.append(h)
# Đo giá trị ánh sáng, đất
lux = calculate_lux(calculate_resistance()) # đo độ sáng
lux_stack.append(lux) #Lưu vào stack
soilMoisterValue = soilMois.read() #đo độ ẩm đất
if countingTime % 5*60 == 0: # Xử lí dữ liệu nhiệt độ, độ ẩm sau mỗi 5p
tempAverage = sum(t_stack)/len(t_stack)
# Gửi dữ liệu nhiệt độ trung bình trong 5p vừa rồi lên cloud
#...........
#Khởi động máy bơm nước để tưới khi nhiệt độ > 40
if tempAverage > 40:
waterRelay.on()
t_stack.clear()