質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.48%
Arduino

Arduinoは、AVRマイコン、単純なI/O(入出力)ポートを備えた基板、C言語を元としたArduinoのプログラム言語と、それを実装した統合開発環境から構成されたシステムです。

Q&A

解決済

2回答

2082閲覧

TM1637とSSD1306は競合?

RainbowGoblins

総合スコア1

Arduino

Arduinoは、AVRマイコン、単純なI/O(入出力)ポートを備えた基板、C言語を元としたArduinoのプログラム言語と、それを実装した統合開発環境から構成されたシステムです。

0グッド

0クリップ

投稿2021/04/12 02:52

編集2021/04/12 05:02

前提・実現したいこと

ESP32で体温計と血中酸素濃度計を作ろうとしてます。
体温は赤外線温度センサを読み取り、目立つ7セグLED(TM1637)で表示させる。

それとは別に同じシステム(ESP32のプログラム)中で、
血中酸素濃度センサを使い、これを0.96インチのOLED(SSD1306)で
表示させたいと思っています。

それぞれの機能は動くようになりました。

SSD1306で表示できているプログラムに、7セグLEDを最初の方に追加したところ、
コンパイルで段階で、後から読み込むSSD1306が競合しているとエラーが出ます。
TM1637とSSD1306を同時に使うことはできないのでしょうか?

ネット記事の見様見真似で始めたArduinoですので、小生は基礎がありません。
わかっている方にお教えいただきたいと思い質問をしています。

【追記】】
コードを貼り付けました。
2つのディスプレイそれぞれに、ライブラリ違いのdisplayを書いています。

