* 実績 [#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;
}

////////////////////////////////////////////////////////////////
###
    技術 一覧 検索 最新 バックアップ リンク元   ヘルプ   最終更新のRSS