質問編集履歴

5

初心者アイコンをつけました。

2021/09/10 02:13

投稿

Yuji_222
Yuji_222

スコア0

test CHANGED
File without changes
test CHANGED
@@ -383,3 +383,9 @@
383
383
  ### 補足情報(FW/ツールのバージョンなど)
384
384
 
385
385
  ・ macOS
386
+
387
+ ・ VScode
388
+
389
+ ・ Python
390
+
391
+ ・ RaspberryPi pico

4

書式の改善

2021/09/10 02:13

投稿

Yuji_222
Yuji_222

スコア0

test CHANGED
File without changes
test CHANGED
@@ -68,10 +68,6 @@
68
68
 
69
69
 
70
70
 
71
- コード
72
-
73
-
74
-
75
71
  ```
76
72
 
77
73
  from machine import Pin
@@ -118,7 +114,9 @@
118
114
 
119
115
 
120
116
 
121
- Python (DHT11モジュールファイル dht.py)
117
+ Python (DHT11モジュールファイル)
118
+
119
+ **dht.py**
122
120
 
123
121
  ```
124
122
 

3

書式の改善

2021/09/10 01:57

投稿

Yuji_222
Yuji_222

スコア0

test CHANGED
File without changes
test CHANGED
@@ -118,7 +118,9 @@
118
118
 
119
119
 
120
120
 
121
- ```Python (DHT11モジュールファイル dht.py)
121
+ Python (DHT11モジュールファイル dht.py)
122
+
123
+ ```
122
124
 
123
125
  import array
124
126
 

2

エラーメッセージの出るプログラム追加と状況を詳しく記入させていただきました。

2021/09/10 01:55

投稿

Yuji_222
Yuji_222

スコア0

test CHANGED
File without changes
test CHANGED
@@ -6,17 +6,37 @@
6
6
 
7
7
  RaspberryPi pico と Pythonで、DHT11から得た値をある指数に変換し、指数の大きさによってフルカラーLEDの色を変化させるというデバイスを制作しております。開発環境は、VScodeです。
8
8
 
9
- その前段階として、以下サイトのコードをほとんどそのまま用いてDHT11のモジュールが使用できるかを試しています。
9
+ その前段階として、以下に示した参考サイトのコードをほとんどそのまま用いて(華氏と摂氏の両方を表すプログラムであったため、華氏に言及する2行を削除しました。 14行目、16行目。)DHT11のモジュールが使用できるかを試しています。
10
-
10
+
11
- しかしながら、DHT11の部分に赤波線が現れ、正常にプログラムが作動しません。
11
+ しかしながら、コードを添付したところ、下記(該当のソースコード 5行目)のDHT11の部分に赤波線が現れ、そのまま実行しましたが正常にプログラムが作動しませんでした
12
-
12
+
13
+
14
+
13
- dht.pyもインストール済みで、同じように進めていたのですがどこに問題があるのかわからず苦戦しております。
15
+ モジュールであるDHT11のファイル、dht.pyもインストール済みで、同じように進めていたのですがどこに問題があるのかわからず苦戦しております。
16
+
14
-
17
+ 今回のテストを行う前に、ラズパイpicoに搭載してあるLEDを点滅させるプログラムは正常に作動いたしましたので、今回はおそらくモジュールが反映されていないのではないかと考えております。
18
+
19
+
20
+
15
- ご教授いただけると幸いです。
21
+ お忙しいところ恐縮ですが、ご教授いただけると幸いです。
22
+
23
+
24
+
16
-
25
+ * 尚、エラーメッセージ5行目の _convert_pulses_to_buffer ですが、
26
+
17
-
27
+    dht.py の 99行目に表記されております。
28
+
29
+
30
+
31
+
32
+
18
-
33
+ ```参考サイト
34
+
19
- 参考サイト:http://serverarekore.blogspot.com/2021/06/raspberry-pi-picodht11.html
35
+ https://randomnerdtutorials.com/esp32-esp8266-dht11-dht22-micropython-temperature-humidity-sensor/
36
+
37
+ ```
38
+
39
+
20
40
 
21
41
 
22
42
 
@@ -26,10 +46,6 @@
26
46
 
27
47
  ```
28
48
 
29
- エラーメッセージ
30
-
31
- ```
32
-
33
49
  Traceback (most recent call last):
34
50
 
35
51
  File "<stdin>", line 10, in <module>
@@ -40,26 +56,36 @@
40
56
 
41
57
  AttributeError: 'DHT11' object has no attribute '_convert_pulses_to_buffer'
