Вариант датчиков температуры без библиотеки далласа и без задержек ( в главном цикле делаем задержку более оной секунды)
У меня с 15 датчиками на получение температуры и вывод в сеть уходит около 2 сек.
Код: Выделить всё
/*
Modul Temperature
part of Arduino Mega Server project
*/
#ifdef TEMP_FEATURE
#include <OneWire.h>
OneWire ds(2);//шина на пине 2
byte const MAX_TEMP_SENSORS = 15;
byte const FULL_HEALTH = 100;
byte const ZERO_HEALTH = 0;
byte tempSensorHealth[MAX_TEMP_SENSORS];
byte const MAX_ID_DIGITS = 8;
float current_temp[MAX_TEMP_SENSORS];
char objSens[MAX_TEMP_SENSORS][12] = {"boil1", "boil2", "boil3", "boil4", "boil5", "boil6", "boil7", "boil8","colecIN", "colecOUT", "colec1", "colec2", "colec3", "colec4", "colec5", };
// Sensors ID's
byte idTempDat[MAX_TEMP_SENSORS][MAX_ID_DIGITS] = {
// boil
{ 0x28, 0xFF, 0xED, 0x80, 0x64, 0x14, 0x1, 0x15,},// boi2
{ 0x28, 0xFF, 0x41, 0x90, 0x64, 0x14, 0x1, 0x3F,},// boi3
{ 0x28, 0xFF, 0x3C, 0x8E, 0x64, 0x14, 0x1, 0x93,},// boi4
{ 0x28, 0xFF, 0xB7, 0x90, 0x64, 0x14, 0x1, 0x5,},// boi5
{ 0x28, 0xFF, 0xF7, 0x8B, 0x64, 0x14, 0x1, 0x40,},
{ 0x28, 0xFF, 0x7F, 0xB1, 0x64, 0x14, 0x2, 0x4,},// boi6
{ 0x28, 0xFF, 0xD7, 0x8D, 0x64, 0x14, 0x1, 0xB1,},// boi7
{ 0x28, 0xFF, 0xB6, 0x8B, 0x64, 0x14, 0x1, 0x64,},// boil8
{ 0x28, 0xFF, 0xF6, 0xB0, 0x6C, 0x14, 0x4, 0x4B,},// colecIN
{ 0x28, 0xFF, 0xB6, 0x63, 0x68, 0x14, 0x2, 0x68,},// colecOUT
{ 0x28, 0xFF, 0x5F, 0xD6, 0x6C, 0x14, 0x4, 0x12,},// colec1
{ 0x28, 0xFF, 0xC1, 0x5D, 0x68, 0x14, 0x2, 0x9,},// colec2
{ 0x28, 0xFF, 0x56, 0x64, 0x6D, 0x14, 0x4, 0xDC,},// colec3
{ 0x28, 0xFF, 0x2A, 0x99, 0x6C, 0x14, 0x4, 0xD7,},// colec4
{ 0x28, 0xFF, 0xC9, 0x9A, 0x6C, 0x14, 0x4, 0xCB,},// colec5
};
int temp_[MAX_TEMP_SENSORS];
byte addr[8];
byte lastsens = 0;
byte data[12];
void tempInit() {
initStart("Temperature");
timeStamp();
showSensorsId();
modulTemp = MODUL_ENABLE;
initDone();
}
void showSensorsId() {
if (lastsens == 0) {
for (byte i = 0; i < MAX_TEMP_SENSORS; i++) {
if ( !ds.search(addr)) {
Serial.println("No more addresses.");
Serial.println();
ds.reset_search();
lastsens = 1;
delay(250);
return;
}
if (i == 0) {
if (addr[0] == 0x28) {
Serial.println(" Chip = DS18S20");
} else {
Serial.println("Device is not a DS18S20.");
return;
}
}
byte h;
Serial.print("{");
for ( h = 0; h < 8; h++) {
Serial.write(" 0x");
Serial.print(addr[h], HEX);
Serial.write(',');
}
Serial.print("},");
Serial.print("\n");
if (OneWire::crc8(addr, 7) != addr[7]) {
Serial.println("CRC is not valid!");
return;
}
Serial.println();
}
}
}
void tempWorks() {
ds.reset(); //сбрасываем шину
ds.write(0xCC);//обращаемся ко всем датчикам
ds.write(0x44);//конвертируем температуру в датчиках
for (byte n = 0; n < MAX_TEMP_SENSORS; n++) {
getTemperature(n);
}
}
void getTemperature(byte n) {
ds.reset();
ds.select(idTempDat[n]);//обращаемся к датчику с номером n
ds.write(0xBE);//запрашиваем температуру
//получаем температуру
byte h;
for ( h = 0; h < 9; h++) {
data[h] = ds.read();
}
//проверяем чексумму
if (OneWire::crc8(data, 8) != data[8]) {
timeStamp();
tempSensorHealth[n] = ZERO_HEALTH;
Serial.print(objSens[n]);
Serial.print(" ");
Serial.print("Sensor error");
Serial.print("\n");
return;
}
else{
int16_t raw = (((int16_t)data[1]) << 8) | data[0];//конвертируем
current_temp[n] = (float)raw / 16.0;
timeStamp();
tempSensorHealth[n] = FULL_HEALTH;
Serial.print(objSens[n]);
Serial.print(": ");
Serial.println(current_temp[n]);
temp_[n] = (current_temp[n] - (int)current_temp[n]) * 100;
if ((current_temp[n] > -1) && (current_temp[n] < 0)) {
#ifdef MAJORDOMO_FEATURE
sendRequestMinusM(objSens[n], "-", (int)current_temp[n], abs(temp_[n]));
#endif
} else {
#ifdef MAJORDOMO_FEATURE
sendRequestMinusM(objSens[n], "", (int)current_temp[n], abs(temp_[n]));
#endif
}
}
} // getTemperature( )
#endif // TEMP_FEATURE