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

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

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

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

Q&A

解決済

2回答

4795閲覧

ESP-WROOM-02開発ボードとAM2320とのI2C通信で正しい値が得られない

mochi_kabe

総合スコア13

Arduino

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

0グッド

0クリップ

投稿2018/09/20 16:37

編集2018/09/21 11:50

前提・実現したいこと

ESP-WROOM-02開発ボードにAM2320等のセンサをI2Cで繋ぎ、Webで見られるデータロガーを作ろうと思っているのですが、I2C通信がうまくいかず困っています。
アドバイスいただけると嬉しいです。

発生している問題

温度、湿度が正常に取得できない。あらゆる値が255(FF)で返される。たまに0の時もある

下の例で言えば、hHum, lHum, hTemp, lTempの全てが255で返されるため、温度と湿度はどちらも6553.50となってしまいます。

![イメージ説明]
手書きで汚いですが回路図です。

ソースコード

#include<Wire.h> int AM2320_ADDRESS = 0x5C; void setup() { Serial.begin(115200); Wire.begin(); //ESP8266ではWire.begin(SDA,SCL)のようにしてSDA,SCLピンを設定できる。デフォルトは4,5 } void loop() { int hHum, lHum, hTemp, lTemp = 0; //それぞれ湿度と温度の上2桁、下2桁 Wire.beginTransmission(AM2320_ADDRESS); Wire.endTransmission(); Wire.beginTransmission(AM2320_ADDRESS); Wire.write(0x03); Wire.write(0x00); Wire.write(0x04); if(Wire.endTransmission()!=0){ //0は成功、1はデータサイズオーバー、2,3はNACK、4はその他エラー Serial.println("error"); } Wire.requestFrom(AM2320_ADDRESS, 6); while(Wire.available() !=0){ for(int i = 1; i < 7; i++){//iは現在のレジストリ int c = Wire.read(); switch (i){ hTemp = c; break; case 6: lTemp = c; break; case 3: hHum = c; break; case 4: lHum = c; break; default: break; } } Serial.print("Temp ="); Serial.print((hTemp*256+lTemp)/10.0); Serial.print("˚C"); Serial.print(" Hum ="); Serial.print((hHum*256+lHum)/10.0); Serial.println("%"); delay(10*1000); } }

試したこと

・ESP-WROOM-02への書き込みは正常に行えます。LチカやWiFi接続はできました。

・Arduino UnoにAM2320等をI2Cで接続した場合、正しい温度・湿度が取得できました。そのためAM2320本体やスケッチ、配線には大きな問題はないように思われました。

・SDA、SCLのプルアップは2.2kΩ、4.7kΩ、プルアップなし等試しましたが結果は変わりませんでした。

・SDAとSCLのピンの組み合わせを色々試してみましたが、全て同様にうまくいきませんでした。(デフォルトの4と5だけでなく4と12や4と13、5と4、5と12,5と13など)

・AM2320の他にもI2C接続のRTCを試してみましたが、時間、日時は全てFFで帰ってきました。

・オシロスコープは持ち合わせていませんので波形は見られていません。

補足情報(FW/ツールのバージョンなど)

Arduino IDEのバージョンは1.8.5、Arduino core for ESP8266のバージョンは2.4.2です。
ESP-WROOM-02開発ボードは秋月電子で購入したものを使用しています。

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

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

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

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

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

ozwk

2018/09/21 00:39 編集

適当でいいので回路図かなにか電気的な接続がわかるものをください
ikadzuchi

2018/09/21 05:12

とりあえず、「少なくとも何かは出ているか」を見るために、Vccと信号線の間にLEDをつけて実行してみてください。正常なら送信時だけ一瞬光るはずです。
退会済みユーザー

退会済みユーザー

2018/09/21 09:55

ソースは問題ありませんので、接続を簡単に説明お願いします。SENSOR → ARDUINO 1(VDD) → 5V 2(SDA) → A4 3(GND) → GND 4(SCL) → A5 でいけるはずです
coco_bauer

2018/09/21 11:15

Arduino Unoの電源電圧は5V,ESP-WROOM-02 の電源電圧は3.0~3.6V。当然、WROOM-02のピンから出力される信号は3.6V以上にはなりません。 ESP-WROOM-02の出力ピンを5Vにプルアップするような無茶はしてないですよね? 回路図が無いので、要らぬ心配をしているのかもしれませんが、異なる電源電圧のシステムをつなぐ際には注意が必要な場合があります。
mochi_kabe

2018/09/21 11:56

返信遅くなり申し訳ありません。回路図のようなものを書きました。LEDは今試して見ます。5Vにプルアップはされていない...と思います。ご指摘等ありがとうございます。
mochi_kabe

2018/09/21 14:33

LEDをVccとSDA、SCLの間に繋ぐと、どちらの場合もシリアルモニタに取得したデータが表示されるタイミングで一瞬光りました。
guest

回答2

0

ベストアンサー

データシートを読んだだけですが、タイミングの問題があるかもしれませんね。

最低でも、Wire.requestFrom()の前に1.5ms、後に30μs待つ必要があるみたいです。

投稿2018/09/21 22:35

mkgt00

総合スコア165

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

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

mochi_kabe

2018/09/22 00:38

ご指摘の通り、Wire.requestFrom()の前にdelayMicroseconds(1500)、後にdelayMicroseconds(30)を入れましたら、正常に動きました!! これからはデータシートにもっとちゃんと目を通そうと思います。 本当に助かりました。ありがとうございました。
guest

0

Wire関連の関数の使い方がどうも公式とは違うようですんで、そこらへんかなーとはおもいます。
が、
こういう組み込み系の通信、特にI2Cの通信を行おうとするときは、オシロでの波形確認は必須です
不具合の原因が果たしてソフトウエアなのかハードウエアなのか、動作不良の原因はどこにあるか、などの究明には必須のものとなります

なんとかオシロを手配しましょう

投稿2018/09/21 01:39

y_waiwai

総合スコア87774

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

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

mochi_kabe

2018/09/21 12:04

回答ありがとうございます。 Wire関連の関数の使い方...Wire.begin()がESP8266では引数をとるといったあたりでしょうか。具体的に公式と異なる点を指摘していただけると大変助かります。 そうですか...。少し時間がかかってしまうかもしれませんがオシロスコープを用意したいと思います。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.48%

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

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

質問する

関連した質問