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

質問編集履歴

5

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

2021/09/10 02:13

投稿

Yuji_222
Yuji_222

スコア0

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

書式の改善

2021/09/10 02:13

投稿

Yuji_222
Yuji_222

スコア0

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モジュールファイル dht.py)
59
+ Python (DHT11モジュールファイル)
60
+ **dht.py**
62
61
  ```
63
62
  import array
64
63
  import micropython

3

書式の改善

2021/09/10 01:57

投稿

Yuji_222
Yuji_222

スコア0

title CHANGED
File without changes
body CHANGED
@@ -58,7 +58,8 @@
58
58
 
59
59
  ```
60
60
 
61
- ```Python (DHT11モジュールファイル dht.py)
61
+ Python (DHT11モジュールファイル dht.py)
62
+ ```
62
63
  import array
63
64
  import micropython
64
65
  import utime

2

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

2021/09/10 01:55

投稿

Yuji_222
Yuji_222

スコア0

title CHANGED
File without changes
body CHANGED
@@ -2,33 +2,46 @@
2
2
  文系学生が、趣味でラズパイを弄り始めておそらく初歩的なミスを犯しました。
3
3
 
4
4
  RaspberryPi pico と Pythonで、DHT11から得た値をある指数に変換し、指数の大きさによってフルカラーLEDの色を変化させるというデバイスを制作しております。開発環境は、VScodeです。
5
- その前段階として、以下サイトのコードをほとんどそのまま用いてDHT11のモジュールが使用できるかを試しています。
5
+ その前段階として、以下に示した参考サイトのコードをほとんどそのまま用いて(華氏と摂氏の両方を表すプログラムであったため、華氏に言及する2行を削除しました。 14行目、16行目。)DHT11のモジュールが使用できるかを試しています。
6
- しかしながら、DHT11の部分に赤波線が現れ、正常にプログラムが作動しません。
6
+ しかしながら、コードを添付したところ、下記(該当のソースコード 5行目)のDHT11の部分に赤波線が現れ、そのまま実行しましたが正常にプログラムが作動しませんでした
7
- dht.pyもインストール済みで、同じように進めていたのですがどこに問題があるのかわからず苦戦しております。
8
- ご教授いただけると幸いです。
9
7
 
8
+ モジュールであるDHT11のファイル、dht.pyもインストール済みで、同じように進めていたのですがどこに問題があるのかわからず苦戦しております。
10
- 参考サイ:http://serverarekore.blogspot.com/2021/06/raspberry-pi-picodht11.html
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
- ```Python
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 time import sleep
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
- hum = sensor.humidity()
69
+ class InvalidChecksum(Exception):
56
- print('Temperature: %3.1f C' %temp)
57
- print('Humidity: %3.1f %%' %hum)
58
- except OSError as e:
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

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

2021/09/10 01:54

投稿

Yuji_222
Yuji_222

スコア0

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