-
Notifications
You must be signed in to change notification settings - Fork 0
/
smart_farming.py
170 lines (155 loc) · 4.59 KB
/
smart_farming.py
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
import wifimgr
from time import sleep
import machine
import gc
import network
import json
from machine import Pin, PWM
try:
import usocket as socket
except:
import socket
# Initialize PWM and relay IO
pwm = PWM(Pin(6))
pwm.freq(5000)
relays = [Pin(i, Pin.OUT) for i in range(14, 22)] # Assuming relay pins are from 14 to 21
flag = [False] * 8
# Initialize Wi-Fi using wifimgr
wlan = wifimgr.get_connection()
if wlan is None:
print("Could not initialize the network connection.")
while True:
pass
print("Raspberry Pi Pico W OK")
print("IP address:", wlan.ifconfig()[0])
# HTML to serve (as defined above)
html = """<!DOCTYPE html>
<html>
<head>
<title>Smart Farming Control</title>
<style>
body { font-family: Arial, sans-serif; text-align: center; margin-top: 50px; }
button { padding: 10px 20px; font-size: 16px; margin: 10px; cursor: pointer; }
</style>
<script>
function sendRequest(path) {
var xhr = new XMLHttpRequest();
xhr.open('GET', path, true);
xhr.onreadystatechange = function() {
if (xhr.readyState === 4 && xhr.status === 200) {
alert(xhr.responseText);
}
};
xhr.send();
}
function checkForUpdate() {
sendRequest('/update_check');
}
function performUpdate() {
sendRequest('/update');
}
</script>
</head>
<body>
<h1>Smart Farming Control</h1>
<button onclick="sendRequest('/all_on')">Turn All Relays On</button>
<button onclick="sendRequest('/all_off')">Turn All Relays Off</button>
<br>
<button onclick="checkForUpdate()">Check for Updates</button>
<button onclick="performUpdate()">Perform Update</button>
</body>
</html>
"""
def web_page():
return html
def get_status():
return {
'relay1': flag[0],
'relay2': flag[1],
'relay3': flag[2],
'relay4': flag[3],
'relay5': flag[4],
'relay6': flag[5],
'relay7': flag[6],
'relay8': flag[7]
}
def check_for_update():
# Placeholder function for checking updates
print("Checking for updates...")
# Return True if an update is available
return False
def update_firmware():
# Placeholder function to update firmware
print("Updating firmware...")
return True
# Create a socket and listen for connections
s = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
s.bind(('', 80))
s.listen(5)
print('Listening on port 80')
def serve_client(conn):
request = conn.recv(1024)
request = str(request)
relay_on = request.find('/relay') >= 0
all_on = request.find('/all_on') >= 0
all_off = request.find('/all_off') >= 0
status_req = request.find('/status') >= 0
update_check_req = request.find('/update_check') >= 0
update_req = request.find('/update') >= 0
if relay_on:
relay_num = int(request.split('/relay')[1][0])
flag[relay_num - 1] = not flag[relay_num - 1]
relays[relay_num - 1].value(flag[relay_num - 1])
pwm.duty_u16(5000)
sleep(0.1)
pwm.duty_u16(0)
response = f"Relay {relay_num} {'ON' if flag[relay_num - 1] else 'OFF'}"
elif all_on:
for i in range(8):
flag[i] = True
relays[i].value(True)
pwm.duty_u16(5000)
sleep(0.1)
pwm.duty_u16(0)
response = "All Relays ON"
elif all_off:
for i in range(8):
flag[i] = False
relays[i].value(False)
pwm.duty_u16(5000)
sleep(0.1)
pwm.duty_u16(0)
response = "All Relays OFF"
elif status_req:
response = json.dumps(get_status())
elif update_check_req:
if check_for_update():
response = "Update Available"
else:
response = "No Update Available"
elif update_req:
if update_firmware():
response = "Firmware Updated"
else:
response = "Update Failed"
else:
response = web_page()
conn.send('HTTP/1.1 200 OK\r\n')
if status_req or update_check_req or update_req:
conn.send('Content-Type: application/json\r\n')
else:
conn.send('Content-Type: text/html\r\n')
conn.send('Connection: close\r\n\r\n')
conn.sendall(response)
conn.close()
while True:
try:
if gc.mem_free() < 102000:
gc.collect()
conn, addr = s.accept()
conn.settimeout(3.0)
print('Received HTTP GET connection request from %s' % str(addr))
serve_client(conn)
except OSError as e:
conn.close()
print('Connection closed')