思い出したかのように
この前の科学実験の課題 フィジカルコンピューティングのソースと解説
C++がベースらしくC言語したやってない僕には違いがわからないけど よくわからないところが多い
まあー動いてるから良し(最低)
ソースはほとんどネットからいただきました
LM60とDIS18を同時に動かしたいのでプログラムを結合しました
#include<OneWire.h> //ワンワイヤーってセンサの規格?を読み込んどく処理
int ledPin = 3; //LEDの出力ピン
int analogpin0 = 3; //まず入力ピンと出力ピンが同じなのが謎
OneWire ds(9); //dsっつーのがどうやらデジタルセンサの関数的な役割
double min = -424.0 / 6.25; //わからん 温度の最小値
double vref = 2560.0; //基準電圧
int Adata = 0; //アナログのA
int summary = 0; //summary/要約 1秒間の平均で測定しているので0.02秒毎のAdataを格納しとくやつ
int i; //便利なやつ
int count = 0; //データ数わかりやすくするためにつけた数えるだけの存在 ただそれだけの存在
double t_value; //0.1秒間の平均値
//setup前にアナログ温度センサの関数とかを宣言している loop内で良かったなこの処理
void setup() {
analogReference(INTERNAL); //INTERNAL? お決まりのやつらしい
pinMode(ledPin, OUTPUT); //ピンをどう使いますか? ledPinを出力にという意味
Serial.begin(9600); //お決まり
while(!Serial); //シリアル通信している間あああ
}
void loop(){
digitalWrite(ledPin,HIGH); //LED光らせるよ
Adata=0;
byte i;
byte present = 0;
byte type_s=0;
byte data[12];
byte addr[8];
float celsius;
//なぜか16進で処理し始めるので萎えました もとのソースと見比べながら検証したが謎
//おそらく16進でデータが返ってくるのかと なるほどデジタルねって感じ
digitalWrite(ledPin,LOW); //LED消すよ! いらなくね?
if ( !ds.search(addr)) {
ds.reset_search();
return;
}
//一番の謎作業 ds.reset_seach(); これがないとデジタルの温度は0° 寒い
ds.reset(); //出ました リセットするのね
ds.select(addr); //addrをセレクトするのね はいはい
ds.write(0x44,1); //16進の処理はしないでほしい あと他のサイトにも特に説明なし 動いてるからいいだろ
delay(19000); //19秒待つぜ
present = ds.reset(); //リセットしてプレセント
ds.select(addr); //またセレクト
ds.write(0xBE); //ほんで書き込み 16進なのでBEは11001110
for ( i = 0; i < 9; i++) {
data[i] = ds.read();
}
//data[0]からdata[8]をリセット ナニをリセットするのか
Serial.print(count); //今何回目の計測かをカウント
Serial.print(" "); //おそらくExcelとかで考察するのでタブ
unsigned int raw = (data[1] << 8) | data[0]; //rawにdata[1]を8だけ右シフトしたものにdata[0]をORで加算 はあ?
celsius = (float)raw / 16.0; //rawを16割る なんとこれで温度に 何か16進と関係がありそう…
Serial.print("DigitalTemp = "); //以下表示
Serial.print(celsius);
//----------------Analog--------------------------//
summary=0;
for(i=0;i<50;i++){
Adata=analogRead(analogpin0);
summary=summary+Adata;
delay(2); //0.002秒待ち
}
//1秒間の合計をサマリーに
t_value=((double)summary/50.0/1024.0*vref/6.25)+min; //割ってかけて足して気温になる
Serial.print(" AnalogTemp = ");
Serial.println(t_value);
count += 1;
delay(900); //0.9秒待ち 合計1秒
}
解説になってねー
20秒毎に気温を表示します 1万も集めるから50時間くらいかかる