質問編集履歴

2

やってみましたが、コードの貼り付け方うまくいったでしょうか?

2021/04/12 05:02

投稿

RainbowGoblins
RainbowGoblins

スコア1

test CHANGED
File without changes
test CHANGED
@@ -68,6 +68,8 @@
68
68
 
69
69
 
70
70
 
71
+ ```arduino
72
+
71
73
  #include <SPI.h>
72
74
 
73
75
  #include <Wire.h>
@@ -451,3 +453,5 @@
451
453
  return temp_new;
452
454
 
453
455
  }
456
+
457
+ ```

1

コードを貼り付けました。不必要なテンプレート消しました。

2021/04/12 05:02

投稿

RainbowGoblins
RainbowGoblins

スコア1

test CHANGED
File without changes
test CHANGED
@@ -34,6 +34,26 @@
34
34
 
35
35
 
36
36
 
37
+ 【追記】】
38
+
39
+ コードを貼り付けました。
40
+
41
+ 2つのディスプレイそれぞれに、ライブラリ違いのdisplayを書いています。
42
+
43
+
44
+
45
+ コンパイルは、
46
+
47
+ Adafruit_SSD1306 display(SCREEN_WIDTH, SCREEN_HEIGHT,
48
+
49
+ の行で止まります。
50
+
51
+
52
+
53
+ よろしくお願いいたします。
54
+
55
+
56
+
37
57
  ### 発生している問題・エラーメッセージ
38
58
 
39
59
 
@@ -48,74 +68,386 @@
48
68
 
49
69
 
50
70
 
51
- ```ここに言語名を入力
52
-
53
- ソースコード
54
-
55
- ```
56
-
57
-
58
-
59
- ### 試したこと
60
-
61
-
62
-
63
- ここに問題に対して試したことを記載してください。
64
-
65
-
66
-
67
- ### 補足情報(FW/ツールのバージョンなど)
68
-
69
-
70
-
71
- ここにより詳細な情報を記載してください。
72
-
73
- ### 前提・実現したいこと
74
-
75
-
76
-
77
- ここに質問の内容を詳しく書いてください。
78
-
79
- (例)PHP(CakePHP)で●●なシステムを作っています
80
-
81
- ■■な機能を実装中に以下のエラーメッセージが発生しました。
82
-
83
-
84
-
85
- ### 発生している問題・エラーメッセージ
86
-
87
-
88
-
89
- ```
90
-
91
- エラーメッセージ
92
-
93
- ```
94
-
95
-
96
-
97
- ### 該当のソースコード
98
-
99
-
100
-
101
- ```ここに言語名を入力
102
-
103
- ソースコード
104
-
105
- ```
106
-
107
-
108
-
109
- ### 試したこと
110
-
111
-
112
-
113
- ここに問題に対して試したことを記載してください。
114
-
115
-
116
-
117
- ### 補足情報(FW/ツールのバージョンなど)
118
-
119
-
120
-
121
- ここにより詳細な情報を記載してください。
71
+ #include <SPI.h>
72
+
73
+ #include <Wire.h>
74
+
75
+ #include <Adafruit_MLX90614.h>
76
+
77
+ #include <Adafruit_GFX.h>
78
+
79
+ #include <Adafruit_SSD1306.h>
80
+
81
+ #include "Adafruit_VL53L0X.h"
82
+
83
+ #include <TM1637Display.h>// Include the library:
84
+
85
+
86
+
87
+ // TM1637 7セグLED初期設定
88
+
89
+ // Define the connections pins:
90
+
91
+ #define CLK 15//22
92
+
93
+ #define DIO 1//21
94
+
95
+
96
+
97
+ // Create display object of type TM1637Display:
98
+
99
+ //タイプTM1637Displayの表示オブジェクトを作成します
100
+
101
+ TM1637Display display = TM1637Display(CLK, DIO);
102
+
103
+
104
+
105
+ // Create array that turns all segments on:
106
+
107
+ //すべてのセグメントをオンにする配列を作成します。
108
+
109
+ const uint8_t data[] = {0xff, 0xff, 0xff, 0xff};
110
+
111
+
112
+
113
+ // Create array that turns all segments off:
114
+
115
+ //すべてのセグメントをオフにする配列を作成します。
116
+
117
+ const uint8_t blank[] = {0x00, 0x00, 0x00, 0x00};
118
+
119
+
120
+
121
+ // LCD初期設定
122
+
123
+ #define SCREEN_WIDTH 128 // OLED display width, in pixels
124
+
125
+ #define SCREEN_HEIGHT 64 // OLED display height, in pixels
126
+
127
+
128
+
129
+ // Declaration for SSD1306 display connected using software SPI (default case):
130
+
131
+ #define OLED_MOSI 23
132
+
133
+ #define OLED_CLK 18
134
+
135
+ #define OLED_DC 4
136
+
137
+ #define OLED_CS 5
138
+
139
+ #define OLED_RESET 2
140
+
141
+ Adafruit_SSD1306 display(SCREEN_WIDTH, SCREEN_HEIGHT,
142
+
143
+ OLED_MOSI, OLED_CLK, OLED_DC, OLED_RESET, OLED_CS);
144
+
145
+
146
+
147
+ //超音波距離センサ定数設定
148
+
149
+ #define OK_DISTANCE 40 // 測定は40mm以内
150
+
151
+ Adafruit_VL53L0X lox = Adafruit_VL53L0X();
152
+
153
+
154
+
155
+ // スピーカー定数設定
156
+
157
+ #define BEATTIME 500 //音を出している時間(msec)
158
+
159
+ #define SPEAKER 25 //スピーカーの出力ピン番号]
160
+
161
+ #define OK_SOUND 1046.502
162
+
163
+ #define NG_SOUND 500.0
164
+
165
+
166
+
167
+ // 温度センサー初期設定
168
+
169
+ #define TEMP_THRESHOLD 37.5 //平熱/発熱の判定を行う閾値
170
+
171
+ #define ADJUST_TEMP 0 //体温補正:表面温度+3.7℃=体温
172
+
173
+ Adafruit_MLX90614 mlx = Adafruit_MLX90614();
174
+
175
+
176
+
177
+ // デバッグ用
178
+
179
+ #define DEBUG 0
180
+
181
+
182
+
183
+ //初期設定
184
+
185
+ void setup() {
186
+
187
+ Serial.begin(9600);
188
+
189
+ Serial.println("Adafruit MLX90614 test");
190
+
191
+
192
+
193
+ mlx.begin();
194
+
195
+
196
+
197
+ Wire.begin();
198
+
199
+
200
+
201
+ if (!lox.begin()) {
202
+
203
+ Serial.println(F("Failed to boot VL53L0X"));
204
+
205
+ while(1);
206
+
207
+ }
208
+
209
+
210
+
211
+ // SSD1306_SWITCHCAPVCC = generate display voltage from 3.3V internally
212
+
213
+ if(!display.begin(SSD1306_SWITCHCAPVCC)) {
214
+
215
+ Serial.println(F("SSD1306 allocation failed"));
216
+
217
+ for(;;); // Don't proceed, loop forever
218
+
219
+ }
220
+
221
+
222
+
223
+ //ESP32で音を鳴らすための設定
224
+
225
+ ledcSetup(1, 12000, 8); //(チャネル0~15, PWMの周波数, デューティ比を表すビット数)
226
+
227
+ ledcAttachPin(SPEAKER, 1); //(ピン番号, チャネル)
228
+
229
+
230
+
231
+
232
+
233
+ display.setTextColor(SSD1306_WHITE); // Draw white text
234
+
235
+ display.setCursor(0, 16); // Start at top-left corner
236
+
237
+ display_text("Temp?");
238
+
239
+
240
+
241
+ }
242
+
243
+ //ループ関数
244
+
245
+ void loop() {
246
+
247
+
248
+
249
+ float temp;
250
+
251
+
252
+
253
+ temp = mlx.readObjectTempC();
254
+
255
+ Serial.print("object Temp, ");
256
+
257
+ Serial.print(temp); //シリアルモニタに計算したobject温度を表示
258
+
259
+ Serial.print("\tambient Temp, ");
260
+
261
+ Serial.print(mlx.readAmbientTempC()); //シリアルモニタに計算したambient温度を表示
262
+
263
+
264
+
265
+ if(is_distance_ok()){
266
+
267
+ temp = read_temp_sensor() + ADJUST_TEMP;
268
+
269
+ display_temp(temp);
270
+
271
+ 7segs_temp(temp);
272
+
273
+ if(temp < TEMP_THRESHOLD){
274
+
275
+ play_sound(OK_SOUND, 100, 2);
276
+
277
+ delay(3000);
278
+
279
+ display_text("Temp?");
280
+
281
+ }else{
282
+
283
+ play_sound(NG_SOUND, 500, 2);
284
+
285
+ delay(3000);
286
+
287
+ display_text("Temp?");
288
+
289
+ }
290
+
291
+ }else if(temp > 28.0){
292
+
293
+ play_sound(NG_SOUND, 100, 5);
294
+
295
+ display_text("Too far!");
296
+
297
+ delay(500);
298
+
299
+ }
300
+
301
+ delay(500);
302
+
303
+ }
304
+
305
+
306
+
307
+ void play_sound(float freq, int beattime, int number){
308
+
309
+ for(int i=0; i<number; i++){
310
+
311
+ ledcWriteTone(1,freq) ; // ド
312
+
313
+ delay(beattime);
314
+
315
+ ledcWrite(1,0);
316
+
317
+ }
318
+
319
+ }
320
+
321
+
322
+
323
+ void display_text(char* text){
324
+
325
+ display.clearDisplay();
326
+
327
+ display.setTextSize(2); // Normal 2x2 pixel scale
328
+
329
+ display.setCursor(0, 16); // Start at top-left corner
330
+
331
+ display.cp437(true); // Use full 256 char 'Code Page 437' font
332
+
333
+ display.print(text);
334
+
335
+ display.display();
336
+
337
+ }
338
+
339
+
340
+
341
+ void display_temp(float number){
342
+
343
+ display.clearDisplay();
344
+
345
+ display.setTextSize(4); // Normal 4x4 pixel scale
346
+
347
+ display.setCursor(0, 16); // Start at top-left corner
348
+
349
+ display.cp437(true); // Use full 256 char 'Code Page 437' font
350
+
351
+ display.print(number);
352
+
353
+ display.display();
354
+
355
+ }
356
+
357
+
358
+
359
+ void 7segs_temp(float number){
360
+
361
+ display.clear();
362
+
363
+ display.showNumberDec(number,false, 2, 0); // distance to front obstacle
364
+
365
+ //display.setSegments(Letter_deg,1,2);
366
+
367
+ //display.setSegments(Letter_C,1,3);
368
+
369
+ delay(1100);
370
+
371
+ }
372
+
373
+
374
+
375
+ int is_distance_ok(){
376
+
377
+ VL53L0X_RangingMeasurementData_t measure;
378
+
379
+ lox.rangingTest(&measure, false); // pass in 'true' to get debug data printout!
380
+
381
+
382
+
383
+ float Distance = 0; //計算した距離を格納する変数
384
+
385
+
386
+
387
+ if (measure.RangeStatus != 4) { // phase failures have incorrect data 4回測定できない
388
+
389
+ Distance = measure.RangeMilliMeter; //cmへの換算
390
+
391
+ Serial.print("\tDistance, "); //わかりやすくするため、シリアルモニタにDistance:を表示
392
+
393
+ Serial.println(Distance); //シリアルモニタに計算した距離を表示
394
+
395
+ } else {
396
+
397
+ //display.setTextSize(1); // Draw 1X-scale text
398
+
399
+ //display.setCursor(0, 48);
400
+
401
+ //display.println("out of range ...");
402
+
403
+ Serial.println("\tout of range ...");
404
+
405
+ }
406
+
407
+ if(Distance > 0 && Distance < OK_DISTANCE){
408
+
409
+ return 1;
410
+
411
+ }else{
412
+
413
+ return 0;
414
+
415
+ }
416
+
417
+ }
418
+
419
+
420
+
421
+ float read_temp_sensor(){
422
+
423
+ float temp_old;
424
+
425
+ float temp_new;
426
+
427
+
428
+
429
+ temp_old = mlx.readObjectTempC();
430
+
431
+ for(int i=0; i<8; i++){
432
+
433
+ temp_new = mlx.readObjectTempC();
434
+
435
+ if(temp_new > temp_old){
436
+
437
+ temp_new = temp_old;
438
+
439
+ }
440
+
441
+ delay(50);
442
+
443
+ }
444
+
445
+ Serial.print("Temp_fixed, ");
446
+
447
+ Serial.println(temp_new); //シリアルモニタに測定した体温を表示
448
+
449
+
450
+
451
+ return temp_new;
452
+
453
+ }