42
58
 
59
+ ```
60
+
43
61
 
44
62
 
45
63
 
46
64
 
47
65
  ### 該当のソースコード
48
66
 
49
-
67
+ Python (Complete project details at https://RandomNerdTutorials.com)
68
+
69
+
70
+
50
-
71
+ コード
72
+
73
+
74
+
51
- ```Python
75
+ ```
52
76
 
53
77
  from machine import Pin
54
78
 
55
79
  from time import sleep
56
80
 
57
- import dht
81
+ import dht
58
82
 
59
83
 
60
84
 
61
85
  sensor = dht.DHT11(Pin(28))
62
86
 
87
+ #sensor = dht.DHT11(Pin(14))
88
+
63
89
 
64
90
 
65
91
  while True:
@@ -74,49 +100,281 @@
74
100
 
75
101
  hum = sensor.humidity()
76
102
 
103
+ #temp_f = temp * (9/5) + 32.0
104
+
77
105
  print('Temperature: %3.1f C' %temp)
78
106
 
107
+ #print('Temperature: %3.1f F' %temp_f)
108
+
79
109
  print('Humidity: %3.1f %%' %hum)
80
110
 
81
111
  except OSError as e:
82
112
 
83
113
  print('Failed to read sensor.')
84
114
 
115
+
116
+
85
- ```
117
+ ```
118
+
119
+
120
+
121
+ ```Python (DHT11モジュールファイル dht.py)
122
+
123
+ import array
124
+
125
+ import micropython
126
+
127
+ import utime
86
128
 
87
129
  from machine import Pin
88
130
 
