teratail header banner
teratail header banner
質問するログイン新規登録

質問編集履歴

1

個人情報を消しました.

2021/06/18 06:57

投稿

raspypy
raspypy

スコア247

title CHANGED
File without changes
body CHANGED
@@ -15,128 +15,7 @@
15
15
  ![イメージ説明](a61ab6dccb1af9a34ea3795cf101e4d5.jpeg)
16
16
 
17
17
  ##プログラム
18
- ```python3.6
19
- import lora
20
- import ast
21
- import time
22
- import struct
23
- import sys
24
18
  import ambient
25
-
26
- # (bw, sf, timeout)
27
- mode = [
28
- (3, 12, 5), (3, 11, 5), (3, 10, 4), (3, 9, 3), (3, 8, 2), (3, 7, 2),
29
- (4, 12, 5), (4, 11, 4), (4, 10, 3), (4, 9, 3), (4, 8, 2), (4, 7, 2),
30
- (5, 12, 4), (5, 11, 3), (5, 10, 2), (5, 9, 2), (5, 8, 2), (5, 7, 2),
31
- (6, 12, 3), (6, 11, 3), (6, 10, 2), (6, 9, 2), (6, 8, 2), (6, 7, 2)
32
- ]
33
-
34
- channelId1 = 37537
35
- writeKey1 = '17eb678e47248e04'
36
- channelId2 = 37538
37
- writeKey2 = 'c1ebd40ef25434f2'
38
- channelId3 = 37539
39
- writeKey3 = '2e4b2507527c6e1f'
40
- channelId4 = 37540
41
- writeKey4 = '662fed41f01a2148'
42
-
43
19
  am1 = ambient.Ambient(channelId1, writeKey1)
44
- am2 = ambient.Ambient(channelId2, writeKey2)
45
- am3 = ambient.Ambient(channelId3, writeKey3)
46
- am4 = ambient.Ambient(channelId4, writeKey4)
47
20
 
48
- lr = lora.LoRa()
49
-
50
- def printable(l):
51
- x = struct.unpack(str(len(l)) + 'b', l)
52
- y = ''
53
- for i in range(len(x)):
54
- if x[i] >= 0:
55
- y = y + chr(x[i])
56
- return y
57
-
58
- def sendcmd(cmd):
59
- # print(cmd)
60
- lr.write(cmd)
61
- t = time.time()
62
- while (True):
63
- if (time.time() - t) > 5:
64
- print('panic: %s' % cmd)
65
- exit()
66
- line = lr.readline()
67
- if 'OK' in printable(line):
68
- # print(line)
69
- return True
70
- elif 'NG' in printable(line):
71
- # print(line)
72
- return False
73
-
74
- def setMode(bw, sf):
75
- lr.write('config\r\n')
76
- lr.s.flush()
77
- time.sleep(0.2)
78
- lr.reset()
79
- time.sleep(1.5)
80
-
81
- line = lr.readline()
82
- while not ('Mode' in printable(line)):
83
- line = lr.readline()
84
- if len(line) > 0:
85
- print(line)
86
-
87
- sendcmd('2\r\n')
88
- sendcmd('bw %d\r\n' % bw)
89
- sendcmd('sf %d\r\n' % sf)
90
- sendcmd('q 2\r\n')
91
- sendcmd('w\r\n')
92
-
93
- lr.reset()
94
- print('LoRa module set to new mode')
95
- time.sleep(1)
96
- sys.stdout.flush()
97
-
98
- while (True):
99
- rssi = [None] * len(mode)
100
- latlng = ()
101
- for i in range(len(mode)):
102
- print('setMode(bw: %d, sf: %d)' % (mode[i][0], mode[i][1]))
103
- setMode(mode[i][0], mode[i][1])
104
-
105
- t = None if i == 0 else mode[i][2]
106
- timeout = False
107
- start = time.time()
108
- while (True):
109
- while (True):
110
- line = lr.readline(t)
111
- # print(line)
112
- # sys.stdout.flush()
113
- if len(line) == 0: # TIMEOUT
114
- timeout = True
115
- break
116
- if len(line) >= 14: # 'rssi(4bytes),pan id(4bytes),src id(4bytes),\r\n'で14バイト
117
- break
118
- if timeout == True:
119
- rssi[i] = None
120
- print('TIMEOUT')
121
- break;
122
- data = lr.parse(line) # 'rssi(4bytes),pan id(4bytes),src id(4bytes),laglng=(12バイト,12バイト)\r\n', ペイロード34バイト
123
- print(data)
124
- if 'loc=' in data[3]:
125
- loc = ast.literal_eval(data[3].split('=')[1])
126
- rssi[i] = data[0]
127
- latlng = loc
128
- s = mode[i][2] - (time.time() - start)
129
- # print('sleep: ' + str(s))
130
- if i != 0 and s > 0:
131
- time.sleep(s)
132
- break
133
-
134
- print(rssi)
135
- print(latlng)
136
- sys.stdout.flush()
137
-
138
- am1.send({'d1': rssi[5], 'd2': rssi[4], 'd3': rssi[3], 'd4': rssi[2], 'd5': rssi[1], 'd6': rssi[0], 'lat': latlng[0], 'lng': latlng[1]})
139
- am2.send({'d1': rssi[11], 'd2': rssi[10], 'd3': rssi[9], 'd4': rssi[8], 'd5': rssi[7], 'd6': rssi[6], 'lat': latlng[0], 'lng': latlng[1]})
140
- am3.send({'d1': rssi[17], 'd2': rssi[16], 'd3': rssi[15], 'd4': rssi[14], 'd5': rssi[13], 'd6': rssi[12], 'lat': latlng[0], 'lng': latlng[1]})
141
- am4.send({'d1': rssi[23], 'd2': rssi[22], 'd3': rssi[21], 'd4': rssi[20], 'd5': rssi[19], 'd6': rssi[18], 'lat': latlng[0], 'lng': latlng[1]})
142
21
  ```