Showing
8 changed files
with
196 additions
and
27 deletions
... | @@ -9,4 +9,5 @@ | ... | @@ -9,4 +9,5 @@ |
9 | ## 일정 | 9 | ## 일정 |
10 | + 2021.05.03: Init(개인 아두이노 코드 git에서 이전) | 10 | + 2021.05.03: Init(개인 아두이노 코드 git에서 이전) |
11 | + 2021.05.11: Arduino 개발 중단, RaspberryPi Pico로 플랫폼 이전, C++ -> MicroPython | 11 | + 2021.05.11: Arduino 개발 중단, RaspberryPi Pico로 플랫폼 이전, C++ -> MicroPython |
12 | -+ 2021.05.12: RaspberryPi Pico v0.1 code complete. Now working on rpi4 with MQTT. | ||
... | \ No newline at end of file | ... | \ No newline at end of file |
12 | ++ 2021.05.12: RaspberryPi Pico v0.1 code complete. Now working on rpi4 with MQTT. | ||
13 | ++ 2021.05.13: RaspberryPi4 v0.1 code complete. with MQTT. + Pico code bug fix. | ||
... | \ No newline at end of file | ... | \ No newline at end of file | ... | ... |
hardware/rpi4/readme.md
0 → 100644
hardware/rpi4/requirements.txt
0 → 100644
1 | +paho-mqtt | ||
... | \ No newline at end of file | ... | \ No newline at end of file |
1 | +import paho.mqtt.client as mqtt | ||
2 | +import paho.mqtt.publish as publish | ||
3 | + | ||
1 | from bluetooth import * | 4 | from bluetooth import * |
2 | import time | 5 | import time |
3 | 6 | ||
7 | +MQTT_BLOCK = False | ||
8 | + | ||
9 | +BT_MAC_ADDRESS = '00:18:91:D8:24:39' | ||
10 | +MED_BOTT_NO = '1' | ||
11 | + | ||
4 | client_socket = BluetoothSocket( RFCOMM ) | 12 | client_socket = BluetoothSocket( RFCOMM ) |
5 | -client_socket.connect(("00:18:91:D8:24:39", 1)) | 13 | +client_mqtt = mqtt.Client() |
6 | -print("bluetooth connected!") | ||
7 | 14 | ||
15 | +# --------------------------------------------------- # | ||
16 | +# INTERNAL FUNCTIONS | ||
17 | +# --------------------------------------------------- # | ||
8 | def _send_data(msg:str): | 18 | def _send_data(msg:str): |
19 | + ''' Bluetooth를 통해 데이터를 송신한다 | ||
20 | + ''' | ||
9 | client_socket.send(msg) | 21 | client_socket.send(msg) |
10 | 22 | ||
11 | def _recv_data(): | 23 | def _recv_data(): |
24 | + ''' Bluetooth를 통해 데이터를 수신한다 | ||
25 | + ''' | ||
12 | # 소켓에 2초간 받을 수 있는 시간을 준다 | 26 | # 소켓에 2초간 받을 수 있는 시간을 준다 |
13 | client_socket.settimeout(2) | 27 | client_socket.settimeout(2) |
14 | 28 | ||
... | @@ -21,23 +35,99 @@ def _recv_data(): | ... | @@ -21,23 +35,99 @@ def _recv_data(): |
21 | while time.time() < timeout_start + timeout: | 35 | while time.time() < timeout_start + timeout: |
22 | data += client_socket.recv(1024).decode('utf-8') | 36 | data += client_socket.recv(1024).decode('utf-8') |
23 | except: | 37 | except: |
24 | - print("INFO: DATA RECV TIMEOUT") | 38 | + print('INFO: DATA RECV TIMEOUT') |
25 | finally: | 39 | finally: |
26 | return data | 40 | return data |
27 | 41 | ||
28 | 42 | ||
29 | -while True: | 43 | +def _sub_mqtt(client, userdata, flags, rc): |
30 | - sel_mode = input("SELECT MODE: ") | 44 | + ''' MQTT에서 subscribe한다 |
45 | + ''' | ||
46 | + print("Connected with result code "+str(rc)) | ||
47 | + client.subscribe(f'bottle/1/stb') | ||
31 | 48 | ||
32 | - if sel_mode == 'W': | 49 | +def _work_mqtt(client, userdata, msg): |
33 | - msg = input("send message : ") | 50 | + ''' MQTT에서 데이터를 받으면 알맞게 로직을 수행한다 |
34 | - _send_data(msg) | 51 | + ''' |
35 | - | 52 | + print('DOING SOMETHING') |
36 | - elif sel_mode == 'WR': | 53 | + global MQTT_BLOCK |
37 | - msg = input("send message : ") | 54 | + MQTT_BLOCK = True |
38 | - _send_data(msg) | 55 | + |
56 | + received_msg = msg.payload.decode('utf-8') | ||
39 | 57 | ||
58 | + data = '' | ||
59 | + data_list = [] | ||
60 | + | ||
61 | + # 만약 req메시지를 받았다면 | ||
62 | + if received_msg == 'req': | ||
63 | + while len(data_list) != 4: | ||
64 | + _send_data('REQ') | ||
65 | + data = _recv_data() | ||
66 | + data_list = data.split('/') | ||
67 | + # 데이터를 Publish한다 | ||
68 | + _pub_mqtt(f'bottle/{MED_BOTT_NO}/bts', data, 'localhost') | ||
69 | + | ||
70 | + # 만약 res메시지를 받았다면 | ||
71 | + elif received_msg.split('/')[0] == 'res': | ||
72 | + _send_data(received_msg.split('/')[1]) | ||
40 | data = _recv_data() | 73 | data = _recv_data() |
41 | - print(f"Received: {data}") | 74 | + data_list = data.split('/') |
75 | + while len(data_list) != 4: | ||
76 | + _send_data('REQ') | ||
77 | + data = _recv_data() | ||
78 | + data_list = data.split('/') | ||
79 | + # 데이터를 Publish한다 | ||
80 | + _pub_mqtt(f'bottle/{MED_BOTT_NO}/bts', data, 'localhost') | ||
81 | + | ||
82 | + print("DEBUG") | ||
83 | + print(data) | ||
84 | + print(data_list) | ||
85 | + print(received_msg) | ||
86 | + MQTT_BLOCK = False | ||
87 | + | ||
88 | +def _pub_mqtt(topic:str, payload:str, hostname:str): | ||
89 | + ''' MQTT를 통해 데이터를 publish한다 | ||
90 | + ''' | ||
91 | + publish.single( | ||
92 | + topic=topic, | ||
93 | + payload=payload, | ||
94 | + hostname=hostname) | ||
95 | + | ||
96 | + | ||
97 | +# --------------------------------------------------- # | ||
98 | +# MAIN | ||
99 | +# --------------------------------------------------- # | ||
100 | +def _run(): | ||
101 | + # CONNECT BT | ||
102 | + client_socket.connect((BT_MAC_ADDRESS, 1)) | ||
103 | + print('bluetooth connected!') | ||
104 | + | ||
105 | + # SUBSCRIBE MQTT | ||
106 | + client_mqtt.on_connect = _sub_mqtt | ||
107 | + client_mqtt.on_message = _work_mqtt | ||
108 | + client_mqtt.connect_async("localhost") | ||
109 | + client_mqtt.loop_start() | ||
110 | + | ||
111 | + | ||
112 | + while True: | ||
113 | + if MQTT_BLOCK is False: | ||
114 | + # 항상 데이터를 받을 상태로 있는다 | ||
115 | + data = _recv_data() | ||
116 | + | ||
117 | + # 만약 데이터가 ''가 아니면 무언가 온 것이므로 처리한다 | ||
118 | + if data != '': | ||
119 | + print('DATA IN') | ||
120 | + data_list = data.split('/') | ||
121 | + | ||
122 | + # 만약 데이터가 불량하게 왔을 경우, 제대로 올때까지 반복시도한다 | ||
123 | + while len(data_list) != 4: | ||
124 | + data = _recv_data() | ||
125 | + data_list = data.split('/') | ||
126 | + | ||
127 | + # 데이터를 Publish한다 | ||
128 | + _pub_mqtt(f'bottle/{MED_BOTT_NO}/bts', data, 'localhost') | ||
129 | + | ||
130 | + client_socket.close() | ||
42 | 131 | ||
43 | -client_socket.close() | ||
... | \ No newline at end of file | ... | \ No newline at end of file |
132 | +if __name__ == '__main__': | ||
133 | + _run() | ||
... | \ No newline at end of file | ... | \ No newline at end of file | ... | ... |
hardware/rpi4/serverside_mqtt_rtest.py
0 → 100644
1 | +import paho.mqtt.client as mqtt | ||
2 | + | ||
3 | +import time | ||
4 | + | ||
5 | +def on_connect(client, userdata, flags, rc): | ||
6 | + print("Connected with result code "+str(rc)) | ||
7 | + client.subscribe("bottle/1/bts") # 요거 수정해서 확인하세요 | ||
8 | + | ||
9 | +def on_message(client, userdata, msg): | ||
10 | + print(msg.topic) | ||
11 | + print(msg.payload.decode('utf-8')) | ||
12 | + | ||
13 | +client = mqtt.Client() | ||
14 | +client.on_connect = on_connect | ||
15 | +client.on_message = on_message | ||
16 | + | ||
17 | +client.connect_async("localhost") | ||
18 | +client.loop_start() | ||
19 | + | ||
20 | +while True: | ||
21 | + print("TESTing") | ||
22 | + time.sleep(1) | ||
... | \ No newline at end of file | ... | \ No newline at end of file |
hardware/rpi4/serverside_mqtt_stest.py
0 → 100644
1 | +import paho.mqtt.publish as publish | ||
2 | + | ||
3 | +# hub -> server | ||
4 | +# msgs = \ | ||
5 | +# [ | ||
6 | +# { | ||
7 | +# 'topic':"bottle/1/bts", | ||
8 | +# 'payload':"1/30.4/32.2/1" | ||
9 | +# } | ||
10 | +# ] | ||
11 | + | ||
12 | +# server -> hub with date | ||
13 | +# msgs = \ | ||
14 | +# [ | ||
15 | +# { | ||
16 | +# 'topic':"bottle/1/stb", | ||
17 | +# 'payload':"res/0513" | ||
18 | +# } | ||
19 | +# ] | ||
20 | + | ||
21 | +# server -> hub without date | ||
22 | +msgs = \ | ||
23 | +[ | ||
24 | + { | ||
25 | + 'topic':"bottle/1/stb", | ||
26 | + 'payload':"req" | ||
27 | + } | ||
28 | +] | ||
29 | + | ||
30 | +publish.multiple(msgs, hostname="localhost") |
... | @@ -8,8 +8,9 @@ display4 = tm1637.TM1637(clk=Pin(12), dio=Pin(13)) | ... | @@ -8,8 +8,9 @@ display4 = tm1637.TM1637(clk=Pin(12), dio=Pin(13)) |
8 | # --------------------------------------------------- # | 8 | # --------------------------------------------------- # |
9 | def work_tm1637(data:str): | 9 | def work_tm1637(data:str): |
10 | display4.show(data) | 10 | display4.show(data) |
11 | - sleep(2) | 11 | + |
12 | - mydisplay.show(' ') | 12 | +def off_tm1637(): |
13 | + display4.show(' ') | ||
13 | 14 | ||
14 | # # Show a word | 15 | # # Show a word |
15 | # mydisplay.show("Pico") | 16 | # mydisplay.show("Pico") | ... | ... |
... | @@ -10,6 +10,21 @@ import reed | ... | @@ -10,6 +10,21 @@ import reed |
10 | import display4 | 10 | import display4 |
11 | 11 | ||
12 | # --------------------------------------------------- # | 12 | # --------------------------------------------------- # |
13 | +# FUNCTIONS | ||
14 | +# --------------------------------------------------- # | ||
15 | +def _collect_sensor_datas(reed_data:int) -> str: | ||
16 | + # Collect Humidity, Temperature | ||
17 | + dht_data = dht.work_dht() | ||
18 | + if dht_data == False: | ||
19 | + dht_data = [0,0] | ||
20 | + # Collect Ultrasonic distance | ||
21 | + ultrasonic_data = ultrasonic.work_sr04() | ||
22 | + # Make data string | ||
23 | + send_data_str = str(reed_data) + '/' + str(dht_data[1]) + '/' + str(dht_data[0]) + '/' + str(ultrasonic_data) | ||
24 | + | ||
25 | + return send_data_str | ||
26 | + | ||
27 | +# --------------------------------------------------- # | ||
13 | # LOOP ENTRYPOINT | 28 | # LOOP ENTRYPOINT |
14 | # --------------------------------------------------- # | 29 | # --------------------------------------------------- # |
15 | def _run(): | 30 | def _run(): |
... | @@ -37,22 +52,16 @@ def _run(): | ... | @@ -37,22 +52,16 @@ def _run(): |
37 | 52 | ||
38 | # IF INPUT MEANS GET MESSAGE or MEDICINE LID STATUS CHANGED | 53 | # IF INPUT MEANS GET MESSAGE or MEDICINE LID STATUS CHANGED |
39 | if input_data == 'REQ' or reed_data != current_reed_data: | 54 | if input_data == 'REQ' or reed_data != current_reed_data: |
40 | - # Collect Humidity, Temperature | ||
41 | - dht_data = dht.work_dht() | ||
42 | - if dht_data == False: | ||
43 | - dht_data = [0,0] | ||
44 | - # Collect Ultrasonic distance | ||
45 | - ultrasonic_data = ultrasonic.work_sr04() | ||
46 | - # Make data string | ||
47 | - send_data_str = str(reed_data) + '/' + str(dht_data[1]) + '/' + str(dht_data[0]) + '/' + str(ultrasonic_data) | ||
48 | # Send data using BT | 55 | # Send data using BT |
49 | - bto.send_data_bt(send_data_str) | 56 | + bto.send_data_bt(_collect_sensor_datas(reed_data)) |
50 | - | ||
51 | else: | 57 | else: |
52 | # Refine BT data | 58 | # Refine BT data |
53 | input_data = input_data.strip() | 59 | input_data = input_data.strip() |
54 | display4.work_tm1637(input_data) | 60 | display4.work_tm1637(input_data) |
55 | neopixel.work_led() | 61 | neopixel.work_led() |
62 | + display4.off_tm1637() | ||
63 | + # Send data using BT | ||
64 | + bto.send_data_bt(_collect_sensor_datas(reed_data)) | ||
56 | 65 | ||
57 | # Update reed state | 66 | # Update reed state |
58 | reed_data = current_reed_data | 67 | reed_data = current_reed_data | ... | ... |
-
Please register or login to post a comment