質問編集履歴
5
初心者アイコンをつけました。
title
CHANGED
File without changes
|
body
CHANGED
@@ -190,4 +190,7 @@
|
|
190
190
|
###
|
191
191
|
|
192
192
|
### 補足情報(FW/ツールのバージョンなど)
|
193
|
-
・ macOS
|
193
|
+
・ macOS
|
194
|
+
・ VScode
|
195
|
+
・ Python
|
196
|
+
・ RaspberryPi pico
|
4
書式の改善
title
CHANGED
File without changes
|
body
CHANGED
@@ -33,8 +33,6 @@
|
|
33
33
|
### 該当のソースコード
|
34
34
|
Python (Complete project details at https://RandomNerdTutorials.com)
|
35
35
|
|
36
|
-
コード
|
37
|
-
|
38
36
|
```
|
39
37
|
from machine import Pin
|
40
38
|
from time import sleep
|
@@ -58,7 +56,8 @@
|
|
58
56
|
|
59
57
|
```
|
60
58
|
|
61
|
-
Python (DHT11モジュールファイル
|
59
|
+
Python (DHT11モジュールファイル)
|
60
|
+
**dht.py**
|
62
61
|
```
|
63
62
|
import array
|
64
63
|
import micropython
|
3
書式の改善
title
CHANGED
File without changes
|
body
CHANGED
@@ -58,7 +58,8 @@
|
|
58
58
|
|
59
59
|
```
|
60
60
|
|
61
|
-
|
61
|
+
Python (DHT11モジュールファイル dht.py)
|
62
|
+
```
|
62
63
|
import array
|
63
64
|
import micropython
|
64
65
|
import utime
|
2
エラーメッセージの出るプログラム追加と状況を詳しく記入させていただきました。
title
CHANGED
File without changes
|
body
CHANGED
@@ -2,33 +2,46 @@
|
|
2
2
|
文系学生が、趣味でラズパイを弄り始めておそらく初歩的なミスを犯しました。
|
3
3
|
|
4
4
|
RaspberryPi pico と Pythonで、DHT11から得た値をある指数に変換し、指数の大きさによってフルカラーLEDの色を変化させるというデバイスを制作しております。開発環境は、VScodeです。
|
5
|
-
その前段階として、以下
|
5
|
+
その前段階として、以下に示した参考サイトのコードをほとんどそのまま用いて(華氏と摂氏の両方を表すプログラムであったため、華氏に言及する2行を削除しました。 14行目、16行目。)DHT11のモジュールが使用できるかを試しています。
|
6
|
-
しかしながら、DHT11の部分に赤波線が現れ、正常にプログラムが作動しません。
|
6
|
+
しかしながら、コードを添付したところ、下記(該当のソースコード 5行目)のDHT11の部分に赤波線が現れ、そのまま実行しましたが正常にプログラムが作動しませんでした。
|
7
|
-
dht.pyもインストール済みで、同じように進めていたのですがどこに問題があるのかわからず苦戦しております。
|
8
|
-
ご教授いただけると幸いです。
|
9
7
|
|
8
|
+
モジュールであるDHT11のファイル、dht.pyもインストール済みで、同じように進めていたのですがどこに問題があるのかわからず苦戦しております。
|
10
|
-
|
9
|
+
今回のテストを行う前に、ラズパイpicoに搭載してあるLEDを点滅させるプログラムは正常に作動いたしましたので、今回はおそらくモジュールが反映されていないのではないかと考えております。
|
11
10
|
|
11
|
+
お忙しいところ恐縮ですが、ご教授いただけると幸いです。
|
12
|
+
|
13
|
+
* 尚、エラーメッセージ5行目の _convert_pulses_to_buffer ですが、
|
14
|
+
dht.py の 99行目に表記されております。
|
15
|
+
|
16
|
+
|
17
|
+
```参考サイト
|
18
|
+
https://randomnerdtutorials.com/esp32-esp8266-dht11-dht22-micropython-temperature-humidity-sensor/
|
19
|
+
```
|
20
|
+
|
21
|
+
|
12
22
|
### 発生している問題・エラーメッセージ
|
13
23
|
|
14
24
|
```
|
15
|
-
エラーメッセージ
|
16
|
-
```
|
17
25
|
Traceback (most recent call last):
|
18
26
|
File "<stdin>", line 10, in <module>
|
19
27
|
File "/lib/dht.py", line 58, in temperature
|
20
28
|
File "/lib/dht.py", line 44, in measure
|
21
29
|
AttributeError: 'DHT11' object has no attribute '_convert_pulses_to_buffer'
|
30
|
+
```
|
22
31
|
|
23
32
|
|
24
33
|
### 該当のソースコード
|
34
|
+
Python (Complete project details at https://RandomNerdTutorials.com)
|
25
35
|
|
36
|
+
コード
|
37
|
+
|
26
|
-
```
|
38
|
+
```
|
27
39
|
from machine import Pin
|
28
40
|
from time import sleep
|
29
|
-
import dht
|
41
|
+
import dht
|
30
42
|
|
31
43
|
sensor = dht.DHT11(Pin(28))
|
44
|
+
#sensor = dht.DHT11(Pin(14))
|
32
45
|
|
33
46
|
while True:
|
34
47
|
try:
|
@@ -36,28 +49,144 @@
|
|
36
49
|
sensor.measure()
|
37
50
|
temp = sensor.temperature()
|
38
51
|
hum = sensor.humidity()
|
52
|
+
#temp_f = temp * (9/5) + 32.0
|
39
53
|
print('Temperature: %3.1f C' %temp)
|
54
|
+
#print('Temperature: %3.1f F' %temp_f)
|
40
55
|
print('Humidity: %3.1f %%' %hum)
|
41
56
|
except OSError as e:
|
42
57
|
print('Failed to read sensor.')
|
58
|
+
|
43
59
|
```
|
60
|
+
|
61
|
+
```Python (DHT11モジュールファイル dht.py)
|
62
|
+
import array
|
63
|
+
import micropython
|
64
|
+
import utime
|
44
65
|
from machine import Pin
|
45
|
-
from
|
66
|
+
from micropython import const
|
46
|
-
import dht
|
47
67
|
|
48
|
-
sensor = dht.DHT11(Pin(28))
|
49
68
|
|
50
|
-
while True:
|
51
|
-
try:
|
52
|
-
sleep(2)
|
53
|
-
sensor.measure()
|
54
|
-
temp = sensor.temperature()
|
55
|
-
|
69
|
+
class InvalidChecksum(Exception):
|
56
|
-
print('Temperature: %3.1f C' %temp)
|
57
|
-
print('Humidity: %3.1f %%' %hum)
|
58
|
-
|
70
|
+
pass
|
59
|
-
print('Failed to read sensor.')
|
60
71
|
|
72
|
+
|
73
|
+
class InvalidPulseCount(Exception):
|
74
|
+
pass
|
75
|
+
|
76
|
+
|
77
|
+
MAX_UNCHANGED = const(100)
|
78
|
+
MIN_INTERVAL_US = const(200000)
|
79
|
+
HIGH_LEVEL = const(50)
|
80
|
+
EXPECTED_PULSES = const(84)
|
81
|
+
|
82
|
+
|
83
|
+
class DHT11:
|
84
|
+
_temperature: float
|
85
|
+
_humidity: float
|
86
|
+
|
87
|
+
def __init__(self, pin):
|
88
|
+
self._pin = pin
|
89
|
+
self._last_measure = utime.ticks_us()
|
90
|
+
self._temperature = -1
|
91
|
+
self._humidity = -1
|
92
|
+
|
93
|
+
def measure(self):
|
94
|
+
current_ticks = utime.ticks_us()
|
95
|
+
if utime.ticks_diff(current_ticks, self._last_measure) < MIN_INTERVAL_US and (
|
96
|
+
self._temperature > -1 or self._humidity > -1
|
97
|
+
):
|
98
|
+
# Less than a second since last read, which is too soon according
|
99
|
+
# to the datasheet
|
100
|
+
return
|
101
|
+
|
102
|
+
self._send_init_signal()
|
103
|
+
pulses = self._capture_pulses()
|
104
|
+
buffer = self._convert_pulses_to_buffer(pulses)
|
105
|
+
self._verify_checksum(buffer)
|
106
|
+
|
107
|
+
self._humidity = buffer[0] + buffer[1] / 10
|
108
|
+
self._temperature = buffer[2] + buffer[3] / 10
|
109
|
+
self._last_measure = utime.ticks_us()
|
110
|
+
|
111
|
+
@property
|
112
|
+
def humidity(self):
|
113
|
+
self.measure()
|
114
|
+
return self._humidity
|
115
|
+
|
116
|
+
@property
|
117
|
+
def temperature(self):
|
118
|
+
self.measure()
|
119
|
+
return self._temperature
|
120
|
+
|
121
|
+
def _send_init_signal(self):
|
122
|
+
self._pin.init(Pin.OUT, Pin.PULL_DOWN)
|
123
|
+
self._pin.value(1)
|
124
|
+
utime.sleep_ms(50)
|
125
|
+
self._pin.value(0)
|
126
|
+
utime.sleep_ms(18)
|
127
|
+
|
128
|
+
def _capture_pulses(self):
|
129
|
+
pin = self._pin
|
130
|
+
pin.init(Pin.IN, Pin.PULL_UP)
|
131
|
+
|
132
|
+
val = 1
|
133
|
+
idx = 0
|
134
|
+
transitions = bytearray(EXPECTED_PULSES)
|
135
|
+
unchanged = 0
|
136
|
+
timestamp = utime.ticks_us()
|
137
|
+
|
138
|
+
while unchanged < MAX_UNCHANGED:
|
139
|
+
if val != pin.value():
|
140
|
+
if idx >= EXPECTED_PULSES:
|
141
|
+
raise InvalidPulseCount(
|
142
|
+
"Got more than {} pulses".format(EXPECTED_PULSES)
|
143
|
+
)
|
144
|
+
now = utime.ticks_us()
|
145
|
+
transitions[idx] = now - timestamp
|
146
|
+
timestamp = now
|
147
|
+
idx += 1
|
148
|
+
|
149
|
+
val = 1 - val
|
150
|
+
unchanged = 0
|
151
|
+
else:
|
152
|
+
unchanged += 1
|
153
|
+
pin.init(Pin.OUT, Pin.PULL_DOWN)
|
154
|
+
if idx != EXPECTED_PULSES:
|
155
|
+
raise InvalidPulseCount(
|
156
|
+
"Expected {} but got {} pulses".format(EXPECTED_PULSES, idx)
|
157
|
+
)
|
158
|
+
return transitions[4:]
|
159
|
+
|
160
|
+
def _convert_pulses_to_buffer(self, pulses):
|
161
|
+
"""Convert a list of 80 pulses into a 5 byte buffer
|
162
|
+
|
163
|
+
The resulting 5 bytes in the buffer will be:
|
164
|
+
0: Integral relative humidity data
|
165
|
+
1: Decimal relative humidity data
|
166
|
+
2: Integral temperature data
|
167
|
+
3: Decimal temperature data
|
168
|
+
4: Checksum
|
169
|
+
"""
|
170
|
+
# Convert the pulses to 40 bits
|
171
|
+
binary = 0
|
172
|
+
for idx in range(0, len(pulses), 2):
|
173
|
+
binary = binary << 1 | int(pulses[idx] > HIGH_LEVEL)
|
174
|
+
|
175
|
+
# Split into 5 bytes
|
176
|
+
buffer = array.array("B")
|
177
|
+
for shift in range(4, -1, -1):
|
178
|
+
buffer.append(binary >> shift * 8 & 0xFF)
|
179
|
+
return buffer
|
180
|
+
|
181
|
+
def _verify_checksum(self, buffer):
|
182
|
+
# Calculate checksum
|
183
|
+
checksum = 0
|
184
|
+
for buf in buffer[0:4]:
|
185
|
+
checksum += buf
|
186
|
+
if checksum & 0xFF != buffer[4]:
|
187
|
+
raise InvalidChecksum()
|
188
|
+
|
189
|
+
```
|
61
190
|
###
|
62
191
|
|
63
192
|
### 補足情報(FW/ツールのバージョンなど)
|
1
ソースコードを添付する位置が誤っていたようでしたので、変更させていただきました。ご教授いただきありがとうございます。
title
CHANGED
File without changes
|
body
CHANGED
@@ -24,7 +24,22 @@
|
|
24
24
|
### 該当のソースコード
|
25
25
|
|
26
26
|
```Python
|
27
|
+
from machine import Pin
|
28
|
+
from time import sleep
|
29
|
+
import dht
|
30
|
+
|
31
|
+
sensor = dht.DHT11(Pin(28))
|
32
|
+
|
33
|
+
while True:
|
34
|
+
try:
|
27
|
-
|
35
|
+
sleep(2)
|
36
|
+
sensor.measure()
|
37
|
+
temp = sensor.temperature()
|
38
|
+
hum = sensor.humidity()
|
39
|
+
print('Temperature: %3.1f C' %temp)
|
40
|
+
print('Humidity: %3.1f %%' %hum)
|
41
|
+
except OSError as e:
|
42
|
+
print('Failed to read sensor.')
|
28
43
|
```
|
29
44
|
from machine import Pin
|
30
45
|
from time import sleep
|