単独でデータを計測はできるが、統合すると照度センサーがゼロになるというバグが発生
4時間は悩んだ・・・
①21Pinから温度を取得
クラウドへデータ送信もOK
②25pinから照度を取得
①②それぞれちゃんと動いている。
ブレッドボード上に2種類の回路を結合し、プログラムも統合したところ、温度は取得できるが照度が0になる。
色々やってみたが症状は変わらない。
それぞれの単機能プログラムに戻して動作させると、ちゃんと読み取る。
こうなったら、消去法で行くしかない。
20時30分頃から作業
結合した全部入りのプログラムから、WiFi部分とクラウド送信部分を取り除く・・・ダメ
温度取得部分をコメントアウト・・・は? 2000位の値が出てたんだが、先程単独②の時は。
②だけにして実行。ちゃんと1800値が出る。
回路は悪くない。それは間違いない!
温度関係を全てコメントアウト状態のまま
analogreadの後50msのディレイを500にしてみる。
毎回コンパイルに30秒、システムリセットで電源抜去、シリアルコンソールを立ち上げ直し・・・2分程度はかかってるね。
クソ、照度0しか返ってこない。
温度回路への配線を抜去 それでも照度0
②だけにしたらちゃんと照度計測する。
なんじゃ
テストプログラムを全部消去
照度Pのみをコピペで入れて動かす。
当然動く。
============
それでは温度ルーチンを少しづつ手で加えていく。
まずは定義部分だけ。include/define/オブジェクト生成まで
OK
sensors.begin(); を追加
OK
pinMode(analogIn,INPUT);追加
OK
sensors.requestTemperatures();
Serial.print("sensor(0)\t");
float tmp = sensors.getTempCByIndex(0);
Serial.println(tmp); 追加
NG??? -127.0が帰ってきだした。照度は問題なし。
焦土と温度の間にdelay(500);追加した
NG 同じ-127
先に温度、500ms間を空けて照度取得に入れ替えてみる
NG 同じ-127
----は?-------------
くっそーーーー、温度計配線を抜いたままだった。
あれれ、配線復活したらちゃんと動き出した・・・orz
測定順を元に戻してみる。
OK
ソースを少し綺麗に書き直した。
============
WIFI部分を加えていく。
WiFiClient client;
NG #include "Ambient.h"が無いとエラーになった???なんでや?
まあ、"Ambient.h"加えたらコンパイル通ったのでうやむやにする
OK
Ambient ambient;を加える
OK
WiFi接続パラメータ2行を加える
OK
WiFi.begin(ssid, password);
Serial.print("WiFi start ");
while(WiFi.status()!=WL_CONNECTED) {
delay(500);
Serial.print("x");
}
Serial.print("\r\nWiFi connected\r\nIP address: ");
Serial.println(WiFi.localIP());
M5.dis.drawpix(0, 0xE8E800); // Yellow
delay(1000);を加える
!!!!!!!! ここじゃ! WiFiが入ったらアナログ(Pin25)読めない!!!!!!!!!
22時20分
約2時間の苦行であった・・・・
---------------------------------
学習
---------------------------------
こちらのサイトに細かいPinの仕様が書いてあった。(ありがとうございます!)
アナログ入力について
Pin25は「ADC_CH8」に接続されていることは表に記載がある。
で、WiFiを1回でも使用すると再起動しない限りADCが使用ができなくなると。
これですね・・・原因は
RTCもADCのch1/ch2と被ってるのだが、書いてある意味が解らない・・・
「RTCは内部的なGPIOへのアクセス方法で、ULPからアクセスする場合に利用します。・・・・」
ちんぷんかんぷん
---------デバッグ再開--------------
とにかく、ここをすり抜けないとどうにも進めないので、空いてるピンをアサインし直すことにする。
Pin25~Pin39がADCへ繋がってるが、
Pin穴があるのは(GROVE除く)GPIO33(ADC1_CH5)位しか空きが無い。
Pin番号を25->33にし、配線も変えてみる。
OK ②センサーとも読めました。
WiFi文を有効にしてみる
OK IPも取れた! よっしゃあああ
ambient.begin(channelId, writeKey, &client);と、チャネルIDと書き込みキー文字列定義を追加
OK
グラフも2つあるとそれっぽいね。
今晩は5分に一回データを送信しつつ就寝
Atomは消費電力がデカいのかモバイルバッテリーが勝手に落ちない。
我が家のポンコツUSB電流計では0.00Aと表示されるが・・
8時間後の結果
・温度 この窓エアコンは26度のドライ設定にしてあるが22度近くまで下がってるね。意外な発見
・照度 朝6時ころから照度が上がって天候が曇りのせいか、明るさが多少変化しながら推移し8時過ぎに点灯
こうやってデータにすると面白い。外気温との比較とか天候の記録とかも合わせ読んでみたいところです。
なるほどであります。記録マニアの血が騒ぐ。
ちなみに殆どのPinhaPullUp有効が規定値と書いてあるので追加の抵抗は不要なのか?
----ソース----
#include "M5Atom.h"
#include "Ambient.h"
#include <OneWire.h>
#include <DallasTemperature.h>
#define ONE_WIRE_BUS 21 // Pin No
WiFiClient client;
Ambient ambient;
OneWire oneWire(ONE_WIRE_BUS);
DallasTemperature sensors(&oneWire);
const char* ssid = "WARXXXXXXXXXX";
const char* password = "8FXXXXXXXXXX";
unsigned int channelId = 38XXX; // AmbientのチャネルID
const char* writeKey = "d34XXXXXXXXXX"; // ライトキー
int analogIn = 33; // only 33
void setup() {
M5.begin(true, false, true); // use LED
delay(50);
M5.dis.drawpix(0, 0x00f000); // RED RED
delay(1000);
Serial.begin(115200);
Serial.printf("Hello \n");
sensors.begin();
pinMode(analogIn,INPUT);
delay(50);
WiFi.begin(ssid, password);
Serial.print("WiFi start ");
while(WiFi.status()!=WL_CONNECTED) {
delay(500);
Serial.print("x");
}
Serial.print("\r\nWiFi connected\r\nIP address: ");
Serial.println(WiFi.localIP());
ambient.begin(channelId, writeKey, &client); // Ambient環境初期化
M5.dis.drawpix(0, 0xE8E800); // Yellow
delay(1000);
}
void loop() {
M5.dis.drawpix(0, 0xf00000); // green
int blightness = analogRead(analogIn);
Serial.printf("analogRead(%d) = %d\n", analogIn, blightness);
delay(500);
//---------
M5.dis.drawpix(0, 0x0000f0); // Blue
sensors.requestTemperatures();
Serial.print("sensor(0)\t");
float tmp = sensors.getTempCByIndex(0);
Serial.println(tmp);
delay(500);
//---------
M5.dis.drawpix(0, 0x707070); // white
ambient.set(1, tmp); // data temp set
ambient.set(8, blightness); // data blight set
ambient.send(); // send!
delay(1*10*1000); // n * 10秒
// delay(1*60000); // n 分
}