89
- from time import sleep
90
-
91
- import dht
92
-
93
-
94
-
95
- sensor = dht.DHT11(Pin(28))
96
-
97
-
98
-
99
- while True:
100
-
101
- try:
102
-
103
- sleep(2)
104
-
105
- sensor.measure()
106
-
107
- temp = sensor.temperature()
108
-
109
- hum = sensor.humidity()
110
-
111
- print('Temperature: %3.1f C' %temp)
112
-
113
- print('Humidity: %3.1f %%' %hum)
114
-
115
- except OSError as e:
116
-
117
- print('Failed to read sensor.')
118
-
119
-
131
+ from micropython import const
132
+
133
+
134
+
135
+
136
+
137
+ class InvalidChecksum(Exception):
138
+
139
+ pass
140
+
141
+
142
+
143
+
144
+
145
+ class InvalidPulseCount(Exception):
146
+
147
+ pass
148
+
149
+
150
+
151
+
152
+
153
+ MAX_UNCHANGED = const(100)
154
+
155
+ MIN_INTERVAL_US = const(200000)
156
+
157
+ HIGH_LEVEL = const(50)
158
+
159
+ EXPECTED_PULSES = const(84)
160
+
161
+
162
+
163
+
164
+
165
+ class DHT11:
166
+
167
+ _temperature: float
168
+
169
+ _humidity: float
170
+
171
+
172
+
173
+ def __init__(self, pin):
174
+
175
+ self._pin = pin
176
+
177
+ self._last_measure = utime.ticks_us()
178
+
179
+ self._temperature = -1
180
+
181
+ self._humidity = -1
182
+
183
+
184
+
185
+ def measure(self):
186
+
187
+ current_ticks = utime.ticks_us()
188
+
189
+ if utime.ticks_diff(current_ticks, self._last_measure) < MIN_INTERVAL_US and (
190
+
191
+ self._temperature > -1 or self._humidity > -1
192
+
193
+ ):
194
+
195
+ # Less than a second since last read, which is too soon according
196
+
197
+ # to the datasheet
198
+
199
+ return
200
+
201
+
202
+
203
+ self._send_init_signal()
204
+
205
+ pulses = self._capture_pulses()
206
+
207
+ buffer = self._convert_pulses_to_buffer(pulses)
208
+
209
+ self._verify_checksum(buffer)
210
+
211
+
212
+
213
+ self._humidity = buffer[0] + buffer[1] / 10
214
+
215
+ self._temperature = buffer[2] + buffer[3] / 10
216
+
217
+ self._last_measure = utime.ticks_us()
218
+
219
+
220
+
221
+ @property
222
+
223
+ def humidity(self):
224
+
225
+ self.measure()
226
+
227
+ return self._humidity
228
+
229
+
230
+
231
+ @property
232
+
233
+ def temperature(self):
234
+
235
+ self.measure()
236
+
237
+ return self._temperature
238
+
239
+
240
+
241
+ def _send_init_signal(self):
242
+
243
+ self._pin.init(Pin.OUT, Pin.PULL_DOWN)
244
+
245
+ self._pin.value(1)
246
+
247
+ utime.sleep_ms(50)
248
+
249
+ self._pin.value(0)
250
+
251
+ utime.sleep_ms(18)
252
+
253
+
254
+
255
+ def _capture_pulses(self):
256
+
257
+ pin = self._pin
258
+
259
+ pin.init(Pin.IN, Pin.PULL_UP)
260
+
261
+
262
+
263
+ val = 1
264
+
265
+ idx = 0
266
+
267
+ transitions = bytearray(EXPECTED_PULSES)
268
+
269
+ unchanged = 0
270
+
271
+ timestamp = utime.ticks_us()
272
+
273
+
274
+
275
+ while unchanged < MAX_UNCHANGED:
276
+
277
+ if val != pin.value():
278
+
279
+ if idx >= EXPECTED_PULSES:
280
+
281
+ raise InvalidPulseCount(
282
+
283
+ "Got more than {} pulses".format(EXPECTED_PULSES)
284
+
285
+ )
286
+
287
+ now = utime.ticks_us()
288
+
289
+ transitions[idx] = now - timestamp
290
+
291
+ timestamp = now
292
+
293
+ idx += 1
294
+
295
+
296
+
297
+ val = 1 - val
298
+
299
+ unchanged = 0
300
+
301
+ else:
302
+
303
+ unchanged += 1
304
+
305
+ pin.init(Pin.OUT, Pin.PULL_DOWN)
306
+
307
+ if idx != EXPECTED_PULSES:
308
+
309
+ raise InvalidPulseCount(
310
+
311
+ "Expected {} but got {} pulses".format(EXPECTED_PULSES, idx)
312
+
313
+ )
314
+
315
+ return transitions[4:]
316
+
317
+
318
+
319
+ def _convert_pulses_to_buffer(self, pulses):
320
+
321
+ """Convert a list of 80 pulses into a 5 byte buffer
322
+
323
+
324
+
325
+ The resulting 5 bytes in the buffer will be:
326
+
327
+ 0: Integral relative humidity data
328
+
329
+ 1: Decimal relative humidity data
330
+
331
+ 2: Integral temperature data
332
+
333
+ 3: Decimal temperature data
334
+
335
+ 4: Checksum
336
+
337
+ """
338
+
339
+ # Convert the pulses to 40 bits
340
+
341
+ binary = 0
342
+
343
+ for idx in range(0, len(pulses), 2):
344
+
345
+ binary = binary << 1 | int(pulses[idx] > HIGH_LEVEL)
346
+
347
+
348
+
349
+ # Split into 5 bytes
350
+
351
+ buffer = array.array("B")
352
+
353
+ for shift in range(4, -1, -1):
354
+
355
+ buffer.append(binary >> shift * 8 & 0xFF)
356
+
357
+ return buffer
358
+
359
+
360
+
361
+ def _verify_checksum(self, buffer):
362
+
363
+ # Calculate checksum
364
+
365
+ checksum = 0
366
+
367
+ for buf in buffer[0:4]:
368
+
369
+ checksum += buf
370
+
371
+ if checksum & 0xFF != buffer[4]:
372
+
373
+ raise InvalidChecksum()
374
+
375
+
376
+
377
+ ```
120
378
 
121
379
  ###
122
380
 

1

ソースコードを添付する位置が誤っていたようでしたので、変更させていただきました。ご教授いただきありがとうございます。

2021/09/10 01:54

投稿

Yuji_222
Yuji_222

スコア0

test CHANGED
File without changes
test CHANGED
@@ -50,7 +50,37 @@
50
50
 
51
51
  ```Python
52
52
 
53
+ from machine import Pin
54
+
55
+ from time import sleep
56
+
57
+ import dht
58
+
59
+
60
+
61
+ sensor = dht.DHT11(Pin(28))
62
+
63
+
64
+
65
+ while True:
66
+
67
+ try:
68
+
53
- ソースコード
69
+ sleep(2)
70
+
71
+ sensor.measure()
72
+
73
+ temp = sensor.temperature()
74
+
75
+ hum = sensor.humidity()
76
+
77
+ print('Temperature: %3.1f C' %temp)
78
+
79
+ print('Humidity: %3.1f %%' %hum)
80
+
81
+ except OSError as e:
82
+
83
+ print('Failed to read sensor.')
54
84
 
55
85
  ```
56
86