* 実績 [#a9e1ac59]
- 32個接続
- 寄生電力モード
- スキャン測度は1fps前後
- スキャン速度は1fps前後
** Soft [#bc699197]
###
#include <OneWire.h>
#include <DallasTemperature.h>
#include <stdlib.h>
OneWire oneWire(2);
DallasTemperature sensor(&oneWire);
#define dSensorNumber 32
// 高速化のため、バッファに溜めてから纏めてシリアル送信する
// バッファフォーマットは正規表現で「\N\N(,\N\N\.\N)+\0」。
// \0はナル文字。
#define dBufferIndex(aIndex) (2 + aIndex * 5)
#define dBufferSize (dBufferIndex(dSensorNumber) + 1)
static char sBuffer[dBufferSize];
static int sSensorNumber = 0;
void setup();
void loop();
void fBufferInit();
void fBufferSetSensorNumber(int number);
void fBufferSetValue(int index, float value);
////////////////////////////////////////////////////////////////
void softwareReset(void) {
Serial.println("\n----\nSoftware RESET\n----");
delay(100);
//setup();
((void(*)(void))0)();
delay(100);
}
////////////////////////////////////////////////////////////////
void setup() {
Serial.begin(9600);
Serial.println("\n\nBegin OneWireTemprature");
sensor.begin();
delay(100);
if (sensor.isParasitePowerMode()) {
Serial.println(" sensor.isParasitePowerMode() ==> true");
}
sSensorNumber = sensor.getDeviceCount();
Serial.print(" sensor.getDeviceCount ==> ");
Serial.print(sSensorNumber);
if (sSensorNumber > dSensorNumber) {
sSensorNumber = dSensorNumber;
Serial.print(", fixed to ");
Serial.print(sSensorNumber);
}
Serial.println("");
fBufferInit();
Serial.println("\nsetup.done");
delay(100);
}
////////////////////////////////////////////////////////////////
void loop() {
sensor.requestTemperatures();
//Serial.print(sSensorNumber);
fBufferSetSensorNumber(sSensorNumber);
for(int s = 0; s < sSensorNumber; s++) {
float v = sensor.getTempCByIndex(s);
if (v <= 0 || v > 80) {// Error
// センサー挿入時は85が出る
softwareReset();
}
//Serial.print(", ");
//Serial.print((int)v);
fBufferSetValue(s, v);
}
//Serial.println("");
Serial.println(sBuffer);
if (sSensorNumber < dSensorNumber) {
// センサー不足 ==> ある分だけ読んでからリセット
softwareReset();
}
delay(100);
}
////////////////////////////////////////////////////////////////
void fBufferInit() {
char* p = sBuffer;
*(p++) = '0';
*(p++) = '0';
for (int s = 0; s < dSensorNumber; s++) {
*(p++) = ',';
*(p++) = '0';
*(p++) = '0';
*(p++) = '.';
*(p++) = '0';
}
*(p++) = '\0';
if (p - sBuffer != dBufferSize) {
Serial.println("\n\nError: fBufferInit");
Serial.print(" dBufferSize ==> ");
Serial.println(dBufferSize);
Serial.print(" inited ==> ");
Serial.println(p - sBuffer);
while(true) delay(10000);
}
Serial.println("fBufferInit() ==> /");
Serial.println(sBuffer);
Serial.println("/");
}
void fBufferSetSensorNumber(int number) {
if (number < 0 || 100 <= number) {
Serial.print("\n\nError: argment out of range: fBufferSetSensorNumber.index in [0,100) ==> ");
Serial.print(number);
return;
}
int d0 = (int)(number * 10);
int c1 = d0 % 10; int d1 = d0 / 10;
int c2 = d1 % 10;
sBuffer[0] = '0' + c2;
sBuffer[1] = '0' + c1;
}
void fBufferSetValue(int index, float value) {
if (index < 0 || dSensorNumber <= index ) {
Serial.print("\n\nError: argment out of range: fBufferSetValue.index in [0,");
Serial.print(dSensorNumber);
Serial.print(") ==> ");
Serial.println(index);
return;
}
if (value < 0 || 100 <= value) {
Serial.print("\n\nError: argment out of range: fBufferSetValue.value in [0,100) ==> ");
Serial.print(value);
return;
}
int d0 = (int)(value * 10);
int c1 = d0 % 10; int d1 = d0 / 10;
int c2 = d1 % 10; int d2 = d1 / 10;
int c3 = d2 % 10;
// + 0 = ',' ;
sBuffer[dBufferIndex(index) + 1] = '0' + c3;
sBuffer[dBufferIndex(index) + 2] = '0' + c2;
// + 3 = '.' ;
sBuffer[dBufferIndex(index) + 4] = '0' + c1;
}
////////////////////////////////////////////////////////////////
###