コンパイルは、
Adafruit_SSD1306 display(SCREEN_WIDTH, SCREEN_HEIGHT,
の行で止まります。

よろしくお願いいたします。

発生している問題・エラーメッセージ

conflicting declaration 'Adafruit_SSD1306 display'

該当のソースコード

arduino

1#include <SPI.h> 2#include <Wire.h> 3#include <Adafruit_MLX90614.h> 4#include <Adafruit_GFX.h> 5#include <Adafruit_SSD1306.h> 6#include "Adafruit_VL53L0X.h" 7#include <TM1637Display.h>// Include the library: 8 9// TM1637 7セグLED初期設定 10// Define the connections pins: 11#define CLK 15//22 12#define DIO 1//21 13 14// Create display object of type TM1637Display: 15//タイプTM1637Displayの表示オブジェクトを作成します: 16TM1637Display display = TM1637Display(CLK, DIO); 17 18// Create array that turns all segments on: 19//すべてのセグメントをオンにする配列を作成します。 20const uint8_t data[] = {0xff, 0xff, 0xff, 0xff}; 21 22// Create array that turns all segments off: 23//すべてのセグメントをオフにする配列を作成します。 24const uint8_t blank[] = {0x00, 0x00, 0x00, 0x00}; 25 26// LCD初期設定 27#define SCREEN_WIDTH 128 // OLED display width, in pixels 28#define SCREEN_HEIGHT 64 // OLED display height, in pixels 29 30// Declaration for SSD1306 display connected using software SPI (default case): 31#define OLED_MOSI 23 32#define OLED_CLK 18 33#define OLED_DC 4 34#define OLED_CS 5 35#define OLED_RESET 2 36Adafruit_SSD1306 display(SCREEN_WIDTH, SCREEN_HEIGHT, 37 OLED_MOSI, OLED_CLK, OLED_DC, OLED_RESET, OLED_CS); 38 39//超音波距離センサ定数設定 40#define OK_DISTANCE 40 // 測定は40mm以内 41Adafruit_VL53L0X lox = Adafruit_VL53L0X(); 42 43// スピーカー定数設定 44#define BEATTIME 500 //音を出している時間(msec) 45#define SPEAKER 25 //スピーカーの出力ピン番号] 46#define OK_SOUND 1046.502 47#define NG_SOUND 500.0 48 49// 温度センサー初期設定 50#define TEMP_THRESHOLD 37.5 //平熱/発熱の判定を行う閾値 51#define ADJUST_TEMP 0 //体温補正:表面温度+3.7℃=体温 52Adafruit_MLX90614 mlx = Adafruit_MLX90614(); 53 54// デバッグ用 55#define DEBUG 0 56 57//初期設定 58void setup() { 59 Serial.begin(9600); 60 Serial.println("Adafruit MLX90614 test"); 61 62 mlx.begin(); 63 64 Wire.begin(); 65 66 if (!lox.begin()) { 67 Serial.println(F("Failed to boot VL53L0X")); 68 while(1); 69 } 70 71 // SSD1306_SWITCHCAPVCC = generate display voltage from 3.3V internally 72 if(!display.begin(SSD1306_SWITCHCAPVCC)) { 73 Serial.println(F("SSD1306 allocation failed")); 74 for(;;); // Don't proceed, loop forever 75 } 76 77//ESP32で音を鳴らすための設定 78 ledcSetup(1, 12000, 8); //(チャネル0~15, PWMの周波数, デューティ比を表すビット数) 79 ledcAttachPin(SPEAKER, 1); //(ピン番号, チャネル) 80 81 82 display.setTextColor(SSD1306_WHITE); // Draw white text 83 display.setCursor(0, 16); // Start at top-left corner 84 display_text("Temp?"); 85 86} 87//ループ関数 88void loop() { 89 90 float temp; 91 92 temp = mlx.readObjectTempC(); 93 Serial.print("object Temp, "); 94 Serial.print(temp); //シリアルモニタに計算したobject温度を表示 95 Serial.print("\tambient Temp, "); 96 Serial.print(mlx.readAmbientTempC()); //シリアルモニタに計算したambient温度を表示 97 98 if(is_distance_ok()){ 99 temp = read_temp_sensor() + ADJUST_TEMP; 100 display_temp(temp); 101 7segs_temp(temp); 102 if(temp < TEMP_THRESHOLD){ 103 play_sound(OK_SOUND, 100, 2); 104 delay(3000); 105 display_text("Temp?"); 106 }else{ 107 play_sound(NG_SOUND, 500, 2); 108 delay(3000); 109 display_text("Temp?"); 110 } 111 }else if(temp > 28.0){ 112 play_sound(NG_SOUND, 100, 5); 113 display_text("Too far!"); 114 delay(500); 115 } 116 delay(500); 117} 118 119void play_sound(float freq, int beattime, int number){ 120 for(int i=0; i<number; i++){ 121 ledcWriteTone(1,freq) ; // ド 122 delay(beattime); 123 ledcWrite(1,0); 124 } 125} 126 127void display_text(char* text){ 128 display.clearDisplay(); 129 display.setTextSize(2); // Normal 2x2 pixel scale 130 display.setCursor(0, 16); // Start at top-left corner 131 display.cp437(true); // Use full 256 char 'Code Page 437' font 132 display.print(text); 133 display.display(); 134} 135 136void display_temp(float number){ 137 display.clearDisplay(); 138 display.setTextSize(4); // Normal 4x4 pixel scale 139 display.setCursor(0, 16); // Start at top-left corner 140 display.cp437(true); // Use full 256 char 'Code Page 437' font 141 display.print(number); 142 display.display(); 143} 144 145void 7segs_temp(float number){ 146 display.clear(); 147 display.showNumberDec(number,false, 2, 0); // distance to front obstacle 148 //display.setSegments(Letter_deg,1,2); 149 //display.setSegments(Letter_C,1,3); 150 delay(1100); 151} 152 153int is_distance_ok(){ 154 VL53L0X_RangingMeasurementData_t measure; 155 lox.rangingTest(&measure, false); // pass in 'true' to get debug data printout! 156 157 float Distance = 0; //計算した距離を格納する変数 158 159 if (measure.RangeStatus != 4) { // phase failures have incorrect data 4回測定できない 160 Distance = measure.RangeMilliMeter; //cmへの換算 161 Serial.print("\tDistance, "); //わかりやすくするため、シリアルモニタにDistance:を表示 162 Serial.println(Distance); //シリアルモニタに計算した距離を表示 163 } else { 164 //display.setTextSize(1); // Draw 1X-scale text 165 //display.setCursor(0, 48); 166 //display.println("out of range ..."); 167 Serial.println("\tout of range ..."); 168 } 169 if(Distance > 0 && Distance < OK_DISTANCE){ 170 return 1; 171 }else{ 172 return 0; 173 } 174} 175 176float read_temp_sensor(){ 177 float temp_old; 178 float temp_new; 179 180 temp_old = mlx.readObjectTempC(); 181 for(int i=0; i<8; i++){ 182 temp_new = mlx.readObjectTempC(); 183 if(temp_new > temp_old){ 184 temp_new = temp_old; 185 } 186 delay(50); 187 } 188 Serial.print("Temp_fixed, "); 189 Serial.println(temp_new); //シリアルモニタに測定した体温を表示 190 191 return temp_new; 192}

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

K_3578

2021/04/12 02:54

とりあえず不必要なテンプレート消しておきましょう。
K_3578

2021/04/12 02:59

というか基礎がありません、って基礎学ばないと仮に見様見真似で作ったとしても応用全く効きませんけど それでいいんでしょうかねー?
K_3578

2021/04/12 04:46

とりあえずソースコードはMarkDownの<code>ブロック内に貼り付けてご提示ください。 #が見出しと認識されて見づらすぎるので。 MarkDownの使い方に関してはこの質問の回答を参考にどうぞ https://teratail.com/questions/238564
guest

回答2

0

ベストアンサー

エラーメッセージからすると、変数displayが二回(以上)宣言されています。
コードを確認して2回宣言していないか確認してください(というか質問文にコード貼ってください)


話としては

arduino

1int x; 2float x;

でエラーが出るのと全く一緒です。どっちかのdisplayの変数名を適当に変えてください

投稿2021/04/12 03:01

編集2021/04/12 04:20
ozwk

総合スコア13521

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

0

宣言が競合している、とおっしゃってるんで、そこんところを修正しましょう

#コードの提示がないのでここまで

投稿2021/04/12 02:57

y_waiwai

総合スコア87774

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.48%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問