#include <EEPROM.h>
#include <OneWire.h>
#include <DallasTemperature.h>
#define LED 13
#define OWBUS 2
long lastLed = 0;
int ledCycle = 1000;
typedef struct {
char alias[17];
DeviceAddress adr;
float t;
float tLastReported;
int lastRead;
} TSENS_TYPE;
#define MAX_SENSORS 16
typedef struct {
int scanInterval;
TSENS_TYPE sensors[MAX_SENSORS];
} PER_DATA;
PER_DATA data;
char input[16];
int inPtr;
int scan = 0;
long lastReport = 0;
OneWire oneWire(OWBUS);
DallasTemperature ds18b20(&oneWire);
void _help() {
Serial.println("alias xx newAlias");
Serial.println("del xx");
Serial.println("int xx");
Serial.println("list");
Serial.println("min xx minTemp");
Serial.println("max xx maxTemp");
Serial.println("res xx resolution");
Serial.println("reset");
Serial.println("save");
Serial.println("scan");
Serial.println("start");
Serial.println("stop");
Serial.println();
Serial.println("OK");
}
int _scanNumber(char *ptr) {
int number = 0;
while ((*ptr > 47) && (*ptr < 58)) {
number *= 10;
number += ((int)*ptr - 48);
ptr++;
}
return number;
}
void _initFromEeprom() {
// Check if the eeprom data is valid:
if (EEPROM.read(0) == 255) {
memset(&data, 0x00, sizeof(PER_DATA));
data.scanInterval = 1;
return;
}
EEPROM.get(0, data);
}
void _storeToEeprom() {
EEPROM.put(0, data);
Serial.println("OK");
}
void setup() {
Serial.begin(9600);
Serial.println("OK");
pinMode(LED, OUTPUT);
ds18b20.begin();
_initFromEeprom();
inPtr = 0;
}
void printAddress(DeviceAddress deviceAddress)
{
for (uint8_t i = 0; i < 8; i++)
{
if (deviceAddress[i] < 16) Serial.print("0");
Serial.print(deviceAddress[i], HEX);
}
}
void _reset() {
int i, n;
DeviceAddress devAdr;
memset(&data.sensors[0], 0x00, MAX_SENSORS*sizeof(TSENS_TYPE));
n = ds18b20.getDeviceCount();
for (i=0; i<n; i++) {
Serial.print(i);
Serial.print(" ");
ds18b20.getAddress(data.sensors[0].adr, i);
printAddress(data.sensors[0].adr);
Serial.println("");
}
data.scanInterval = 1;
Serial.println("OK");
}
void _report() {
if (!scan)
return;
if (millis() < lastReport) {
lastReport = millis();
return;
}
if (millis()-lastReport < (data.scanInterval*1000) )
return;
Serial.println("T0=......");
Serial.println("T1=......");
Serial.println("T2=......");
Serial.println("T3=.....");
lastReport = millis();
}
void _listSensors() {
int i;
for (i=0; i<MAX_SENSORS; i++) {
if (strlen(data.sensors[i].adr)<8)
continue;
Serial.print(i);
Serial.print(" ");
printAddress(data.sensors[i].adr);
if (strlen(data.sensors[i].alias) > 0) {
Serial.print(" ");
Serial.print(data.sensors[i].alias);
}
Serial.println();
}
Serial.println("OK");
}
void _setAlias(char *input) {
int sensNumber = -1;
// alias xx newAlias
if (strlen(input) < 10) {
Serial.println("ERR: alias xx newAlias");
return;
}
// scan sensor number
sensNumber = _scanNumber(&input[6]);
if ((sensNumber<0) || (sensNumber>=MAX_SENSORS)) {
Serial.println("ERR: Sensor number invalid");
return;
}
if (strlen(data.sensors[sensNumber].adr) < 8) {
Serial.println("ERR: Sensor not scanned");
return;
}
strcpy(data.sensors[sensNumber].alias, &input[9]);
Serial.println("OK");
}
void _setInterval(char *input) {
// int xx
data.scanInterval = _scanNumber(&input[4]);
if (data.scanInterval < 1)
data.scanInterval = 1;
Serial.println(data.scanInterval);
Serial.println("OK");
}
void _led() {
if (millis()-lastLed < ledCycle )
return;
lastLed = millis();
if (digitalRead(LED) == LOW)
digitalWrite(LED, HIGH);
else
digitalWrite(LED, LOW);
}
void loop() {
while (Serial.available()) {
input[inPtr] = Serial.read();
if (input[inPtr] == '\n') {
input[inPtr] = 0;
inPtr = 0;
Serial.println(input);
if (input[1]=='c') // scan
scan = 1;
else if (input[1]=='a') // sAve
_storeToEeprom();
else if (input[1]=='t') // stop
scan = 0;
else if (input[1]=='i') // list
_listSensors();
else if (input[1]=='l') // alias
_setAlias(input);
else if (input[1]=='e') // reset
_reset();
else if (input[1]=='n') // iNt
_setInterval(input);
else if (input[0]=='?') // reset
_help();
} else if (inPtr<15)
inPtr++;
}
_led();
_report();
}